SHTC3基于BLINKER的高精度温湿度记录-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4891|回复: 11

[分享] SHTC3基于BLINKER的高精度温湿度记录

[复制链接]
发表于 2020-4-19 15:25 | 显示全部楼层 |阅读模式
首先我们要有温湿度模块SHTC3(数据是比DHT22精确而且便宜),然后有一块物联网开发板CH-340(8266的一种)一共20块吧
Arduino IDE(建议此论坛搜索最新版或者在Arduino官网下载最新版本:https://www.arduino.cc/)
1.2  安装blinker Arduino库(https://doc.blinker.app/?file=001-快速开始/02-esp8266-WiFi接入)
       下载.zip文件,解压缩到ARDUINO安装目录的“libraries”文件夹中。
1.3  安装SHTC3库(见附件
       下载.zip文件,解压缩到ARDUINO安装目录的“libraries”文件夹中。
1.4  安装ESP8266支持包(https://github.com/esp8266/Arduino/releases)
       下载.exe文件,双击自动安装就可以。
1.5  安装blinker APP(https://doc.blinker.app/?file=001-快速开始/02-esp8266-WiFi接入)

四、具体制作过程
1.连接
ch-340数据线插入电脑USB口(d1接scl,d2接sda,+接3v,—接G)
2.打开手机APP,添加DIY设备  arduino,WiFi接入,复制key,点开右上角的一个圈三个点点开界面配置删除里面的并复制下面界面配置进去储存
3.打开ide,将key复制到程序里替换
4打开附件文件夹SHTC3
5点击上传等待上传完成。

程序
#define BLINKER_WIFI
#define BLINKER_MIOT_SENSOR   //小爱同学定义为传感器设备
#include <Blinker.h>
#include "SparkFun_SHTC3.h"
char auth[] = "72290821bdd3";    //设备key
char ssid[] = "CMCC-QR9a";         //wifi ssid
char pswd[] = "un98pchd";     //wifi 密码

BlinkerNumber HUMI("humi");    //定义湿度数据键名
BlinkerNumber TEMP("temp");    //定义温度数据键名
SHTC3 mySHTC3;
float humi_read = 0, temp_read = 0;
void dataStorage()
{
    Blinker.dataStorage("temp", temp_read);
    Blinker.dataStorage("humi", humi_read);
}
void heartbeat()
{
    HUMI.print(humi_read);        //给blinkerapp回传湿度数据
    TEMP.print(temp_read);        //给blinkerapp回传温度数据
}

void miotQuery(int32_t queryCode)      //小爱同学语音命令反馈
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

            int humi_read_int=humi_read;     //去掉湿度浮点
            BlinkerMIOT.humi(humi_read_int);     //小爱接收湿度
            BlinkerMIOT.temp(temp_read);      //小爱接收温度
            BlinkerMIOT.print();

}
void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    Blinker.begin(auth, ssid, pswd);   
    Blinker.attachHeartbeat(heartbeat);//数据上传
    Blinker.attachDataStorage(dataStorage);//图表上传
    Wire.begin();
    errorDecoder(mySHTC3.begin());
    BlinkerMIOT.attachQuery(miotQuery);//小爱
}

void loop()
{
    Blinker.run();
    float h = mySHTC3.toPercent();
    float t = mySHTC3.toDegC();
    if (isnan(h) || isnan(t))
    {
        BLINKER_LOG("无法读取DHT数据!");
    }
    else
    {
        BLINKER_LOG("Humidity: ", h, " %");
        BLINKER_LOG("Temperature: ", t, " *C");
        humi_read = h;
        temp_read = t;
    }
    SHTC3_Status_TypeDef result = mySHTC3.update();                                             
    Blinker.delay(2000);
}

void errorDecoder(SHTC3_Status_TypeDef message)                             
{
  switch(message)
  {
    case SHTC3_Status_Nominal : Serial.print("Nominal"); break;
    case SHTC3_Status_Error : Serial.print("Error"); break;
    case SHTC3_Status_CRC_Fail : Serial.print("CRC Fail"); break;
    default : Serial.print("Unknown return code"); break;
  }
}
配置文件
{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨light¨¨background¨{¨img¨¨assets/img/bg/2.jpg¨}}¨dashboard¨|{¨type¨¨num¨¨t0¨¨湿度¨¨ico¨¨fal fa-question¨¨clr¨¨#389BEE¨¨min¨É¨max¨¢1c¨uni¨´%´¨bg¨É¨cols¨Í¨rows¨Í¨key¨¨humi¨´x´É´y´Ð¨speech¨|÷¨lstyle¨Ë}{ß9ßAßB¨温度¨ßDßEßF¨#EA0909¨ßHÉßIº0ßJ´℃´ßKÉßLÍßMÍßN¨temp¨´x´Í´y´ÐßP|÷ßQË}{ß9¨deb¨¨mode¨ÉßKÉßLÑßMÍßN¨debug¨´x´É´y´¤CßP|÷ßQÊ}{ß9¨cha¨ßKɨsty¨¨line¨ßF¨#076EEF¨¨sty1¨ßZ¨clr1¨ßS¨sty2¨ßZ¨clr2¨ßGßLÑßMÍßNßO´x´É´y´ËßP|÷ßQÊßBßC¨key1¨ßT¨t1¨ßR}÷¨actions¨|¦¨cmd¨¦¨switch¨‡¨text¨‡¨on¨¨打开?name¨¨off¨¨关闭?name¨—÷¨triggers¨|{¨source¨ßj¨source_zh¨¨开关状态¨¨state¨|ßlßn÷¨state_zh¨|¨打开¨¨关闭¨÷}÷}

点这个

点这个

这个是界面

这个是界面
Screenshot_20200419_150343_iot.clz.me.jpg

这个是模块

这个是模块

这儿

这儿

这是模块接线方法看颜色

这是模块接线方法看颜色

这是传感器接线方法

这是传感器接线方法

SparkFun_SHTC3_Arduino_Library-master (1).zip

18.58 KB, 下载次数: 41

这个是库

SHTC3DIANDENG.zip

1.29 KB, 下载次数: 25

这个是程序解压到桌面运行

发表于 2021-7-25 17:24 | 显示全部楼层
本帖最后由 tjdxryx 于 2021-7-25 17:41 编辑

谢谢分享,已经成功用上了特此留言感谢。我又在此基础上加了个手动刷新按钮和两个继电器开关按钮,通过温度传感器来控制开关1,湿度传感器来控制开关2,插个取暖器和加湿器就很方便了。贴上新增代码,新手如果有什么错误,还请赐教。
boolean tempbutton,humibutton; //定义两个布尔数,标识开关闭合
int kg1 = D5;
int kg2 = D6; //开关对应nodemcu上的D5、D6引脚
BlinkerButton Button0("btn-kg0");
BlinkerButton Button1("btn-kg1");
BlinkerButton Button2("btn-kg2");//设置app上3个按键的键名

void button0_callback(const String & state) {
    HUMI.print(humi_read);
    TEMP.print(temp_read);  //按钮0实现刷新功能
}

void button1_callback(const String & state) {
    if (state=="on") {
        Button1.color("#FF0000");   
        Button1.text("取暖器开");    //按钮1打开,按钮颜色变红,输出文字
        Button1.print("on");
        tempbutton=1;
    } else if(state=="off"){
        Button1.color("#000000");  //按钮1关闭,颜色变黑,输出文字
        Button1.text("取暖器关");
        Button1.print("off");
        tempbutton=0;
    }
}
void button2_callback(const String & state) {
    if (state=="on") {
        Button2.color("#FF0000");   
        Button2.text("加湿器开");
        Button2.print("on");
        humibutton=1;
    } else if(state=="off"){
        Button2.color("#000000");   //同按钮1
        Button2.text("加湿器关");
        Button2.print("off");
        humibutton=0;
    }
}

void setup()的部分添加以下语句
pinMode(kg1, OUTPUT);
digitalWrite(kg1, HIGH);  //我的继电器是低电平触发 把D5 D6脚初始化高电平
pinMode(kg2, OUTPUT);   //如果继电器高电平触发就把HIGH设置成LOW
digitalWrite(kg2, HIGH);  
Button0.attach(button0_callback);
Button1.attach(button1_callback); //注册回调函数
Button2.attach(button2_callback);

void loop()的部分添加以下语句,先判断开关状态,如果是打开则判断温湿度来操作开关闭合,
如果关闭就保持关闭状态。

if (tempbutton==1){  //判断开关是否打开,如果打开
     if(t<32){
     digitalWrite(kg1, LOW);  //判断温度,如果低于32就触发低电平打开开关
     delay(1000);}
     if(t>33){                         //如果高于33度就触发高电平,关闭开关  
     digitalWrite(kg1, HIGH);//用于低电平触发的继电器,高电平则相反,温度值自己设定即可。
     delay(1000);}       //延时1秒执行
     }
    else  digitalWrite(kg1, HIGH);//开关关闭,输出高电平,保持关闭。
    if (humibutton==1){
     if(h<40){
     digitalWrite(kg2, LOW);
     delay(1000);}     
     if(h>60){             //湿度判定一样,低于40开,高于60关,数值自设即可
     digitalWrite(kg2, HIGH);
     delay(1000);}
     }
    else  digitalWrite(kg2, HIGH);

在blinker的app里面添加3个按键的时候,按键0的数据键名填写btn-kg0,要选普通按键。按键1和2填写btn-kg1,btn-kg2,选择开关按键。



点评

牛人  发表于 2022-1-26 21:14
发表于 2020-10-25 16:42 | 显示全部楼层
按你的配置,点灯界面温度湿度显示整数,不带小数,咋回事呢?
发表于 2020-10-26 09:49 | 显示全部楼层
管脚怎么改,只能接D1,D2吗?
发表于 2022-1-26 23:28 | 显示全部楼层
tjdxryx 发表于 2021-7-25 17:24
谢谢分享,已经成功用上了特此留言感谢。我又在此基础上加了个手动刷新按钮和两个继电器开关按钮,通过温度 ...

实践后发现,按键1和按键2在人工按下后,不能随设定的条件自动变化,但是可以手动调节,请指教。
(其它头文件等省略)
  1. float humi_read=0, temp_read=0;

  2. boolean tempbutton,humibutton; //定义两个布尔数,标识开关闭合
  3. int kg1 = D5;
  4. int kg2 = D6; //开关对应nodemcu上的D5、D6引脚
  5. BlinkerButton Button0("btn-kg0");//app上选普通按键
  6. BlinkerButton Button1("btn-kg1");//app上选开关按键,kg2亦然
  7. BlinkerButton Button2("btn-kg2");//设置app上3个按键的键名

  8. void button0_callback(const String & state) {
  9.     HUMI.print(humi_read);
  10.     TEMP.print(temp_read);  //按钮0实现刷新功能
  11. }

  12. void button1_callback(const String & state) {
  13.     if (state=="on") {
  14.         Button1.color("#FF0000");   
  15.         Button1.text("取暖器开");    //按钮1打开,按钮颜色变红,输出文字
  16.         Button1.print("on");
  17.         tempbutton=1;
  18.     } else if(state=="off"){
  19.         Button1.color("#000000");  //按钮1关闭,颜色变黑,输出文字
  20.         Button1.text("取暖器关");
  21.         Button1.print("off");
  22.         tempbutton=0;
  23.     }
  24. }

  25. void button2_callback(const String & state) {
  26.     if (state=="on") {
  27.         Button2.color("#FF0000");   
  28.         Button2.text("加湿器开");
  29.         Button2.print("on");
  30.         humibutton=1;
  31.     } else if(state=="off"){
  32.         Button2.color("#000000");   //同按钮1
  33.         Button2.text("加湿器关");
  34.         Button2.print("off");
  35.         humibutton=0;
  36.     }
  37. }

  38. void heartbeat()
  39. {
  40.     HUMI.print(humi_read);
  41.     TEMP.print(temp_read);
  42. }
  43. void dataStorage()
  44. {
  45.    Blinker.dataStorage("temp",temp_read);
  46.    Blinker.dataStorage("humi",humi_read);
  47. }
  48. void setup()
  49. {
  50.     Serial.begin(115200);
  51.     Wire.begin();
  52.     sht31.begin(0x44);
  53.     delay(1);
  54.    
  55.     BLINKER_DEBUG.stream(Serial);
  56.     BLINKER_DEBUG.debugAll();
  57.     pinMode(LED_BUILTIN, OUTPUT);
  58.     digitalWrite(LED_BUILTIN, LOW);

  59.     Blinker.begin(auth, ssid, pswd);
  60.     Blinker.attachHeartbeat(heartbeat);
  61.     Blinker.attachDataStorage(dataStorage);
  62.    
  63.     pinMode(kg1, OUTPUT);
  64.     digitalWrite(kg1, HIGH);  //我的继电器是低电平触发 把D5 D6脚初始化高电平
  65.     pinMode(kg2, OUTPUT);   //如果继电器高电平触发就把HIGH设置成LOW
  66.     digitalWrite(kg2, HIGH);  
  67.     Button0.attach(button0_callback);
  68.     Button1.attach(button1_callback); //注册回调函数
  69.     Button2.attach(button2_callback);

  70. }

  71. void loop()
  72. {
  73.     Blinker.run();

  74.     float h = sht31.readHumidity();
  75.     float t = sht31.readTemperature();

  76.     humi_read = h;
  77.     temp_read = t;
  78.    
  79.     if (tempbutton==1){  //判断开关是否打开,如果打开
  80.      if(t<20){
  81.      digitalWrite(kg1, LOW);  //判断温度,如果低于20就触发低电平打开开关
  82.      delay(1000);
  83.      }
  84.      if(t>23){                //如果高于23度就触发高电平,关闭开关  
  85.      digitalWrite(kg1, HIGH);//用于低电平触发的继电器,高电平则相反,温度值自己设定即可。
  86.      delay(1000);      //延时1秒执行
  87.      }
  88.     }
  89.     else
  90.     {digitalWrite(kg1, HIGH);
  91.     }//开关关闭,输出高电平,保持关闭。
  92.    
  93.     if (humibutton==1){
  94.      if(h<40){
  95.      digitalWrite(kg2, LOW);
  96.      delay(1000);
  97.      }     
  98.      if(h>60){             //湿度判定一样,低于40开,高于60关,数值自设即可
  99.      digitalWrite(kg2, HIGH);
  100.      delay(1000);
  101.      }
  102.     }
  103.     else
  104.     {digitalWrite(kg2, HIGH);
  105.     }
  106.     Blinker.delay(1000);
  107. }
复制代码
发表于 2022-1-27 11:25 | 显示全部楼层
其他智友也可发表自己的看法
发表于 2022-1-28 09:36 | 显示全部楼层
tjdxryx 发表于 2021-7-25 17:24
谢谢分享,已经成功用上了特此留言感谢。我又在此基础上加了个手动刷新按钮和两个继电器开关按钮,通过温度 ...

经过改进其它温湿度程序,发现你的程序还是能用的,谢谢了!
  1. #include <Arduino.h>
  2. #include <Wire.h>
  3. #include "Adafruit_SHT31.h"

  4. Adafruit_SHT31 sht31 = Adafruit_SHT31();

  5. void setup() {
  6.   Serial.begin(9600);
  7.    sht31.begin();
  8.     delay(1);
  9.      pinMode(D5, OUTPUT);
  10.     digitalWrite(D5, LOW);  //我的继电器是高电平触发 把D5 D6脚初始化低电平
  11.     pinMode(D6, OUTPUT);   //如果继电器低电平触发就把LOW设置成HIGH
  12.     digitalWrite(D6, LOW);
  13. }


  14. void loop()
  15. {
  16.   float t = sht31.readTemperature();
  17.   float h = sht31.readHumidity();

  18.   if (! isnan(t))
  19.     {  // check if 'is not a number'
  20.     Serial.print("Temp: ");
  21.     Serial.print(t);
  22.     Serial.print("°C");
  23.     Serial.print("\t\t");
  24.     }
  25.     else
  26.     {
  27.     Serial.println("Failed to read temperature");
  28.     }
  29.   
  30.   if (! isnan(h))
  31.     {  // check if 'is not a number'
  32.     Serial.print("Humi: ");
  33.     Serial.print(h);
  34.     Serial.println("%RH");
  35.     }
  36.     else
  37.     {
  38.     Serial.println("Failed to read humidity");
  39.   }

  40.   delay(1000);
  41.   if(t<20){
  42.      digitalWrite(D5, HIGH);  //判断温度,如果低于20就触发高电平打开开关
  43.      delay(1000);
  44.      }
  45.      if(t>23){                //如果高于23度就触发低电平,关闭开关  
  46.      digitalWrite(D5, LOW);
  47.      delay(1000);}

  48.      if(h<40){
  49.      digitalWrite(D6, HIGH);
  50.      delay(1000);}     
  51.      if(h>60){             //湿度判定一样,低于40开,高于60关,数值自设即可
  52.      digitalWrite(D6, LOW);
  53.      delay(1000);
  54.      }
  55. }
复制代码
发表于 2022-2-15 13:46 | 显示全部楼层
bird_144 发表于 2022-1-28 09:36
经过改进其它温湿度程序,发现你的程序还是能用的,谢谢了!

SHT31和SHT30可以同样
用吗
发表于 2022-3-10 21:28 | 显示全部楼层
cwm157454311 发表于 2022-2-15 13:46
SHT31和SHT30可以同样
用吗

经过多次实践,sht30,31,35都能用
发表于 2022-3-10 22:51 | 显示全部楼层
bird_144 发表于 2022-3-10 21:28
经过多次实践,sht30,31,35都能用

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

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 08:52 , Processed in 0.115604 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表