使用Arduino、DHT11温湿度传感器 和 ESP-01S 实现在乐为物联上传输数据

文章目录


前言

物联网云平台能帮助我们实现各个设备的数据传输功能,本文简单介绍如何在乐为物联平台上进行简单的物联:用户注册、创建设备、创建传感器、请求API、查看数据。

需要的器件有:Arduino UNO板DHT11温湿度传感器ESP-01S Wi-Fi模块

(如果需要在串口模拟器上调试的,还需要器件:串口转USB

使用的软件:Arduino IDE

(如果需要在串口模拟器上调试的,还需要软件:串口调试器

需要下载的库:DHT11库


一、温湿度检测

1.1 接线

使用的器件:DHT11温湿度传感器、Arduino UNO板

连线:

ArduinoDHT11
12数字接口DATA
5VVCC
GNDGND

1.2 Arduino代码

这里我们需要先在Arduino IDE中下载DHT11库。

(网上下载的dht、dht11库也行)

然后我们可以使用库中提供的示例代码,检测温湿度传感器能否成功传输数据:

#include <DHT11.h>
DHT11 dht11(12); // dht11的数字引脚为12

void setup() {
    Serial.begin(9600);
}

void loop() {
    int temperature = 0;
    int humidity = 0;
    int result = dht11.readTemperatureHumidity(temperature, humidity);

    if (result == 0) {
        Serial.print("Temperature: ");
        Serial.print(temperature);
        Serial.print(" °C\tHumidity: ");
        Serial.print(humidity);
        Serial.println(" %");
    } else {
        Serial.println(DHT11::getErrorString(result));
    }
    delay(2000);
}

运行结果:

到此,表示温湿度传感器可正常工作。 

二、ESP-01S WiFi模块调试

这步可以跳过,但是如果在第四步中你的ESP-01S无法联网,推荐回来这步看看。

(注意:在连接WiFi时,请确保你的热点或者路由器的WiFi网络频带是2.4GHz

(苹果手机热点具体的设置就是热点设置中打开“最大兼容”)

2.1 接线

如下图,将ESP-01S Wi-Fi模块 与 串口转USB 连接,然后插入电脑中:

2.2 串口调试 

打开串口调试器,这里我使用的软件是友善串口调试助手。

开始发送命令:

① 发送命令AT;

响应:OK

② 发送命令AT+CWMODE=1,将工作状态设置为Station模式(WiFi模式);

响应:OK

③ 发送命令AT+CWJAP="WiFi名","WiFi密码"。

响应:WIFI CONNECTED

WIFI GOT IP

OK

自此,成功连接WiFi:

三、乐为物联

乐为物联官网地址:首页 - 乐联网 - 乐为物联开放平台 - 物联网云服务运营专家

进入乐为物联官网,创建乐为物联账户,并获取如下信息:

① userkey、 ② 设备标识(网关) ③ 传感器标识。

3.1 userkey

在乐为物联中,选择“我的账户”-->“设置个人信息”中,查看自己的UserKey。

3.2 新建设备并获取设备标识

在乐为物联中,选择“我的物联”-->“我的设备”中,新建设备。

设备新建好后,要记得这个标识,后面会用到:

这里我的设备标识是02。

3.3 新建设备对应的传感器,并获取传感器标识

在乐为物联中,选择“我的物联”-->“传感器与控制器”中,新建传感器。

这里我们使用温湿度传感器,故需要新建两个传感器:温度和湿度。

同理,我们需要记住传感器的标识,后面调用API时会用到:

3.4 在线API测试工具

乐为物联官方开发者指南:平台动态 - 乐联网 - 乐为物联开放平台 - 物联网云服务运营专家

乐为物联API在线测试工具:APITest - 乐联网 - 乐为物联开放平台 - 物联网云服务运营专家

这里我们进入乐为物联官方提供的API在线测试工具:

这里有几个部分需要我们进行修改:

① UserKey  ② 网关号(设备标识) ③ Name(传感器标识)

也就是我们上面提到的要记住的几个标识。

然后修改成我们对应的UserKey和标识后,就可以调用接口,测试是否能够调用API:

从返回的数据来看,我们成功调用了API,这里我们可以在乐为物联的实时数据上验证:

从上图我们可以看出,我们API是调用成功的,接下来就可以开始测试用WiFi模块对发送对应的AT命令了。

四、实现在乐为物联上传输数据

4.1 接线

使用的器件:DHT11温湿度传感器、Arduino UNO板、ESP-01S WiFi 模块。

连线:

ArduinoDHT11    
12数字接口DATA
5VVCC
GNDGND
Arduino ESP-01S              
2数字接口(软串口RX)TX
3数字接口(软串口TX)RX
3.3V3.3V
GNDGND

4.2 Arduino代码

代码:

#include <SoftwareSerial.h>
#include <DHT11.h>
#define POST_TIME 20000
SoftwareSerial espSerial(2, 3);     // RX, TX
DHT11 dht11(12);                    // 12号引脚用于连接温湿度传感器
const String ssid = "...";       // Wi-Fi名
const String password = "..."; // Wi-Fi密码
const String userkey = "..."; // userkey

void setup() 
{
  Serial.begin(115200);
  espSerial.begin(115200);
  connectToWiFi();
}

void loop() 
{
  /* 读取温湿度 */
  int temperature = 0;
  int humidity = 0;
  int result = dht11.readTemperatureHumidity(temperature, humidity);
  String postData = "[{\"Name\":\"T1\",\"Value\":\"" + String(temperature) + "\"},{\"Name\":\"H1\",\"Value\":\"" + String(humidity) + "\"}]";
  /* 调用的api以及发送数据 */
  sendHttpPostRequest("http://www.lewei50.com/api/V1/gateway/UpdateSensors/02", postData); 
  delay(POST_TIME);
}

void connectToWiFi() 
{
  bool wifiConnected = false;
  Serial.println("AT+CWJAP=\"" + ssid + "\",\"" + password + "\"" + "\r\n");
  espSerial.println("AT+CWMODE=1"); // 设置模式为 Station mode(如果在串口调试器已经调试好了的,可以不用在这里设置)
  while (!wifiConnected) 
  {
    espSerial.println("AT+CWJAP=\"" + String(ssid) + "\",\"" + String(password) + "\"" + "\r\n"); // 连接WiFi
    delay(2000);
    if (espSerial.find("OK")) {
      Serial.println("Connected to WiFi.");
      wifiConnected = true; // 设置标志位为true,跳出循环
      break;
    } else {
      Serial.println("Connection failed. Retrying...");
      delay(2000);
    }
  }
}

void sendHttpPostRequest(const String& url, const String& postData) {
  String host = "www.lewei50.com";
  int port = 80;

  espSerial.println("AT+CIPSTART=\"TCP\",\"" + host + "\"," + String(port));
  delay(2000);

  if (espSerial.find("CONNECT")) {
    Serial.println("Connect Succesfully\n"); // 测试能否发送数据
    /* AT+CIPSEND给出数据长度 */
    String cmd = "AT+CIPSEND=";
    cmd += String(postData.length() + 164); 
    espSerial.println(cmd);

    /* 连接成功后便可发送数据 */
    if (espSerial.find(">")) {
      Serial.println("begin to send!!!"); 

      espSerial.println("POST /api/V1/gateway/UpdateSensors/02 HTTP/1.1");
      espSerial.println("userkey: " + userkey);
      espSerial.println("Host: "+ host);
      espSerial.println("Content-Length: " + String(postData.length()));
      espSerial.println();
      espSerial.print(postData);

      // 测试:用于检测输出是否正确
      Serial.println("----------------------------------------------");
      Serial.println("POST /api/V1/gateway/UpdateSensors/02 HTTP/1.1"); 
      Serial.println("userkey: " + userkey);
      Serial.println("Host: "+host);
      Serial.println("Content-Length: " + String(postData.length()));
      Serial.println();
      Serial.println(postData);
      Serial.println("----------------------------------------------");
    } else {
      Serial.println("Failed to initiate data transmission.");
    }
  } else {
    Serial.println("Failed to connect to server.");
  }
}

运行结果:

① 串口显示:

② 乐为物联:

至此实现从Arduino UNO 、 ESP-01S 和 DHT11温湿度传感器实现与乐为物联的通信。 


常见问题

1 WiFi连接不上的问题

这里需要注意,我们热点或路由器的WiFi的网络频段需要在2.4GHz:

2 串口调试器无法打开串口的问题

问题示例:

原因:

① 这里有时是因为驱动的问题,我们需要去下载串口驱动,安装完成后,便可正常打开串口:

驱动下载链接:驱动下载链接

② 有时候我们需要注意是否是因为打开了多个占用串口的软件,例如同时开了Arduino IDE的串口监视器和串口调试器。

3 传输数据给API,然后反馈Invalid post data format

问题示例:

AT+CIPSTART="TCP","www.lewei50.com",80

ALREADY CONNECTED

ERROR
AT+CIPCLOSE

CLOSED

OK
AT+CIPSTART="TCP","www.lewei50.com",80

CONNECT

OK
AT+CIPSEND=222


OK

busy s...

Recv 222 bytes

SEND OK

+IPD,324:HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Access-Control-Allow-Origin: https://ai.lewei50.com
Access-Control-Allow-Headers: Content-Type,userkey, Authorization
Date: Mon, 27 May 2024 14:24:17 GMT
Content-Length: 57

{"Successful":false,"Message":"Invalid post data format"}CLOSED

这是因为我们发送的数据不符合规范API规定的数据格式,这里我是改了顺序和删了一些语句之后才实现API的成功调用的:

原本发送的数据(有问题):

AT+CIPSEND=219

POST /api/V1/gateway/UpdateSensors/02 HTTP/1.1
Host: www.lewei50.com
Content-Type: application/json
userkey: ae8fa6d3058041499820dd0810127...
Content-Length: 55

修改后的发送格式:

修改成如上图的格式便可正常响应。

(上图格式只是可解的一种,应该还可以通过其他格式的数据请求。)

总结

1. 上文只是简单地做了一个乐为物联的传感器响应数据到乐为物联平台,如果使用不同的平台,可能调用的API不同,请求的数据格式也可能不一样,需要工具官方文档进行修改。

2. 上文ESP-01S主要通过AT命令来实现其功能,例如:

① 连接WiFi

AT + CWMODE = 1

AT + CWJAP="WiFi名","WiFi密码"

② TCP连接

AT+CIPSTART="TCP","www.lewei50.com",80

③ 发送数据请,指定发送数据大小

AT+CIPSEND=223

④ 指定完毕后,发送数据

POST /api/V1/gateway/UpdateSensors/02 HTTP/1.1

userkey: ae8fa6d3058041499820dd0810127...

Host: open.lewei50.com

Content-Length: 55

[{"Name":"T1","Value":"24"},{"Name":"H1","Value":"45"}]

上上行的空格是必须的!!!

要下载dht11 arduino库,可以按照以下步骤进行操作: 1. 打开Arduino官方网站(https://www.arduino.cc/)或其他Arduino相关网站。 2. 在网站的搜索框中输入“dht11库”或“dht11 Arduino库”。 3. 在搜索结果中找到与dht11相关的库文件。通常,库文件的命名会包含“dht11”或与之相关的关键词。 4. 点击库文件的下载链接或按钮。这将在计算机中下载一个zip压缩文件。 5. 解压缩下载的zip文件。可以使用文件解压缩软件(如WinRAR或7-Zip)来完成此操作。 6. 打开Arduino IDE(集成开发环境)软件。 7. 在Arduino IDE中,选择“Sketch”(菜单栏上的选项),然后选择“包含库”或“引入库”(通常是在子菜单中)。 8. 在弹出的库管理器窗口中,点击“添加库”或“导入库”按钮。 9. 浏览计算机中解压缩的文件夹,并选择其中的库文件。库文件通常以“.zip”或“.h”为扩展名。 10. 点击“安装”或“导入”按钮,等待片刻,直到库文件成功安装。 11. 确认库文件已成功安装后,可以在Arduino IDE的“示例”菜单中找到dht11的示例代码。选择感兴趣的示例代码,并将其打开。 12. 现在,你就可以使用dht11库和Arduino开发板来编写程序并使用dht11传感器了。 以上是下载dht11 arduino库的一般步骤,具体操作可能因个人实际情况而有所不同。如果遇到任何问题,可以在Arduino社区或相关论坛中寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值