Bonjour à tous,
je suis en train de bricoler une porte actionnée automatiquement par une photorésistance et 2 fins de course.
En glanant des infos à droite et à gauche, j'ai réussi à programmer son ouverture en fonction de la luminosité.
Je voudrais maintenant ajouter une fonction de temporisation telle que si la condition de luminosité est vraie pendant 5 minutes, seulement à ce moment là, on actionne la porte. Si ça n'est pas vrai pendant 5 minutes d'affilées, on reprend le comptage.
J'ai essayé avec la fonction millis, mais ça ne marche pas vraiment comme je le désire. Dans le programme que j'ai fait, si la condition de luminosité change pendant cette tempo de 5 minutes, ça ne ré-initialise pas le comptage et je ne trouve pas comment je pourrais résoudre ça. Si vous avez une piste...
Merci d'avance pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 //Fonctionnement avec photorésistance et 2 fins de course // la valeur detection "jour" de la photoresistance est differente de la valeur "nuit" pour éviter les // ouvertures/fermetures intempestives quand on est aux alentour du seuil de luminosité détecté #include <AFMotor.h> //librairie shield Adafruit motor AF_DCMotor motor(1); //Moteur branché sur la sortie 1 // Déclaration des variables et des constantes int FinCFerm = A1;// entrée du fin de course FERME. Une broche sur la masse l'autre sur A1 int FinCOuv = A2;// entrée du fin de course OUVERT. Une broche sur la masse l'autre sur A2 int SensorValue; //declaration de la photoresistance int i=0; //declaration de la valeur de la photoresistance unsigned long tempsDepart = 0; // déclaration de la variable qui va contenir la valeur du temps au départ const long dureeTempo = 300000; // déclaration de la constante de durée de temporisation 300000ms = 5minutes void setup() { Serial.begin(9600); // démarrage la liaison série entre entrée analogique et ordi pinMode(FinCFerm, INPUT_PULLUP); // mode lecture sur le bouton FinCFerm utilisation de la resistance interne de pull up pinMode(FinCOuv, INPUT_PULLUP); //mode lecture sur le bouton FinCOuv utilisation de la resistance interne de pull up //Donc de base lorsque le bouton n'est pas appuyé on lit un état haut (5V = niveau logique 1) motor.setSpeed(255); // reglage vitesse moteur à 255/255 motor.run(RELEASE); // le moteur s'arrête } void loop() { unsigned long tempsCourant = millis(); // variable du temps courant. Appel à la fonction millis() pour l'obtention de la valeur de ce temps SensorValue = analogRead(A0); i=map (SensorValue, 0, 1023, 0, 100); if ((i<=30) && (tempsCourant - tempsDepart >= dureeTempo)) //Condition : Detection de la nuit et tempo atteinte { tempsDepart = tempsCourant; // On sauvegarde la valeur du dernier tempsCourant while(digitalRead(FinCFerm) != 1){ //Tant que la porte n'est pas fermée, le moteur tourne dans le sens Fermeture motor.run(FORWARD); } motor.run(RELEASE); //On arrete le moteur car le contact fin de course est activé } if ((i>50) && (tempsCourant - tempsDepart >= dureeTempo)) //Condition : Detection du jour et tempo atteinte { tempsDepart = tempsCourant; while(digitalRead(FinCOuv) != 1){ //Tant que la porte n'est pas ouverte, le moteur tourne dans le sens Ouverture motor.run(BACKWARD); } motor.run(RELEASE); //On arrete le moteur car le contact fin de course est activé } delay(1000); //petite attente }
Partager