使用ESP8266和DHT11传感器将温湿度数据上传到OneNet平台

本教程将介绍如何使用ESP8266模块和DHT11传感器,通过Arduino编程将采集到的温湿度数据上传到OneNet平台。

准备工作:

  • Arduino开发板
  • ESP8266模块
  • DHT11温湿度传感器
  • 一根面包板
  • 跳线

步骤:

  1. 连接硬件:

    • 将ESP8266模块连接到Arduino开发板,并根据ESP8266模块的TX/RX引脚连接到Arduino的软串口引脚D3和D2。
    • 将DHT11传感器连接到Arduino的数字引脚4。
  2. 安装库:

    • 在Arduino IDE中安装以下库:
      • ESP8266WiFi.h
      • dht11.h
      • SoftwareSerial.h
  3. 代码:

    #include 'ESP8266.h'
    #include 'dht11.h'
    #include 'SoftwareSerial.h'
    
    //配置ESP8266WIFI设置
    #define SSID 'HONOR Play4T'    //填写2.4GHz的WIFI名称,不要使用校园网
    #define PASSWORD '12345678'//填写自己的WIFI密码
    #define HOST_NAME 'api.heclouds.com'  //API主机名称,连接到OneNET平台,无需修改
    #define DEVICE_ID '1099655073'       //填写自己的OneNet设备ID
    #define HOST_PORT (80)                //API端口,连接到OneNET平台,无需修改
    String APIKey = 'IiJSs17atNND2C77wumz03w63hw='; //与设备绑定的APIKey
    
    #define INTERVAL_SENSOR 5000 //定义传感器采样及发送时间间隔
    
    //创建dht11示例
    
    dht11 DHT11;
    
    //定义DHT11接入Arduino的管脚
    #define DHT11PIN 4
    
    //定义ESP8266所连接的软串口
    /*********************
     * 该实验需要使用软串口
     * Arduino上的软串口RX定义为D3,
     * 接ESP8266上的TX口,
     * Arduino上的软串口TX定义为D2,
     * 接ESP8266上的RX口.
     * D3和D2可以自定义,
     * 但接ESP8266时必须恰好相反
     *********************/
    SoftwareSerial mySerial(3, 2);
    ESP8266 wifi(mySerial);
    
    void setup() {
      mySerial.begin(115200); //初始化软串口
      Serial.begin(9600);     //初始化串口
      Serial.print('setup begin\r\n');
    
      //以下为ESP8266初始化的代码
      Serial.print('FW Version: ');
      Serial.println(wifi.getVersion().c_str());
    
      if (wifi.setOprToStation()) {
        Serial.print('to station ok\r\n');
      } else {
        Serial.print('to station err\r\n');
      }
    
      //ESP8266接入WIFI
      if (wifi.joinAP(SSID, PASSWORD)) {
        Serial.print('Join AP success\r\n');
        Serial.print('IP: ');
        Serial.println(wifi.getLocalIP().c_str());
      } else {
        Serial.print('Join AP failure\r\n');
      }
    
      Serial.println('');
      Serial.print('DHT11 LIBRARY VERSION: ');
      Serial.println(DHT11LIB_VERSION);
    
      mySerial.println('AT+UART_CUR=9600,8,1,0,0');
      mySerial.begin(9600);
      Serial.println('setup end\r\n');
    }
    
    unsigned long net_time1 = millis(); //数据上传服务器时间
    void loop() {
    
      if (net_time1 > millis())
        net_time1 = millis();
    
      if (millis() - net_time1 > INTERVAL_SENSOR) //发送数据时间间隔
      {
    
        int chk = DHT11.read(DHT11PIN);
    
        Serial.print('Read sensor: ');
        switch (chk) {
          case DHTLIB_OK:
            Serial.println('OK');
            break;
          case DHTLIB_ERROR_CHECKSUM:
            Serial.println('Checksum error');
            break;
          case DHTLIB_ERROR_TIMEOUT:
            Serial.println('Time out error');
            break;
          default:
            Serial.println('Unknown error');
            break;
        }
    
        float sensor_hum = (float)DHT11.humidity;
        float sensor_tem = (float)DHT11.temperature;
        Serial.print('Humidity (%): ');
        Serial.println(sensor_hum, 2);
    
        Serial.print('Temperature (oC): ');
        Serial.println(sensor_tem, 2);
        Serial.println('');
    
        if (wifi.createTCP(HOST_NAME, HOST_PORT)) { //建立TCP连接,如果失败,不能发送该数据
          Serial.print('create tcp ok\r\n');
          char buf[10];
          //拼接发送data字段字符串
          String jsonToSend = '{\'Temperature\':';
          dtostrf(sensor_tem, 1, 2, buf);
          jsonToSend += '\'' + String(buf) + '\'';
          jsonToSend += ',\'Humidity\':';
          dtostrf(sensor_hum, 1, 2, buf);
          jsonToSend += '\'' + String(buf) + '\'';
          jsonToSend += '}';
    
          //拼接POST请求字符串
          String postString = 'POST /devices/';
          postString += DEVICE_ID;
          postString += '/datapoints?type=3 HTTP/1.1';
          postString += '\r\n';
          postString += 'api-key:';
          postString += APIKey;
          postString += '\r\n';
          postString += 'Host:api.heclouds.com\r\n';
          postString += 'Connection:close\r\n';
          postString += 'Content-Length:';
          postString += jsonToSend.length();
          postString += '\r\n';
          postString += '\r\n';
          postString += jsonToSend;
          postString += '\r\n';
          postString += '\r\n';
          postString += '\r\n';
    
          const char *postArray = postString.c_str(); //将str转化为char数组
    
          Serial.println(postArray);
          wifi.send((const uint8_t *)postArray, strlen(postArray)); //send发送命令,参数必须是这两种格式,尤其是(const uint8_t*)
          Serial.println('send success');
          if (wifi.releaseTCP()) { //释放TCP连接
            Serial.print('release tcp ok\r\n');
          } else {
            Serial.print('release tcp err\r\n');
          }
          postArray = NULL; //清空数组,等待下次传输数据
        } else {
          Serial.print('create tcp err\r\n');
        }
    
        Serial.println('');
    
        net_time1 = millis();
      }
    }
    
  4. 配置OneNet平台:

    • 注册OneNet账号并创建一个新的设备。
    • 获取设备ID和APIKey。
    • 在代码中修改SSID、PASSWORD、HOST_NAME、DEVICE_ID和APIKey的值。
  5. 上传代码并运行:

    • 将代码上传到Arduino开发板并运行。
    • 打开串口监视器,观察代码运行日志。
    • 在OneNet平台上查看设备的数据,验证是否成功上传数据。

注意:

  • 确保ESP8266模块和DHT11传感器正确连接。
  • 确保WIFI名称和密码正确。
  • 确保设备ID和APIKey正确。
  • 代码中的时间间隔INTERVAL_SENSOR可以根据需要进行调整。

本教程仅提供一个基本示例,您可以根据自己的需求对代码进行扩展和修改。

其他资源:

  • OneNet平台:https://www.onenet.io/
  • ESP8266文档:https://www.espressif.com/en/products/hardware/esp8266
  • DHT11传感器文档:https://www.adafruit.com/product/385
Arduino ESP8266 DHT11温湿度传感器数据上传OneNet平台教程

原文地址: https://www.cveoy.top/t/topic/oI5Y 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录