《Arduino实验》实验:ESP8266连接贝壳物联并上传DHT11温湿度数据

   日期:2021-04-04     浏览:240    评论:0    
核心提示:文章目录实验内容实验器件实验连线实验步骤实验代码实验结果实验内容使用 ESP8266 连接并连接贝壳物联平台 (需要对ESP8266进行透传联网),并温湿度数据上传。贝壳物联的使用手册。实验器件arduino UNO X 1ESP8266-01s X 1DHT11温湿度传感器 X 1USB数据烧写线 X 1面包板 x 1杜邦线 X 10实验连线ESP8266Arduino3v33.3VGNDGNDEN3.3VRXTXTXRX

文章目录

    • 实验内容
    • 实验器件
    • 实验连线
    • 实验步骤
    • 实验代码
    • 实验结果
    • 库文件

实验内容

使用 ESP8266 连接并连接贝壳物联平台 (需要对ESP8266进行透传联网),并温湿度数据上传。
贝壳物联的使用手册。

实验器件

  • arduino UNO X 1
  • ESP8266-01s X 1
  • DHT11温湿度传感器 X 1
  • USB数据烧写线 X 1
  • 面包板 x 1
  • 杜邦线 X 10

实验连线

ESP8266 Arduino
3v3 3.3V
GND GND
EN 3.3V
RX TX
TX RX
DHT11 Arduino
VCC 5V
GND GND
DATA 2

实验步骤

  1. 根据连线表格,将ESP8266、DHT11与Arduino开发板进行连接;
  2. 将代码中“DEVICEID”、“APIKEY”、“INPUTID”进行修改。
  3. 将Arduino开发板与电脑通过USB烧写线进行连接(上传时RX与TX不要连接,上传完再连接)
  4. 使用Arduino IDE将代码验证并上传
  5. 上传成功后,在贝壳物联平台查看数据。

实验代码

注意:记得修改代码中的“DEVICEID”、“APIKEY”、“INPUTID1”、“INPUTID2”。

#include <aJSON.h> //引用库文件
#include <dht11.h> //引用dht11库文件
#define dht11Pin 2 //定义温湿度针脚号为2号引脚
//============= 此处必须修改============
String DEVICEID = "设备ID"; // 你的设备ID=======
String APIKEY = "设备APIKEY"; // 设备密码==
String INPUTID1 = "数据接口1"; //接口ID1==============
String INPUTID2 = "数据接口2"; //接口ID2==============
//=======================================
dht11 dht;    //实例化一个对象
unsigned long lastCheckStatusTime = 0; //记录上次报到时间
unsigned long lastUpdateTime = 0;//记录上次上传数据时间
const unsigned long postingInterval = 40000; // 每隔40秒向服务器报到一次
const unsigned long updateInterval = 5000; // 数据上传间隔时间5秒
unsigned long checkoutTime = 0;//登出时间
void setup() { 
  pinMode(dht11Pin, OUTPUT); //通过定义将Arduino开发板上dht11Pin引脚(2号口)的工作模式转化为输出模式
  Serial.begin(115200);
  delay(5000);//等一会儿ESP8266
}
void loop() { 
  //每一定时间查询一次设备在线状态,同时替代心跳
  if (millis() - lastCheckStatusTime > postingInterval) { 
    checkStatus();
  }
  //checkout 50ms 后 checkin
  if ( checkoutTime != 0 && millis() - checkoutTime > 50 ) { 
    checkIn();
    checkoutTime = 0;
  }
  //每隔一定时间上传一次数据
  if (millis() - lastUpdateTime > updateInterval) { 
    int tol = dht.read(dht11Pin);    //将读取到的值赋给tol
    float temp = (float)dht.temperature; //将温度值赋值给temp
    float humi = (float)dht.humidity; //将湿度值赋给humi
    delay(1000);      //延时1秒
    update2(DEVICEID, INPUTID1, temp, INPUTID2, humi);
    lastUpdateTime = millis();
  }
  //读取串口信息
  while (Serial.available()) { 
    String inputString = Serial.readStringUntil('\n');
    //检测json数据是否完整
    int jsonBeginAt = inputString.indexOf("{");
    int jsonEndAt = inputString.lastIndexOf("}");
    if (jsonBeginAt != -1 && jsonEndAt != -1) { 
      //净化json数据
      inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1);
      int len = inputString.length() + 1;
      char jsonString[len];
      inputString.toCharArray(jsonString, len);
      aJsonObject *msg = aJson.parse(jsonString);
      processMessage(msg);
      aJson.deleteItem(msg);
    }
  }
}
//设备登录
//{"M":"checkin","ID":"xx1","K":"xx2"}\n
void checkIn() { 
  Serial.print("{\"M\":\"checkin\",\"ID\":\"");
  Serial.print(DEVICEID);
  Serial.print("\",\"K\":\"");
  Serial.print(APIKEY);
  Serial.print("\"}\n");
}
//强制设备下线,用消除设备掉线延时
//{"M":"checkout","ID":"xx1","K":"xx2"}\n
void checkOut() { 
  Serial.print("{\"M\":\"checkout\",\"ID\":\"");
  Serial.print(DEVICEID);
  Serial.print("\",\"K\":\"");
  Serial.print(APIKEY);
  Serial.print("\"}\n");
}

//查询设备在线状态
//{"M":"status"}\n
void checkStatus() { 
  Serial.print("{\"M\":\"status\"}\n");
  lastCheckStatusTime = millis();
}

//处理来自ESP8266透传的数据
void processMessage(aJsonObject *msg) { 
  aJsonObject* method = aJson.getObjectItem(msg, "M");
  if (!method) { 
    return;
  }
  String M = method->valuestring;
  if (M == "WELCOME TO BIGIOT") { 
    checkOut();
    checkoutTime = millis();
    return;
  }
  if (M == "connected") { 
    checkIn();
  }
}
//上传一个接口数据
//{"M":"update","ID":"2","V":{"2":"120"}}\n
void update1(String did, String inputid, float value) { 
  Serial.print("{\"M\":\"update\",\"ID\":\"");
  Serial.print(did);
  Serial.print("\",\"V\":{\"");
  Serial.print(inputid);
  Serial.print("\":\"");
  Serial.print(value);
  Serial.println("\"}}");
}
//同时上传两个接口数据调用此函数
//{"M":"update","ID":"112","V":{"6":"1","36":"116"}}\n
void update2(String did, String inputid1, float value1, String inputid2, float value2) { 
  Serial.print("{\"M\":\"update\",\"ID\":\"");
  Serial.print(did);
  Serial.print("\",\"V\":{\"");
  Serial.print(inputid1);
  Serial.print("\":\"");
  Serial.print(value1);
  Serial.print("\",\"");
  Serial.print(inputid2);
  Serial.print("\":\"");
  Serial.print(value2);
  Serial.println("\"}}");
}

实验结果

待我们上传完代码后,刷新贝壳物联首页面,即可看到设备在线状态。

点击数据接口右侧的数据查看按钮即可查看上传的数据情况。

温度接口数据情况。

湿度接口数据情况。

好了,大功告成!恭喜你!

库文件

需要的库文件,为了下载方便,我上传到了蓝奏云,如果失效了,请联系我。
aJson 密码:8uwy
dht11 密码:gsvs

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服