Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 外部数字中断与dht11_Arduino_Embedded_Arduino Uno_Arduino Ide - Fatal编程技术网

Arduino 外部数字中断与dht11

Arduino 外部数字中断与dht11,arduino,embedded,arduino-uno,arduino-ide,Arduino,Embedded,Arduino Uno,Arduino Ide,我有一个Arduino Pro Mini 5v,16MHz,它连接到引脚2上的数字开关。此开关用于使用外部数字中断将Arduino从睡眠中唤醒。我还有一个DHT11温度传感器连接到引脚9。我想要实现的是,当Arduino唤醒5秒钟,并且当针脚2上的开关处于高位时,我想要读取温度传感器并返回温度。我正在使用Tillart的DHT11库,当我这样做时,它会返回一个超时错误。我对此唯一可能的解释是,当DHT11和引脚2上的开关同时被读取时,电压不知何故发生了变化?任何指向解决方案的指针都将不胜感激。多

我有一个Arduino Pro Mini 5v,16MHz,它连接到引脚2上的数字开关。此开关用于使用外部数字中断将Arduino从睡眠中唤醒。我还有一个DHT11温度传感器连接到引脚9。我想要实现的是,当Arduino唤醒5秒钟,并且当针脚2上的开关处于高位时,我想要读取温度传感器并返回温度。我正在使用Tillart的DHT11库,当我这样做时,它会返回一个超时错误。我对此唯一可能的解释是,当DHT11和引脚2上的开关同时被读取时,电压不知何故发生了变化?任何指向解决方案的指针都将不胜感激。多谢各位

编辑1:添加代码

#包括
#包括
int pin2=2;
dht-dht;
#定义DHT11_引脚9
空心销2插口(空心)
{
//从睡眠中醒来时调用的函数
//分离中断,以在正常模式下停止其连续触发
}
无效进入睡眠(无效)
{
连接中断(0,插脚2中断,高);
序列号。打印号(“睡眠”);
延迟(100);
低功耗。断电(永久睡眠,ADC关闭,BOD关闭);
Serial.println(“Awake!”);
}
无效设置()
{
序列号开始(115200);
引脚模式(引脚2,输入);
引脚模式(DHT11_引脚,输入);
}
整数秒=0;
void循环()
{
延迟(1000);
秒++;
println(“在循环中醒来!”);
Serial.println(秒);
如果(数字读取(pin2)=低和秒==5)
{
秒=0;
println(“没有检测到孩子,所以要睡觉了!”);
延迟(200);
进入睡眠();
}
否则如果(秒==5)
{
串行打印(“DHT11\t”);
int chk=DHT.read11(DHT11_引脚);
开关(chk)
{
案例DHTLIB_正常:
串行打印(“确定,\t”);
打破
案例DHTLIB_错误_校验和:
串行打印(“校验和错误,\t”);
打破
案例DHTLIB\u错误\u超时:
串行打印(“超时错误,\t”);
打破
违约:
串行打印(“未知错误,\t”);
打破
}
//显示数据
串行打印LN(DHT温度,1);
延迟(2000年);
秒=0;
}
}

编辑2:我还忘了提到我正在使用RocketStream的低功耗库让Arduino进入睡眠状态。该库可在此处找到:

如Rob Tillart在DHT11库官方Github页面的问题部分所述,问题的原因是一些DHT11传感器将数据传输回电路板所需的时间比数据表上规定的50毫秒左右要长。因此,如果遇到此问题,请尝试通过将F_CPU值除以的值减小到400左右来增加dht头文件上的DHTLIB_超时,然后重试。这允许电路板等待超过50ms的时间,以便电路板从传感器接收回数据。如果此修复不起作用,您可能需要尝试使用示波器测量响应时间,因为某些DHT11的构建方式似乎有所不同。

正如Rob Tillart在DHT11库官方Github页面的问题部分所述,导致该问题的原因是,一些DHT11传感器将数据传输回电路板所需的时间比数据表上规定的50毫秒或更长。因此,如果遇到此问题,请尝试通过将F_CPU值除以的值减小到400左右来增加dht头文件上的DHTLIB_超时,然后重试。这允许电路板等待超过50ms的时间,以便电路板从传感器接收回数据。如果此修复不起作用,您可能需要尝试使用示波器测量响应时间,因为某些DHT11的构造似乎有所不同。

@PatrickTrentin对此表示抱歉。添加了代码。希望其格式正确。是否尝试更改
attachintrupt(0,pin2interrupt,HIGH)
连接中断(0,插脚2中断,上升)然后看看会发生什么?请将
seconds
重命名为
loop\u iterations
。并将
seconds==5
替换为
seconds>=5
@PatrickTrentin谢谢你花时间给我提建议。我会尝试并报告结果。@PatrickTrentin我仍然会遇到超时错误。当我单独读取DHT11时,传感器工作正常。我还注意到,在我运行这个程序,然后运行一个只读取DHT11的程序后,DHT11会响应超时错误一段时间,然后恢复正常。我不确定
attachInterrupt(0,…)
在做什么,根据文档,它应该是
attachInterrupt(digitalPinToInterrupt(pin2))
。由于这不起作用,请尝试添加
detachInterrupt(digitalPinToInterrupt(pin2))
pin2interrupt()
的代码。也许最好看一看
dht
的源代码,看看为什么要花这么长时间才能读取值。@PatrickTrentin对此表示抱歉。添加了代码。希望其格式正确。是否尝试更改
attachintrupt(0,pin2interrupt,HIGH)
连接中断(0,插脚2中断,上升)然后看看会发生什么?请将
seconds
重命名为
loop\u iterations
。并将
seconds==5
替换为
seconds>=5
@PatrickTrentin谢谢你花时间给我提建议。我会试试看,然后报告结果。@PatrickTrentin I.s