|
硬件:模数化插座,DS18B20温度传感器,ESP12F一路继电器集成模块
软件及IDE: Arduino 1.8.13
手机APP:Blinker 2.5.2
实现功能:原有冷柜有一个冷冻室和一个冷藏室,因为冷冻室暂时不需要使用,希望把冷冻室改造为冷藏功能或者弱冷冻功能,温度可控(比如0-5度,或者0~-12度),冷柜不做任何改动。
只需要增加一个模数化插座和一个控制该插座的继电器,控制插座的供电状态,而冷柜的旋钮开关一直置于弱冷状态即可。
在手机上安装Blinker软件。做一个程序上传到ESP12F和Blinker 对接。
代码如下
- /* *****************************************************************
- * DS18B20是Dallas Semiconductor Corp.生产的1-Wire接口温度传感器,该独特的1-Wire接口仅需要一个用于与微控制器的双向通信的数字针
- * DS18B20温度传感器相当精确,无需外部组件即可工作.它可以测量-55°C至+ 125°C的温度,精度为±0.5°C
- * 用户可以将温度传感器的分辨率配置为9、10、11或12位.但是,上电时的默认分辨率为12位(即0.0625°C精度)
- * 该传感器可以由3V至5.5V电源供电,并且在主动温度转换期间仅消耗1mA电流
- * *****************************************************************/
- #define BLINKER_WIFI
- //#define BLINKER_ESP_SMARTCONFIG
- #include <Blinker.h>
- #include<OneWire.h>
- #include<DallasTemperature.h>
- #define BUS 13 //GPIO13=D7,温度传感器黄色线接针脚D7,然后并一个4.7K电阻接到3V3
- //针脚定义: 面朝印字面,左为GND,右为VCC,中间为数字输出引脚(接4.7-10k上拉电阻)
- OneWire onewire(BUS);//通过将传感器的信号引脚传递到其构造函数来创建单线对象,这个单线对象让我们与任何单线设备进行通信,而不仅仅是DS18B20
- DallasTemperature sensors(&onewire);//为了与DS18B20传感器进行通信,我们需要创建DallasTemperature库的对象,并将单线对象的引用作为参数传递
- char auth[] ="3fa7574e4fff";// "Your Device Secret Key";
- char ssid[] = "TP-LINK_2F98";//Your WiFi network SSID or name";
- char pswd[] = "1122334455";//Your WiFi network WPA password or WEP key";
- uint32_t read_time = 0;
- float temp_read1=0;
- float temp_read2=0;
- float t1=0;
- // 新建组件对象
- BlinkerButton Button1("cooler1");
- BlinkerButton Button2("cooler2");
- BlinkerNumber TEMP1("temp1");
- BlinkerNumber TEMP2("temp2");
- bool b1_state=false;
- bool b2_state=false;
- int relayPin1=5; //GPIO5=D1 for NodeMCU
- //int relayPin2=12; //GPIO12=D6
- uint16_t get_time= 2000; //每隔2秒取一次温度值
- // 按下按键即会执行该函数
- void button1_callback(const String & state){
- BLINKER_LOG("get button1 state: ", state);
- digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
- if (state=="on" ){
- b1_state=true;
- Button1.print("on");
- }
- else if (state=="off"){
- b1_state=false;
- digitalWrite(relayPin1,LOW);
- Button1.print("off");
- }
- }
- void button2_callback(const String & state) {
- BLINKER_LOG("get button2 state: ", state);
- digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
- if(state=="on"){
- b2_state=true;
- Button2.print("on");
- }
- else if (state=="off"){
- b2_state=false;
- digitalWrite(relayPin1,LOW);
- Button2.print("off");
- }
- }
- // 如果未绑定的组件被触发,则会执行其中内容
- void dataRead(const String & data)
- {
- BLINKER_LOG("Blinker readString: ", data);
- digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
- Blinker.vibrate();
- uint32_t BlinkerTime = millis();
- Blinker.print("millis", BlinkerTime);
- }
- void heartbeat(){
- TEMP1.print(temp_read1);
- TEMP2.print(temp_read2);
- }
- void dataStorage() {
- Blinker.dataStorage("temp1", temp_read1);
- Blinker.dataStorage("temp2", temp_read2);
- }
- void setup()
- {
- Serial.begin(115200);
- sensors.begin(); //该功能搜索总线上连接的传感器,并为每个传感器设置位分辨率(12位)
- sensors.setResolution(10); //自定义分辨率10位,0.25
- BLINKER_DEBUG.stream(Serial);
- pinMode(relayPin1,OUTPUT);
- //pinMode(relayPin2,OUTPUT);
- pinMode(LED_BUILTIN, OUTPUT);
- digitalWrite(LED_BUILTIN, HIGH);
- Blinker.begin(auth,ssid, pswd);
- Blinker.attachData(dataRead);
- Blinker.attachHeartbeat(heartbeat);
- Blinker.attachDataStorage(dataStorage);
- Button1.attach(button1_callback);
- Button2.attach(button2_callback);
- BLINKER_LOG("Awesome! Uploading is OK!");
- }
- //切换到温度传感器控制,控制电源插座的开关
- void cooler1(){
- if (t1>=5){
- digitalWrite(relayPin1,HIGH); //制冷机启动
- }
- else if (t1<=0){
- digitalWrite(relayPin1,LOW);
- }
- }
- //强制通电,恢复本机控制模式
- void cooler2(){
- if (t1>=-2){
- digitalWrite(relayPin1,HIGH); //制冷机启动
- }
- if (t1<=-10){
- digitalWrite(relayPin1,LOW);
- }
- }
- void loop(){
- Blinker.run();
- sensors.requestTemperatures(); //该功能向总线上的所有传感器发送命令以执行温度转换
- if (read_time == 0 || (millis() - read_time) >= get_time) {
- read_time = millis();
- t1 = sensors.getTempCByIndex(0); //该功能读取并返回传感器的温度读数.deviceIndex只是总线上传感器的位置,
- //如果您仅在总线上使用一个DS18B20,请将其设置为0
- temp_read1 = t1;
- Serial.print("当前温度 t1 = ");
- Serial.print(t1,1);
- Serial.print(char(176));//shows degrees character
- Serial.print("C | ");
- //print the temperature in Fahrenheit
- Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0);
- Serial.print(char(176));//shows degrees character
- Serial.println("F");
- if (b1_state==true){
- cooler1();
- //b2_state=false;
- }
- if (b2_state==true){
- cooler2();
- //b1_state=false;
- }
- }
- /*
- * DallasTemperature.h库中的其他有用功能
- * DallasTemperature对象可以使用一些有用的功能。下面列出了其中几个:
- * setResolution() 该功能将DS18B20的内部模数转换器的分辨率设置为9位,10位,11位或12位,分别对应于0.5°C,0.25°C,0.125°C和0.0625°C的增量。
- * bool getWaitForConversion()函数返回waitForConversion标志的值。当您要检查温度转换是否完成时,此功能很有用。
- * setHighAlarmTemp()&setLowAlarmTemp()功能可设置设备的内部高温和低温警报(以摄氏度为单位)。有效范围是-55至125°C
- * bool hasAlarm() 如果温度超过上限和下限警报温度设置时设备处于警报状态,此功能将返回true。
- */
- }
复制代码
|
|