|
20金币
现在显示没有问题,但是物理按键设置最低温度和最高温度,不能触发继电器,新手比较菜,请大佬帮忙改改,谢谢!
- #include "TM1637Display.h"
- #define SCL 5
- #define SDA 4
- TM1637Display TM(SCL, SDA);
- #define BTN_INPUT 12 //按键引脚
- #define jdq_OUTPUT 13 //继电器引脚
- #include <OneWire.h>
- #include <DallasTemperature.h>
- #define ONE_WIRE_BUS 14 //温度引脚
- OneWire oneWire(ONE_WIRE_BUS);
- DallasTemperature ds18b20(&oneWire);
- bool AU_state = false;
- int AU_last = 10;
- const int MAX_DISPLAY_MODE = 3;
- int display_mode = 0; //0: 温度 1:开关 2: 设置
- uint8_t data[] = { 0x00, 0x00, 0x00, 0x00 };
- bool wifi_isopen = false;
- int brightness = 0x01; //led亮度设置
- bool alarm_isopen = true;
- int di = 11; //初始最低温度
- int gao = 20;//初始最高温度
- int alarm_setup_mode = -1; //-1: off 0~3分别对应四位
- float temperature = 0;
- uint32_t timestamp_alarm = 0; //温度设置
- uint32_t timestamp_TEMP = 0; //温度
- uint32_t timestamp_btn = 0; //按键
- uint32_t timestamp_lasthit = 0;
- bool btn_state = false;
- void alarm_add(int digit) //按键设置温度 长按+1
- {
- if (digit == 0)
- {
- di += 1;//最低温度+
- if (di >= 20)
- {
- di = di % 10;
- }
- }
- if (digit == 1)
- {
- di -= 1;//最低温度-
- if (di >= 20)
- {
- di -= 1;
- }
- }
- if (digit == 2)
- {
- gao += 1;//最高温度+
- if (gao >= 50)
- {
- gao = gao % 10;
- }
- }
- if (digit == 3)
- {
- gao -= 1;//最高温度-
- if (gao>= 50)
- {
- gao -= 1;
- }
- }
- }
- bool is_alarm()
- {
- return (alarm_isopen);
- }
- void set_colon(bool flag)
- {
- uint8_t num = 0x00;
- if (flag)
- num = 0x80;
- int i;
- for (i = 0; i < 4; i++)
- {
- data[i] = data[i] | num;
- }
- }
- void set_data_use_name()
- {
- data[0] = SEG_B | SEG_C | SEG_D | SEG_F | SEG_G; //y
- data[1] = SEG_B | SEG_C | SEG_D | SEG_F | SEG_G; //y
- data[2] = SEG_A | SEG_B | SEG_E | SEG_F | SEG_G; //P
- data[3] = SEG_C | SEG_D | SEG_E | SEG_F | SEG_G; //b
- set_colon(true);
- }
- void set_data_use_temperature() //温度输出
- {
- int num = (int)temperature;
- if (num < 10)
- data[0] = 0x00;
- else
- data[0] = TM.encodeDigit(num / 10);
- data[1] = TM.encodeDigit(num % 10);
- data[2] = SEG_A | SEG_B | SEG_F | SEG_G; //o
- data[3] = SEG_A | SEG_D | SEG_E | SEG_F; //C
- set_colon(false);
- }
- void set_data_use_alarm_isopen() //温度控制继电器开关
- {
- if (alarm_isopen)
- {
- data[0] = 0x00;
- data[1] = 0x00;
- data[2] = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F; //O
- data[3] = SEG_C | SEG_E | SEG_G; //n
- }
- else
- {
- data[0] = 0x00;
- data[1] = SEG_C | SEG_D | SEG_E | SEG_G; //o
- data[2] = SEG_A | SEG_E | SEG_F | SEG_G; //F
- data[3] = SEG_A | SEG_E | SEG_F | SEG_G; //F
- }
- set_colon(false);
- }
- void set_data_use_alarm()
- {
- uint32_t num1, num2;
- num1 = di;
- num2 = gao;
- data[0] = TM.encodeDigit(num1 / 10);
- data[1] = TM.encodeDigit(num1 % 10);
- data[2] = TM.encodeDigit(num2 / 10);
- data[3] = TM.encodeDigit(num2 % 10);
- if (alarm_setup_mode != -1)
- {
- if (millis() % 700 < 350)
- data[alarm_setup_mode] = 0x00;
- }
- set_colon(true);
- }
- void set_data(int display_mode) //显示模式切换
- {
- switch (display_mode)
- {
- case -1:
- set_data_use_name();
- break;
- case 0:
- set_data_use_temperature();
- break;
- case 1:
- set_data_use_alarm_isopen();
- break;
- case 2:
- set_data_use_alarm();
- break;
- default:
- data[0] = 0xff;
- data[1] = 0xff;
- data[2] = 0xff;
- data[3] = 0xff;
- }
- }
- void setup()
- {
- Serial.begin(115200);
- pinMode(BTN_INPUT, INPUT);
- pinMode(jdq_OUTPUT, OUTPUT);//继电器输出
- pinMode(LED_BUILTIN, OUTPUT);
- digitalWrite(LED_BUILTIN, HIGH);
- attachInterrupt(digitalPinToInterrupt(BTN_INPUT), btn_trigger, CHANGE);
- ds18b20.begin();
- TM.setBrightness(brightness);
- }
- void loop()
- {
- uint32_t time_now = millis();
- if (is_alarm())
- {
- AU_state = true;
- timestamp_alarm = di;
- }
- if (AU_state && gao - timestamp_alarm > AU_last * 1000)
- {
- AU_state = false;
- }
- //update 温度
- if (time_now - timestamp_TEMP > 2000)
- {
- ds18b20.requestTemperatures();// 发送命令获取温度
- temperature = ds18b20.getTempCByIndex(0);
- if (temperature < 0)
- temperature = 0;
- timestamp_TEMP = time_now;
- }
- // Serial.println(ds18b20.getTempCByIndex(0)); //串口调试温度
- // delay(2000);//串口调试温度延时
- set_data(display_mode);
- TM.setSegments(data);
- digitalWrite(jdq_OUTPUT, AU_state);
- }
- void btn_press()
- {
- if (AU_state)
- {
- AU_state = false;
- return;
- }
- switch (display_mode)
- {
- case -1:
- display_mode = 0;
- break;
- case 2:
- if (alarm_setup_mode != -1)
- {
- alarm_add(alarm_setup_mode);
- break;
- }
- else
- {
- display_mode++;
- if (display_mode == MAX_DISPLAY_MODE)
- display_mode = 0;
- }
- break;
- default:
- display_mode++;
- if (display_mode == MAX_DISPLAY_MODE)
- display_mode = 0;
- }
- }
- void btn_hold()
- {
- switch (display_mode)
- {
- case 1:
- alarm_isopen = !alarm_isopen;
- break;
- case 2:
- alarm_setup_mode++;
- if (alarm_setup_mode ==4)
- alarm_setup_mode = -1;
- break;
- default:
- display_mode = -1;
- }
- }
- ICACHE_RAM_ATTR void btn_trigger() //触发按钮
- {
- uint32_t time_now = millis();
- if (!btn_state)
- {
- timestamp_btn = time_now;
- }
- else
- {
- if (time_now - timestamp_lasthit > 200)
- {
- if (time_now - timestamp_btn < 500)
- {
- Serial.println("短按");
- btn_press();
- }
- else
- {
- Serial.println("长按");
- btn_hold();
- }
- timestamp_lasthit = time_now;
- }
- }
- btn_state = digitalRead(BTN_INPUT);
- }
复制代码
|
|