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

1272170918 发表于 2020-4-19 15:25

SHTC3基于BLINKER的高精度温湿度记录

首先我们要有温湿度模块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打开附件文件夹SHTC35点击上传等待上传完成。
程序#define BLINKER_WIFI#define BLINKER_MIOT_SENSOR   //小爱同学定义为传感器设备#include <Blinker.h>#include "SparkFun_SHTC3.h"char auth[] = "72290821bdd3";    //设备keychar ssid[] = "CMCC-QR9a";         //wifi ssidchar 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¨|¨打开¨¨关闭¨÷}÷}

tjdxryx 发表于 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秒执行
   }
    elsedigitalWrite(kg1, HIGH);//开关关闭,输出高电平,保持关闭。
    if (humibutton==1){
   if(h<40){
   digitalWrite(kg2, LOW);
   delay(1000);}   
   if(h>60){             //湿度判定一样,低于40开,高于60关,数值自设即可
   digitalWrite(kg2, HIGH);
   delay(1000);}
   }
    elsedigitalWrite(kg2, HIGH);

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



apfjm 发表于 2020-10-25 16:42

按你的配置,点灯界面温度湿度显示整数,不带小数,咋回事呢?

apfjm 发表于 2020-10-26 09:49

管脚怎么改,只能接D1,D2吗?

bird_144 发表于 2022-1-26 23:28

tjdxryx 发表于 2021-7-25 17:24
谢谢分享,已经成功用上了特此留言感谢。我又在此基础上加了个手动刷新按钮和两个继电器开关按钮,通过温度 ...

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

boolean tempbutton,humibutton; //定义两个布尔数,标识开关闭合
int kg1 = D5;
int kg2 = D6; //开关对应nodemcu上的D5、D6引脚
BlinkerButton Button0("btn-kg0");//app上选普通按键
BlinkerButton Button1("btn-kg1");//app上选开关按键,kg2亦然
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 heartbeat()
{
    HUMI.print(humi_read);
    TEMP.print(temp_read);
}
void dataStorage()
{
   Blinker.dataStorage("temp",temp_read);
   Blinker.dataStorage("humi",humi_read);
}
void setup()
{
    Serial.begin(115200);
    Wire.begin();
    sht31.begin(0x44);
    delay(1);
   
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachHeartbeat(heartbeat);
    Blinker.attachDataStorage(dataStorage);
   
    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()
{
    Blinker.run();

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

    humi_read = h;
    temp_read = t;
   
    if (tempbutton==1){//判断开关是否打开,如果打开
   if(t<20){
   digitalWrite(kg1, LOW);//判断温度,如果低于20就触发低电平打开开关
   delay(1000);
   }
   if(t>23){                //如果高于23度就触发高电平,关闭开关
   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.delay(1000);
}

bird_144 发表于 2022-1-27 11:25

其他智友也可发表自己的看法

bird_144 发表于 2022-1-28 09:36

tjdxryx 发表于 2021-7-25 17:24
谢谢分享,已经成功用上了特此留言感谢。我又在此基础上加了个手动刷新按钮和两个继电器开关按钮,通过温度 ...

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

Adafruit_SHT31 sht31 = Adafruit_SHT31();

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


void loop()
{
float t = sht31.readTemperature();
float h = sht31.readHumidity();

if (! isnan(t))
    {// check if 'is not a number'
    Serial.print("Temp: ");
    Serial.print(t);
    Serial.print("°C");
    Serial.print("\t\t");
    }
    else
    {
    Serial.println("Failed to read temperature");
    }

if (! isnan(h))
    {// check if 'is not a number'
    Serial.print("Humi: ");
    Serial.print(h);
    Serial.println("%RH");
    }
    else
    {
    Serial.println("Failed to read humidity");
}

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

   if(h<40){
   digitalWrite(D6, HIGH);
   delay(1000);}   
   if(h>60){             //湿度判定一样,低于40开,高于60关,数值自设即可
   digitalWrite(D6, LOW);
   delay(1000);
   }
}

cwm157454311 发表于 2022-2-15 13:46

bird_144 发表于 2022-1-28 09:36
经过改进其它温湿度程序,发现你的程序还是能用的,谢谢了!

SHT31和SHT30可以同样
用吗

bird_144 发表于 2022-3-10 21:28

cwm157454311 发表于 2022-2-15 13:46
SHT31和SHT30可以同样
用吗

经过多次实践,sht30,31,35都能用

cwm157454311 发表于 2022-3-10 22:51

bird_144 发表于 2022-3-10 21:28
经过多次实践,sht30,31,35都能用

谢谢、。。。。。。。。。。。。。。。。
页: [1] 2
查看完整版本: SHTC3基于BLINKER的高精度温湿度记录