外部数字中断和dht11

时间:2017-02-24 21:50:32

标签: arduino embedded arduino-uno arduino-ide

我有一个Arduino Pro Mini 5v,16 mhz,它连接到引脚2上的数字开关。该开关用于通过外部数字中断将Arduino从睡眠状态唤醒。我还有一个连接到引脚9的DHT11温度传感器。我想要实现的是当Arduino唤醒5秒钟时以及当引脚2上的开关为高电平时,我想读取温度传感器并返回温度。我正在使用Tillart的DHT11库,当我这样做时,它会返回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

1 个答案:

答案 0 :(得分:0)

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