ESP8266模块上传温湿度传感器的数据到云平台(乐为物联)

ESP8266相关AT指令

1. AT:检测模块是否正常工作,返回“OK”表示正常。 1. AT+RST:重启模块。 1. AT+CWMODE=:设置Wi-Fi模式,可以是以下几种:
* 1:Station模式,连接到一个Wi-Fi网络。
* 2: SoftAP模式,创建一个Wi-Fi热点。
* 3: SoftAP+Station模式,同时作为热点和连接到一个Wi-Fi网络。
  1. AT+CWJAP="","":连接到指定的Wi-Fi网络,为网络名称,为密码。
  2. AT+CWLAP:列出附近可用的Wi-Fi网络列表。
  3. AT+CIPSTART="","",:建立TCP或UDP连接,可以是"TCP"或"UDP",为目标IP地址,为目标端口号。
  4. AT+CIPSEND=:发送数据前设置发送数据的长度,为数据长度。
  5. AT+CIPCLOSE:关闭当前的TCP或UDP连接。

ESP8266连线方式

arduino esp8266
3.3v 3v3
RX TX
TX RX
GND GND

RX和TX分别是接收端和发送端,arduino默认是数字引脚0和1,可以使用SoftwareSerial.h库的SoftwareSerial设置
SoftwareSerial esp8266(RX,TX)
当然,这里的RX和TX是对drduino板来说的

温度传感器的使用

以前的博客

云平台

乐为物联官网地址
在上面添加设备和传感器,博客其他人有参见下面(我不生产知识,我只是...)
CSDNESP8266上传数据到乐联网简单教程
CSDNESP8266WiFi模块接入乐为物联平台
两都介绍了AT相关的指令,(还有下面最重要的一个东西)。第二个还有添加完成后模拟测试的教程,添加设备和API测试官网教程也有,但是没有HTTP的测试教程(第2个有)
上面测试做完了可以使用下面的串口调试助手和网络调试助手,串口调试助手和Arduino IDE的串口监视器差不多,通过串口发AT指令调试ESP模块;网络调试助手验证下面的
链接: 百度网盘
提取码:yv9x

传输格式

ESP8266除非烧录代码进去,不然一般是使用AT指令的方式来传数据到云平台; 步骤:设置STA模式(AT+CWMODE=1)->连WIFI(AT+CWJAP=)->和服务器建立连接(AT+CIPSTART=)->发送数据(AT+CIPSEND)

1.API格式
直接上图了,最开始是做这个,后面不知道是硬件的原因还是其他原因一会能传上数据一会直接挂掉,备注:使用这个要设置透传模式(AT+CIPMODE=1透明传输),透传模式发送数据不指定传输的字节数,也就是ESP连接好云平台后使用AT+CIPSEND指令直接传数据,这样传输的时候不好控制,看资料说传完数据后再传一个"+++"表示结束(待验证)

上面的信息在这个链接可以看见 一个在2013年发布的疑似用户写的通讯协议的说明指南

2.通过HTTP传数据,端口80,IP和上面相同,格式如下:
POST /api/V1/gateway/Updatesensors/02 HTTP/1.1
userkey: *********
Host: open.lewei50.com
Content-Length: 26
jonnection: close
[{"Name":"T1","Value":20}]

最后一行的数据叫做json格式,T1是你云平台上传感器的名字,20是值;在实现的时候可以传多个数据--温度&湿度,用DHT库读出来后强转为字符串,在把字符串整理成上面这种格式(需要使用c语言转义字符),发送就ok(在之前可以使用网络调试助手传一个固定数据试试,验证格式有没有弄错)

话不多说代码来罗

点击查看代码
#include <SoftwareSerial.h>
#include <DHT.h>
SoftwareSerial espSerial(9, 10);//rx,tx
DHT dht;
const String ssid = "ikun";//我是ikun你记住
const String password = "ikun20022002";
const String userkey = "写你自己的";
void setup() {
  Serial.begin(115200);
  espSerial.begin(115200);
  GetWiFi();
  dht.setup(3);//传感器
}

void loop() {

  int humidity = dht.getHumidity();
  int temperature = dht.getTemperature();
  String post = "[{\"Name\":\"传感器名字\",\"Value\":\"" + String(temperature) + "\"},{\"Name\":\"传感器名字2\",\"Value\":\"" + String(humidity) + "\"}]";
  send(post);
  delay(15000);
}

void GetWiFi() {
  bool wififlag = false;
  Serial.println("AT+CWJAP=\"" + ssid + "\",\"" + password + "\"" + "\r\n");
  espSerial.println("AT+CWMODE=1");
  while (!wififlag) {
    espSerial.println("AT+CWJAP=\"" + String(ssid) + "\",\"" + String(password) + "\"" + "\r\n");
    delay(2000);
    if (espSerial.find("OK")) {
      Serial.println("Connected to WiFi.");
      wififlag = true;
      break;
    } else {
      Serial.println("Connection failed. Retrying...");
      delay(2000);
    }
  }
}

void send(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("TCP Connect Succesfully");

    String cmd = "AT+CIPSEND=";
    cmd += String(postData.length() + 164);
    espSerial.println(cmd);
    if (espSerial.find(">")) {
      Serial.println("Ready,sending");
      espSerial.println("POST /api/V1/gateway/UpdateSensors/写自己的设备标识 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("SUCCESS");
    } else {
      Serial.println("CIPSEND Erro");
    }
  } else {
    Serial.println("Failed CIPSTART.");
  }
}

说明:如果你上传的数据是0可能是因为我们使用的温湿度传感器的库不同,导致温度湿度数据不能正确读出来,上面传感器的使用的博客有我使用的库的下载链接

总结

原理:连接Arduino uno、ESP8266、温湿度传感器,然后通过代码把需要发送的数据整理成固定数据,再通过SoftwareSerial.h库通过串口发送AT指令给ESP,用AT指令来完成连接WIF、连接云平台、发送数据的功能。只要数据格式没错,乐为物联会根据你传的数据把湿度和温度更新到你的云设备上

后续实验的思考

自己做一个简易云平台思路:Web页面展示数据+数据库存储历史温湿度+支持HTTP传输+后端发简单数据给ESP8266(实现控制小灯)

特别鸣谢:方委员

posted @ 2024-05-28 23:29  moonKing  阅读(259)  评论(0编辑  收藏  举报