Je viens sur ce forum car je suis une bille en programmation et j’aurais besoin d’aide.
Mon objectif:
Avoir une porte de poulailler qui s’ouvre et se ferme en fonction de la luminosité, avec une lumière qui s’éclaire 15 min à l’intérieur du poulailler avant la fermeture.
Montage :
Arduino Uno
Batterie 12 V (qui se recharge via un panneau solaire)
Vérin électrique 12 V
Led 5 V
LDR
Module de Relais 2 canaux
Convertisseur de tension (Pour alimenter l’Arduino avec la batterie)
Je n’ai pas de capteur fin de course car comme j’utilise un vérin, je sais qu’il me faut 30 sec pour ouvrir ou fermer la porte. Cependant, je ne sais pas comment l’arrêter.
Mon second problème réside dans le stockage des données. J’aimerais savoir comment je peux faire pour garder les valeurs mesurées par la LDR et en établir une moyenne sur 5 min de mesures. Idéalement, ce qui serait bien c’est que les mesures soient faites toutes les 10 sec et qu’ils réitèrent la moyenne en permanence toutes les 10 secondes. Si la moyenne est inférieure à un certain seuil, la lumière du poulailler s’allume pdt 15 min et ensuite la porte se ferme.
Je vous mets en PJ mon prog Arduino et le montage mais je suis loin d’avoir réussi à faire ce que je voulais.
Quel verin?
On en trouve chez ali ou ebay ils sont presque tous équipé de fin de courses. Donc Tu ne t'occupe de rien.
Je suis en train de faire le meme
Moi j'utilise un double pont en H l298D
Pour la ldr
Tu te creer une variable int ldr, un byte nb de lecture
Et toutes les 10 secondes ou minutes tu lit la ldr, tu cumule les valeures a la fin tu fait une division du total ldr par le nb de lecture et tu aura une valeure moyenne sur (nb x tempo) de temps ca evite les fausse mesures , flashs, eclair ou autre
Prevoie un hysterisis ou tu ne fait rien, la limite nuit / jour doit etre TRES franche pour eviter les bagots
Ps je suis sur tablette, difficile de lire ton code.g
achess:
Bonjour,
Un verin c'est un gros moyen, un servo moteur suffit en général ?
moi j'utilise ça car c'est en 12V, très fiable, pas de gestion des fin de course , très costaud pour une porte guillotine, pas de risque que ça déconne
avant d'avoir ça je me suis déjà fait bouffer une vingtaine de poules... outre l'effet pécunier, il y a aussi l'effet émotionnel...
c'est vrai le bouzin m'a couté une vingtaine d'euro... soit le prix de 2 poules.... mais quand on aime, on ne compte pas!
Arzou:
moi j'utilise ça car c'est en 12V, très fiable, pas de gestion des fin de course , très costaud pour une porte guillotine, pas de risque que ça déconne
Pas besoin non plus de fin de course avec un servo test
"Tu te creer une variable int ldr, un byte nb de lecture
Et toutes les 10 secondes ou minutes tu lit la ldr, tu cumule les valeures a la fin tu fait une division du total ldr par le nb de lecture et tu aura une valeure moyenne sur (nb x tempo) de temps ca evite les fausse mesures , flashs, eclair ou autre..."
Ce que tu as dit juste au dessus, je ne sais pas faire c'est bien le problème. Comment cumuler les valeurs? et continuer de les cumuler ttes les 10 minutes et faire la moyenne à l'infini?
Ensuite pour répondre aux autres sur le pourquoi j'ai prix un vérin c'est pour être sur que le renard va pas soulever la porte avec son museau. L'effort axial nécessaire pour la soulever avec un vérin lui sera impossible.
Je n'ai pas d'infos sur ce vérin pour savoir s'il y a une fin de course ou non ou alors est ce que c'est par défaut et une fois arrivé au max, il s'arrête automatiquement? Comment en être sur?
a toi de l'adapter
je ne suis pas chez moi donc je ne pourrais pas le tester avant ce soir
if ( millis() - tempo >= periode_scrutation) // autorise a entrer dans la boucle ldr sans blocage
{
tempo = millis();
if (nb_lectures_LDR > duree_boucle) // traitement de la ldr au fil de l'eau si on a atteint le nb de lectures LDR
{
periode_scrutation = 10000ul; // aprés la premiere loop, on ralentie la lecture LDR en ajoutant une tempo importante
if ((total_ldr / nb_lectures_LDR) >= 500) Etat = nuit; // si la moyenne des lectures LDR >= 500 il fait jour hors de cette plage on ne fait rien
else if ((total_ldr / nb_lectures_LDR) <= 400) Etat = jour; // si la moyenne des lectures LDR <= 400 il fait nuit
total_ldr = 0; // on re initialise
nb_lectures_LDR = 0;
}
total_ldr = total_ldr + (analogRead(lecture_Ldr)); // on cumule les lecture LDR
nb_lectures_LDR++; // INC nb de boucles
Arzou:
sauf qu'avec les poules le bas du logement va se remplir très très vite de "merdes" et ca ne descendra plus et ta porte se bloquera.. entre-ouverte
je nettoie tout les jours et j'ai rarement quelque chose. La gorge fait 2 cm du fait que j'ai arrondi le bas de la tôle.
klvin1981:
Je n'ai pas d'infos sur ce vérin pour savoir s'il y a une fin de course ou non ou alors est ce que c'est par défaut et une fois arrivé au max, il s'arrête automatiquement? Comment en être sur?
pour savoir, tu branche ton verin sur une source 12V et tu regarde ce qu'il se passe. s'il s'arrete seul en bout de course, il a des contacts de fin de course, s'il force.... pas bon!
J'ai pas vraiment compris ton code pour être honnête. Voilàa ce que j'ai fait au départ. Je ne sais pas comment intégrer ton code dans le mien
C'est là ou je bugge.
const int forwards = 7;
const int backwards = 12;
int pinPR = A0; //pin de connexion pour la photorésistance
int Light = 6;
void setup() {
Serial.begin(9600);
pinMode(pinPR,INPUT);
pinMode(forwards, OUTPUT);//set relay as an output
pinMode(backwards, OUTPUT);//set relay as an output
pinMode(Light,OUTPUT);
}
void loop() {
int valeur = analogRead(pinPR); // on lit la valeur transmise par la photorésistance
Serial.println(valeur); // on l'affiche
if (valeur > 300)
{
digitalWrite(forwards, LOW);//Ouverture porte
digitalWrite(backwards, HIGH);//Ouverture porte
delay(1000); // wait 30 seconds
digitalWrite(forwards, LOW);
digitalWrite(backwards, LOW);
}
if (valeur < 300)
{
digitalWrite(Light,HIGH);
delay(5000);// wait 10 minutes
digitalWrite(forwards, HIGH);//Fermeture porte
digitalWrite(backwards, LOW);//Fermeture porte
delay(1000);// wait 30 seconds
digitalWrite(forwards, LOW);
digitalWrite(backwards, LOW);
digitalWrite(Light,LOW);
}
Voici le code, j'ai viré pas mal de choses, il est minimaliste pas testé
byte nb_boucles=0; // comptage de nb boucles
byte duree_boucle=20; // nombre de lecture a effectuer. plus le nombre est élevé plus la précision de la moyenne augmente
long int total_ldr =0; // pour memoriser et faire la moyenne des lectures ldr
void setup()
{
//Put your setup code here, to run once:
}
void loop()
{
if (nb_boucles >duree_boucle) // si le nombre de boucles est supérieur a la durée (nombre de lectures prevues) on rentre dans le test
{
if ((total_ldr/nb_boucles) >=500) etat=jour; // si total lecture ldr/nb_boucles ( soit la valeur moyenne) est supérieur ou egal a 500 il fait jour
else if ((total_ldr/nb_boucles) <=400) etat=nuit; // si la moyenne est inférieur ou égal à 400 il fait nuit
// si la moyenne est entre 400 et 500 on ne fait rien pour eviter l'effet yoyo.
// ces valeures sont a tester en situation réelle
total_ldr=0; // on re initialise le cumul des lectures ldr
nb_boucles=0; // on re initialisele nb de boucle a 0
}
total_ldr=total_ldr+(analogRead(lecture_Ldr)); // ici on lit la ldr ( valeur entre 0 et 1023) et on la cumule aux valeurs lues précédemment.
nb_boucles++; //on incremente le nombre de boucles.
}
if (jour_ou_nuit != etat) // y a t il eu un changement d'etat oui ? alors,
// (etat est la situation precedente )
{
jour_ou_nuit = etat; // on memorise l'état actuel
if (jour_ou_nuit==nuit) // on est passe de jour a nuit?
{
baisse_trappe(); // oui, donc on baisse la trappe et le reste
}
else
{
monte_trappe(); // donc on est passé de nuit à jour
} delay(1000); // on attend 1 seconde sinon ce serait trop rapide et la moyenne ne serai pas significative. On peut ( je dirait même, on doit!) Utiliser millis() pour eviter le blocage de la loop . On peu utiliser une valeur bcp plus grande que 1 seconde pour augmenter la stabilité de la moyenne.
}
J'ai été trop long, message perdu , j'abrège..
Réponds à ton besoin d'assurer la mesure 5 mn et l'arrêt même si défaut de fin de course.
Non vérifié :
Plus de variables, avec des noms plus évocateurs pour ne jouer les actions qu'une fois, ce que je propose :
//hors fonction :
const int pinOuvrir = 12;
const int pinFermer = 7;
int pinPR = A0; //pin de connexion pour la photorésistance
int pinLampe = 6;
int valeur;
unsigned long chrono;
unsigned long attente = 300000;// 5 mn
unsigned long chronoMoteur;
unsigned long dureeMoteur = 32000; // 32 secondes avec marge de sécurité
bool ouverture = 0;
bool finDeCourse;
bool fermeture = 0;
bool jour;
Dans le setup :
valeur = analogRead(pinPR);
if (valeur > 300)jour = true;
else jour = false;
Dans le loop:
//ouverture
if ((valeur > 300))
{
if (jour)// Après vérification
{
if (!ouverture)//commande éxécutée une seule fois
{
digitalWrite(pinOuvrir, LOW);//Ouverture porte
ouverture = true;
finDeCourse = false;
chronoMoteur = millis();
}
if ((!finDeCourse) && ((millis() - chronoMoteur) > dureeMoteur))
{
digitalWrite(pinOuvrir, LOW);//arrête le moteur
finDeCourse = true;
}
}
else // encore la nuit
{
if ((millis() - chrono) > attente)
{
jour = true;//valide la mesure
ouverture = false;// prochaine action
}
else chrono = millis();//remets le compteur à zéro
}
}