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
@PatrickTrentin Désolé pour ça. Ajouté le code. Espérons que c'est formaté correctement. – Jigmeister
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'. –
@PatrickTrentin Merci d'avoir pris le temps de me donner vos suggestions. Je vais les essayer et rendre compte des résultats. – Jigmeister