Bonjour,
J'utilise Arduino pour ouvrir/fermer ma porte de poulailler (un classique !)
Par ces fortes chaleurs, elle fait un peu n'importe quoi (fermeture intempestive le jour).
Je soupçonne une instabilité de mon alimentation.
Il y a-t-il possibilité d'afficher les tensions des différentes pins avec un "Serial.println(...)" ce qui me permettrait d'avoir une trace visuelle sur mon PC en phase de test.
Je ne trouve pas d'article sur le sujet
Je vous remercie
Nicolas
Pas vraiment la tension exacte. Vous pouvez savoir si la pin est HIGH ou LOW par un digitalRead et imprimer cela.
Quel capteur avez vous pour déterminer si c'est l'heure de fermer ?
Avez vous une trace dans le setup() qui dit que vous démarrez ? ça permettrait de voir un reboot intempestif.
(si vous partagez votre code et un dessin de votre circuit électronique on pourra vous dire si on voit un truc louche)
Si le nombre d'entrées analogiques disponibles est suffisant il est possible de connecter une entrée analogique en parallèle sur une sortie digitale.
@nicolas_paour
Effectivement, la tension disponible sur une sortie digitale est dépendante de la température et du courant dans la sortie.
Ces informations sont disponibles dans la datasheet du microcontroleur , à télécharger sur le site du fabricant pour être assuré d'avoir la dernière version.
Généralement cela se trouve dans le chapitre "Electrical characteristics" ou un nom ressemblant.
Exemple pour le µC des Uno, nano :
Mode "source"
Une courbe jumelle existe pour le mode "sink".
Fort courant et forte température au niveau du boîtier ne vont pas bien ensemble.
Bonjour,
J'utilise une photodiode et je compare 2 seuils de luminosité avec une différence de 450 pour distinguer les deux phases.
int Seuil_Jour = 950; // Variable de luminosité seuil pour le jour
int Seuil_Nuit = 500; // Variable de luminosité seuil pour la nuit
Les pistes seraient :
- mettre une capa sur l'entrée alimentation pour amortir les micro coupures
- faire un calcule de moyenne de luminosité pour "noyer" une valeur erratique
- supprimer ma fermeture sur phase d'initialisation (mais j'aime bien les initialisation !)
voici le code
// Version V1 sans détection renard
// date 24/07/2023
int MotorPin1 = 12; // Déclaration broche 1 commande moteur
int MotorPin2 = 9; // Déclaration broche 2 commande moteur
int Speed = 255; // Vitesse d'ouverture et fermeture de la porte
int Luminosite = 0; // Variable de la luminosité
int LuminositePin = A0; // Déclaration broche LDR
int Seuil_Jour = 950; // Variable de luminosité seuil pour le jour
int Seuil_Nuit = 500; // Variable de luminosité seuil pour la nuit (avant 700)
int Tempo_luminosite = 10000; // Temporisation luminosité 10 secondes = 10000ms
int Temps_ouverture_fermeture = 32000; // Temps d'action du verrin pour arriver en butée
int Tempo_affichage = 0;
boolean mem_lumiere = false; // Déclaration de la mémoire lumière
boolean Detecte_lumiere = false; // Déclaration variable détection lumière
boolean Jour = true; // Déclaration variable Jour = 1 | Nuit = 0
boolean porte_fermee = false; //Déclaration variable porte fermée
boolean porte_ouverte = false; //Déclaration variable porte ouverte
boolean Initialisation_passee = false; // Déclaration variable initialisation
// État d'activation de la tempo
boolean tempoActive = false;
// Temps à l'activation de la tempo
unsigned long tempoDepart = 0;
void setup() {
Serial.begin(9600); // Ouverture du port série et debit de communication fixé à 9600 bauds
Serial.println("Decodage ...");
//Configuration du Canal A
pinMode(MotorPin1, OUTPUT); // Broche Arduino réservée pour le sens de rotation du moteur A
pinMode(MotorPin2, OUTPUT); // Broche Arduino réservée pour le freinage du moteur A
Fermer_porte_Initialisation();
}
void loop() {
if (Tempo_affichage >= 10000) {
Serial.print("Luminosite = ");
Serial.println(Luminosite);
Serial.print("Seuil_Nuit = ");
Serial.println(Seuil_Nuit);
Serial.print("Seuil_Jour = ");
Serial.println(Seuil_Jour);
Serial.print("Statut porte (0 : fermée, 1 : ouverte) = ");
Serial.println(porte_ouverte);
Serial.println(" ----------------------");
Tempo_affichage = 0;
} else {
Tempo_affichage = Tempo_affichage + 1;
}
Luminosite = analogRead(LuminositePin);
// Initialisation_passee = true quand la porte est fermée au démarrage
if (Initialisation_passee) {
if (Luminosite >= Seuil_Jour) {
Detecte_lumiere = true;
}
if (Luminosite <= Seuil_Nuit) {
Detecte_lumiere = false;
}
if (Detecte_lumiere != mem_lumiere) {
tempoActive = true;
tempoDepart = millis();
Serial.println("La lumière lance tempo"); // Affichage sur le moniteur série du texte
}
if (Detecte_lumiere && tempoActive && ((millis() - tempoDepart) >= Tempo_luminosite)) {
Jour = true;
Serial.println("Il fait jour"); // Affichage sur le moniteur série du texte
tempoActive = false;
Serial.print("porte_non_ouverte = ");
Serial.println(porte_ouverte);
if (!porte_ouverte) {
Ouvrir_porte();
}
Serial.print("porte_ouverte = ");
Serial.println(porte_ouverte);
}
mem_lumiere = Detecte_lumiere;
if (!Detecte_lumiere && tempoActive && (millis() - tempoDepart) >= Tempo_luminosite) {
Jour = false;
Serial.println("Il fait nuit"); // Affichage sur le moniteur série du texte
tempoActive = false;
Serial.print("porte_non_fermee = ");
Serial.println(porte_fermee);
if (!porte_fermee) {
Fermer_porte();
}
Serial.print("porte_fermee = ");
Serial.println(porte_fermee);
}
mem_lumiere = Detecte_lumiere;
}
}
// Séquence de fermeture de la porte, le verin sort.
void Fermer_porte_Initialisation() {
// sortir verin
Serial.println("Séquence initialisation");
digitalWrite(MotorPin1, LOW); // Le moteur A tourne dans le sens normal
digitalWrite(MotorPin2, LOW); // Désactivation du frein moteur A
Serial.println("Première fermeture porte"); // Affichage sur le moniteur série
analogWrite(3, Speed); // Vitesse maximale 255-0 pour le moteur A
delay(Temps_ouverture_fermeture);
Arret_moteur();
porte_fermee = true;
porte_ouverte = false;
Initialisation_passee = true;
Serial.println("Porte Fermée par initialisation"); // Affichage sur le moniteur série
}
// Séquence de fermeture de la porte, le verin sort.
void Fermer_porte() {
// sortir verin
digitalWrite(MotorPin1, LOW); // Le moteur A tourne dans le sens normal
digitalWrite(MotorPin2, LOW); // Désactivation du frein moteur A
Serial.println("Fermeture porte"); // Affichage sur le moniteur série
analogWrite(3, Speed); // Vitesse maximale 255-0 pour le moteur A
delay(Temps_ouverture_fermeture);
Arret_moteur();
porte_fermee = true;
porte_ouverte = false;
Serial.println("Porte Fermée"); // Affichage sur le moniteur série
}
// Séquence d'ouverture de la porte, le verin rentre.
void Ouvrir_porte() {
// renter verin
digitalWrite(MotorPin1, HIGH); // Le moteur A tourne dans le sens inverse
digitalWrite(MotorPin2, LOW); // Désactivation du frein moteur A
Serial.println("ouverture porte"); // Affichage sur le moniteur série
Serial.print("Speed = ");
Serial.println(Speed);
analogWrite(3, Speed); // Vitesse maximale 255-0 pour le moteur A
delay(Temps_ouverture_fermeture);
Arret_moteur();
porte_fermee = false;
porte_ouverte = true;
Serial.println("Porte Ouverte"); // Affichage sur le moniteur série
}
// a priori pas necéssaire car en fin de course !
void Arret_moteur() {
Serial.println("Arret_moteur");
digitalWrite(MotorPin1, LOW); // Le moteur A tourne dans le sens normal
digitalWrite(MotorPin2, LOW); // Désactivation du frein moteur A
analogWrite(3, 0);
tempoActive = 0;
}
Pas très disponible ces 4 jours pour répondre, en vadrouille
Merci
Nicolas
Le coupable semble être là si la carte reboote… reste à trouver pourquoi elle rebooterait
en attendant vous pouvez effectivement mettre une grosse capa sur l'entrée alimentation comme vous dites ou modifier la procédure de fermeture sur phase d'initialisation et rajouter un détecteur qui sait quel est l'état de la porte et fermer ou ouvrir en fonction de la luminosité.
(la plupart des projets que l'on voit finissent par mettre une RTC car la photodiode peut réagir les jours de mauvais temps / passage de gros nuages etc).