文章目录
前言
物联网云平台能帮助我们实现各个设备的数据传输功能,本文简单介绍如何在乐为物联平台上进行简单的物联:用户注册、创建设备、创建传感器、请求API、查看数据。
需要的器件有:Arduino UNO板、DHT11温湿度传感器、ESP-01S Wi-Fi模块
(如果需要在串口模拟器上调试的,还需要器件:串口转USB)
使用的软件:Arduino IDE
(如果需要在串口模拟器上调试的,还需要软件:串口调试器)
需要下载的库:DHT11库
一、温湿度检测
1.1 接线
使用的器件:DHT11温湿度传感器、Arduino UNO板
连线:
Arduino | DHT11 |
12数字接口 | DATA |
5V | VCC |
GND | GND |
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 模块。
连线:
Arduino | DHT11 |
12数字接口 | DATA |
5V | VCC |
GND | GND |
Arduino | ESP-01S |
2数字接口(软串口RX) | TX |
3数字接口(软串口TX) | RX |
3.3V | 3.3V |
GND | GND |
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+CIPCLOSECLOSED
OK
AT+CIPSTART="TCP","www.lewei50.com",80CONNECT
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"}]
(上上行的空格是必须的!!!)