2017-02-24 2 views
1

J'ai un Arduino Pro Mini 5v, 16 mégahertz et il est connecté à un commutateur numérique sur la broche 2. Ce commutateur est utilisé pour réveiller l'Arduino de la veille en utilisant une interruption numérique externe. J'ai aussi un capteur de température DHT11 connecté à la broche 9. Ce que je veux atteindre est le quand l'Arduino est éveillé pendant 5 secondes et aussi quand l'interrupteur sur la broche 2 est ÉLEVÉ, je veux lire le capteur de température et retourner la température. J'utilise la bibliothèque DHT11 par Tillart et quand je fais cela, il renvoie une erreur TIME_OUT. La seule explication possible que j'ai pour cela est que d'une certaine façon la tension est changée quand le DHT11 et l'interrupteur sur la broche 2 sont lus ensemble? Tout pointeur vers une solution sera grandement apprécié. Je vous remercie.Interruption numérique externe et dht11

Edit 1: Ajout de code

 #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; 
      } 
     } 

Edit 2: J'ai oublié aussi mentionner que j'utilise la bibliothèque LowPower par RocketScream pour mettre l'Arduino dormir. La bibliothèque peut être trouvée ici: https://github.com/rocketscream/Low-Power

+0

@PatrickTrentin Désolé pour ça. Ajouté le code. Espérons que c'est formaté correctement. – Jigmeister

+0

voulez-vous essayer de modifier 'attachInterrupt (0, pin2interrupt, HIGH);' à 'attachInterrupt (0, pin2interrupt, RISING);' et voir ce qui se passe? Et renommez 'secondes' en' loop_iterations'. Et remplacez 'secondes == 5' par' secondes> = 5'. –

+0

@PatrickTrentin Merci d'avoir pris le temps de me donner vos suggestions. Je vais les essayer et rendre compte des résultats. – Jigmeister

Répondre

0

Comme discuté dans la section des problèmes sur la page officielle Github de la bibliothèque DHT11 par Rob Tillart, le problème est dû au fait que certains capteurs DHT11 mettent plus de temps à transférer des données sur la carte puis la 50 ms ou plus spécifié sur la fiche technique. Par conséquent, si vous rencontrez ce problème, essayez d'augmenter DHTLIB_TIMEOUT sur le fichier d'en-tête dht en réduisant la valeur divisant la valeur F_CPU à environ 400 et réessayez. Cela permet à la carte d'attendre plus de 50 ms pour que la carte reçoive des données du capteur. Si cette correction ne fonctionne pas, vous pouvez essayer de mesurer le temps de réponse à l'aide d'un oscilloscope, car il semble que certains DHT11 soient construits différemment.