用户
 找回密码
 立即注册

QQ登录

只需要一步,快速开始

搜索

85

主题

155

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
42461
2017-11-9 19:26:39 geeiot 管理员 楼主 3545
冬天马上就到了,屋里面又冷又干燥。随手使用闲置的ESP12E和DHT22模块搞了一个小小的电子温度计。可以随时在手机上面查看和统计当天室内的温湿度(其实我觉得意义不大啊)。
先放一个预览图:
QQ截图20171109191934.jpg

6BD17150109E13AD33968FD291D953DD.jpg

一、需要的材料
1、ESP12E(或者ESP8266)。我使用的mini迷你版NodeMcu,免去焊接步骤了。
QQ截图20171109185130.jpg

2、杜邦线3条
3、DHT11/22模块一块(注意:我使用的DHT22,使用DHT11的话,需要修改一下程序)
接线:
ESP12E                DHT22
    5V    ---------   VCC
  GND  ---------   GND
GPIO2  ---------  DATA
QQ截图20171109192631.jpg

二、申请平台账号
有了硬件,总要有软件呀。自己写太麻烦,于是去NETHOME申请了一个账号,使用他们的接口,分分钟搞定数据的显示(如预览图)。
1、注册账号
http://center.easylinker.net/register/index.html
填写好相关信息,然后就OK了。
2、获取连接KEY
这个KEY比较重要,是连接EasyLinker服务器的关键。登录之后在个人中心获取。
QQ截图20171109185551.jpg

三、使用Arduino IDE编写ESP WIFI模块程序。
要注意的是,本来的IDE是不支持ESP8266的,需要安装相关的库。
1、为Arduino IDE安装相关的库
打开Arduino,选择“首选项”,在“附加开发板管理器网址”中填入以下网址:
  1. http://arduino.esp8266.com/stable/package_esp8266com_index.json
复制代码
QQ截图20171109185946.jpg

2、打开工具->开发板->开发板管理器
QQ截图20171109190108.jpg

3、等待开发板管理器启动完成后,移动到开发板管理器的最下方,可以看到一个esp8266 by esp8266 Community,右下角有个选择版本,选好2.0.0之后点击安装,因为是连接到github上下载,下载可能有点慢。
QQ截图20171109190152.jpg

4、下载完成之后可以在开发板选项中看到ESP8266 Module,一般开发就是用Generic ESP8266 Module就行了其它的设置默认。
QQ截图20171109190418.jpg

5、烧写程序
复制以下程序,然后修改13、14账号和连接KEY为申请到的。16、17行为自己家里面的WIFI。然后烧录到ESP8266,上电。代码和库文件在文末有下载。
  1. #include <ArduinoJson.h>
  2. #include <ESP8266WiFi.h>
  3. #include <DHT.h>

  4. //Define DHT Type
  5. #define DHTTYPE DHT22
  6. // DHT Sensor Pin
  7. const int DHTPin = 2;
  8. // Initialize DHT sensor
  9. DHT dht(DHTPin, DHTTYPE);

  10. //用户名和KEY,修改为在Easylinker申请的
  11. String userid = "*********";
  12. String passwd = "*****************************";
  13. //WIFI SSID和密码 修改为自己家的
  14. const char *ssid = "Geeiot";
  15. const char *wifiPasswd = "www.geeiot.net";
  16. //服务器地址和端口,不用修改
  17. const char *serverip = "easylinker.net";
  18. int serverport = 8787;

  19. //WIFI对象
  20. WiFiClient client;

  21. void setup() {
  22.   dht.begin();
  23.   //Setup Serial
  24.   Serial.begin(115200);
  25.   //Set WIFI mode
  26.   WiFi.mode(WIFI_STA);
  27.   //Set hosttname
  28.   WiFi.hostname("HUM");
  29.   //Login server
  30.   LoginServer();
  31. }

  32. void loop() {
  33.   //接收服务器数据并处理
  34.   GetMsg();
  35.   //获取温湿度然后发送信息到Easylinker
  36.   GetTemHum();
  37.   //delay 3秒,就是每隔三秒钟发送一次数据。
  38.   delay(3000);
  39. }

  40. //============================================================
  41. //             连接控制,WIFI连接,消息处理
  42. //============================================================

  43. /*
  44.    作用1:连接WiFi和连接服务器
  45.    作用2:登录服务器
  46.    流程:先连接WIFI,当连接WIFI成功之后,连接服务器,当服务器连接成功之后,
  47.    发送登录信息,登录服务器
  48. */
  49. void LoginServer()
  50. {
  51.   //登陆状态
  52.   bool isLogin = false;
  53.   String logStr = "@,1," + userid + "," + passwd + ",in,0,7";
  54.   //如果WIFI没有连接,那么连接WIFI
  55.   if (WiFi.status() != WL_CONNECTED) {
  56.     //连接WIFI
  57.     WiFi.begin(ssid, wifiPasswd);
  58.     Serial.print("Try to connect wifi ");
  59.     Serial.print(ssid);
  60.     Serial.println(".");
  61.     while (WiFi.status() != WL_CONNECTED) //WiFi.status() ,这个函数是wifi连接状态,返回wifi链接状态
  62.     {
  63.       delay(500);
  64.       Serial.print("Waiting...");
  65.     }
  66.     Serial.println(".Connect WiFi successful!");
  67.     Serial.print("WifiClient IP is ");
  68.     Serial.println(WiFi.localIP());
  69.   }
  70.   //如果未连接服务器,那么连接服务器
  71.   if (!client.connected())
  72.   {
  73.     Serial.print("Try to connect server ");
  74.     Serial.println(serverip);
  75.     //WIFI连接成功后连接服务器
  76.     while (!client.connected())
  77.     {
  78.       if (!client.connect(serverip, serverport))
  79.       {
  80.         delay(500);
  81.       }
  82.       Serial.print("Waiting...");
  83.     }
  84.     Serial.println(".Connect easylinkersuccessful!");
  85.     Serial.println("Try to login nethome!");
  86.   }
  87.   while (!isLogin)
  88.   {
  89.     SendMsg(logStr);  //发送登录信息
  90.     delay(1000);
  91.     if (client.available())
  92.     {
  93.       String wifiRead = "";
  94.       //透传数据
  95.       while (client.available())
  96.       {
  97.         wifiRead += char(client.read());
  98.         delay(1);
  99.       }
  100.       if (wifiRead.length() != 0)
  101.       {
  102.         DieRecvMsg(wifiRead);
  103.         DynamicJsonBuffer  jsonBuffer(200);
  104.         JsonObject& root = jsonBuffer.parseObject(wifiRead);
  105.         if (root.success())
  106.         {
  107.           String jsonType = root["type"];
  108.           if (jsonType == "success")
  109.           {
  110.             String loginState = root["err_id"];
  111.             if (loginState == "1101")
  112.             {
  113.               Serial.println("Easylinkerlogin successful!");
  114.               isLogin = true;
  115.             }
  116.           }
  117.         }
  118.       }
  119.       delay(1000);
  120.     }
  121.   }
  122.   Serial.flush();
  123. }

  124. /*
  125.    接收来自服务器的信息
  126. */
  127. int GetMsg()
  128. {
  129.   if (WiFi.status() != WL_CONNECTED || !client.connected())
  130.   {
  131.     DieError("Disconnect with easylinkerserver, reconnecting!");
  132.     LoginServer();
  133.     return -1;
  134.   }
  135.   //如果有信息
  136.   if (client.available())
  137.   {
  138.     String wifiRead = "";
  139.     //接收数据
  140.     while (client.available())
  141.     {
  142.       wifiRead += char(client.read());
  143.       delay(1);
  144.     }
  145.     if (wifiRead.length() != 0)
  146.     {
  147.       DieRecvMsg(wifiRead);
  148.       DynamicJsonBuffer  jsonBuffer(200);
  149.       JsonObject& root = jsonBuffer.parseObject(wifiRead);
  150.       if (root.success())
  151.       {
  152.         String jsonType = root["type"];
  153.         if (jsonType == "error")
  154.         {
  155.           String err_id = root["err_id"];
  156.           //未登录
  157.           if (err_id == "1154")
  158.           {
  159.             LoginServer();
  160.           }
  161.         }
  162.       }
  163.       else
  164.       {
  165.         DieError("Json root failed");
  166.       }
  167.     }
  168.   }
  169.   Serial.flush();
  170. }

  171. /*
  172.    向服务器发送消息
  173. */
  174. int SendMsg(String msg)
  175. {
  176.   if (msg.length() != 0 && client.connected())  //如果msg长度不为0,并且连接到了服务器
  177.   {
  178.     DieSendMsg(msg);
  179.     size_t counti = msg.length();
  180.     char sbuf[counti];
  181.     strcpy(sbuf, msg.c_str());
  182.     client.write(sbuf, counti);
  183.     return 0;
  184.   }
  185.   else
  186.   {
  187.     return -1;
  188.   }
  189.   Serial.flush();
  190. }

  191. /*
  192. * 获取温湿度然后上传
  193. */
  194. void GetTemHum()
  195. {
  196.   float h = dht.readHumidity();
  197.   float t = dht.readTemperature();
  198.   if (isnan(h) || isnan(t)) {
  199.     DieError("Failed to read from DHT sensor!");
  200.     return;
  201.   }
  202.   else
  203.   {
  204.     String data = "@,1," + userid + ",data,1," + t + "," + h + ",0,0,0,0,0,0,0,0,0,17";
  205.     SendMsg(data);
  206.   }
  207. }

  208. /*
  209.    显示错误信息
  210. */
  211. void DieError(String msg)
  212. {
  213.   Serial.print("Error:");
  214.   Serial.println(msg);
  215.   Serial.flush();
  216. }

  217. /*
  218.    显示收到的信息
  219. */
  220. void DieRecvMsg(String msg)
  221. {
  222.   Serial.print("Recv:");
  223.   Serial.println(msg);
  224.   Serial.flush();
  225. }

  226. void DieSendMsg(String msg)
  227. {
  228.   Serial.print("Send:");
  229.   Serial.println(msg);
  230.   Serial.flush();
  231. }
复制代码
四、完成
正常情况下,登录EasyLinker控制台首页就可以看到有数据啦。需要曲线图的话,打开模块商城,购买fd1和fd2模块就行(免费的)。
QQ截图20171109191555.jpg

别问我为什么要选择fd1和fd2,因为我还没写完。
程序里面默认使用的是fd1和fd2两个数据,更多的话,可以去查看NETHOME的API(http://doc.easylinker.net/index.php?s=/1&page_id=22)。
当然,也可以用NETHOME实现更多的功能,自己研究啦。
代码和库文件下载:
游客,如果您要查看本帖隐藏内容请回复

使用道具 举报 回复
2018-1-7 22:00:30 qingf120 来自手机 新手上路
沙发
谢谢分享 但接口的网址好像不通啊  
使用道具 举报 回复 支持 反对
qingf120 发表于 2018-1-7 22:00
谢谢分享 但接口的网址好像不通啊

这几天换了接口,备案还没下来。。新的接口地址:easylinker.net
使用道具 举报 回复 支持 反对
谢谢,辛苦了
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册