求助,更换数码管后按键不能切换了-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 436|回复: 0

[未解决] 求助,更换数码管后按键不能切换了

[复制链接]
发表于 2022-5-31 12:41 | 显示全部楼层 |阅读模式


原来用1637正常显示,屏幕太小,现在换成1650,温度能显示,但是按键不能切换了,哪位帮看看输出那块问题


  1. #include <Arduino.h>
  2. #include <Wire.h>

  3. #include <TM1650.h>
  4. TM1650 d;

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

  10. #define BTN_INPUT 12  //按键引脚
  11. const int MAX_DISPLAY_MODE = 2;//按键二级菜单
  12. int display_mode = 0;
  13. uint8_t data[] = { 0x00, 0x00, 0x00, 0x00 };
  14. int brightness = 1; //亮度设置0-7
  15. int alarm_setup_mode = -1; //-1: off 0~3分别对应四位

  16. float temperature = 0;
  17. uint32_t timestamp_TEMP = 0;    //温度
  18. uint32_t timestamp_btn = 0;   //按键
  19. uint32_t timestamp_lasthit = 0;
  20. bool btn_state = false;

  21. int x;//定义变量x,储存下限阈值
  22. int s;//定义变量s,储存上限阈值

  23. void set_colon(bool flag)
  24. {
  25.   uint8_t num = 0x00;
  26.   if (flag)
  27.     num = 0x00;
  28.   int i;
  29.   for (i = 0; i < 4; i++)
  30.   {
  31.     data[i] = data[i] | num;
  32.   }
  33. }
  34.   char line[4];
  35. void set_data_use_temperature() //温度输出
  36. {
  37.   int num = (int)temperature;
  38.   if (num < 10)
  39.     data[0] = 0x00;
  40.   else

  41. itoa(temperature, line, 10);

  42. d.displayString(line);

  43. //  data[0] = d.displayRunning(num / 10);
  44. //  data[1] = d.displayString(num % 10);
  45. //  data[2] = SEG_A | SEG_B | SEG_F | SEG_G; //o
  46. //  data[3] = SEG_A | SEG_D | SEG_E | SEG_F; //C
  47.   set_colon(false);
  48. }
  49. void set_data_use_alarm()
  50. {
  51.   uint32_t num1, num2;
  52.   num1 = x;
  53.   num2 = s;
  54.   data[0] = d.displayString(num1 / 10);
  55.   data[1] = d.displayString(num1 % 10);
  56.   data[2] = d.displayString(num2 / 10);
  57.   data[3] = d.displayString(num2 % 10);
  58.   if (alarm_setup_mode != -1)
  59.   {
  60.     if (millis() % 700 < 350)
  61.       data[alarm_setup_mode] = 0x00;
  62.   }
  63.   set_colon(true);
  64. }
  65. void set_data(int display_mode) //显示模式切换
  66. {
  67.   switch (display_mode)
  68.   {
  69.     case 0:
  70.       set_data_use_temperature();
  71.       break;
  72.     case 1:
  73.       set_data_use_alarm();
  74.       break;
  75.     default:
  76.       data[0] = 0xff;
  77.       data[1] = 0xff;
  78.       data[2] = 0xff;
  79.       data[3] = 0xff;
  80.   }
  81. }

  82. void setup()
  83.   {
  84.       Serial.begin(115200);
  85.       DS18B20.begin();
  86.       x = 10;// x初始值
  87.       s = 20;// s初始值

  88.       pinMode(BTN_INPUT, INPUT);//按键输出
  89.       attachInterrupt(digitalPinToInterrupt(BTN_INPUT), btn_trigger, CHANGE);
  90.       d.setBrightness(brightness);
  91.       Wire.begin();
  92.       d.init();
  93.       pinMode(13, OUTPUT);// 继电器输出
  94.       digitalWrite(13, HIGH);//默认输出高电平
  95. }
  96. void loop()
  97.   {
  98.   uint32_t time_now = millis();
  99.   //更新温度到数码管
  100.   if (time_now - timestamp_TEMP > 2000)
  101.   {
  102.      DS18B20.requestTemperatures();// 发送命令获取温度
  103.      temperature = DS18B20.getTempCByIndex(0);

  104.    //  Serial.print(temperature);//调试输出
  105.   }
  106.   set_data(display_mode);
  107. //  d.setSegments(data);
  108. //   d.displayString("3214");
  109.    if(temperature<x)
  110.         {
  111.             ;
  112.             digitalWrite(13, HIGH);
  113.         }
  114.         
  115.    if(temperature>s)
  116.         {
  117.             ;
  118.             digitalWrite(13, LOW);
  119.         }//高于上限关闭
  120. }

  121. void alarm_add(int digit)
  122. {
  123.   if (digit == 0)
  124.   {
  125.     x += 1;
  126.     if (x >= 30)
  127.     {
  128.       x = x % 10;
  129.     }
  130.   }
  131.   if (digit == 1)
  132.   {
  133.     x -= 1;
  134.     if (x >= 30)
  135.     {
  136.       x -= 1;
  137.     }
  138.   }
  139.   if (digit == 2)
  140.   {
  141.     s += 1;
  142.     if (s >= 50)
  143.     {
  144.       s = s % 10;
  145.     }
  146.   }
  147.   if (digit == 3)
  148.   {
  149.     s -= 1;
  150.     if (s>= 50)
  151.     {
  152.       s -= 1;
  153.     }
  154.   }
  155. }


  156. void btn_press()
  157. {
  158.   switch (display_mode)
  159.   {
  160.     case -1:
  161.       display_mode = 0;
  162.       break;
  163.     case 1:
  164.       if (alarm_setup_mode != -1)
  165.       {
  166.         alarm_add(alarm_setup_mode);
  167.         break;
  168.       }
  169.       else
  170.       {
  171.         display_mode++;
  172.         if (display_mode == MAX_DISPLAY_MODE)
  173.           display_mode = 0;
  174.       }
  175.       break;
  176.     default:
  177.       display_mode++;
  178.       if (display_mode == MAX_DISPLAY_MODE)
  179.         display_mode = 0;
  180.   }
  181. }

  182. void btn_hold()
  183. {
  184.   switch (display_mode)
  185.   {
  186.     case 1:
  187.       alarm_setup_mode++;
  188.       if (alarm_setup_mode ==4)
  189.         alarm_setup_mode = -1;
  190.       break;
  191.     default:
  192.       display_mode = -1;
  193.   }
  194. }

  195. ICACHE_RAM_ATTR void btn_trigger()
  196. {
  197.   uint32_t time_now = millis();
  198.   if (!btn_state)
  199.   {
  200.     timestamp_btn = time_now;
  201.   }
  202.   else
  203.   {
  204.     if (time_now - timestamp_lasthit > 200)
  205.     {
  206.       if (time_now - timestamp_btn < 500)
  207.       {
  208.         //Serial.println("短按");
  209.         btn_press();
  210.       }
  211.       else
  212.       {
  213.         //Serial.println("长按");
  214.         btn_hold();
  215.       }
  216.       timestamp_lasthit = time_now;
  217.     }
  218.   }
  219.   btn_state = digitalRead(BTN_INPUT);
  220. }
  221.   
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-1 21:13 , Processed in 0.067822 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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