我正在制作一个自动电子邮件检查器,使用adafruit羽毛,arduino IDE,IFTTT来检查电子邮件,以及adafruit io将IFTTT连接到我的羽毛上。
我有2个LED连接到羽毛的GPIO。当我收到一封电子邮件时,一个led开启,另一个电子邮件,第二个led开启,第三个电子邮件,第一个led开始闪烁等等。
值得注意的是,它不会计算收件箱中未读电子邮件的数量,而是会在电子邮件到达时点亮指示灯。因此,它只能在任何时候提醒我最多4封电子邮件。
这完美无缺,但现在我想把它全部放在一个3d打印的盒子里。之前,一旦达到4个电子邮件限制,我会单击“重置”按钮,但在案例中无法访问。所以我添加了一个按钮作为重置按钮,并使代码接受按钮输入。
// if I get a new email
if (amountOnScreen == 1){
digitalWrite(14, HIGH);
while(amountOnScreen == 1) {
if (digitalRead(13) == LOW) {
amountOnScreen = 0;
Serial.print("button pressed");
}
}
}
(如果amountOnScreen == 2那么这意味着两封电子邮件到达,等等......)
同样,稍后我在代码中
if (amountOnScreen == 0) {
digitalWrite(14,LOW);
digitalWrite(12,LOW);
}
一旦收到电子邮件,整件事就会崩溃,我不知道为什么。
同样,无论出于何种原因,按下按钮时返回低电平,未按下时按钮返回高电平。
非常感谢任何帮助。
谢谢!
编辑:
所以我摆脱了while循环,而只是使用了里面的代码,结果是它不起作用,除非在电子邮件进入时按下按钮(这是非常不切实际的)。
所以我阅读了一些关于循环的内容,并尝试了一个for(;;)循环,如果a)另一封电子邮件进入或b)按下按钮就会中断。 现在代码完美无缺,只有一个小问题......
for (;;) {
Serial.print("for loop again");
delay(100);
// makes sure LED is on
digitalWrite(14, HIGH);
// if button is pressed
if (digitalRead(13) == LOW) {
amountOnScreen = 0;
Serial.print("pressed while in first for(;;) loop ");
break;
}
}
然而:问题在于它完美地工作一次,但任何后续尝试都会导致灯闪烁十分之一秒,然后再次关闭。
第一次控制台输出: (一堆'for loop again')....... for循环再次压缩,而在第一次为(;;)
我第二次尝试同样的事情: for循环中的for循环,在第一个中用于(;;)
一旦命令到达整个函数的最后一行,我就把命令打印到控制台,所以它实际上退出了函数,但无论出于什么原因,第二次读取按钮输出错误...
还有什么想法?
答案 0 :(得分:0)
我认为由于while循环而被触发的是看门狗。在使用WiFi或任何其他形式的更高级别通信的MCU上工作时,代码需要持续运行以维持连接和内容。因此,使用这样的while
循环是不好的做法。尝试使用简单的if
语句读取主循环中的按钮状态,或者使用众多库中的一个。