Bonjour à tous !
Premiers post pour premiers pas en programmation
Donc merci de me lire avec mes mots n'ayant, pour l'instant, pas tout assimilé.
J'ai donc un projet simple : Arrosage automatique
Matériel :
1 x ARDUINO R3
1 x Module capteur **18B20 **arduinosensors.nl - arduinosensors Resources and Information.
1 x Ecran LCD 16x2
Le VRAI projet :
- Arroser une surface afin de la maintenir à 25°C
Le fonctionnement :
- Enclenchement de l'arrosage lorsque <25°C et couper une fois atteinte.
- Affichage sur LCD 16x2 en direct (température et action)
Mon souhait :
- Lire en continue la température MÊME une fois l'arrosage enclenché (Relay; HIGH)
Maintenant voici mon problème :
Suivant le code ci-joint et comme je ne sais pas mettre plusieurs actions (je débute) et ce sont des bouts de codes pompés sur le net et un peu de moi (quand même ...)
Je ne sais pas faire en sorte que le relais s’enclenche à <25°C et EN MÊME TEMPS que la lecture du capteur continue (ainsi que les actions d'affichage sur le LCD) ceci afin qu'une fois les >25°C, le relais coupe.
Suivant mon code (qui est loin d'être propre, j'en conviens) TOUT s'arrête lorsque le relais est sur HIGH.
Donc plus de lecture, plus de continuité sur le LCD etc... (enfin je pense car pas encore branché LCD).
en définitive mes actions sont BLOQUANTES et il me faut donc des NON BLOQUANTES (c'est bien ca ?)
J'ai un lien sympa sur le sujet : Multitâches
Mais comment l'intégrer dans mon code, si toutefois c'est bien la solution...
Ma demande peut vous paraître simple mais pour un débutant, c'a l'est moins.
En vous remerciant pour votre aide.
#include <OneWire.h> // Inclusion de la librairie OneWire
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE A0 // Broche utilisée pour le bus 1-Wire
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean unefois = false;
boolean unefois1 = false;
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
//KY019 5V relay module
int relay = 7; // relay turns trigger signal - active high;
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp) {
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}
if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur
if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
return false; // Si ce n'est pas le cas on retourne une erreur
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0x44, 1); // On lance une prise de mesure de température
delay(800); // Et on attend la fin de la mesure
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad
for (byte i = 0; i < 9; i++) // On lit le scratchpad
data[i] = ds.read(); // Et on stock les octets reçus
// Calcul de la température en degré Celsius
*temp = ((data[1] << 8) | data[0]) * 0.0625;
// Pas d'erreur
return true;
}
// setup()
void setup() {
Serial.begin(9600); // Initialisation du port série
lcd.begin(16, 2); //Taille LCD
pinMode(12, OUTPUT); // LED VERTE
pinMode(13, OUTPUT); // LED ROUGE
pinMode(relay, OUTPUT); // Relais sortie
}
// loop()
void loop() {
if(!unefois){
//Affichage TEXTE (Nom du produit) une seule fois
lcd.setCursor(0,0);
lcd.print(" * X-Fresh *");
lcd.setCursor(0,1);
lcd.print(" Version : 1.0");
delay(4000);
lcd.clear();
unefois = true;
}
if(!unefois1){
//Affichage TEXTE (Démarrage) une seule fois
lcd.setCursor(0,0);
lcd.print("Bonjour !");
lcd.setCursor(0,1);
lcd.print(" Demarrage...");
delay(1000);
lcd.clear();
unefois1 = true;
}
float temp;
// Lit la température ambiante à ~1Hz
if (getTemperature(&temp)) {
// Affiche la température
Serial.print("Temperature : ");
Serial.print(temp);
Serial.write(176); // caractère °
Serial.write('C');
Serial.println();
}
// Action au-dela de 25°C enclanche relais
if (temp > 25) {
lcd.setCursor(0,0);
lcd.write("Arrosage actif");
lcd.setCursor(0,1);
lcd.print(temp); //Température mesurée réelle
lcd.print(" C [====]"); //Pompe enclenchée
digitalWrite(12,LOW); // VERTE ETEINTE
digitalWrite(13,HIGH); // ROUGE ALLUMEE
digitalWrite(relay, HIGH); // MOTEUR ALLUME
delay(2000);
}
else {
digitalWrite(relay, LOW); // MOTEUR ETEINT
digitalWrite(12, HIGH); // VERTE ALLUMEE
digitalWrite(13, LOW); // ROUGE ETEINTE
noTone(13);
}
}