温湿度传感器HDC1080+8266+led+小程序交互-Arduino中文社区 - Powered by Discuz! Archiver

Leslie1995 发表于 2019-9-19 21:49

温湿度传感器HDC1080+8266+led+小程序交互

本帖最后由 Leslie1995 于 2020-7-1 12:27 编辑

前言
   最近获得一块8266,一直想做过远程交互之类的东西,正好可以最一下,已经很久没有使用arduino了,基本啥都不会,重头学习一下,下面是这几天做的东西,由于会点小程序,就使用小程序尝试来进行交互实验。
   主要功能:

[*]ESP8266通过HDC1080采集到温湿度,送到服务器,再到小程序显示,也可以网页或者其他方式。
[*]小程序能远程控制led的亮灭。
    这里很感谢群主奈何的温湿度传感器的测评和HDC1080例程,还有海神的dth11教程,虽然最终没有使用dth11,但是最初是用dth11,因为HDC1080还没有到,后面只是直接换成了HDC使用,同时也感谢博哥ESP8288系列,提供很多思路和基础知识。


一、材料

[*]esp8266-12(e)
[*]HDC1080高精度温湿度(原本用dth11,后来看了群主奈何的帖子就采用了这个)
[*]led
[*]电源
[*]备案服务器(小程序要求比较多,不使用小程序可以不需要)
[*]小程序测试号





二、原理


[*]ESP8266通过HDC1080采集到温湿度,送到服务器,再到小程序。ESP8266——》》服务器———》》小程序
[*]控制LED亮灭。小程序——》》服务器———》》ESP8266(进行交互)
[*]个人觉得使用用服务器的好处在于无论网页,还是APP,小程序都可以多端交互。
[*]注意:由于本人不太熟ESP8266,技术水平有限,这里是偷懒行为,由ESP8266发送数据到服务器的同时,服务器返回LED的状态,所以并不是完全实时控制,有延时,本实验使用的是每秒发送数据(向服务器发GET的请求),所以LED的状态的实际变化由delay的时间决定。



三、程序


[*]ESP8266的blink例程

这为什么需要一个blink例程呢,因为ESP8266的针脚和arduino并不通用,因为第一次使用ESP8266,被坑了,大体没有差别唯一差别在于初始化定义方式#define PIN D2//ESP8266
#define PIN 2//Arduino
blink例程/**
* ESP8266-12(E)blink例程
*@author 沉默
* @date 2019/09/21
*/
void setup() {
    pinMode(D2, OUTPUT);   // 初始化D2引脚为输出引脚,arduino不需要D,ESP8266需要D
}

void loop() {
    digitalWrite(D2, HIGH); // 亮灯
    delay(1000); // 延时1s
    digitalWrite(D2, LOW);// 灭灯
    delay(1000); // 延时1s
}

[*]HDC1080例程

参考群主奈何的帖子
[经验] 九种温湿度传感器使用对比体验
[分享] HDC1080温湿度传感器接入blinker演示
驱动库:https://github.com/closedcube/ClosedCube_HDC1080_Arduino
本人简化例程:
* HDC1080例程
*@author 沉默
* @date 2019/09/21
*/
#include <ClosedCube_HDC1080.h>
ClosedCube_HDC1080 hdc1080;

void setup()
{
Serial.begin(115200);
hdc1080.begin(0x40);
}

void loop()
{
Serial.print("Temperature: ");
Serial.print(hdc1080.readTemperature());
Serial.println( "℃");
Serial.print("Humidity: ");
Serial.print(hdc1080.readHumidity());
Serial.println( "%");
delay(2000);


}


[*]BasicHTTPClient例程

这个由博哥ESP8266系列,学习得来,这里非常感谢博哥ESP8266系列教程,从里面得到很多启发。



关于ESP8266基于arduino开发的相关库安装方法参考
[教程] 《博哥ESP8266系列1》- Arduino IDE for esp8266
BasicHTTPClient例程
这里完全可以有上面的库得到例程。
#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>

#include <WiFiClient.h>

ESP8266WiFiMulti WiFiMulti;

void setup() {

Serial.begin(115200);
// Serial.setDebugOutput(true);

Serial.println();
Serial.println();
Serial.println();

for (uint8_t t = 4; t > 0; t--) {
    Serial.printf(" WAIT %d...\n", t);
    Serial.flush();
    delay(1000);
}

WiFi.mode(WIFI_STA);
WiFiMulti.addAP("SSID", "PASSWORD");

}

void loop() {
// wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED)) {

    WiFiClient client;

    HTTPClient http;

    Serial.print(" begin...\n");
    if (http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html")) {// HTTP


      Serial.print(" GET...\n");
      // start connection and send HTTP header
      int httpCode = http.GET();

      // httpCode will be negative on error
      if (httpCode > 0) {
      // HTTP header has been send and Server response header has been handled
      Serial.printf(" GET... code: %d\n", httpCode);

      // file found at server
      if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
          String payload = http.getString();
          Serial.println(payload);
      }
      } else {
      Serial.printf(" GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      }

      http.end();
    } else {
      Serial.printf("[HTTP} Unable to connect\n");
    }
}

delay(10000);

[*]关于如何控制LED代码

主要通过indexOf()函数,检查服务器返回的LED状态,来控制LED的变化。
String payload = http.getString();
          if ( payload.indexOf("open") > 0) {
            Serial.println("open");
            digitalWrite(D3, HIGH);// 灭灯
          } else if (payload.indexOf("close") > 0) {
            Serial.println("close");
            digitalWrite(D3, LOW); // 亮灯
          } else {
            Serial.println("find null");
          }


[*]数值转换

由于HDC1080返回的数值是float(好像是double),需要转换成String才可以,发送到服务器。
//Temperature
float temp = hdc1080.readTemperature();
char tempstr;
sprintf(tempstr, "%.2f", temp);
String tempstring = tempstr;


[*]最终代码
DHC1080ESP8266.rar

四、服务器和小程序

每个人都架构服务器的语言不一样所以这里不贴出来,(主要我写得太烂了),小程序也是。这里主要提供一些思路,由于我使用是小程序,小程序正式上线,需要审核,所以我这里只是用了测试,另外小程序连的服务器需要有合法域名,最好有证书(https),所以不一定用服务器+小程序,可以直接本地架构一个服务器,采用网页式,或者像其他一样使用别人的一些物联网平台。


五、成果展示

主要接线实在太丑了,而且没有只有一个手机,有需要或有机会再补充图片或视频。


串口数据:



小程序:





六、补充

上面有说,由于ESP8266跟arduino的根脚有区别,具体详细的可以去查资料,这里补充一个ESP8266的iic的接线图。



单片机菜鸟 发表于 2019-9-20 09:08

看起来不错 麻雀虽小五脏俱全

Leslie1995 发表于 2019-9-20 09:53

单片机菜鸟 发表于 2019-9-20 09:08
看起来不错 麻雀虽小五脏俱全

博哥系列帮助很大,有什么问题都基本在里面可以找到解答,谢谢

单片机菜鸟 发表于 2019-9-20 10:42

Leslie1995 发表于 2019-9-20 09:53
博哥系列帮助很大,有什么问题都基本在里面可以找到解答,谢谢

https://blog.csdn.net/dpjcn1990以后可以参考这个 这个属于完整版本

Leslie1995 发表于 2019-9-20 12:31

单片机菜鸟 发表于 2019-9-20 10:42
https://blog.csdn.net/dpjcn1990以后可以参考这个 这个属于完整版本

好的,谢谢

cslcsl 发表于 2019-12-9 10:24

请问一下,小程序连服务器是怎么操作的你是连接了什么服务器

Leslie1995 发表于 2020-1-6 10:57

cslcsl 发表于 2019-12-9 10:24
请问一下,小程序连服务器是怎么操作的你是连接了什么服务器

唔,微信小程序可能为了兼容IOS,所以标准是跟IOS系统一样,需要HTTPS,所以需要备案的域名,指向服务器。我的是腾讯云的服务器,已经备案过了。微信公众平台那边填写,小程序和其他一样通过get/post请求就可以了。

mr7 发表于 2020-4-16 15:32

到时也试试测试这个传感器
页: [1]
查看完整版本: 温湿度传感器HDC1080+8266+led+小程序交互