Hello,
C'est pas mal mais il faut tenir compte de quelques règles.
Quand on mesure la tension d'une cellule photo-résistance et qu'on détermine un niveau de luminosité pour déclencher l'ouverture et la fermeture d'une porte, il est préférable d'avoir deux seuils de détection différents pour éviter que la porte fasse le yo-yo au moment du passage du seuil. Une autre possibilité est de travailler avec une valeur moyennée.
Je pense que le pb vient de la variable x. Il est préférable d'utiliser un booléen pour mémoriser l'état de la porte et engager une seule fois l’ordre d’ouverture et de fermeture.
Voici un exemple de code avec les 2 seuils de détection (valeurs arbitraire) et un booléen pour mémoriser l'état de la porte. (Attention code non testé)
const char ledbleu = 2; // variable broche 2 (vraie), Une LED bleu pour détection crépuscule, s'il fait sombre
const char fermeture = 7; // variable pour broche 7 (vraie), pour fermer porte
const char capteur = 0; // broche A0 sur laquelle va être connecté le pont diviseur de tension
float tension = 0; // variable qui va enregistrer la tension lue en sortie du capteur
float seuilObscurite = 4.2; // valeur en V, seuil qui détermine le niveau auquel l'obscurité est présente
float seuilLumonisite = 4; // valeur en V, seuil qui détermine le niveau auquel la luminosité est présente
boolean PorteFermee = false; // statut de la porte ou démarre toujours le programme porte ouverte
int x = 0;
void setup()
{
// définition des broches utilisées
pinMode(ledbleu, OUTPUT);
pinMode(fermeture, OUTPUT);
digitalWrite(ledbleu, HIGH);
digitalWrite(fermeture, HIGH);
Serial.begin(9600); // la voie série pour monitorer
}
void loop()
{
// conversion de cette valeur en tension
tension = (analogRead(capteur) * 5.0) / 1024;
if ((tension >= seuilObscurite) && !PorteFermee) //Pour FERMETURE
{
digitalWrite(ledbleu, LOW); // detection seuil obscurité On allume la LED bleu
delay(240000); // délai pour ne fermer porte que aprés 4 minutes ( 240 000)
digitalWrite(fermeture, LOW); // On ferme la porte apres x secondes
digitalWrite(ledbleu, HIGH); // On éteint la LED bleu
PorteFermee = true;
}
if ((tension < seuilLumonisite) && PorteFermee) //Pour OUVERTURE
{
//Serial.print(" x= ");
delay(240000);//délai pour ouvrir la porte que aprés 4 minutes
digitalWrite(fermeture, HIGH); // on ouvre la porte
PorteFermee = false;
}
// délai pour ne prendre des mesures que toutes les 60-secondes (60 000)
delay(60000);
//Serial.print(" x= ");
Serial.println(x);
}
Bon courage..