ESP8266 连接 OneNET 平台 DHT11 温湿度数据上传 - Arduino 代码示例

本教程将介绍如何使用 ESP8266 模块连接到 OneNET 平台,并使用 Arduino 代码将 DHT11 温湿度传感器采集的数据上传到云端。

引入头文件

#include 'ESP8266.h'
#include 'dht11.h'
#include 'SoftwareSerial.h'
#include<Servo.h>

配置 ESP8266 WIFI 设置

#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();
  }
}

处理从 OneNET 获取的命令

如果 ESP8266 库中没有 available 函数,则可以使用其他方式接收从 OneNET 平台发送的命令。例如使用 ESP8266 的 AT 指令,通过 AT+CIPSTART 建立 TCP 连接,然后使用 AT+CIPSEND 发送数据,并使用 AT+CIPCLOSE 关闭连接。接收到的数据可以使用 AT+CIPRXGET 指令获取。下面给出一个简单的示例代码:

void loop() {
  // 建立 TCP 连接
  mySerial.println('AT+CIPSTART='TCP','api.heclouds.com',80');

  delay(1000); // 等待连接建立

  // 发送获取命令的请求
  mySerial.println('AT+CIPSEND');
  mySerial.println('GET /cmds?device_id=YOUR_DEVICE_ID&limit=1 HTTP/1.1');
  mySerial.println('Host: api.heclouds.com');
  mySerial.println('api-key: YOUR_API_KEY');
  mySerial.println('Connection: close');
  mySerial.println();

  delay(1000); // 等待数据返回

  // 获取返回的数据
  while (mySerial.available()) {
    char c = mySerial.read();
    Serial.print(c);
    // 根据返回的数据进行相应的操作
  }

  // 关闭 TCP 连接
  mySerial.println('AT+CIPCLOSE');
  delay(1000); // 等待连接关闭
}

注意

  • 确保您的 ESP8266 模块已正确连接到 Arduino 并安装了必要的库文件。
  • 填写代码中所需的 OneNET 设备 ID 和 APIKey。
  • 将代码中的 SSID 和 PASSWORD 替换为您的 Wi-Fi 网络名称和密码。
  • 此代码仅供参考,您需要根据自己的实际情况进行修改。

其他

  • ESP8266 连接 OneNET 平台的其他示例代码可以参考 OneNET 文档
  • DHT11 温湿度传感器的使用方法可以参考 DHT11 文档

总结

本教程介绍了如何使用 ESP8266 模块连接到 OneNET 平台,并使用 Arduino 代码将 DHT11 温湿度传感器采集的数据上传到云端。您可以根据本教程的代码进行修改,以实现更复杂的功能。

ESP8266 连接 OneNET 平台 DHT11 温湿度数据上传 - Arduino 代码示例

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

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