使用Adafruit Feather的电子邮件检查器在简单的循环中崩溃

时间:2017-12-10 17:38:45

标签: c++ arduino

我正在制作一个自动电子邮件检查器,使用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循环,在第一个中用于(;;)

一旦命令到达整个函数的最后一行,我就把命令打印到控制台,所以它实际上退出了函数,但无论出于什么原因,第二次读取按钮输出错误...

还有什么想法?

1 个答案:

答案 0 :(得分:0)

我认为由于while循环而被触发的是看门狗。在使用WiFi或任何其他形式的更高级别通信的MCU上工作时,代码需要持续运行以维持连接和内容。因此,使用这样的while循环是不好的做法。尝试使用简单的if语句读取主循环中的按钮状态,或者使用众多库中的一个。