家用冷柜控制改造-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2460|回复: 5

[分享] 家用冷柜控制改造

[复制链接]
发表于 2021-6-15 14:07 | 显示全部楼层 |阅读模式
硬件:模数化插座,DS18B20温度传感器,ESP12F一路继电器集成模块
软件及IDE: Arduino 1.8.13
手机APP:Blinker 2.5.2
实现功能:原有冷柜有一个冷冻室和一个冷藏室,因为冷冻室暂时不需要使用,希望把冷冻室改造为冷藏功能或者弱冷冻功能,温度可控(比如0-5度,或者0~-12度),冷柜不做任何改动。
只需要增加一个模数化插座和一个控制该插座的继电器,控制插座的供电状态,而冷柜的旋钮开关一直置于弱冷状态即可。
在手机上安装Blinker软件。做一个程序上传到ESP12F和Blinker 对接。
代码如下

  1. /* *****************************************************************
  2. * DS18B20是Dallas Semiconductor Corp.生产的1-Wire接口温度传感器,该独特的1-Wire接口仅需要一个用于与微控制器的双向通信的数字针
  3. * DS18B20温度传感器相当精确,无需外部组件即可工作.它可以测量-55°C至+ 125°C的温度,精度为±0.5°C
  4. * 用户可以将温度传感器的分辨率配置为9、10、11或12位.但是,上电时的默认分辨率为12位(即0.0625°C精度)
  5. * 该传感器可以由3V至5.5V电源供电,并且在主动温度转换期间仅消耗1mA电流
  6. * *****************************************************************/
  7. #define BLINKER_WIFI
  8. //#define BLINKER_ESP_SMARTCONFIG
  9. #include <Blinker.h>
  10. #include<OneWire.h>
  11. #include<DallasTemperature.h>

  12. #define BUS 13 //GPIO13=D7,温度传感器黄色线接针脚D7,然后并一个4.7K电阻接到3V3
  13.                //针脚定义: 面朝印字面,左为GND,右为VCC,中间为数字输出引脚(接4.7-10k上拉电阻)
  14. OneWire onewire(BUS);//通过将传感器的信号引脚传递到其构造函数来创建单线对象,这个单线对象让我们与任何单线设备进行通信,而不仅仅是DS18B20
  15. DallasTemperature sensors(&onewire);//为了与DS18B20传感器进行通信,我们需要创建DallasTemperature库的对象,并将单线对象的引用作为参数传递

  16. char auth[] ="3fa7574e4fff";// "Your Device Secret Key";
  17. char ssid[] = "TP-LINK_2F98";//Your WiFi network SSID or name";
  18. char pswd[] = "1122334455";//Your WiFi network WPA password or WEP key";
  19. uint32_t read_time = 0;
  20. float temp_read1=0;
  21. float temp_read2=0;
  22. float t1=0;

  23. // 新建组件对象
  24. BlinkerButton Button1("cooler1");
  25. BlinkerButton Button2("cooler2");
  26. BlinkerNumber TEMP1("temp1");
  27. BlinkerNumber TEMP2("temp2");

  28. bool b1_state=false;
  29. bool b2_state=false;
  30. int relayPin1=5;  //GPIO5=D1 for NodeMCU
  31. //int relayPin2=12; //GPIO12=D6
  32. uint16_t get_time= 2000;  //每隔2秒取一次温度值

  33. // 按下按键即会执行该函数
  34. void button1_callback(const String & state){
  35.     BLINKER_LOG("get button1 state: ", state);
  36.     digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  37.     if (state=="on" ){
  38.       b1_state=true;
  39.       Button1.print("on");

  40.     }
  41.     else if (state=="off"){
  42.       b1_state=false;
  43.       digitalWrite(relayPin1,LOW);
  44.       Button1.print("off");
  45.     }
  46. }

  47. void button2_callback(const String & state) {
  48.     BLINKER_LOG("get button2 state: ", state);
  49.     digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  50.     if(state=="on"){
  51.       b2_state=true;
  52.       Button2.print("on");
  53.     }
  54.     else if (state=="off"){
  55.       b2_state=false;
  56.       digitalWrite(relayPin1,LOW);
  57.       Button2.print("off");
  58.     }
  59. }

  60. // 如果未绑定的组件被触发,则会执行其中内容
  61. void dataRead(const String & data)
  62. {
  63.      BLINKER_LOG("Blinker readString: ", data);
  64.      digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  65.      Blinker.vibrate();
  66.      uint32_t BlinkerTime = millis();
  67.      Blinker.print("millis", BlinkerTime);
  68. }

  69. void heartbeat(){           

  70.      TEMP1.print(temp_read1);
  71.      TEMP2.print(temp_read2);
  72. }

  73. void dataStorage() {
  74.      Blinker.dataStorage("temp1", temp_read1);
  75.      Blinker.dataStorage("temp2", temp_read2);
  76. }

  77. void setup()
  78. {
  79.     Serial.begin(115200);
  80.     sensors.begin();  //该功能搜索总线上连接的传感器,并为每个传感器设置位分辨率(12位)
  81.     sensors.setResolution(10);  //自定义分辨率10位,0.25
  82.     BLINKER_DEBUG.stream(Serial);
  83.     pinMode(relayPin1,OUTPUT);
  84.     //pinMode(relayPin2,OUTPUT);
  85.     pinMode(LED_BUILTIN, OUTPUT);
  86.     digitalWrite(LED_BUILTIN, HIGH);

  87.     Blinker.begin(auth,ssid, pswd);
  88.     Blinker.attachData(dataRead);
  89.     Blinker.attachHeartbeat(heartbeat);
  90.     Blinker.attachDataStorage(dataStorage);
  91.     Button1.attach(button1_callback);
  92.     Button2.attach(button2_callback);

  93.     BLINKER_LOG("Awesome! Uploading is OK!");
  94. }

  95. //切换到温度传感器控制,控制电源插座的开关
  96. void cooler1(){
  97.         if (t1>=5){
  98.         digitalWrite(relayPin1,HIGH);  //制冷机启动
  99.         }
  100.         else if (t1<=0){
  101.         digitalWrite(relayPin1,LOW);
  102.         }
  103. }

  104. //强制通电,恢复本机控制模式
  105. void cooler2(){
  106.         if (t1>=-2){
  107.         digitalWrite(relayPin1,HIGH);  //制冷机启动
  108.         }
  109.         if (t1<=-10){
  110.         digitalWrite(relayPin1,LOW);
  111.         }
  112. }

  113. void loop(){
  114.      Blinker.run();
  115.      sensors.requestTemperatures();  //该功能向总线上的所有传感器发送命令以执行温度转换
  116.      if (read_time == 0 || (millis() - read_time) >= get_time) {
  117.         read_time = millis();

  118.         t1 =  sensors.getTempCByIndex(0);  //该功能读取并返回传感器的温度读数.deviceIndex只是总线上传感器的位置,
  119.                                                  //如果您仅在总线上使用一个DS18B20,请将其设置为0
  120.         temp_read1 = t1;
  121.         Serial.print("当前温度 t1 = ");
  122.         Serial.print(t1,1);
  123.         Serial.print(char(176));//shows degrees character
  124.         Serial.print("C  |  ");

  125.        //print the temperature in Fahrenheit
  126.         Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0);
  127.         Serial.print(char(176));//shows degrees character
  128.         Serial.println("F");

  129.      if (b1_state==true){
  130.        cooler1();
  131.       //b2_state=false;

  132.     }

  133.      if (b2_state==true){
  134.        cooler2();
  135.       //b1_state=false;

  136.     }
  137. }      

  138.     /*
  139.      * DallasTemperature.h库中的其他有用功能
  140.      * DallasTemperature对象可以使用一些有用的功能。下面列出了其中几个:
  141.      * setResolution() 该功能将DS18B20的内部模数转换器的分辨率设置为9位,10位,11位或12位,分别对应于0.5°C,0.25°C,0.125°C和0.0625°C的增量。
  142.      * bool getWaitForConversion()函数返回waitForConversion标志的值。当您要检查温度转换是否完成时,此功能很有用。
  143.      * setHighAlarmTemp()&setLowAlarmTemp()功能可设置设备的内部高温和低温警报(以摄氏度为单位)。有效范围是-55至125°C
  144.      * bool hasAlarm() 如果温度超过上限和下限警报温度设置时设备处于警报状态,此功能将返回true。

  145.      */
  146. }
复制代码


 楼主| 发表于 2021-6-15 14:15 | 显示全部楼层
cooler control.jpg
系统电路图
 楼主| 发表于 2021-6-15 14:21 | 显示全部楼层
Screenshot_20210615_141632.jpg
 楼主| 发表于 2021-6-15 14:31 | 显示全部楼层
esp8266模块与1路继电器集成,广州艾尔赛ESP8266继电器开发板,三种供电方式
IDE选择开发板ESPino(ESP-12 Module),上传时IO0和GND短接,完成后断开,reset
GPIO5高电位触发继电器。
发表于 2021-6-15 20:57 | 显示全部楼层
看样子压缩机开关周期只有 20min,如此频繁的开关(72次/天)怕是寿命不长吧
 楼主| 发表于 2021-6-16 09:52 | 显示全部楼层
增大温差控制,能延长周期,达不到恒温控制。
即使不这样做,家里的冰箱压缩机也是频繁启停的。能效等级反映了保温层的厚度。散热越快,启动越频繁,故障率越高。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 11:45 , Processed in 0.110954 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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