亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

天气监控系统

发布时间:2021-05-17
分享到:

天气监控系统

发布时间:2021-05-17
分享到:

该设计是一种天气监控系统,该系统使用传感器显示温度,湿度和空气质量。该系统新颖的原因在于它的简单性和用户友好性。它可以放在您的手掌中。它可以帮助预测,并且预测结果更加准确。

硬件组件:

  • 粒子氩
  • DHT11温湿度传感器
  • 气体传感器(MQ2)
  • 空气质量传感器 v1.3
  • LDR 5兆欧
  • 电阻 1kΩ

软件应用程序:

 电路原理图:

代码:

1)氩气天气监控代码

#include "Adafruit_DHT.h"

#define DHTPIN 2     //连接那个引脚

#define DHTTYPE DHT11        // DHT 11 

DHT dht(DHTPIN, DHTTYPE);

SYSTEM_MODE(AUTOMATIC);

void setup() {
    pinMode(A0,INPUT); //LDR 引脚
    pinMode(A1,INPUT); //MQ2 引脚
    pinMode(A2,INPUT); //MQ135 引脚
    Serial.begin(115200); 
    dht.begin();
}

void loop() {
    
    // 在测量之间等待几秒钟。
    delay(2000);
    // 极慢传感器)
    float h = dht.getHumidity();
    // 温度读数为摄氏度
    float t = dht.getTempCelcius();
    
    //获取灯光级别
    float LDR=analogRead(A0);
    //读取MQ2级别
    float MQ2=analogRead(A1);
    //读取MQ135级别
    float MQ135=analogRead(A2);
  
    // 检查是否有读取失败并提前退出(以重试)。
    // if (isnan(h) || isnan(t) || isnan(f)) {
    if (isnan(h)) {
        Serial.println("Failed to read from DHT sensor!");
        h=t=0;
    }
    
    //将传感器数据转换为JSON响应 Webhooks将数据发送到ThingSpeak&Zapier进行进一步处理
    
    String Data="{\"field1\":\""+String(t)+"\","; //Temp
    Data+="\"field2\":\""+String(h)+"\","; //Humdity
    Data+="\"field3\":\""+String(LDR)+"\","; //LDR
    Data+="\"field4\":\""+String(MQ135)+"\","; //MQ135
    Data+="\"field5\":\""+String(MQ2)+"\"}"; //MQ2
    

    Particle.publish("WeatherData", Data, PUBLIC);
    
    Serial.print("Humid: "); 
    Serial.print(h);
    Serial.print("% - ");
    Serial.print("Temp: "); 
    Serial.print(t);
    Serial.println("*C");
    Serial.print("LDR: ");
    Serial.println(LDR);
    Serial.print("MQ2: ");
    Serial.println(MQ2);
    Serial.print("MQ135: ");
    Serial.println(MQ135);
    Serial.println(Time.timeStr());
    // 测量之间等待30秒
    delay(300000);
}

2)氩气天气监控器子代码1

#include "Adafruit_DHT.h"

DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) {
    _pin = pin;
    _type = type;
    _count = count;
    firstreading = true;
}

void DHT::begin(void) {
//装上别针
    pinMode(_pin, INPUT);
    pinSetFast(_pin);
    _lastreadtime = 0;
}

float DHT::readTemperature() {
    float f;

    if (read()) {
        switch (_type) {
            case DHT11:
                f = data[2];
                return f;
            case DHT22:
            case DHT21:
                f = data[2] & 0x7F;
                f *= 256;
                f += data[3];
                f /= 10;
                if (data[2] & 0x80)
                    f *= -1;
                return f;
        }
    }
    return NAN;
}

float DHT::getHumidity() {
    return readHumidity();
}

float DHT::getTempCelcius() {
    return readTemperature();
}

float DHT::getTempFarenheit() {
    return convertCtoF(readTemperature());
}

float DHT::getTempKelvin() {
    return convertCtoK(readTemperature());
}

float DHT::getHeatIndex() {
    return convertFtoC(computeHeatIndex(convertCtoF(readTemperature()), readHumidity()));
}

float DHT::getDewPoint() {
    return computeDewPoint(readTemperature(), readHumidity());
}

float DHT::convertFtoC(float f) {
    return (f - 32) * 5 / 9;
}

float DHT::convertCtoF(float c) {
    return c * 9 / 5 + 32;
}

float DHT::convertCtoK(float c) {
    return c + 273.15;
}

float DHT::readHumidity(void) {
    float f;

    if (read()) {
        switch (_type) {
            case DHT11:
                f = data[0];
                return f;
            case DHT22:
            case DHT21:
                f = data[0];
                f *= 256;
                f += data[1];
                f /= 10;
                return f;
        }
    }
    return NAN;
}

float DHT::computeHeatIndex(float tempFahrenheit, float percentHumidity) {

    return -42.379 + 
         2.04901523 * tempFahrenheit + 
        10.14333127 * percentHumidity +
        -0.22475541 * tempFahrenheit * percentHumidity +
        -0.00683783 * pow(tempFahrenheit, 2) +
        -0.05481717 * pow(percentHumidity, 2) + 
         0.00122874 * pow(tempFahrenheit, 2) * percentHumidity + 
         0.00085282 * tempFahrenheit * pow(percentHumidity, 2) +
        -0.00000199 * pow(tempFahrenheit, 2) * pow(percentHumidity, 2);
}

float DHT::computeDewPoint(float tempCelcius, float percentHumidity) {
    double a = 17.271;
    double b = 237.7;
    double tC = (a * (float) tempCelcius) / (b + (float) tempCelcius) + log( (float) percentHumidity / 100);
    double Td = (b * tC) / (a - tC);
    return Td;
}

boolean DHT::read(void) {
    uint8_t laststate = HIGH;
    uint8_t counter = 0;
    uint8_t j = 0, i;
    unsigned long currenttime;

// 检查传感器是否在两秒钟前读取并提前返回
// 使用最后的读数。
    currenttime = millis();
    if (currenttime < _lastreadtime) {
// ie there was a rollover
        _lastreadtime = 0;
    }
    if (!firstreading && ((currenttime - _lastreadtime) < 2000)) {
        return true; // return last correct measurement
//        delay(2000 - (currenttime - _lastreadtime));
    }
    firstreading = false;
/*
    Serial.print("Currtime: "); Serial.print(currenttime);
    Serial.print(" Lasttime: "); Serial.print(_lastreadtime);
*/
    _lastreadtime = millis();

    data[0] = data[1] = data[2] = data[3] = data[4] = 0;
  
// 将销拉高并等待250毫秒
    pinSetFast(_pin);
    delay(250);

// 现在把它拉低20毫秒
    pinMode(_pin, OUTPUT);
    pinResetFast(_pin);
    delay(20);
    noInterrupts();
    pinSetFast(_pin);
    delayMicroseconds(40);
    pinMode(_pin, INPUT);

// 读入计时
    for ( i=0; i< MAXTIMINGS; i++) {
        counter = 0;
        while (pinReadFast(_pin) == laststate) {
            counter++;
            delayMicroseconds(1);
            if (counter == 255) {
                break;
            }
        }
        laststate = pinReadFast(_pin);

        if (counter == 255) break;

//忽略前3个过渡
        if ((i >= 4) && (i%2 == 0)) {
// 将每个位放入存储字节
            data[j/8] <<= 1;
            if (counter > _count)
                data[j/8] |= 1;
            j++;
        }
    }

    interrupts();

/*
    Serial.println(j, DEC);
    Serial.print(data[0], HEX); Serial.print(", ");
    Serial.print(data[1], HEX); Serial.print(", ");
    Serial.print(data[2], HEX); Serial.print(", ");
    Serial.print(data[3], HEX); Serial.print(", ");
    Serial.print(data[4], HEX); Serial.print(" =? ");
    Serial.println(data[0] + data[1] + data[2] + data[3], HEX);
*/

// 检查我们读取了40位并且校验和匹配
    if ((j >= 40) && 
       (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) {
        return true;
    }
 
    return false;

}    

3)氩气天气监控器子代码2

#ifndef DHT_H
#define DHT_H

#include "application.h"
#include "math.h"

// 我们需要跟踪多少时间转换。2*数字位+额外
#define MAXTIMINGS 85

#define DHT11 11
#define DHT22 22
#define DHT21 21
#define AM2301 21

class DHT {
    private:
        uint8_t data[6];
        uint8_t _pin, _type, _count;
        unsigned long _lastreadtime;
        boolean firstreading;
        float readTemperature();
        float convertFtoC(float);
        float convertCtoF(float);
        float convertCtoK(float);
        float computeHeatIndex(float tempFahrenheit, float percentHumidity);
        float computeDewPoint(float tempCelcius, float percentHumidity);
        float readHumidity(void);
        boolean read(void);

    public:
        DHT(uint8_t pin, uint8_t type, uint8_t count=6);
        void begin(void);
        float getHumidity();
        float getTempCelcius();
        float getTempFarenheit();
        float getTempKelvin();
        float getHeatIndex();
                float getDewPoint();

};
#endif

电路设计图片:

实时数据:

摄氏度

华氏度

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论