Arduino在启动时自动运行代码
Arduino to run code on start automatically
我对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
,而是通过buttonPressed
、buttonPressedNew
和buttonHeld
函数。每个函数都接收一个表示按钮的数字,如果按钮处于函数名称建议的状态,则返回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)条件。
也许你会得到你想要的。
- 如何在linux终端中同时编译和运行c++代码
- 尝试用java代码编译和运行c++代码
- 不同/较旧的处理器运行c++代码的方式是否不同
- 无法在 geany 上运行代码。无法执行构建命令
- 运行代码时,c++ 会终止进程
- 编译多个C++文件.调用二进制文件以运行代码
- 分段故障 运行C++代码时出现 SIGSEGV
- 如何分析在 Windows 上运行C++代码?
- 编译器资源管理器(godbolt)如何安全地运行代码?
- 如何在 vim (windows) 中编译和运行 c++ 代码
- 无法在 Visual Studio 代码中生成和运行 C++ 代码
- 连续运行C++代码和 Python 代码
- 在静态初始化期间运行代码
- C++ .我正在尝试通过使用开关内的数组来获取用户输入,但是当我运行代码时,它显示分段错误?
- 我最近更改了编译器路径以运行 c++ 代码,但现在我无法运行任何 python 代码。我该如何解决这个问题?
- 如何在Visual Studio Code的终端内运行C++代码?
- 在注入的 Dll 的 DllMain 中运行代码导致注入超时
- 并行和顺序运行代码时会产生不同的结果
- 运行代码时C++错误
- 在 CortexM0 中从 RAM 运行代码时出现硬故障