Go Down

Topic: Problème plantage pro mini (Read 591 times) previous topic - next topic

achess

Jun 12, 2017, 12:42 am Last Edit: Jun 12, 2017, 12:44 am by achess
Bonjour,
Je commande une pompe à distance par une télécommande 12 V UHF.
Comme je suis en limite de portée, pour palier le déclenchement aléatoire et ajouter des fonctions, comme démarrer ou arrêter la pompe à chaque commande, délai de 4 secondes entre 2 commandes et arrêt forcé après 10 minutes (cuve pleine).

Le récepteur et le pro mini sont alimentés en 11 V. l'entrée 4 et la sortie 2 du promini sont intercalés au niveau de la base du transistor de commande du relais du récepteur.

Tout fonctionne bien sauf si je ne commande pas la pompe durant plus de 3 jours. Dans ce cas je suis obligé de faire un "reset" au pro mini.

Voyer vous une erreur dans la programmation ?
Code: [Select]

/* 07/01/2017 1522 octets version finale.
  Commande de pompe avec mise en veille
  Consommation en veille : 3.4 mA nano et pro mini(CH340).


  appuie sur télécommande :déclenchement sur front montant entrée 2.
  > Réveil du circuit > pompe en marche
  désactivation de l'entrée pendant 4 secondes, pour éviter les fausses commandes

  nouvel appuie sur télécommande > Arrêt pompe et retour en veille au bout de 4 secondes.

  ou au bout de 10 mn > arrêt forcé cuve jardin pleine
  pour éviter l'oubli et la commande non désirée.
  
  Pour cela le circuit ne doit pas retourner en veille tant que la pompe tourne, sinon
  le compteur millis() est remis à zéro.

*/
#include "LowPower.h"

const byte interruptPin = 2;
const byte LED = 13;
const byte pomp = 4;
boolean etatPin2;
boolean etatPomp = 0; // etat pompe
boolean verrou = 0;// verrou entrée 2
unsigned long temps1=0;// première impulsion de commande
unsigned long temps2;//

void wake () {
  // ne fait rien
}  // end of wake

void veille() {
  attachInterrupt(0, wake, HIGH);
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
  detachInterrupt(0);
}

void setup ()
{
  pinMode(LED, OUTPUT);
  pinMode(pomp, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  veille();
}  // end of setup

void loop ()
{
  etatPin2 = digitalRead(interruptPin);
  if (!verrou) {// entré 2 active
    if (etatPin2==1) {// première impulsion
      if (!etatPomp) {// pompe arrêtée
        digitalWrite (LED, 1);
        digitalWrite (pomp, 1);
        etatPomp=1;
      }
      else {
        digitalWrite (LED, 0);
        digitalWrite (pomp, 0);
        etatPomp=0;
        
      }
      temps1 = millis();//
      verrou = 1;
    }
  }

  temps2 = millis() - temps1;
  
  if (temps2 > 4000) {
    verrou = 0; // dévérouille l'entrée 2
    if(!etatPomp) veille();// besoin d'être retardée
  }

  if (temps2 > 600000) { // arret forcé à 10 mn
    digitalWrite (LED, 0);
    digitalWrite (pomp, 0);
    etatPomp = 0;
    veille();
    verrou = 0;
  }
} // end of loop


Raccordement sur le récepteur

-Standby

Quote
Tout fonctionne bien sauf si je ne commande pas la pompe durant plus de 3 jours. Dans ce cas je suis obligé de faire un "reset" au pro mini.
Qu'est-ce qui ne fonctionne pas au juste ?
The Mind is like a parachute it works best when opened.

achess

Bonjour et merci de ta réponse, -standby,

Fonctionne parfaitement, mais si je suis plusieurs jours sans l'utiliser, je m'aperçoit que la commande ne réponds plus.
Je dois faire 150 m pour appuyer sur le bouton "reset" du pro mini pour que ça fonctionne de nouveau.

Ce n'est pas un problème avec millis() puisqu'il n'y a pas 50 jours.

Je viens de recevoir un nouveau pro mini. Dès que j'ai un moment, j'en reprogramme un nouveau et viendrais donner des nouvelles.
 

dfgh

hello
j'ai du mal à suivre ton code

attachInterrupt(0, wake, HIGH);
signifie que la fonction Wake sera appelée sur un signal haut de l'entrée D2

mais tu as déclaré D2 comme suit:
 pinMode(interruptPin, INPUT_PULLUP);
signifie que tu as activé la résistance de pull up de l'entrée D2

comment fonctionne la télécommande?

le récepteur mets D2 à l'état bas? le µ a le temps de se réveiller avant la réception du message?
mais il faut que le récepteur remette D2 à High pour que la fonction Wake soit appelée

achess

Bonjour dfhg,

L'entrée 2 est a 0 V au repos. Elle est reliée sur la sortie du cicuit décodeur du récepteur.

Cette sortie était normalement reliée sur la base du transistor qui commute le relais de sortie. J'ai coupé cette liaison ( croix rouge) et relié D4 en sortie pour commuter le relais via le Pro mini.

J'ai utilisé l'exemple de la librairie low-power https://github.com/rocketscream/Low-Power/blob/master/Examples/powerDownWakeExternalInterrupt/powerDownWakeExternalInterrupt.ino

 
J'avoue aussi que je ne comprend pas bien le fonctionnement.




Aegnor1975

Bonsoir Achess,

Je sais que le 11v est dans les tolérances de l'Arduino, mais j'ai eu un soucis similaire avec une alimentation 12v, la uno ne répondait plus après quelques jours...
J'ai mis un step down en 9v, et ça fait plus d'un an qu'elle tourne sans reset...

Peut-être voir de ce côté là ?

Cordialement,

Aegnor

achess

Merci du conseil Aegnor1975, je ferais l'essai.

achess

#7
Jun 27, 2017, 04:21 pm Last Edit: Jun 27, 2017, 04:30 pm by achess
Bonjour,

J'ai remplacé le promini par un nouveau.

Le lendemain il ne fonctionnait plus.
Le circuit régulateur du pro mini était complètement carbonisé. Pourtant c'est une alimentation à découpage qui sort une tension bien stabilisée à 11 V cc.

J'ai inséré un Mc78HC05 relié sur l'entrée Vcc 5 V du promini et depuis plus de soucis.

Mes pro mini sont chinois, mais dorénavant je mettrait maxi 9V sur l'entrée Raw.

achess

Bonjour,

Le plantage s'est encore manifesté >:(
Je pense avoir trouvé l'erreur, puisque cela fait plusieurs jour que ça fonctionne.

Je suppose que c'est la variable "verrou" qui ne repassait pas à 0 sur mon arrêt automatique de pompe que j'ai réglé à 10 mn.

Voir les dernières lignes de mon programme dans mon premier post.

J'avais mis
Code: [Select]
  if (temps2 > 600000) { // arret forcé à 10 mn
    digitalWrite (LED, 0);
    digitalWrite (pomp, 0);
    etatPomp = 0;
    veille();
    verrou = 0;
  }
La modification a été de mettre la fonction veille() en dernier.

Je pense que la mise en veille se faisait parfois avant que la variable soit mise à 0 empêchant toute nouvelle commande.

L'ordre des actions a donc un grande importance dans une fonction.

Go Up