je débute en programmation arduino, voici ce que je souhaiterais faire : un interrupteur crépusculaire inversé et temporisé. Vous allez me dire, "il y a déjà pleins de sujets la dessus", alors je vais m'expliquer en détail car je n'ai rien trouvé :
j'ai réalisé une installation photovoltaique avec un routeur mk2 (pour ceux qui connaissent), celui ci permet de ne pas envoyé de surplus photovoltaique sur le réseau. Celui-ci déclenche un réchauffeur électrique lors de surplus électrique : une led s'éclaire par implusions (elle clignotte plus ou moins vite suivant le surplus).
Voici mon projet, j'ai une carte arduino, une cellule photoélectrique et un relais. Je souhaiterais déclencher le relais (sans temporisation) pour délencher une pompe dès que la led du réchauffeur électrique commence à clignotter (avec la cellule photoélectrique fixée sur cette led, je pense que c'est possible en réglant la sensibilité). Ceci n'est pas compliquer mais dès que la led s'éteint il ne faut pas que la pompe (le relais) se coupe sinon il va faire que de s'allumer et s'éteindre. Je souhaiterais ajouter une petite temporisation de 1 ou 2 minutes par exemple pour éviter que la pompe s'éteigne. Par ailleurs, lorsque les 1 ou 2 minutes sont écoulés, le programme de l'arduino va reprendre au début et attendre que le led s'allume à nouveau, ce qui risque de faire une micro coupure du relais.
Existe t'il une solution pour que le relais se mette en route et ne se coupe pas tant que le capteur photoélectrique détecte une valeur par exemple supérieure à 600 (dans un laps de temps de 1min par exemple).
Cas concret : lorsqu'on appuie sur un bouton temporisé dans un parking la lumière reste allumée par exemple 1 minute mais dès qu'on appuie sur l'interrupteur la minuterie se remet à zéro et recommence son décompte.
Est ce que vous voyez c que je souhaiterais faire ?
Merci par avance pour votre aide.
// PIN 2 : sortie relais pour la pompe de circulation
// PIN A0 : cellule photoélectrique
#define pinCAPTEUR A0
#define pinRELAY 2
#define led 13
void setup() {
pinMode(2, OUTPUT); //on configure la PIN 2 de l'Arduino en OUTPUT pour le relais
Serial.begin(9600); //initialisation moniteur série à 9600baud
}
void loop() {
int valeur = analogRead(pinCAPTEUR); //lecture de la valeur sur la pin A0 capteur de lumière
Serial.println(valeur); // on écrit la valeur obtenu dans le moniteur série
// delay(250); // on attend 250ms
if (valeur < 894) { // si la valeur est inférieure à 894 alors....
digitalWrite(13, HIGH);
digitalWrite(2, HIGH); // ... on allume le relais
}
if( valeur > 894) { // si la valeur est supérieure à alors...
digitalWrite(13, HIGH);
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(13, LOW);
digitalWrite(2, LOW); // on éteint le relais
}
}
Et si la valeur vaut 894 vous faites quoi ? (Utiliser if-else quand vous voulez l’oposé d’une condition plutôt que de faire 2 tests)
Mais si elle oscille autour de 894, qu’est-ce qu’il se passera pour votre relais ? (Lire sur la notion d’hysteresis - en gros vous voudrez déclencher dans un sens à 894 mais dans l’autre sens que si vous retombez 886 par exemple pour éviter les soucis)
Pour la lisibilité et maintenabilité de votre code prenez l’habitude de nommer les pins (déclarez les en const byte) ainsi que les valeurs magiques comme 894 (faites un const int seuilCrepusculaire = 894; par exemple et dans les tests utilisez seuilCrepusculaire)
De même préférez des noms de variables parlant. valeur c’est trop générique, appelez cela niveauObscurite ou luminosite.
vous verrez que c’est plus lisible d’avoir dans le code
Par contre savez-vous comment je peux faire lorsque le relais se déclenche, je souhaiterais qu'il reste en route pendant par exemple 1 minute, et pendant ce temps je souhaiterais avoir une lecture permanente du capteur et si dans la minute on arrive par exemple au seuil de déclenchement le décompte de 1 minute reparte de "0".
Afin d'éviter des déclenchements du relais dû au clignotement de la led.
Pour ceux que ça intéresse, voici mon code.
J'utilise une cellule photoélectrique, un relais et une arduino uno.
Mon but est de déclencher une pompe de circulation quand j'ai du surplus photovoltaique. La cellule photoélectrique est fixée sur la led clignotante de mon routeur photovoltaique.
Ce code ajoute une temporisation de 10secs lorsque la, pompe est en route afin d'éviter la mise en marche et l'arrêt de la pompe dû au clignotement de la led.
A vous d'ajuster le seuil de déclenchement et le délais de temporisation (je n'ai pas encore calibré mon système, mon seuil ne sera pas celui la et ma temporisation sera de 2-5 minutes).
const int seuil = 200; // seuil de déclenchement du relais
int pinCapteur = A1; // le capteur est connecté sur la broche A1
int pinRelay = 2; // le relais est connecté sur la pin 2
int photocellReading = analogRead(pinCapteur);
long temps;
void setup() {
pinMode(pinCapteur, INPUT); // on veut lire le capteur
pinMode(pinRelay, OUTPUT);
Serial.begin(9600); //initialisation moniteur série à 9600baud
digitalWrite(pinRelay, HIGH); // éteint le relay
temps=millis();
}
void loop() {
const unsigned long DELAY = 10000ul; // 10 secondes (le ul à la fin pour unsigned long)
photocellReading = analogRead(pinCapteur);
Serial.println(photocellReading); // on écrit la valeur obtenue dans le moniteur série
delay(250); // on attend 250ms
if (photocellReading > seuil){
digitalWrite(pinRelay, LOW); //allume le relais
temps = millis();
}
else {
if((millis()-temps > DELAY))
{
digitalWrite(pinRelay, HIGH); // éteint le relay
temps = millis();
}
}
}