Bonjour à tous
Voilà je lance mon premier post sur ce forum, j'ai besoin de vous !
Mon projet est une serre d'intérieur pour semis avec gestion automatisée de l'humidité, température éclairage et ventilation avec les valeurs affichées sur écran lcd.
matériel utilisé :
- serre ikéa
- arduino méga
- DS3231 RTC
- écran lcd 20x4
- DHT 22
- Shield 4 relais.
- brumisateur
- ventilateurs
- ruban led
Mon projet fonctionne (je reviendrai certainement pour une optimisation de code qui a l'air bien confus!) mais étant curieux et débutant je coince sur une fonction de temps.
En effet j'allume les led de 8h à 20h mais je voulais afficher sur l'écran depuis combien de temps la led est allumée (ou éteinte) ... et là ... je n'y arrive pas. J'arrive à afficher l'état de la led ON ou OFF mais pas la durée.
voici mon code :
#include <Time.h>
#include <TimeLib.h>
#include <DS3232RTC.h>
#include <Wire.h> // va avec ds3231
#include <LiquidCrystal_I2C.h>
//#include <Adafruit_Sensor.h>
#include <DHT.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4);
// DS3232RTC (SDA, SCL);
#define DHTPIN 9 // Pin du DHT
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
const int hum = 5; // pin du relais 1 (brumisateur)
const int vent = 6; // pin du relais 2 (ventilateur)
const int led = 7; // pin du relais 3 (Led)
const int vh = 8; // pin du relais 4 (non utilisé)
const int temps;
void setup()
{
pinMode(hum, OUTPUT); // on initialise la pin du relais en OUTPUT
pinMode(vent, OUTPUT); // on initialise la pin du relais en OUTPUT
pinMode(led, OUTPUT); // on initialise la pin du relais en OUTPUT
pinMode(vh, OUTPUT); // on initialise la pin du relais en OUTPUT
dht.begin();
Wire.begin();
lcd.init();
lcd.cursor_on();
lcd.backlight();
lcd.init(); // initialisation de l'afficheur
{
Serial.begin(9600);
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
// Serial.print(hour());
// Serial.print(minute());
}
//setTime(11, 30, 00, 18, 2, 2018); //set the system time to 23h31m30s on 13Feb2009
// RTC.set(now()); //set the RTC from the system time
//RTC.setTime(12, 0, 0);
//RTC.setDate(18, 2, 2018);
setTime(temps);
//
}
void setRelay(int relay, int value)
{
if (relay > 0 && relay < 5) digitalWrite((relay + 4), value);
}
void loop()
{
delay(1000); // Délai avant lecture température
float h = dht.readHumidity();
float temp = dht.readTemperature();
byte etat_vh = digitalRead(8);
byte etat_led = digitalRead(7);
byte etat_vent = digitalRead(6);
byte etat_hum = digitalRead(5);
if (isnan(temp) || isnan(h)) // check if returns are valid, if they are NaN (not a number) then something went wrong!
{
lcd.print("Erreur de lecture DHT");
}
else
{
lcd.setCursor(0, 0); // position de début d'écriture
lcd.print("Tmp: "); // écrit Temp: à l'écran
lcd.print(temp); // écrit la température du DHT
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(h);
lcd.print(" %");
lcd.setCursor(0, 2);
lcd.print("Vnt:");
if (etat_vent == 1) lcd.print(" ON ");
else lcd.print(" OFF");
lcd.print(" Brume:");
if (etat_hum == 1) lcd.print(" ON ");
else lcd.print(" OFF");
lcd.setCursor(0, 3);
lcd.print("Led: ");
if (etat_led == 1) lcd.print("ON ");
else lcd.print("OFF ");
setSyncProvider(RTC.get);
lcd.print("("); // depuis combien de temps led allumée ou éteinte
lcd.print(hour()); // depuis combien de temps led allumée ou éteinte
lcd.print("h"); // depuis combien de temps led allumée ou éteinte
lcd.print(minute()); // depuis combien de temps led allumée ou éteinte
lcd.print(")"); // depuis combien de temps led allumée ou éteinte
Serial.print(hour()); // perso test pour verif heure et date sur serial
Serial.print(' ');
Serial.print(minute());
Serial.print(' ');
Serial.print(day());
Serial.print(' ');
Serial.print(month());
Serial.print(' ');
Serial.print(year());
Serial.println();
}
if (h < 80) setRelay(1, 1); // déclenche brume si humidité <80%
else setRelay(1, 0); // sinon éteint
if (h < 80) setRelay(4, 1); // déclenche vent h si humidité <80%
else setRelay(4, 0); // sinon éteint
if (temp > 30) setRelay(2, 1); // déclenche vent si température >30°
else setRelay(2, 0);
if (hour() > 8 & hour() < 20 ) setRelay(3, 1); // allumé entre 8 et 20h
else setRelay(3, 0);
}
ici je voulais afficher la valeur heure en retirant 8 mais évidemment après minuit c'est faux et surtout pas de raz quand la led s'éteint.
lcd.print("("); // depuis combien de temps led allumée ou éteinte
lcd.print(hour()-8); // depuis combien de temps led allumée ou éteinte
lcd.print("h"); // depuis combien de temps led allumée ou éteinte
lcd.print(minute()); // depuis combien de temps led allumée ou éteinte
lcd.print(")"); // depuis combien de temps led allumée ou éteinte
Ou alors comment démarrer un chrono quand l'état de la LED change d'état?
merci d'avance pour vos lumières ! Ne soyez pas trop durs