首页 > 解决方案 > 我怎样才能摆脱困境?

问题描述

我想在我的 Arduino 项目中摆脱困境。目前我正在对数字手表进行编程,一切正常,但我想通过单击一个按钮来添加选项菜单,但是在单击它之后,即使我在代码中有任何内容,也不会弹出任何内容。看看它。不知道怎么写比较好。如果您有一些想法,请您可以重写代码的某些部分并解释您这样做的原因。提前感谢。

请不要介意 s = s + 1,我想要那样。

#include "LiquidCrystal.h"
#include <EEPROM.h>

LiquidCrystal lcd(12,11,5,4,3,2);

int h = 0;
int m = 0;
int s = 0;
int right = 8;
int left = 9;
int buttonStateLeft = 0;
String when;


uint8_t EEPROMaddress_sec = 1;
uint8_t EEPROMaddress_min = 2;
uint8_t EEPROMaddress_hour = 3;

bool clockShown = true;
bool menuShown = false;

void setup()
{
  lcd.begin(16,2);
  pinMode(right, INPUT);
  pinMode(left, INPUT);
}

void loop()
{

  if(menuShown)
  {
        lcd.setCursor(0,0);
        lcd.print("jozo je kkt");
        delay(200);
  }


  if(clockShown) {

      lcd.setCursor(0,0);
      buttonStateLeft = digitalRead(left);

      if(buttonStateLeft == HIGH)
      {
        clockShown = false;
        menuShown = true;
        lcd.clear();
      }

      s = EEPROM.read(EEPROMaddress_sec);
      m = EEPROM.read(EEPROMaddress_min);
      h = EEPROM.read(EEPROMaddress_hour);

      s = s + 1;

      if(h > 12)
      when = "PM";
      if(h < 12)
      when = "AM";
      if(h == 12)
      when = "PM";

      lcd.print("Cas: ");
      if(h<10)lcd.print("0");
      lcd.print(h);
      lcd.print(":");
      if(m<10)lcd.print("0");
      lcd.print(m);
      lcd.print(":");
      if(s<10)lcd.print("0");
      lcd.print(s);
      lcd.print(" ");
      lcd.print(when);

      if(s == 60)
      {
        s = 0;
        m = m+1;
      }

      if(m == 60)
      {
        s = 0;
        m = 0;
        h = h+1;
      }
      if(h == 24)
      {
        m = 0;
        s = 0;
        h = 0;
      }

      EEPROM.write(EEPROMaddress_sec, s);
      EEPROM.write(EEPROMaddress_min, m);
      EEPROM.write(EEPROMaddress_hour, h);

      delay(1000);
  }
}

标签: arduino

解决方案


为此,您必须使用中断,请注意,您必须将按钮连接到中断引脚(并非每个引脚都是中断引脚)您可以谷歌“'your_card_name'的中断引脚是什么”,代码将必须改变,你可以按照这些:

在设置功能中替换:

 pinMode(left, INPUT);

经过 :

 attachInterrupt(digitalPinToInterrupt(left), switchMode, RISING);

在 setup(){...} 之前添加此函数

 int lastPressTime=millis();
 void switchMode(){ // function called when the button is pressed
    if((millis()-lastPressTime)>60){ // for debouncing
     clockShown = false;
     menuShown = true;
     lcd.clear();
     lastPressTime=millis();
    }
 }

并从您的代码中删除这部分:(循环()函数中的那个)

        buttonStateLeft = digitalRead(left);

  if(buttonStateLeft == HIGH)
  {
    clockShown = false;
    menuShown = true;
    lcd.clear();
  }

推荐阅读