查看: 2109|回复: 0

氦氪云入门教程02-基于氦氪通用演示产品的温湿度计

[复制链接]
  • TA的每日心情
    开心
    2016-11-11 12:32
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2017-8-8 14:28 | 显示全部楼层 |阅读模式
    上一篇教程我们介绍了氦氪通用演示产品的功能,本篇教程我们来做一个具体的作品:一个带小夜灯的温湿度计。只做温湿度计功能可能不是很实用,所以我们增加了一个LED灯,作为小夜灯来使用。
    作品功能:
    APP端:
    1.控制小夜灯的亮灭。
    2.显示当前的温度和湿度。

    设备端:
    1.按钮控制小夜灯的亮灭。

    所需硬件:
    1.氦氪WiFi模块
    142206klcdarin1zalbp11.jpg

    氦氪WiFi模块的接线请参考文档氦氪模块硬件说明文档


    2.Arduino UNO
    这里就不贴照片了,使用其他型号的Arduino板子也行,我自己用的是兼容Arduino UNO的板子。

    3.DHT22温湿度传感器
    142145zneeh2ecp2qpvyq5.jpg

    4.RGB全彩LED
    142150e2l9fpdudbjyyvfk.jpg

    5.按钮
    142154tyl3mnm0nm3w2ggm.jpg

    硬件接线说明:
    214918for2tot4l11no44o.png

    在氦氪通用演示产品的编辑页面修改通信协议:
    151608pnqo3nrloo3qu6nl.png
    在编辑页面完成修改之后,我们得到的通信协议内容如下图所示:
    142919h9hc922kc9fs294c.png

    将氦氪WiFi模块与USB转串口模块连接,然后在电脑上用串口助手来模拟下该协议的数据收发。
    进入控制页面
    串口助手收到:48 16 02 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62
    所以当我们的Arduino收到的有效数据(即valid_data数组里的数据)为02 00时,我们需要上报当前的设备状态,即小夜灯的开关,当前温度和当前湿度,示例帧如下所示:
    48 16 01 01 01 00 02 11 34 00 00 00 00 00 00 00 00 00 00 00 00 A8

    在APP上点击小夜灯按键
    串口助手收到:48 16 02 01 02 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 65
    所以当我们的Arduino收到的有效数据(即valid_data数组里的数据)为02 01 01时,我们需要开小夜灯,然后再上报当前的设备状态,即小夜灯的开关,当前温度和当前湿度,示例帧如下所示:
    48 16 01 02 01 00 01 11 34 00 00 00 00 00 00 00 00 00 00 00 00 A8

    编写Arduino端的代码,代码如下:

    [kenrobot_code]#include <hekr_protocol.h>
    #include <DHT.h>

    #define DHTPIN 2
    #define DHTTYPE DHT22
    DHT dht(DHTPIN, DHTTYPE);
    u8 temp;
    u8 RecvBuffer[20];
    u8 uLedStatus = 2;
    int buttonPin = 4;
    int buttonIsPressing = 0;
    int redLedPin = 9;
    int greenLedPin = 10;
    int blueLedPin = 11;
    float ftHumidity = 0.0;
    float ftTemperature = 0.0;

    void setup() {
      Serial.begin(9600);
      pinMode(buttonPin, INPUT);
      pinMode(redLedPin, OUTPUT);
      pinMode(greenLedPin, OUTPUT);
      pinMode(blueLedPin, OUTPUT);
      dht.begin();
      HekrInit(SendChar);
      ledColor(0,0,0);
      delay(2000);
      getHumidityAndTemperature();
    }

    void loop() {
      GetData();
      DataHandle();
      
      if(digitalRead(buttonPin) == LOW)
      {
        delay(20);
        if(digitalRead(buttonPin) == LOW)
        {
          if(buttonIsPressing == 0)
          {
            if(uLedStatus == 2)
            {
              ledColor(255,255,255);
              uLedStatus = 1;
              getHumidityAndTemperature();
              valid_data[0] = 1;
              valid_data[1] = 0;
              valid_data[2] = uLedStatus;
              valid_data[3] = byte(int(ftTemperature));  
              valid_data[4] = byte(ftHumidity);
              for(int i=5; i<=16; i++)
              {
                valid_data = 0;
              }
              HekrValidDataUpload(17);     
              buttonIsPressing = 1;     
            }
            else
            {
              ledColor(0,0,0);
              uLedStatus = 2;
              getHumidityAndTemperature();
              valid_data[0] = 1;
              valid_data[1] = 0;
              valid_data[2] = uLedStatus;
              valid_data[3] = byte(int(ftTemperature));  
              valid_data[4] = byte(ftHumidity);
              for(int i=5; i<=16; i++)
              {
                valid_data = 0;
              }
              HekrValidDataUpload(17);     
              buttonIsPressing = 1;     
            }                 
          }
        }
      }
      if(digitalRead(buttonPin) == HIGH)
      {
        delay(100);
        if(digitalRead(buttonPin) == HIGH)
        {
          buttonIsPressing = 0;   
        }
      }
    }

    void getHumidityAndTemperature()
    {
      float h = dht.readHumidity();
      float t = dht.readTemperature();

      if (isnan(h) || isnan(t)) {
        return;
      }
      else
      {
        ftHumidity = h;
        ftTemperature = t;
      }
    }

    void SendChar(unsigned char ch)
    {
      Serial.write(ch);
      delay(2);
    }

    void GetData(void)
    {
      u8 i = 0;
      while(Serial.available())
      {
        RecvBuffer[i++] = Serial.read();
        if(RecvBuffer[0] != 0x48)
          i = 0;
        delay(2);  
      }
    }

    void ledColor(int red, int green, int blue){
          analogWrite(redLedPin,constrain(red,0,255));
          analogWrite(greenLedPin,constrain(green,0,255));
          analogWrite(blueLedPin,constrain(blue,0,255));
    }

    void DataHandle(void)
    {
      if(RecvBuffer[0] == HEKR_FRAME_HEADER)
      {
        temp = HekrRecvDataHandle(RecvBuffer);
        RecvBuffer[0] = 0x00;
        if(ValidDataUpdate == temp)
        {     
          if(valid_data[0] == 2)
          {
            if(valid_data[1] == 0) //收到状态查询命令
            {
              getHumidityAndTemperature();
              valid_data[0] = 1;
              valid_data[1] = 0;
              valid_data[2] = uLedStatus;
              valid_data[3] = byte(int(ftTemperature));  
              valid_data[4] = byte(ftHumidity);
              for(int i=5; i<=16; i++)
              {
                valid_data = 0;
              }
              HekrValidDataUpload(17);            
            }
            if(valid_data[1] == 1) //收到控制小夜灯命令
            {
              if(valid_data[2] == 1)
              {
                ledColor(255,255,255);
                uLedStatus = 1;  
              }
              if(valid_data[2] == 2)
              {
                ledColor(0,0,0);
                uLedStatus = 2;
              }
              getHumidityAndTemperature();
              valid_data[0] = 1;
              valid_data[1] = 0;
              valid_data[2] = uLedStatus;
              valid_data[3] = byte(int(ftTemperature));  
              valid_data[4] = byte(ftHumidity);
              for(int i=5; i<=16; i++)
              {
                valid_data = 0;
              }
              HekrValidDataUpload(17);                  
            }
          }
        }
      }
    }
    [/kenrobot_code]
    我使用的Arduino IDE版本是1.6.5。
    需要在Arduino IDE里的Library Manager中安装一下名字为"DHT sensor library"的DHT传感器的库,安装完毕之后,请将C:Users你的电脑用户名DocumentsArduinolibraries目录下的DHT文件夹改个名字或者删掉,因为这是安装Arduino IDE时预装的DHT传感器库,会和我们新安装的库文件名冲突。
    附件中的Hekr.zip是我们的Arduino库文件,可以在Arduino IDE中使用Add .ZIP Library将该库导入,最新版本和说明文档可以在以下链接中获得:https://github.com/HEKR-Cloud/HE ... ter/example/Arduino


    将Arduino端的程序编译完毕并上传至Arduino UNO之后,将所有硬件模块按照前文中提到的硬件接线说明连接起来,这样我们的基于氦氪通用演示产品的带小夜灯的温湿度计就完成了,打开丛云APP,进入我们之前绑定的氦氪通用演示产品的设备控制页面,就可以对我们的小夜灯进行控制了,在该页面我们还可以看到当前的温湿度。
    221505kqqcngg7ieamqquh.png

    231123pizso1rsgodrahg1.png
    在调试页面我们可以看到APP和设备间的数据收发过程。
    231129vmwkm7ej32ucaw7w.png

    Hekr.zip

    6.31 KB, 下载次数: 12

    氦氪Arduino库

    hygrothermograph-base-on-demo-page.zip

    1.18 KB, 下载次数: 6

    本作品的Arduino端代码

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

    本版积分规则

    热门推荐

    中文 字库 的8针 OLED 12864模块 arduino
    中文 字库 的8针 OLED 128
    屏幕电路SPI连线: 中文字库OLED Arduino UNO GND GND
    [限时福利]5分钟带你快速了解新一代开发板:M5STACK
    [限时福利]5分钟带你快速
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    UNO13号引脚使用输入上拉时异常?
    UNO13号引脚使用输入上拉
    如图。10号引脚和13号引脚都设置为输入上拉模式,并且这两个引脚都是悬空的。但是输出
    一个简单的门禁系统
    一个简单的门禁系统
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表