外部数字中断和 dht11
External digital interrupt and dht11
我有一个 Arduino Pro Mini 5v,16 mhz,它连接到引脚 2 上的数字开关。此开关用于使用外部数字中断将 Arduino 从睡眠状态唤醒。我还有一个连接到引脚 9 的 DHT11 温度传感器。我想要实现的是当 Arduino 唤醒 5 秒并且当引脚 2 上的开关处于高电平时,我想读取温度传感器和 return 气温。我正在使用 Tillart 的 DHT11 库,当我这样做时,它 return 是一个 TIME_OUT 错误。我对此唯一可能的解释是,当同时读取 DHT11 和引脚 2 上的开关时,电压会以某种方式改变?任何指向解决方案的指针都将不胜感激。谢谢。
编辑 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 的 LowPower 库让 Arduino 进入睡眠状态。图书馆可以在这里找到:https://github.com/rocketscream/Low-Power
正如 Rob Tillart 在 DHT11 库的官方 Github 页面上的问题部分中所讨论的那样,问题是由于某些 DHT11 传感器将数据传回板需要更长的时间,然后是 50 毫秒左右在数据表上指定。因此,如果您遇到此问题,请尝试通过将 F_CPU 值除以 400 左右的值来增加 dht 头文件上的 DHTLIB_TIMEOUT,然后重试。这允许电路板等待超过 50 毫秒,以便电路板从传感器接收回数据。如果此修复不起作用,您可能想尝试使用示波器测量响应时间,因为某些 DHT11 的构建方式似乎有所不同。
我有一个 Arduino Pro Mini 5v,16 mhz,它连接到引脚 2 上的数字开关。此开关用于使用外部数字中断将 Arduino 从睡眠状态唤醒。我还有一个连接到引脚 9 的 DHT11 温度传感器。我想要实现的是当 Arduino 唤醒 5 秒并且当引脚 2 上的开关处于高电平时,我想读取温度传感器和 return 气温。我正在使用 Tillart 的 DHT11 库,当我这样做时,它 return 是一个 TIME_OUT 错误。我对此唯一可能的解释是,当同时读取 DHT11 和引脚 2 上的开关时,电压会以某种方式改变?任何指向解决方案的指针都将不胜感激。谢谢。
编辑 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 的 LowPower 库让 Arduino 进入睡眠状态。图书馆可以在这里找到:https://github.com/rocketscream/Low-Power
正如 Rob Tillart 在 DHT11 库的官方 Github 页面上的问题部分中所讨论的那样,问题是由于某些 DHT11 传感器将数据传回板需要更长的时间,然后是 50 毫秒左右在数据表上指定。因此,如果您遇到此问题,请尝试通过将 F_CPU 值除以 400 左右的值来增加 dht 头文件上的 DHTLIB_TIMEOUT,然后重试。这允许电路板等待超过 50 毫秒,以便电路板从传感器接收回数据。如果此修复不起作用,您可能想尝试使用示波器测量响应时间,因为某些 DHT11 的构建方式似乎有所不同。