ESP8266 连接 OneNET 平台 DHT11 温湿度传感器数据采集与控制舵机

引言

本教程介绍如何使用 ESP8266 连接 OneNET 平台,采集 DHT11 温湿度传感器数据并控制舵机。该项目将通过 ESP8266 将 DHT11 传感器的温湿度数据上传到 OneNET 平台,并根据 OneNET 平台的指令控制舵机的转动角度。

硬件准备

  • Arduino 开发板
  • ESP8266 模块
  • DHT11 温湿度传感器
  • 舵机
  • 跳线若干

软件准备

  • Arduino IDE
  • OneNET 平台账号

步骤

  1. 连接硬件

    • 将 ESP8266 模块连接到 Arduino 开发板。
    • 将 DHT11 温湿度传感器连接到 Arduino 开发板的数字引脚 4。
    • 将舵机连接到 Arduino 开发板的数字引脚 7。
  2. OneNET 平台配置

    • 注册 OneNET 平台账号并创建设备。
    • 获取设备 ID 和 API Key。
  3. 代码编写

    • 在 Arduino IDE 中新建一个项目。
    • 将以下代码复制到 Arduino IDE 中:
    #include <ESP8266.h>
    #include <dht11.h>
    #include <SoftwareSerial.h>
    #include <Servo.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;
    // 创建舵机
    Servo myservo;
    int servoPin = 7;
    int light = 0;
    int servoPos = 0;
    // 定义 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');
    
      myservo.attach(servoPin);
      myservo.write(0);
    
      // 以下为 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 += ',\'light\':';
          jsonToSend += '\'' + String(light) + '\'';
          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. 上传代码并运行

    • 将代码上传到 Arduino 开发板。
    • 打开串口监视器,观察运行结果。

说明

  • 代码中的 SSIDPASSWORDDEVICE_IDAPIKey 需要替换成自己的实际值。
  • INTERVAL_SENSOR 定义了传感器采样及发送数据的时间间隔,可以根据需要进行调整。
  • 代码中的 light 变量用于控制舵机的转动角度。您可以通过 OneNET 平台发送指令来修改 light 的值,从而控制舵机的转动角度。

注意

  • ESP8266 的软串口配置需要根据实际连接情况进行调整。
  • 该代码仅供参考,实际应用中可能需要根据具体需求进行修改和完善。

总结

本教程介绍了使用 ESP8266 连接 OneNET 平台,采集 DHT11 温湿度传感器数据并控制舵机的完整流程。希望本教程能够帮助您快速入门 ESP8266 和 OneNET 平台,并开发出更多有趣和实用的物联网应用。

参考

ESP8266 连接 OneNET 平台 DHT11 温湿度传感器数据采集与控制舵机

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

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