Bonjour à toutes et à tous
merci d'avance de votre aide
je souhaiterais ajouter un délais de fermeture le soir et ouverture le matin , de la porte de mon poulailler avec une variation de 30 minutes après le déclenchement de la LDR .
Voila le programme de base .
// Déclaration des variables et des constantes
int PhotoR = A0;// entrée analogique de la photorésistance
int FinCHaut = 9;// entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
int FinCBas = 12;// entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
int D2 = 2;//monté
int D3 = 3;//descente
//variable pour stocker la valeur lue après conversion
int PhotoRLue;
void setup()
{
// démarrage la liaison série entre entrée analogique et ordi
Serial.begin(9600);
//Déclaration des contacts fin de course en entrée avec utilisation de la fonction PULLUP interne
pinMode(FinCHaut, INPUT_PULLUP); //Les Pull Up sont des résistances internes à l'arduino.
//Donc de base lorsque le boutton n'est pas appuyé on lit un état haut (5V = niveau logique 1)
pinMode(FinCBas, INPUT_PULLUP);
}
void loop()
{
PhotoRLue = analogRead(PhotoR);
//Valeur comprise entre 0 et 1024
//on affiche la valeur lue sur la liaison série
Serial.print("PhotoRLue = ");
Serial.print(PhotoRLue);
//on saute une ligne entre deux affichages
Serial.println();
if (PhotoRLue < 190 & digitalRead(FinCBas) == 1) //Condition : Detection de la nuit et la porte est ouverte
//Alors on ferme la porte
{
while(digitalRead(FinCBas) == 1){ //Tant que la porte n'est pas fermé, le moteur tourne
//Fermeture
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
}
digitalWrite(D3, LOW); //On arrete le moteur car le contact fin de course est activé
}
if (PhotoRLue > 650 && digitalRead(FinCHaut) == 1) //Condition : Detection du jour et la porte est fermée FinCHaut = 1 signifie le boutton fin de course haut n'est pas appuyé
{
while(digitalRead(FinCHaut) == 1){ //Tant que la porte n'est pas ouverte, le moteur tourne
//Fermeture
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
}
digitalWrite(D2, LOW);
}
}
Le programme fonctionne mais à plusieurs reprise les poules se sont retrouvées devant une porte close .
Il y a t'il un programme déjà fait .
Merci d'avance
Cordialement Philippe
Merci d'éditer votre post pour rajouter les balises de de code, c'est quasiment illisible tel quel:
sélectionner la partie du texte qui correspond au code
appuyez sur l'icône </> dans la barre d'outils pour indiquer que c'est du code
(Assurez vous aussi d'indenter le code correctement dans l'IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)
la LDR n'est pas une solution fiable pour détecter le lever et coucher du soleil. Mauvais temps, pluie, nuages vont déclencher ou empêcher de déclencher....
pour votre question vous pouvez aller au plus simple. Au moment de la détection, au leu de faire tout de suite la commande, vous faites un delay(1800000ul); // attente active de 30 minutes
puis vous continuez avec le code tel qu'il est
si vous voulez que ce soit un peu plus smart, c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)
// Déclaration des variables et des constantes
int PhotoR = A0;// entrée analogique de la photorésistance
int FinCHaut = 9;// entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
int FinCBas = 12;// entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
int D2 = 2;//monté
int D3 = 3;//descente
//variable pour stocker la valeur lue après conversion
int PhotoRLue;
void setup()
{
// démarrage la liaison série entre entrée analogique et ordi
Serial.begin(9600);
//Déclaration des contacts fin de course en entrée avec utilisation de la fonction PULLUP interne
pinMode(FinCHaut, INPUT_PULLUP); //Les Pull Up sont des résistances internes à l'arduino.
//Donc de base lorsque le boutton n'est pas appuyé on lit un état haut (5V = niveau logique 1)
pinMode(FinCBas, INPUT_PULLUP);
}
void loop()
{
PhotoRLue = analogRead(PhotoR);
//Valeur comprise entre 0 et 1024
//on affiche la valeur lue sur la liaison série
Serial.print("PhotoRLue = ");
Serial.print(PhotoRLue);
//on saute une ligne entre deux affichages
Serial.println();
if (PhotoRLue < 190 & digitalRead(FinCBas) == 1) //Condition : Detection de la nuit et la porte est ouverte
//Alors on ferme la porte
{
while(digitalRead(FinCBas) == 1){ //Tant que la porte n'est pas fermé, le moteur tourne
//Fermeture
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
}
digitalWrite(D3, LOW); //On arrete le moteur car le contact fin de course est activé
}
if (PhotoRLue > 650 && digitalRead(FinCHaut) == 1) //Condition : Detection du jour et la porte est fermée FinCHaut = 1 signifie le boutton fin de course haut n'est pas appuyé
{
while(digitalRead(FinCHaut) == 1){ //Tant que la porte n'est pas ouverte, le moteur tourne
//Fermeture
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
}
digitalWrite(D2, LOW);
}
}
es ce que c'est bon maintenant je ne savais pas pour la balise
merci de votre réponse cordialement Philippe
ça aurait été mieux d'éditer directement le premier post qui reste moche
il y a un petit crayon dans la barre en dessous de vos posts, ça permet de les modifier pour les améliorer (ne pas utiliser pour enlever des trucs une fois que quelqu'un a commenté sinon le fil de la discussion ne veut plus rien dire)
je viens de corriger l'erreur et de le téléverser sur ma arduino nano
justement sur cette ligne comment on peut mettre un délai de fermeture sur la porte .
la variation de la lumière n'est pas identique jour après jour .
// Déclaration des variables et des constantes
int PhotoR = A0;// entrée analogique de la photorésistance
int FinCHaut = 9;// entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
int FinCBas = 12;// entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
int D2 = 2;//monté
int D3 = 3;//descente
//variable pour stocker la valeur lue après conversion
int PhotoRLue;
void setup()
{
// démarrage la liaison série entre entrée analogique et ordi
Serial.begin(9600);
//Déclaration des contacts fin de course en entrée avec utilisation de la fonction PULLUP interne
pinMode(FinCHaut, INPUT_PULLUP); //Les Pull Up sont des résistances internes à l'arduino.
//Donc de base lorsque le boutton n'est pas appuyé on lit un état haut (5V = niveau logique 1)
pinMode(FinCBas, INPUT_PULLUP);
}
void loop()
{
PhotoRLue = analogRead(PhotoR);
//Valeur comprise entre 0 et 1024
//on affiche la valeur lue sur la liaison série
Serial.print("PhotoRLue = ");
Serial.print(PhotoRLue);
//on saute une ligne entre deux affichages
Serial.println();
if ((PhotoRLue < 190) && (digitalRead(FinCBas) == HIGH)) //Condition : Detection de la nuit et la porte est ouverte
//Alors on ferme la porte
{
while(digitalRead(FinCBas) == 1){ //Tant que la porte n'est pas fermé, le moteur tourne
//Fermeture
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
}
digitalWrite(D3, LOW); //On arrete le moteur car le contact fin de course est activé
}
if (PhotoRLue > 650 && digitalRead(FinCHaut) == 1) //Condition : Detection du jour et la porte est fermée FinCHaut = 1 signifie le boutton fin de course haut n'est pas appuyé
{
while(digitalRead(FinCHaut) == 1){ //Tant que la porte n'est pas ouverte, le moteur tourne
//Fermeture
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
}
digitalWrite(D2, LOW);
}
}
C'est vrai @J-M-L mais il vaut mieux mettre le même opérateur dans les deux conditions.
On peut aussi écrire : if ((PhotoRLue < 190) and (digitalRead(FinCBas) == HIGH))
comme dit plus haut, le plus simple (mais pas le plus beau) c'est de mettre une attente
par exemple la fermeture ressemblerait à cela avec votre code
//Condition : Detection de la nuit et la porte est ouverte
if ((PhotoRLue < 190) && (digitalRead(FinCBas) == HIGH)) {
//Alors on ferme la porte dans 30 minutes
delay(1800000ul); // <<=== attente active de 30 minutes
//mise en route de la Fermeture
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
// Tant que la porte n'est pas fermé, le moteur tourne
while (digitalRead(FinCBas) == HIGH);
//On arrete le moteur car le contact fin de course est activé
digitalWrite(D3, LOW);
}
la modification est apportée peut être que j'ai commis des erreurs !!
Les variantes sont modifiable à tous moments ?
// Déclaration des variables et des constantes
int PhotoR = A0;// entrée analogique de la photorésistance
int FinCHaut = 9;// entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
int FinCBas = 12;// entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
int D2 = 2;//monté
int D3 = 3;//descente
//variable pour stocker la valeur lue après conversion
int PhotoRLue;
void setup()
{
// démarrage la liaison série entre entrée analogique et ordi
Serial.begin(9600);
//Déclaration des contacts fin de course en entrée avec utilisation de la fonction PULLUP interne
pinMode(FinCHaut, INPUT_PULLUP); //Les Pull Up sont des résistances internes à l'arduino.
//Donc de base lorsque le boutton n'est pas appuyé on lit un état haut (5V = niveau logique 1)
pinMode(FinCBas, INPUT_PULLUP);
}
void loop()
{
PhotoRLue = analogRead(PhotoR);
//Valeur comprise entre 0 et 1024
//on affiche la valeur lue sur la liaison série
Serial.print("PhotoRLue = ");
Serial.print(PhotoRLue);
//on saute une ligne entre deux affichages
Serial.println();
//Condition : Detection de la nuit et la porte est ouverte
if ((PhotoRLue < 190) && (digitalRead(FinCBas) == HIGH)) {
//Alors on ferme la porte dans 30 minutes
delay(1800000ul); // <<=== attente active de 30 minutes
//mise en route de la Fermeture
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
// Tant que la porte n'est pas fermé, le moteur tourne
while (digitalRead(FinCBas) == HIGH);
//On arrete le moteur car le contact fin de course est activé
digitalWrite(D3, LOW);
}
if (PhotoRLue > 650 && digitalRead(FinCHaut) == 1) //Condition : Detection du jour et la porte est fermée FinCHaut = 1 signifie le boutton fin de course haut n'est pas appuyé
{
while(digitalRead(FinCHaut) == 1){ //Tant que la porte n'est pas ouverte, le moteur tourne
//Fermeture
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
}
digitalWrite(D2, LOW);
}
}
Je fais les essais demain et je vous donne les résultat des modifications
Bonne soirée à vous tous qui m'ont aidé
cordialement Philippe
Pour le matin je le verrai plutôt comme ça (suivant le même schéma que @J-M-L ) :
//Condition : Detection du jour et la porte est fermée
if ((PhotoRLue > 650) && (digitalRead(FinCHaut) == HIGH)) {
//Alors on ouvre la porte dans 30 minutes
delay(1800000ul); // <<=== attente active de 30 minutes
//mise en route de l'ouverture
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
//Tant que la porte n'est pas ouverte, le moteur tourne
while (digitalRead(FinCHaut) == HIGH);
//On arrete le moteur car le contact fin de course est activé
digitalWrite(D2, LOW);
}
A moins que vous ne vouliez pas de délais à l'ouverture auquel cas il vous suffit de l'enlever.
Bon courage.
PS : Avez-vous été lire le tuto de @J-M-L sur les machines à états ?
bonsoir
merci de l'information ,mais la fonction serait que pour le soir en fonction de la saison .
Je prends note de votre information du matin .
ces délais peuvent être positif ou négatif ?
Cordialement Philippe
Ça serait quoi un délai négatif ? On remonte le temps ? (Vous avez vu qu’il fait jour et vous voulez remonter le temps pour ouvrir une demi heure avant… )
bonjour ,
Effectivement c'est une erreur de ma part .
Je viens de faire un essai avec la temporisation de la fermeture en obstruant la LDR avec une plaque opaque et en surveillant la mobilité de la porte du poulailler.
Rien ne se passe !!
Es ce j'ai bien programmé suivant vos indications ?
// Déclaration des variables et des constantes
int PhotoR = A0;// entrée analogique de la photorésistance
int FinCHaut = 9;// entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
int FinCBas = 12;// entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
int D2 = 2;//monté
int D3 = 3;//descente
//variable pour stocker la valeur lue après conversion
int PhotoRLue;
void setup()
{
// démarrage la liaison série entre entrée analogique et ordi
Serial.begin(9600);
//Déclaration des contacts fin de course en entrée avec utilisation de la fonction PULLUP interne
pinMode(FinCHaut, INPUT_PULLUP); //Les Pull Up sont des résistances internes à l'arduino.
//Donc de base lorsque le boutton n'est pas appuyé on lit un état haut (5V = niveau logique 1)
pinMode(FinCBas, INPUT_PULLUP);
}
void loop()
{
PhotoRLue = analogRead(PhotoR);
//Valeur comprise entre 0 et 1024
//on affiche la valeur lue sur la liaison série
Serial.print("PhotoRLue = ");
Serial.print(PhotoRLue);
//on saute une ligne entre deux affichages
Serial.println();
//Condition : Detection de la nuit et la porte est ouverte
if ((PhotoRLue < 190) && (digitalRead(FinCBas) == HIGH)) {
//Alors on ferme la porte dans 30 minutes
delay(1800000ul); // <<=== attente active de 30 minutes
//mise en route de la Fermeture
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
// Tant que la porte n'est pas fermé, le moteur tourne
while (digitalRead(FinCBas) == HIGH);
//On arrete le moteur car le contact fin de course est activé
digitalWrite(D3, LOW);
}
if (PhotoRLue > 650 && digitalRead(FinCHaut) == 1) //Condition : Detection du jour et la porte est fermée FinCHaut = 1 signifie le boutton fin de course haut n'est pas appuyé
{
while(digitalRead(FinCHaut) == 1){ //Tant que la porte n'est pas ouverte, le moteur tourne
//Fermeture
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
}
digitalWrite(D2, LOW);
}
}
Que veut dire 1800000ul cela correspond à 30 minutes
Merci de votre réponse
Cordialement Philippe
la porte était bien ouverte ? vous avez attendu 30 minutes ?
pour en avoir le coeur net vous pouvez faire une petite impression
//Condition : Detection de la nuit et la porte est ouverte
if ((PhotoRLue < 190) && (digitalRead(FinCBas) == HIGH)) {
Serial.println(F("Fermeture dans 30 minutes"));
//Alors on ferme la porte dans 30 minutes
delay(1800000ul); // <<=== attente active de 30 minutes
//mise en route de la Fermeture
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
// Tant que la porte n'est pas fermé, le moteur tourne
while (digitalRead(FinCBas) == HIGH);
//On arrete le moteur car le contact fin de course est activé
digitalWrite(D3, LOW);
}
PS: j'ai supposé que la commande moteur sur D2 et D3 était bonne
re
La commande d2 et d3 n'a pas été modifiée
Voilà ce qui a été introduit dans la arduino nano
demain je vais refaire un montage à blanc sur mon bureau
et je vous tiens au courant des évènements
Merci d'avance cordialement
// Déclaration des variables et des constantes
int PhotoR = A0;// entrée analogique de la photorésistance
int FinCHaut = 9;// entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
int FinCBas = 12;// entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
int D2 = 2;//monté
int D3 = 3;//descente
//variable pour stocker la valeur lue après conversion
int PhotoRLue;
void setup()
{
// démarrage la liaison série entre entrée analogique et ordi
Serial.begin(9600);
//Déclaration des contacts fin de course en entrée avec utilisation de la fonction PULLUP interne
pinMode(FinCHaut, INPUT_PULLUP); //Les Pull Up sont des résistances internes à l'arduino.
//Donc de base lorsque le boutton n'est pas appuyé on lit un état haut (5V = niveau logique 1)
pinMode(FinCBas, INPUT_PULLUP);
}
void loop()
{
PhotoRLue = analogRead(PhotoR);
//Valeur comprise entre 0 et 1024
//on affiche la valeur lue sur la liaison série
Serial.print("PhotoRLue = ");
Serial.print(PhotoRLue);
//on saute une ligne entre deux affichages
Serial.println();
//Condition : Detection de la nuit et la porte est ouverte
if ((PhotoRLue < 190) && (digitalRead(FinCBas) == HIGH)) {
Serial.println(F("Fermeture dans 30 minutes"));
//Alors on ferme la porte dans 30 minutes
delay(1800000ul); // <<=== attente active de 30 minutes
//mise en route de la Fermeture
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
// Tant que la porte n'est pas fermé, le moteur tourne
while (digitalRead(FinCBas) == HIGH);
//On arrete le moteur car le contact fin de course est activé
digitalWrite(D3, LOW);
}
if (PhotoRLue > 550 && digitalRead(FinCHaut) == 1) //Condition : Detection du jour et la porte est fermée FinCHaut = 1 signifie le boutton fin de course haut n'est pas appuyé
{
while(digitalRead(FinCHaut) == 1){ //Tant que la porte n'est pas ouverte, le moteur tourne
//Fermeture
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
}
digitalWrite(D2, LOW);
}
}