哪位帮我看看这个温控代码问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 555|回复: 1

[未解决] 哪位帮我看看这个温控代码问题

[复制链接]
发表于 2022-5-22 20:07 | 显示全部楼层 |阅读模式
20金币
现在显示没有问题,但是物理按键设置最低温度和最高温度,不能触发继电器,新手比较菜,请大佬帮忙改改,谢谢!


  1. #include "TM1637Display.h"
  2. #define SCL 5
  3. #define SDA 4
  4. TM1637Display TM(SCL, SDA);

  5. #define BTN_INPUT 12  //按键引脚
  6. #define jdq_OUTPUT 13 //继电器引脚

  7. #include <OneWire.h>
  8. #include <DallasTemperature.h>
  9. #define ONE_WIRE_BUS 14 //温度引脚
  10. OneWire oneWire(ONE_WIRE_BUS);
  11. DallasTemperature ds18b20(&oneWire);

  12. bool AU_state = false;
  13. int AU_last = 10;

  14. const int MAX_DISPLAY_MODE = 3;
  15. int display_mode = 0; //0: 温度 1:开关 2: 设置
  16. uint8_t data[] = { 0x00, 0x00, 0x00, 0x00 };

  17. bool wifi_isopen = false;

  18. int brightness = 0x01; //led亮度设置

  19. bool alarm_isopen = true;

  20. int di = 11;  //初始最低温度
  21. int gao = 20;//初始最高温度

  22. int alarm_setup_mode = -1; //-1: off 0~3分别对应四位
  23. float temperature = 0;

  24. uint32_t timestamp_alarm = 0;  //温度设置
  25. uint32_t timestamp_TEMP = 0;    //温度
  26. uint32_t timestamp_btn = 0;   //按键
  27. uint32_t timestamp_lasthit = 0;
  28. bool btn_state = false;

  29. void alarm_add(int digit) //按键设置温度 长按+1
  30. {
  31.   if (digit == 0)
  32.   {
  33.     di += 1;//最低温度+
  34.     if (di >= 20)
  35.     {
  36.       di = di % 10;
  37.     }
  38.   }
  39.   if (digit == 1)
  40.   {
  41.     di -= 1;//最低温度-
  42.     if (di >= 20)
  43.     {
  44.       di -= 1;
  45.     }
  46.   }
  47.   if (digit == 2)
  48.   {
  49.     gao += 1;//最高温度+
  50.     if (gao >= 50)
  51.     {
  52.       gao = gao % 10;
  53.     }
  54.   }
  55.   if (digit == 3)
  56.   {
  57.     gao -= 1;//最高温度-
  58.     if (gao>= 50)
  59.     {
  60.       gao -= 1;
  61.     }
  62.   }
  63. }
  64. bool is_alarm()
  65. {
  66. return (alarm_isopen);
  67. }
  68. void set_colon(bool flag)
  69. {
  70.   uint8_t num = 0x00;
  71.   if (flag)
  72.     num = 0x80;
  73.   int i;
  74.   for (i = 0; i < 4; i++)
  75.   {
  76.     data[i] = data[i] | num;
  77.   }
  78. }
  79. void set_data_use_name()
  80. {
  81.   data[0] = SEG_B | SEG_C | SEG_D | SEG_F | SEG_G; //y
  82.   data[1] = SEG_B | SEG_C | SEG_D | SEG_F | SEG_G; //y
  83.   data[2] = SEG_A | SEG_B | SEG_E | SEG_F | SEG_G; //P
  84.   data[3] = SEG_C | SEG_D | SEG_E | SEG_F | SEG_G; //b
  85.   set_colon(true);
  86. }
  87. void set_data_use_temperature() //温度输出
  88. {
  89.   int num = (int)temperature;
  90.   if (num < 10)
  91.     data[0] = 0x00;
  92.   else
  93.     data[0] = TM.encodeDigit(num / 10);
  94.   data[1] = TM.encodeDigit(num % 10);
  95.   data[2] = SEG_A | SEG_B | SEG_F | SEG_G; //o
  96.   data[3] = SEG_A | SEG_D | SEG_E | SEG_F; //C
  97.   set_colon(false);
  98. }
  99. void set_data_use_alarm_isopen() //温度控制继电器开关
  100. {
  101.   if (alarm_isopen)
  102.   {
  103.     data[0] = 0x00;
  104.     data[1] = 0x00;
  105.     data[2] = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F; //O
  106.     data[3] = SEG_C | SEG_E | SEG_G; //n
  107.   }
  108.   else
  109.   {
  110.     data[0] = 0x00;
  111.     data[1] = SEG_C | SEG_D | SEG_E | SEG_G; //o
  112.     data[2] = SEG_A | SEG_E | SEG_F | SEG_G; //F
  113.     data[3] = SEG_A | SEG_E | SEG_F | SEG_G; //F
  114.   }
  115.   set_colon(false);
  116. }
  117. void set_data_use_alarm()
  118. {
  119.   uint32_t num1, num2;
  120.   num1 = di;
  121.   num2 = gao;
  122.   data[0] = TM.encodeDigit(num1 / 10);
  123.   data[1] = TM.encodeDigit(num1 % 10);
  124.   data[2] = TM.encodeDigit(num2 / 10);
  125.   data[3] = TM.encodeDigit(num2 % 10);
  126.   if (alarm_setup_mode != -1)
  127.   {
  128.     if (millis() % 700 < 350)
  129.       data[alarm_setup_mode] = 0x00;
  130.   }
  131.   set_colon(true);
  132. }
  133. void set_data(int display_mode) //显示模式切换
  134. {
  135.   switch (display_mode)
  136.   {
  137.     case -1:
  138.       set_data_use_name();
  139.       break;
  140.     case 0:
  141.       set_data_use_temperature();
  142.       break;
  143.     case 1:
  144.       set_data_use_alarm_isopen();
  145.       break;
  146.     case 2:
  147.       set_data_use_alarm();
  148.       break;
  149.     default:
  150.       data[0] = 0xff;
  151.       data[1] = 0xff;
  152.       data[2] = 0xff;
  153.       data[3] = 0xff;
  154.   }
  155. }
  156. void setup()
  157. {
  158.   Serial.begin(115200);
  159.   pinMode(BTN_INPUT, INPUT);
  160.   pinMode(jdq_OUTPUT, OUTPUT);//继电器输出
  161.   pinMode(LED_BUILTIN, OUTPUT);
  162.   digitalWrite(LED_BUILTIN, HIGH);
  163.   attachInterrupt(digitalPinToInterrupt(BTN_INPUT), btn_trigger, CHANGE);
  164.   ds18b20.begin();
  165.   TM.setBrightness(brightness);
  166. }
  167. void loop()
  168. {
  169.   uint32_t time_now = millis();

  170.   if (is_alarm())
  171.   {
  172.     AU_state = true;
  173.     timestamp_alarm = di;
  174.   }
  175.   if (AU_state && gao - timestamp_alarm > AU_last * 1000)
  176.   {
  177.     AU_state = false;
  178.   }
  179.   //update 温度
  180.   if (time_now - timestamp_TEMP > 2000)
  181.   {
  182.      ds18b20.requestTemperatures();// 发送命令获取温度
  183.       temperature = ds18b20.getTempCByIndex(0);

  184.     if (temperature < 0)
  185.       temperature = 0;
  186.     timestamp_TEMP = time_now;
  187.   }
  188.     // Serial.println(ds18b20.getTempCByIndex(0));  //串口调试温度
  189.     // delay(2000);//串口调试温度延时
  190.   set_data(display_mode);
  191.   TM.setSegments(data);
  192.   digitalWrite(jdq_OUTPUT, AU_state);

  193. }

  194. void btn_press()
  195. {
  196.   if (AU_state)
  197.   {
  198.     AU_state = false;
  199.     return;
  200.   }
  201.   switch (display_mode)
  202.   {
  203.     case -1:
  204.       display_mode = 0;
  205.       break;
  206.     case 2:
  207.       if (alarm_setup_mode != -1)
  208.       {
  209.         alarm_add(alarm_setup_mode);
  210.         break;
  211.       }
  212.       else
  213.       {
  214.         display_mode++;
  215.         if (display_mode == MAX_DISPLAY_MODE)
  216.           display_mode = 0;
  217.       }
  218.       break;
  219.     default:
  220.       display_mode++;
  221.       if (display_mode == MAX_DISPLAY_MODE)
  222.         display_mode = 0;
  223.   }
  224. }

  225. void btn_hold()
  226. {
  227.   switch (display_mode)
  228.   {
  229.     case 1:
  230.       alarm_isopen = !alarm_isopen;
  231.       break;
  232.     case 2:
  233.       alarm_setup_mode++;
  234.       if (alarm_setup_mode ==4)
  235.         alarm_setup_mode = -1;
  236.       break;
  237.     default:
  238.       display_mode = -1;
  239.   }
  240. }

  241. ICACHE_RAM_ATTR void btn_trigger() //触发按钮
  242. {
  243.   uint32_t time_now = millis();
  244.   if (!btn_state)
  245.   {
  246.     timestamp_btn = time_now;
  247.   }
  248.   else
  249.   {
  250.     if (time_now - timestamp_lasthit > 200)
  251.     {
  252.       if (time_now - timestamp_btn < 500)
  253.       {
  254.         Serial.println("短按");
  255.         btn_press();
  256.       }
  257.       else
  258.       {
  259.         Serial.println("长按");
  260.         btn_hold();
  261.       }
  262.       timestamp_lasthit = time_now;
  263.     }
  264.   }
  265.   btn_state = digitalRead(BTN_INPUT);
  266. }
复制代码


发表于 2022-5-26 13:46 | 显示全部楼层
第一行错了:
(改正):
#include<TM1637Display.h>
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-1 20:34 , Processed in 0.074506 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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