Bonjour à vous tous.
Je me suis lancer pour la première fois dans la programmation pour l'ouverture de mon poulailler avec une photorésistance " qui changera plus tard avec un calcul de valeur sur panneau solaire".
Le principe,
2 BP Ouverture et Fermeture manuel qui sont prioritaire sans sécurité logiciel.
suivit si en automatique, une gestion par photorésistance.
2 switch logiciel sont présent pour les fins de courses et 2 switch mécanique au cas ou.
J'utilise un L298N shield avec inversion séparer
La ou je sèche, c'est pour initialisé millis() sans qu'il se reset dans ma programmation .
Pouvez-vous m'aider et m'expliquer svp. je n'y arrive vraiment pas.
si je lance une fois manuellement, millis se s'initialise et quand le mode automatique démarre, il se met directement en erreur
il faudrait que chrono=millis() se fassent juste avant de démarrer les if dans le mode auto je pense
// Test L293D
// brancher le capteur sur a0 et 5v puis une résistance de 10K de A0 a Ground
const int sensorPin = A0; // Capteur connecter a A0
int sensorVal; // Lecture valeur
int ValMin = 100;
int ValMax = 300;
int TempCourse = 4000;
bool erreurb; bool erreurh; int erreurswb; int erreurswh;
unsigned long etatmode;
unsigned long chrono = 0;
// Motor connections
int en1 = 9; // Pin ENA du L298N
int en2 = 8; // Pin ENB du L298N
int in1 = 11; // Pin 2 du L298N
int in2 = 10; // Pin 3 du L298N
int in3 = 7; // Pin 4 du L298N
int in4 = 6; // Pin 5 du L298N
// Bouton poussoir
int boutonOuvre = 3; // Bp Ouverture manuel
int boutonFerme = 2; // BP Fermer manuel
// Fin de course
int switchOuvre = 5; // Switch Haut NO
int switchFerme = 4; // Switch Bas NO
void setup()
{
Serial.begin(9600);
Serial.println("Programme Poulailler MotorShield");
pinMode(en1, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(en2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Moteur off au démarrage
analogWrite(en1, 0);
analogWrite(en2, 0);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
// Bp en interne
pinMode(boutonOuvre, INPUT_PULLUP);
pinMode(boutonFerme, INPUT_PULLUP);
pinMode(switchOuvre, INPUT_PULLUP);
pinMode(switchFerme, INPUT_PULLUP);
erreurh = false ; erreurb = false ; // Variable erreur haut et bas
}
void MoteurOuvre()
{
// Ouverture
sensorVal = analogRead(sensorPin); // Capteur lumiere
analogWrite(en1, 255);
analogWrite(en2, 0);
delay(300);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
Serial.println("Ouverture de la porte");
}
void MoteurFerme()
{
// Fermeture
sensorVal = analogRead(sensorPin); // Capteur lumiere
analogWrite(en1, 0);
analogWrite(en2, 255);
delay(300);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
Serial.println("Fermeture de la porte");
}
// Fonctions
void MoteurStop()
{
// Stop
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
delay(300);
analogWrite(en1, 0);
analogWrite(en2, 0);
Serial.println("Stop");
chrono=millis();
}
void ResetAlarme() {
if (erreurswb != (digitalRead(switchFerme))) {
erreurswb = (digitalRead(switchFerme));
erreurb = false;
chrono = millis();
}
if (erreurswh != (digitalRead(switchOuvre))) {
erreurswh = (digitalRead(switchOuvre));
erreurh = false;
chrono = millis();
}
}
// Attention on commence ici a faire le show
void loop()
{
sensorVal = analogRead(sensorPin); // Capteur lumiere
Serial.print(sensorVal); Serial.print(" Lux "); Serial.print(digitalRead(switchOuvre)); Serial.print(" switchOuvre "); Serial.print(digitalRead(switchFerme));
Serial.print(" switchFerme "); Serial.print(digitalRead(boutonOuvre)); Serial.print(" boutonOuvre "); Serial.print(digitalRead(boutonFerme)); Serial.print(" boutonFerme ");
Serial.print(" erreurH "); Serial.print(erreurh); Serial.print(" erreurB "); Serial.println(erreurb);
if ((digitalRead(boutonOuvre) == true) && (digitalRead(boutonFerme) == true)) etatmode = "rien";
if ((digitalRead(boutonOuvre) == false) && (digitalRead(boutonFerme) == false)) etatmode = "tout";
if ((digitalRead(boutonOuvre) == false) && (digitalRead(boutonFerme) == true)) etatmode = "ouvre";
if ((digitalRead(boutonOuvre) == true) && (digitalRead(boutonFerme) == false)) etatmode = "ferme";
ResetAlarme();
//Commande Bouton poussoir Ouvert et Fermer, si uniquement un des deux est presser
if ( etatmode == "ouvre" ) {MoteurOuvre();chrono=millis();}
//Commande Bouton poussoir Ouvert et Fermer, si uniquement un des deux est presser
if ( etatmode == "ferme" ) {MoteurFerme();chrono=millis();}
// Si aucun bouton enfoncer et que les conditions sont bonnes
if (etatmode =="rien"){
if (digitalRead(switchFerme) == true && (erreurb) == false ) {
if (sensorVal < ValMin) {
if ((millis() - chrono) < TempCourse)MoteurFerme();
else {
chrono = millis();
erreurb = true;
}
}
}
if (digitalRead(switchOuvre) == true && (erreurh) == false ) {
if (sensorVal > ValMax) {
if ((millis() - chrono) < TempCourse)MoteurOuvre();
else {
chrono = millis();
erreurh = true;
}
}
}
else MoteurStop();
}
}
