Salut à tous !
Voilà, allons direct au vif du sujet:
J'ai besoin de contrôler en temps réel la température d'une plaque en verre afin que sa surface soit en permanence au point de roséehttp://fr.wikipedia.org/wiki/Point_de_ros%C3%A9e
Pour cela je pensais utiliser plusieurs modules peltier Thermoélectricité — Wikipédia et un arduino accompagné d'un capteur de température et d'humidité (dht11 DHT11 - Capteur de temperature et humidite digital - Boutique Semageek) pour prendre les mesures de l'air ambiant, et des thermistances pour prendre la température de la plaque de verre
Ça fait un moment que j'attends d'avoir un projet pour tâter du arduino, là c'est l'occasion, mais je débute complet.
Dans l'idée la boucle du programme serait:
{
Arduino interroge le capteur de temp/hum (air);
Recherche dans la courbe de point de rosée la température à atteindre à la surface de la vitre;
Interroge la température à la surface de la vitre (moyenne des 4 thermistances);
Si température supérieure:
Mise en tension des peltiers jusqu’à obtention de la température souhaitée;
Sinon laisse les peltiers éteints
}
Après de nombreux essais en mode "je fais tout tout seul depuis le départ", et de nombreux échecs, j'ai décidé de faire plus simple pour commencer et de juste récupérer un code pour juste communiquer avec le capteur dht11.
Voilà là où j'ai trouvé le code, mon montage est exactement le même http://letmeknow.fr/blog/tuto-utiliser-un-capteur-temperature-humidite/
Problème, le capteur m'envoie aucune info, le seul retour que j'ai est "Temps d'attente dépassé !",
Voilà le code, si quelqu'un saurait me dire où ça coince ce serait avec grand plaisir
/** Broche "DATA" du DHT11 */
const byte DHT11_PIN = 5;
/** Code d'erreur de la fonction readDHT11() */
enum {
DHT11_SUCCESS, //!< Pas d'erreur
DHT11_TIMEOUT_ERROR, //!< Temps d'attente d?©pass?©
DHT11_CHECKSUM_ERROR //!< Donn?©es re?ßues erron?©es
};
/** Fonction setup() */
void setup() {
/* Initialisation du port s?©rie */
Serial.begin(115200);
Serial.println(F("DHT11 DEMO"));
}
/** Fonction loop() *
void loop() {
/* Variables d'usage */
byte temperature, humidity;
/* Lecture de la temp?©rature et de l'humidit?© + gestion des erreurs */
switch (readDHT11(DHT11_PIN, &temperature, &humidity)) {
case DHT11_SUCCESS:
/* Affichage de la temp?©rature et du taux d'humidit?© */
Serial.print(F("Humidite (%): "));
Serial.println((int) humidity);
Serial.print(F("Temperature (^C): "));
Serial.println((int) temperature);
break;
case DHT11_TIMEOUT_ERROR:
Serial.println(F("Temps d'attente depasse !"));
break;
case DHT11_CHECKSUM_ERROR:
Serial.println(F("Erreur de checksum !"));
break;
}
/* Pas besoin de rafraichir l'affichage tr?®s souvent */
delay(2000);
}
/**
* Lit la temp?©rature et le taux d'humidit?© capt?© par un capteur DHT11
*
* @param pin Broche sur laquelle est c?¢bl?© le capteur
* @param temperature Pointeur vers la variable stockant la temp?©rature
* @param humidity Pointeur vers la variable stockant le taux d'humidit?©
* @return DHT11_SUCCESS si aucune erreur, DHT11_TIMEOUT_ERROR en cas de timeout, ou DHT11_CHECKSUM_ERROR en cas d'erreur de checksum
*/
byte readDHT11(byte pin, byte* temperature, byte* humidity) {
/* data[] -> buffer contenant les donn?©es du cpateur
* counter -> compteur permettant de savoir quel bit est re?ßu (bitwise)
* index -> compteur permettant de savoir quel octet est re?ßu (bitwise)
* timeout -> compteur pour le timeout
*/
byte data[5] = { 0 }, counter = 7, index = 0;
unsigned int timeout;
/* Conversion du num?©ro de broche Arduino en ports/masque binaire "bas niveau" */
/* Utiliser les registres du microcontr?¥leur est bien plus rapide que digitalWrite() */
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *ddr = portModeRegister(port); // Registre MODE (INPUT / OUTPUT)
volatile uint8_t *out = portOutputRegister(port); // Registre OUT (?©criture)
volatile uint8_t *in = portInputRegister(port); // Registre IN (lecture)
/* R?©veil du capteur */
*ddr |= bit; // OUTPUT
*out &= ~bit; // LOW
delay(18); // Temps d'attente ?† LOW causant le r?©veil du capteur
*out |= bit; // HIGH
delayMicroseconds(40);
*ddr &= ~bit; // INPUT
/* Attente de la r?©ponse du capteur */
timeout = 0;
while(!(*in & bit)) /* Attente d'un ?©tat LOW */
if (++timeout == 10000)
return DHT11_TIMEOUT_ERROR;
timeout = 0;
while(*in & bit) /* Attente d'un ?©tat HIGH */
if (++timeout == 10000)
return DHT11_TIMEOUT_ERROR;
/* Lecture des donn?©es du capteur (40 bits) */
for (byte i = 0; i < 40; ++i) {
/* Attente d'un ?©tat LOW */
timeout = 0;
while(!(*in & bit))
if (++timeout == 10000)
return DHT11_TIMEOUT_ERROR;
/* Mise en m?©moire du temps courant */
unsigned long t = micros();
/* Attente d'un ?©tat HIGH */
timeout = 0;
while(*in & bit)
if (++timeout == 10000)
return DHT11_TIMEOUT_ERROR;
/* Si le delta Temps est sup?©rieur ?† 40¬µS c'est un "1", sinon c'est un "0" */
if ((micros() - t) > 40)
data[index] |= (1 << counter); // "1"
// Le tableau data[] est initialis?© ?† "0" par d?©faut <span class="wp-smiley emoji emoji-wink" title=";)">;)</span>
/* Si le compteur de bits atteint z?©ro */
if (counter-- == 0) {
counter = 7; /* On passe ?† l'octet suivant */
++index;
}
}
/* Format des donn?©es :
* [0] = humidit?© en %
* [1] = z?©ro
* [2] = temp?©rature en degr?©s Celsius
* [3] = z?©ro
* [4] = checksum (humidit?© + temp?©rature)
*/
*humidity = data[0];
*temperature = data[2];
/* V?©rifie la checksum */
if (data[4] != (data[0] + data[2]))
return DHT11_CHECKSUM_ERROR; /* Erreur de checksum */
else
return DHT11_SUCCESS; /* Pas d'erreur */
}