Bonjour, je suis en galère.
projet de porte automatique sans fin de course par mesure de puissance du moteur sur l'entré analogique
Le moteur tourne au démarrage de l’Arduino sans s’arrêté.
si joint le schéma de câblage et le code.
Et t'il possible d'enlever la mise en veille et comment?
J'ai fait tous cela avec un Arduino Nano.
/* Trappe automatique poulallier avec Arduino Pro Mini
Ouverture declanchee au seuil "jour"
Peut etre retardee en fonction de la variable "nbCycle" pour eviter les ouvertures
intempestives par des phares de voiture ou lampe de poche
Fermeture au seuil "nuit"
Limitation de puissance moteur par resistance serie 10 ohm pour eviter de blesser
et limiter le courant.
Arret automatique à "delai_max" puis remise en veille.
Mode économiseur avec reveil tout les 8 secondes, pouvant retarder les actions.
*/
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
volatile boolean f_wdt = 1;
/* declaration des constantes pour les noms des broches */
const int led = 13; // led du module nano
const int pinldr = A3; // photoresistance
const int pinmoteur = A2; // mesure courant moteur
const int fermer = 2; // commande de fermeture
const int ouvrir = 3; // commande d'ouverture
//const int bat = A1; // surveillance tension batterie
/* declaration des variables */
int nuit = 50; // seuil nuit 0.98 V
int jour = 150; // seuil jour 1.22 V plus haut que seuil nuit
int LDR; // mesure inverse de luminosite
int courant_moteur;
int retard = 0;
int nbCycle = 8; // retard a l'ouverture X 8 secondes(25 sec)
boolean trappe; // etat trappe
boolean rotation = 0; // moteur arrete
unsigned long debut_blocage; // debut du blocage
unsigned long retard_dec; // declenchement jour
int delai_dec;
int mem_courant; // courant moteur au debut du blocage
int delai_max = 9000;// 9 secondes
void setup() {
// initialisation des broches entree/sortie
pinMode(pinldr, INPUT);
// pinMode(bat, INPUT);
pinMode(fermer, OUTPUT);
pinMode(ouvrir, OUTPUT);
pinMode(pinmoteur, INPUT);
pinMode(led, OUTPUT);
//Serial.begin(9600);
LDR = analogRead(pinldr);
// Pour forcer la trappe à se fermer la nuit ou a s'ouvrir le jour.
if (LDR > nuit) {// le jour
trappe = 1; // fermee
}
else {//la nuit
trappe = 0; // ouverte
}
// active le compteur watchdog pour interruption toutes les 8 secondes
setup_watchdog(9);
}
void loop() {
if (rotation == 1) { // moteur tourne
if ((millis() - debut_blocage) > delai_max) {
digitalWrite(ouvrir, 0); digitalWrite(fermer, 0);
trappe = !trappe; rotation = 0; sommeil();
}
}
else {
LDR = analogRead(pinldr);
if (LDR > jour) { // jour
switch (trappe) {
case 0 : sommeil(); break;
case 1 : retard ++; ouverture(); break;
}
}//jour
else {
retard = 0; // éclairage momentane
}
if (LDR < nuit) {
switch (trappe) {
case 1 : sommeil(); break; // fermee
case 0 : fermeture(); break;
}
}
}
}// fin de loop()
// Watchdog Interrupt Service est excite lors d'un timeout du WDT
ISR(WDT_vect)
{
if (f_wdt == 0)
{
f_wdt = 1; // flag global }
}
}
void setup_watchdog(int ii) {
byte bb;
int ww;
if (ii > 9 ) ii = 9; // pour 8 secondes
bb = ii & 7;
if (ii > 7) bb |= (1 << 5);
bb |= (1 << WDCE);
ww = bb;
// Clear the reset flag
MCUSR &= ~(1 << WDRF);
// start timed sequence
WDTCSR |= (1 << WDCE) | (1 << WDE);
// set new watchdog timeout value
WDTCSR = bb;
WDTCSR |= _BV(WDIE);
}
// active la mise en veille pour 8 secondes
void sommeil(void) {
// témoin led si la tension de batterie < 6 V
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode(); //En mode veille choisi
//le micro passe en sommeil pour 8 secondes
sleep_disable();
// Le pramme va reprendre ici apres le timeout du WDT
}
void ouverture() {
//Serial.println(retard);
if (retard > nbCycle) { // environ 2 minutes
digitalWrite(ouvrir, 1); digitalWrite(fermer, 0); rotation = 1; retard = 0;
debut_blocage = millis();
}
else {
sommeil();
}
};
void fermeture() {
digitalWrite(ouvrir, 0); digitalWrite(fermer, 1); rotation = 1;
debut_blocage = millis();
};