Uncategorized

Arduino pour les terrariums

Le but du jeu est de contrôler l’allumage d’un chauffage par un relais.

La température doit être supérieure à 22°C et inférieure à 28.

J’en ai profité pour mettre un LCD (technologie et programmation que je ne connaissais pas ).

Il y a deux capteurs DHT11 (température et hygrométrie), un LCD 2×16, un capteur PIR de présence (comme ça le LCD ne s’allume que quand quelqu’un le regarde 😉 ) et un relais.

Il reste encore 6 pins pour rajouter des relais ou des capteurs.

Une petite remarque sur les capteurs DHT 11… 10% d’écart sur l’hygrométrie … !! c’est quoi ces capteurs.

Enfin bref…

 

DSC00381_web

The code :

/*
LiquidCrystal Library – Hello World

Demonstrates the use a 16×2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.

This sketch prints « Hello World! » to the LCD
and shows the time.

The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)

Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe

This example code is in the public domain.

http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/

// include the library code:
#include <LiquidCrystal.h>

/** Broche « DATA » du DHT11 */
const byte DHT11_PIN_1 = 7; //capteur DHT 11 orange/vert/blanc
const byte DHT11_PIN_2 = 6; //capteur DHT 11 orange bleu blanc

boolean debug=true;
/** 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
};

 

//RTC pour le temps
#include <Wire.h>
#include « RTClib.h »

const int pin5V = 17;
const int pinGND = 16;
RTC_DS1307 rtc;

// Utiliser un PIR
// placé sur la pin 9

int pirPin=9; // la pin sur laquelle est placé le PIR
int pir_delay=60; // 60 secondes, temps de relecture après un changement
int decompte=-1; // on signale qu’il n’y a personne
int lcdPin = 15;
int relaisPin = 8;

byte temperature1, humidity1, temperature2, humidity2;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup(){
if(debug){
Serial.begin(9600);
}
pinMode(pin5V, OUTPUT);
pinMode(pinGND, OUTPUT);
digitalWrite(pin5V, HIGH);
digitalWrite(pinGND, LOW);

pinMode(pirPin, INPUT);
pinMode(lcdPin, OUTPUT);

pinMode(relaisPin, OUTPUT);

#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();

if (! rtc.isrunning()) {
Serial.println(« RTC is NOT running! »);
// following line sets the RTC to the date & time this sketch was compiled
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}

lcd.begin(16, 2);//on initialise le lcd

}

/**
* 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 */
}

void lisDHT(){
/* Lecture de la température et de l’humidité + gestion des erreurs */
switch (readDHT11(DHT11_PIN_1, &temperature1, &humidity1)) {
case DHT11_SUCCESS:

if (debug){
/* Affichage de la température et du taux d’humidité */
Serial.print(F(« Humidite 1(%): « ));
Serial.println((int) humidity1);
Serial.print(F(« Temperature 1(^C): « ));
Serial.println((int) temperature1);
break;
}
case DHT11_TIMEOUT_ERROR:
if (debug){
Serial.println(F(« Temps d’attente depasse ! »));
}
break;

case DHT11_CHECKSUM_ERROR:
if (debug){
Serial.println(F(« Erreur de checksum ! »));
}
break;
}

switch (readDHT11(DHT11_PIN_2, &temperature2, &humidity2)) {
case DHT11_SUCCESS:

if (debug){
/* Affichage de la température et du taux d’humidité */
Serial.print(F(« Humidite 2(%): « ));
Serial.println((int) humidity2);
Serial.print(F(« Temperature 2 (^C): « ));
Serial.println((int) temperature2);
}
break;

case DHT11_TIMEOUT_ERROR:
if(debug){
Serial.println(F(« Temps d’attente depasse ! »));
}
break;

case DHT11_CHECKSUM_ERROR:
if(debug){
Serial.println(F(« Erreur de checksum ! »));
}
break;
}

}

void allumeLCD(){

int pirVal = digitalRead(pirPin);

if(pirVal == HIGH){
// quelque chose dans le champ
Serial.println(« quelque chose est dans le champ »);
Serial.println(« On allume le lcd. »);

//on met la valeur du pin A1 (15) à HIGH
digitalWrite(lcdPin, HIGH);
lcd.display();

//on commence le decompte
decompte = pir_delay;
}

else if(pirVal == LOW && decompte>=0){
// plus personne, on commence à décompter

Serial.println(« plus personne « );
Serial.print(« on eteint le lcd dans « );
Serial.print(decompte);
Serial.println( » secondes »);
decompte–;
if (decompte == 0){
digitalWrite(lcdPin, LOW); //on éteint le LCD
lcd.noDisplay();
}

}

}

void afficheTempe(){
lcd.clear();
lcd.print(« T1 C -H1 % CHAUFFAGE : « );
lcd.setCursor(3, 0);
lcd.print(temperature1);
lcd.setCursor(5, 0);
lcd.print((char)223);
lcd.setCursor(12, 0);
lcd.print(humidity1);

lcd.setCursor(29, 0);
lcd.print(digitalRead(8));

lcd.setCursor(0, 1);
lcd.print(« T2 C -H2 % »);
lcd.setCursor(3, 1);
lcd.print(temperature2);
lcd.setCursor(5, 1);
lcd.print((char)223);

lcd.setCursor(12, 1);
lcd.print(humidity2);

lcd.leftToRight();
lcd.autoscroll();

}
void loop(){
DateTime now = rtc.now();
if(debug){
Serial.print(now.year(), DEC);
Serial.print(‘/’);
Serial.print(now.month(), DEC);
Serial.print(‘/’);
Serial.print(now.day(), DEC);
Serial.print(‘ ‘);
Serial.print(now.hour(), DEC);
Serial.print(‘:’);
Serial.print(now.minute(), DEC);
Serial.print(‘:’);
Serial.print(now.second(), DEC);
Serial.println();
}

allumeLCD();
int seconde = now.second();

if (seconde%4==0){
afficheTempe();} //rafraichit toutes les 4 secondes

lisDHT();

int heure = now.hour();
int etat = digitalRead(relaisPin);

if(debug){
Serial.print(« état »);
Serial.println(etat);
}
//digitalWrite(relaisPin, HIGH);
if ((etat==LOW) { //on doit allumer
if (temperature1 < 22){
digitalWrite(relaisPin, HIGH);
}
}
else if ((etat==HIGH) && (heure > 21)) || (temperature > 29){
digitalWrite(relaisPin, LOW);
}

// un test tout les quart de seconde
delay(1000);
}

 

 

 

Publicités

4 réflexions sur “Arduino pour les terrariums

  1. Bonjour, merci pour ce code, j’aimerai bien l’expérimenter mais un point reste obscur pour moi: Comment câblez vous la RTC? pour SDA et SCL je vois car il y a des broche qui sont spécifiques pour, mais pour OUT? Deuxième question: Est-ce bien une carte uno que je vois sur la photo? Bien cordialement.
    Arnaud.

  2. avec un peu de retard… la RCT est posée sur les broches et tient directement. Il faut pour cela mettre un pin (celui sous le +5V) à 1 et celui sous la masse à 0. ça permet de compacter le montage.
    Oui, c’est un Uno.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s