#include <DHT.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
//Constants
#define DHTPIN 4 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
//ALWAYS USE THIS WITH LCD I2C and Addres 0x3F
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
//Variables
int chk;
float hum; //Stores humidity value
float temp; //Stores temperature value
void setup()
{
Serial.begin(9600);
dht.begin();
lcd.begin(16,2);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
}
void loop()
{
delay(1000);
//Read data and store it to variables hum and temp
hum = dht.readHumidity();
temp = dht.readTemperature();
//Print temp and humidity values to serial monitor
Serial.print("Humidity: ");
Serial.print(hum);
Serial.print(" %, Temp: ");
Serial.print(temp);
Serial.println(" Celsius");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" ");
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Hum: ");
lcd.print(hum);
lcd.print(" %");
delay(1000); //Delay 2 sec.
}
Voila le code que j'utilise pour pour connaitre l’hygrométrie et la température d'un environnement quelconque.
J'aimerai complexifier mon montage et mon programme pour que je puisse déclencher des relais servant à réguler hygrométrie.
je débute vraiment dans ce monde et je me demande comment je dois procéder.
Existe t il un code pour cela, ou dois je rajouter des conditions à mon code déjà existant ?
Idéalement je voudrai par exemple garder une hygrométrie à + ou - 5% de 70% d’hygrométrie.
J'utilise une carte Arduino UNO, DHT22 et un écran I2C LCD 16X2.
Je voudrai apprendre le langage de programmation pour l'arduino, mais dans cette grande diversité de composant et de possibilité je me perd trés facilement ..;
tu fixes les limites de l'humidité et tu déclare des variables pour les contenir.
Exemple :
float H_mini = 65.0 ;
float H_maxi = 75.0 ;
Ensuite tu fais la mesure et tu compares aux limites pré-définies
Si (mesure < H_min i) actionner le relais qui augmente l'humidité
Si (mesure > H_maxi) actionner le relais qui diminue l'humidité (dans la mesure où le dispositif le permet)
Si (mesure > H_mini ET (mesure < H_maxi) ne rien faire.
Pour traduire cela en code C/C++ il te suffit de suivre le tuto d'Eskimon dont le lien est donné dans le message "Règle du forum".
Déjà en faisant ce que je te propose tu aura fait un travail non négligeable.
Pourquoi il existe des solutions plus compliquées comme celle de J-M-L ?
Parce que quand tu atteint la limite haute de l'humidité (par exemple) tu vas couper le relai mais le système qui fourni l'humidité ne va pas devenir instantanément inopérant --> la génération d'humidité va continuer tout en diminuant et finir par s’arrêter.
Il y aura donc un dépassement de la limite haute.
Pour éviter ce fonctionnement il existe des dispositifs dit PID (proportionnelle, intégrale, dérivée) qui "anticipent" les décisions.
Par rapport à ton niveau actuel la marche va être haute, c'est pourquoi je te propose une marche intermédiaire pour y arriver plus lentement mais plus sûrement.
delay(1000); //Delay 2 sec.
Sûr de toi ?
Pour la mesure de l'humidité qui évolue lentement un délais plus long est préférable.
Pour la mise au point prendre le délais le plus court possible sinon c'est casse pied d'avoir à attendre 5s.
Si tu veux faire autre chose que surveiller l'humidité l'emploi de la fonction delay() est totalement déconseillé car elle bloque le programme.
Il faut utiliser la fonction millis() -> voir son application dans l'exemple "blink without delay"