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 58 59 60 61 62 63 64 65 66 67 68
| #include <AFMotor.h> //librairie shield Adafruit motor
AF_DCMotor motor(1); //Moteur branché sur la sortie 1
const byte photoPin = A0; // entrée de la photorésistance
const byte FinCFerm = A1; // entrée du fin de course FERME. Une broche sur la masse l'autre sur A1
const byte FinCOuv = A2; // entrée du fin de course OUVERT. Une broche sur la masse l'autre sur A2
enum : byte {OUVERTE, FERMEE, TEMPO_OUVERTURE, TEMPO_FERMETURE} etatPorte;
unsigned long topChrono = 0; // déclaration de la variable qui va contenir la valeur du temps au départ
const unsigned long dureeTempo = 300000UL; // déclaration de la constante de durée de temporisation 300000ms = 5minutes
void ouvrir()
{
motor.run(BACKWARD); // on active le sens ouverture
while (digitalRead(FinCOuv) == HIGH); // Tant que la porte n'est pas ouverte on attend
motor.run(RELEASE); // On arrete le moteur car le contact fin de course est activé
etatPorte = OUVERTE;
}
void fermer()
{
motor.run(FORWARD); // on active le sens fermeture
while (digitalRead(FinCFerm) == HIGH); // Tant que la porte n'est pas fermée on attend
motor.run(RELEASE); // On arrete le moteur car le contact fin de course est activé
etatPorte = FERMEE;
}
void setup()
{
pinMode(FinCFerm, INPUT_PULLUP);
pinMode(FinCOuv, INPUT_PULLUP);
motor.setSpeed(255);
ouvrir();
}
void loop()
{
int luminosite = map (analogRead(photoPin), 0, 1023, 0, 100); // plus on est proche de 0, plus c'est obscur
switch (etatPorte) {
case OUVERTE:
// on est en position ouverte. Doit on se préparer à fermer ?
if (luminosite <= 30) { // Detection de la nuit
topChrono = millis(); // on note le moment
etatPorte = TEMPO_FERMETURE;
}
break;
case FERMEE:
// on est en position fermée. Doit on se préparer à ouvrir ?
if (luminosite > 50) { // Detection du jour
topChrono = millis(); // on note le moment
etatPorte = TEMPO_OUVERTURE;
}
break;
case TEMPO_OUVERTURE:
if (luminosite <= 50) etatPorte = FERMEE; // la condition n'a pas duré 5 minutes, on revient à l'état précédent
else if (millis() - topChrono >= dureeTempo) ouvrir(); // sinon si le temps d'attente est écoulé, on ouvre.
break;
case TEMPO_FERMETURE:
if (luminosite > 30) etatPorte = OUVERTE; // la condition n'a pas duré 5 minutes, on revient à l'état précédent
else if (millis() - topChrono >= dureeTempo) fermer(); // sinon si le temps d'attente est écoulé, on ferme.
break;
}
} |
Partager