/*
Jardiniere pilotée
http://www.arduino.cc/en/Tutorial/BuiltInExamples
https://roboticsbackend.com/how-to-do-multitasking-with-arduino/#:~:text=%20In%20order%20to%20multitask%20with%20Arduino%2C%20follow,your%20program%20is%20listening%20to%20a...%20More%20
unsigned long previousTimeLed1 = millis();
long timeIntervalLed1 = 1000;
in loop:
unsigned long currentTime = millis();
if(currentTime - previousTimeLed1 > timeIntervalLed1) {
previousTimeLed1 = currentTime;
}
https://wokwi.com/arduino/projects/309649663015780928
*/
// Constants won't change. Used here to also set pin number:
// Broches
const int niveauEauPin = 3; //Entrée Digitale D3
const int pompePin = 4; //Sortie Digitale D4
const int eclairagePin = 5; //Sortie Digitale D5
const int commandeCapteursPin = 6; //Sortie Digitale D4
const int ledNiveauPin = 7; //Sortie Digitale D4
const int humidityPin = A1; //Entrée Analogique A1
// Variables will change:
float humidityValue = 0; //value read from the sensor
float humidityMax = 553; //Lecture max capteur humidité en cours-circuit
float niveauEauValue = 0;
int seuilHumidity = 85;
int ledState = HIGH; // ledState used to set the LED
//Déclaration Temporisation
int heures = 11;
int minutes = 01;
int secondes = 30;
const long interval = 990; // Intervalle Seconde pour la fonction Horloge
unsigned long previousMillis = 0; // will store last time
unsigned long previousTimeHorloge = millis();
unsigned long previousTimeMesure = millis();
unsigned long previousTimeLed = millis();
unsigned long previousTimeLedHigh = millis();
long timeIntervalHorloge = 495;
long timeIntervalMesure = 30000;
long OnTime = 50; // milliseconds of on-time Led
long OffTime = 950; // milliseconds of off-time Led
int debutPompe = 2; // /!\ en secondes
int dureePompe = 2; // /!\ en secondes
int DebutEclairageMatin = 7;
int FinEclairageMatin = 10;
int DebutEclairageSoir = 18;
int FinEclairageSoir = 21;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize pin as output or input
pinMode(eclairagePin, OUTPUT);
pinMode(pompePin, OUTPUT);
pinMode(commandeCapteursPin, OUTPUT);
pinMode(ledNiveauPin, OUTPUT);
pinMode(niveauEauPin, INPUT);
//Etat initial des sorties
digitalWrite(eclairagePin, LOW);
digitalWrite(pompePin, LOW);
digitalWrite(ledNiveauPin, LOW);
digitalWrite(commandeCapteursPin, HIGH);
// initialize serial communications at 9600 bps:
Serial.begin(9600);
}
// the loop function runs over and over again forever
void loop() {
unsigned long currentTime = millis();
//Affichage de l'heure
if(currentTime - previousTimeHorloge > timeIntervalHorloge) {
previousTimeHorloge = currentTime;
myClockFunction();
}
//Lecture des capteurs
if(currentTime - previousTimeMesure > timeIntervalMesure) {
previousTimeMesure = currentTime;
mySensorsReading();
}
// Arrosage
if (humidityValue < seuilHumidity && niveauEauValue == 1) {
if (minutes == debutPompe && secondes >= 2 && secondes <= dureePompe) {
digitalWrite(pompePin, HIGH);
Serial.print("Minutes =");
Serial.println(minutes);
}
else {
digitalWrite(pompePin, LOW);
}
}
else {
digitalWrite(pompePin, LOW);
}
// Eclairage
if (heures >= DebutEclairageMatin && heures < FinEclairageMatin || heures >= DebutEclairageSoir && heures < FinEclairageSoir) {
digitalWrite(eclairagePin, HIGH);
}
else {
digitalWrite(eclairagePin, LOW);
}
if (niveauEauValue == 0) {
Serial.print(niveauEauValue);
myFlash();
}
}
//Personnal functions
int myClockFunction() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
secondes++;
//Increment des Minutes
if (secondes >= 60) {
secondes = 0;
minutes++;
}
//Increment des heures
if (minutes >= 60) {
minutes = 0;
heures++;
}
//Changement jour
if (heures >= 24) {
secondes = 0;
minutes = 0;
heures = 0;
}
// return secondes;
}
}
float mySensorsReading() {
// Active l'alimentation des capteurs
digitalWrite(commandeCapteursPin, LOW);
// read the analog in value:
delay(400);
niveauEauValue = digitalRead(niveauEauPin); // read the input pin
humidityValue = analogRead(humidityPin)/humidityMax*100;
// Désactive l'alimentation des capteurs
digitalWrite(commandeCapteursPin, HIGH);
// print the results to the Serial Monitor:
Serial.print("Humidité = ");
Serial.println(humidityValue);
Serial.print("Niveau d'eau = ");
Serial.println(niveauEauValue);
Serial.print("Heure = ");
Serial.print(heures);
Serial.print(minutes);
Serial.println(secondes);
}
void myFlash() {
unsigned long currentMillis = millis();
if((ledState == LOW) && (currentMillis - previousMillis >= OnTime))
{
ledState = HIGH; // Turn it off
previousMillis = currentMillis; // Remember the time
digitalWrite(ledNiveauPin, ledState); // Update the actual LED
}
else if ((ledState == HIGH) && (currentMillis - previousMillis >= OffTime))
{
ledState = LOW; // turn it on
previousMillis = currentMillis; // Remember the time
digitalWrite(ledNiveauPin, ledState); // Update the actual LED
}
}
/*
if sonde_value[0] < (1 - hysteresis)*int(consigne_temperature):
GPIO.output(CHAUFFAGE, GPIO.HIGH) #Chauffage activé
etat_gpio17 = 1
elif sonde_value[0] > (1 + hysteresis)*int(consigne_temperature):
GPIO.output(CHAUFFAGE, GPIO.LOW) #Chauffage désactivé
etat_gpio17 = 0
*/