我有一個Arduino Pro Mini 5v,16 mhz,它連接到引腳2上的數字開關。此開關用於通過外部數字中斷將Arduino從睡眠中喚醒。我還有一個連接到引腳9的DHT11溫度傳感器。我想要達到的是當Arduino喚醒5秒鐘並且引腳2上的開關爲高電平時,我想讀取溫度傳感器並返回溫度。我正在使用Tillart的DHT11庫,當我這樣做時,它會返回一個TIME_OUT錯誤。我唯一可能的解釋是,當DHT11和引腳2上的開關一起讀取時,電壓會發生改變?任何指向解決方案的指針都將不勝感激。謝謝。外部數字中斷和dht11
編輯1:添加的代碼
#include <LowPower.h>
#include <dht.h>
int pin2 = 2;
dht DHT;
#define DHT11_PIN 9
void pin2interrupt(void)
{
// Function called when awoken from sleep
// Detach interrupt to stop it from continuosly firing when in normal mode
}
void enterSleep(void)
{
attachInterrupt(0, pin2interrupt, HIGH);
Serial.println("Sleeping");
delay(100);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
Serial.println("Awake!");
}
void setup()
{
Serial.begin(115200);
pinMode(pin2, INPUT);
pinMode(DHT11_PIN, INPUT);
}
int seconds = 0;
void loop()
{
delay(1000);
seconds++;
Serial.println("Awake in the loop!");
Serial.println(seconds);
if (digitalRead(pin2) == LOW && seconds == 5)
{
seconds = 0;
Serial.println("No child detected, so going to sleep!");
delay(200);
enterSleep();
}
else if (seconds == 5)
{
Serial.print("DHT11, \t");
int chk = DHT.read11(DHT11_PIN);
switch (chk)
{
case DHTLIB_OK:
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
// DISPLAY DATA
Serial.println(DHT.temperature, 1);
delay(2000);
seconds = 0;
}
}
編輯2:我也忘了提,我使用的是低功耗庫通過RocketScream把Arduino的睡覺。這個庫可以在這裏找到:https://github.com/rocketscream/Low-Power
@PatrickTrentin對不起。添加了代碼。希望它的格式正確。 – Jigmeister
你會嘗試改變attachInterrupt(0,pin2interrupt,HIGH);'attachInterrupt(0,pin2interrupt,RISING);'看看會發生什麼?請將'seconds'重命名爲'loop_iterations'。並用'seconds> = 5'替換'seconds == 5'。 –
@PatrickTrentin感謝您花時間給我提出您的建議。我會嘗試並報告結果。 – Jigmeister