c++ - Arduino 在启动时自动运行代码

标签 c++ arduino load onstart

我是 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 按钮未被按下的代码中被重置,所以只要按钮被按下它就会保持 true。

变量 countdownSeconds 保存倒计时结束剩余的秒数(很明显)。然后代码还告诉显示逻辑在屏幕上显示倒计时。

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

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

现在,我希望您有足够的信息来了解如何以您想要的方式更改程序。

关于c++ - Arduino 在启动时自动运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34096172/

相关文章:

c++ - Arduino 是否完全支持 C++ 标准库?

c++ - 将结构写入闪存

java - 如何从java项目的resource/images文件夹加载图像?

c++ - 如何强制32位浮点计算在不同平台上的一致性?

c++ - 概念与复制构造函数冲突的泛型编程

c++ - 如何在给定 if 条件的情况下删除整数数组中的特定元素?

python - 用 Arduino 和 pySerial 闪烁 LED

C++ 游戏加载对象/全局对象

加载 CSV 文件时,PHP 在完成脚本之前终止(?)

c++ - 将多个文本文件合并为一个