查看: 327|回复: 4

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

[复制链接]
  • TA的每日心情

    2019-9-21 15:36
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    发表于 2019-9-19 21:49 | 显示全部楼层 |阅读模式
    前言
         最近获得一块8266,一直想做过远程交互之类的东西,正好可以最一下,已经很久没有使用arduino了,基本啥都不会,重头学习一下,下面是这几天做的东西,由于会点小程序,就使用小程序尝试来进行交互实验。
         主要功能:
    • ESP8266通过HDC1080采集到温湿度,送到服务器,再到小程序显示,也可以网页或者其他方式。
    • 小程序能远程控制led的亮灭。
        这里很感谢群主奈何的温湿度传感器的测评和HDC1080例程,还有海神的dth11教程,虽然最终没有使用dth11,但是最初是用dth11,因为HDC1080还没有到,后面只是直接换成了HDC使用,同时也感谢博哥ESP8288系列,提供很多思路和基础知识。


    一、材料


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


    0CA5429884A4D37DC7F67C39ED7A74C1.jpg 016DCA5DA12FD5114D463274D16DD698.jpg


    二、原理


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



    三、程序


    • ESP8266的blink例程

    这为什么需要一个blink例程呢,因为ESP8266的针脚和arduino并不通用,因为第一次使用ESP8266,被坑了,大体没有差别唯一差别在于初始化定义方式

    kittenblock中小学创客名师推荐的图形化编程软件

    #define PIN D2//ESP8266
    #define PIN 2//Arduino

    blink例程

    kittenblock中小学创客名师推荐的图形化编程软件

    /**
     * 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
    本人简化例程:

    kittenblock中小学创客名师推荐的图形化编程软件

    /**
     * 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例程
    这里完全可以有上面的库得到例程。

    kittenblock中小学创客名师推荐的图形化编程软件

    /**
       BasicHTTPClient.ino
    
        Created on: 24.05.2015
    
    */
    
    #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("[SETUP] 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("[HTTP] begin...\n");
        if (http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html")) {  // HTTP
    
    
          Serial.print("[HTTP] 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("[HTTP] 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("[HTTP] 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的变化。

    kittenblock中小学创客名师推荐的图形化编程软件

     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才可以,发送到服务器。

    kittenblock中小学创客名师推荐的图形化编程软件

     //Temperature
      float temp = hdc1080.readTemperature();
      char tempstr[6];
      sprintf(tempstr, "%.2f", temp);
      String tempstring = tempstr;


    • 最终代码
    [url=]DHC1080ESP8266.rar[/url]

    四、服务器和小程序


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


    五、成果展示


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


    串口数据:
    AZ358S}6_B_209C{EI89AC4.png


    小程序:



    3A50F503E9D55C0D680D4D44A18F09C0.jpg

    六、补充


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

    DHC1080ESP8266.rar

    1.29 KB, 下载次数: 6

    最终代码

  • TA的每日心情
    开心
    2019-10-11 09:30
  • 签到天数: 755 天

    [LV.10]以坛为家III

    发表于 2019-9-20 09:08 | 显示全部楼层
    看起来不错 麻雀虽小五脏俱全
    打赏作者鼓励一下!
  • TA的每日心情

    2019-9-21 15:36
  • 签到天数: 16 天

    [LV.4]偶尔看看III

     楼主| 发表于 2019-9-20 09:53 | 显示全部楼层
    单片机菜鸟 发表于 2019-9-20 09:08
    看起来不错 麻雀虽小五脏俱全

    博哥系列帮助很大,有什么问题都基本在里面可以找到解答,谢谢
  • TA的每日心情
    开心
    2019-10-11 09:30
  • 签到天数: 755 天

    [LV.10]以坛为家III

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

    https://blog.csdn.net/dpjcn1990  以后可以参考这个 这个属于完整版本
    打赏作者鼓励一下!
  • TA的每日心情

    2019-9-21 15:36
  • 签到天数: 16 天

    [LV.4]偶尔看看III

     楼主| 发表于 2019-9-20 12:31 | 显示全部楼层
    单片机菜鸟 发表于 2019-9-20 10:42
    https://blog.csdn.net/dpjcn1990  以后可以参考这个 这个属于完整版本

    好的,谢谢
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【人脸识别】ESP-EYE 最新的板子到货了
    【人脸识别】ESP-EYE 最新
    1.我不会编程,最多抄几个一步一步的网络教程。 2.不知道为啥就是超级喜欢电子元件。
    2.4“TFT 触摸屏ILI9341,输入示例程序后能显示画面但是无法...
    2.4“TFT 触摸屏ILI9341,
    各位大神,小弟淘了一块2.4“触摸屏,驱动是ILI9341,集成电路板。 上传示例code
    使用arduino uno用蓝牙碰到温湿度问题
    使用arduino uno用蓝牙碰
    [*]硬件: [Arduino UNO] [*]接入方式: [*]blinker库版本: [最新刚下的] [*]开发环境
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    这次做了个8*8的RGB点阵
    这次做了个8*8的RGB点阵
    初次使用贴片,5050RGB用了64个,从设计到布线一次成功,编写了测试程序小灯都没问题
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表