Arduino在启动时自动运行代码

Arduino to run code on start automatically

本文关键字:运行 代码 启动 Arduino      更新时间:2023-10-16

我对C++和Arduino还很陌生。我买了一个叫Defusable Alarm Clock的小工具。我想修改代码,这样当它通电时就会自动开始倒计时。现在,你必须手动按下红色按钮(DET)才能开始倒计时。有没有办法绕过红色按钮,让它自动倒计时?

这是默认代码:

https://gist.github.com/anonymous/a5acc051ae6157e6e7f1

谢谢你的帮助!

查看代码,您可以识别4个不同的输入按钮:

pinMode(HOUR_BUTTON_PIN, INPUT);     
pinMode(MIN_BUTTON_PIN, INPUT);     
pinMode(ALARM_BUTTON_PIN, INPUT);     
pinMode(DET_BUTTON_PIN, INPUT);     

显然,红色按钮是ALARM或DET按钮。

让我们看看每个按钮的输入何时被读取。负责该玩具逻辑的代码不直接使用digitalRead,而是通过buttonPressedbuttonPressedNewbuttonHeld函数。每个函数都接收一个表示按钮的数字,如果按钮处于函数名称建议的状态,则返回true。按钮编号在开始时定义,并通过buttonPins阵列映射到按钮引脚。

#define MIN_BUTTON 0
#define HOUR_BUTTON 1
#define DET_BUTTON 2
#define ALARM_BUTTON 3
...
byte buttonPins[4] = {MIN_BUTTON_PIN, HOUR_BUTTON_PIN, DET_BUTTON_PIN, ALARM_BUTTON_PIN};

回到我们的问题,让我们看看正在查询DET_BUTTON和ALARM_BUTTON的位置。我将只关注设置和循环,因为这些是"按下红色按钮启动"逻辑最可能出现的地方。

 if (buttonPressed(DET_BUTTON)) {
    // enable silent mode for testing
    beep(3500, 50);
    silent = true;
    while (buttonPressed(DET_BUTTON)); // wait for release
  }

这是为了测试蜂鸣器的通电-在重新设置时按住按钮,只要你继续按住,就会发出嘟嘟声。

// check input
  if ((buttonPressed(ALARM_BUTTON)) && (!displayCountdown)) {
    displayAlarmTime = true;
    if (alarmpm) {
      digitalWrite(LED_PM, HIGH);
    } else {
      digitalWrite(LED_PM, LOW);
    }
    if (alarmMode == ALARM_OFF) {
      digitalWrite(LED_ALARM, LOW);
      digitalWrite(LED_DET, LOW);
    } else {
      digitalWrite(LED_ALARM, HIGH);
      if (alarmMode == ALARM_DET) {
    digitalWrite(LED_DET, HIGH);
      } else {
    digitalWrite(LED_DET, LOW);
      }
    }
  } else {
    displayAlarmTime = false;
    digitalWrite(LED_ALARM, LOW);
    digitalWrite(LED_DET, LOW);
  }

这与LED指示灯有关。如果按下报警按钮并且屏幕上没有显示倒计时,则某些LED将点亮,否则它们将熄灭。此外,displayAlarmTime是一个标志,指示应在屏幕上显示报警时间。

  if (!buttonPressed(ALARM_BUTTON)) {
    if (countdownSeconds < 5940) {
      countdownSeconds += 60;
      countdownDuration += 60;
    }

此代码位于if (buttonPressedNew(HOUR_BUTTON) || buttonHeld(HOUR_BUTTON, 150)) blkock内部,因此不感兴趣。下一个片段也有类似的结论,我没有费心去复制。

if (buttonPressedNew(DET_BUTTON)) {
    if (displayAlarmTime) {
      alarmMode++;
      if (alarmMode > ALARM_DET) {
    alarmMode = ALARM_OFF;
      }
      if (alarmMode == ALARM_OFF) {
    snoozeActivated = false;
      }
      return;
    }
    if ((displayZeros) || (isDefused)) {
      isDefused = false;
      displayZeros = false;
      displayCountdown = false;
      return;
    }
    // The DET button has been pressed but not released yet.
    detPressed = true;
    countdownSeconds = defaultCountdownSeconds;
    displayCountdown = true;
  }

第一部分与警报有关。这让我有点困惑,因为只有三种报警模式,而编号最高的模式实际上是ALARM_DET,所以alarmMode > ALARM_DET线永远不会是真的。

不管怎样,它看起来不像我们的候选人。

现在来看第二部分,它看起来更有希望。我认为标志displayZeros表示显示器上显示了零,这意味着您没有按时拆除。isDefused标志表明你确实拆除了炸弹。if ((displayZeros) || (isDefused))一起表示您处于"游戏"的末尾(您赢了或输了),因此应该采取的操作是重置显示。

标志detPressed用于记住按下了DET按钮。它将在检查DET按钮是否未按下的代码中重置,因此只要按下按钮,它就会保持不变。

变量countdownSeconds保持了倒计时结束时剩下的秒数(显然)。然后代码还告诉显示逻辑在屏幕上显示这个倒计时。

  if (!buttonPressed(DET_BUTTON)) {
    if (detPressed) {
      detPressed = false;
      defaultCountdownSeconds = countdownSeconds;
      writeEEPROM();
      countdown();
    }
  }

这是最后一部分。当您释放DET按钮时,内部逻辑将发生。它会将defaultCountDown秒设置为当前的倒计时秒,我想这是因为你可以在按下按钮时更改倒计时,写一些东西(默认的倒计时?)到eeprom和。。。开始倒计时!

现在,我希望,你有足够的信息来弄清楚如何以你想要的方式更改程序。

20秒的答案:

行中:

 if ((buttonPressed(ALARM_BUTTON)) && (!displayCountdown)) 

取消按下按钮(ALARM_BUTTON)条件。

也许你会得到你想要的。