Détecter une chute de tension

Bonjour, je cherche à détecter lorsque l'Arduino n'est plus alimenté afin de sauvegarder des données dans l'EEPROM. La partie sauvegarde et récupération des données c'est bon.
Ce qui ne marche pas c'est la détection de la chute de tension.
En pièce jointe le schéma que j'ai utilisé, j'ai même mis un condensateur 470µF mais l'Arduino s'éteint tout de suite.
Au niveau code j'ai "attachInterrupt(digitalPinToInterrupt(2), powerLoss, FALLING);" (powerLoss étant la route a exécuter lors de la chute de tension)

Y a-t-il d'autres manières de faire ? ou y a-t-il quelque chose de faux ?

D'avance merci pour votre aide.

detect.PNG

Ton schéma est tiré de mon blog :

J'ai fait mes essais et mes mesures avec une UNO et une diode 1N5819 (Schottky).
Qu'as-tu utilisé comme diode ?

j'ai même mis un condensateur 470µF mais l'Arduino s'éteint tout de suite.

L'Arduino s'éteint tout de suite, oui bien sûr, visuellement parlant, il ne va pas rester sous tension pendant très longtemps. La routine d'interruption est-elle appelée (cela doit se voir dans le moniteur série).

Sans schéma complet et sans sketch difficile d'en dire plus.

Merci pour la réponse.
J'ai mis une diode 1N5819.

Pour ce qui est du code j'ai ramené au plus simple :

#include <EEPROM.h>

int adresse = 100;
unsigned int mess = 123;
unsigned int messlue;

void setup() {
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(2), powerLoss, FALLING);

void powerLoss()
{
EEPROM.put (adresse, mess);
}

void loop() {
EEPROM.get (adresse, messlue);
Serial.print("écrit : ");
Serial.println(mess);
Serial.print("lu : ");
Serial.println(messlue);

delay(10000);
}

Si je débranche l'Arduino du PC je ne vois plus rien sur le moniteur série donc je ne vois pas si la routine s'exécute et rien ne s'enregistre dans l'EEPROM
Si je laisse branché l'Arduino au PC quand je débranche l'alim là ça fonctionne mais ce n'est pas le but !!!!
J'ai aussi testé avec du 12V (en adaptant le pont diviseur à 100K et 68K) mais cela ne change rien.
Le schéma complet est identique au tien (sauf si j'alimente avec du 12V auquel cas je branche sur VIN)

Maintenant on est d'accord que dans attachInterrupt(digitalPinToInterrupt(2), powerLoss, FALLING); le 2 c'est bien le pin digital 2 et pas le interrupt 2 ?

As-tu besoin d'autres info ?
Merci d'avance

Bonjour

En mettant le code , dans le corps du message, mais entre balises appropriées il sera plus lisible, en particulier sur smartphone et ça augmentera la probalilité de réponse.

Pour tester la réaction du montage à un descente de D2, mettre D2 à la masse(simuler un coupure d'alim) sans couper l'alimentation. Voir ce qui se passe dans le terminal

la carte Arduino alimente-t-elle des composants extérieurs ?

Si je débranche l'Arduino du PC je ne vois plus rien sur le moniteur série donc je ne vois pas si la routine s'exécute et rien ne s'enregistre dans l'EEPROM

Si l'ARDUINO est alimenté uniquement par l'USB la diode ne voit rien sur son anode, et le pont diviseur non plus. A moins que tu aies branché aussi une alimentation 5V en amont de la diode.

Si je laisse branché l'Arduino au PC quand je débranche l'alim là ça fonctionne mais ce n'est pas le but !!!!

Si tu alimentes par VIN, c'est normal, puisque le pont diviseur est sur VIN. Si tu coupes l'alimentation, le processeur reste alimenté par l'USB et tu vois les messages sur la ligne série.
Si tu alimentes par la broche 5V, cela marchera aussi, mais tu ne verras rien sur le terminal.

J'ai fait mes essais et mesures avec une alimentation 5V et un FTDI sur RX/TX, donc je pouvais voir les messages affichés.

Maintenant on est d'accord que dans attachInterrupt(digitalPinToInterrupt(2), powerLoss, FALLING); le 2 c'est bien le pin digital 2 et pas le interrupt 2 ?

Pin 2, donc interrupt 0.

al1fch:
En mettant le code , dans le corps du message, mais entre balises appropriées il sera plus lisible, en particulier sur smartphone et ça augmentera la probalilité de réponse.

Désolé je débute….

al1fch:
la carte Arduino alimente-t-elle des composants extérieurs ?

physiquement oui mais pas encore dans le soft donc pas alimenté depuis une sortie
Ca change quelque chose ?

hbachetti:
Si l'ARDUINO est alimenté uniquement par l'USB la diode ne voit rien sur son anode, et le pont diviseur non plus. A moins que tu aies branché aussi une alimentation 5V en amont de la diode.

Oui il y a une alim 5V ou 12V selon l'essai derrière la diode comme sur le schéma

hbachetti:
J'ai fait mes essais et mesures avec une alimentation 5V et un FTDI sur RX/TX, donc je pouvais voir les messages affichés.

C'est quoi un FTDI ?

Donc reste à savoir pourquoi ça marche chez toi et pas chez moi ?

Un FTDI est un convertisseur USB / Série :

Port USB + broches RX TX GND + VCC

Tu branches :
USB sur le PC
RX FTDI sur TX ARDUINO
TX FTDI sur RX ARDUINO
GND sur GND

Et tu alimentes l'ARDUINO avec une alimentation externe par la broche 5V.

Si tu veux pouvoir charger le sketch par l'IDE avec le FTDI branché, il faut connecter en plus RTS ou DTR du FTDI sur RESET de l'ARDUINO avec un condensateur en série.
Sinon, tu appuies sur le bouton RESET à la fin de la compilation.

Si c'est un ARDUINO MINI ou PRO MINI, brancher RTS ou DTR du FTDI sur GRN ou DTR de l'ARDUINO.

physiquement oui mais pas encore dans le soft donc pas alimenté depuis une sortie

Il se peut que les composants ou modules extérieurs pompent trop de courant, et réduisent le temps de décharge du condensateur.
Il faut essayer avec l'ARDUINO seul.
Rappel (voir article) :

Dans notre cas, il s'agit d'un ARDUINO qui consomme environ 25mA s'il est alimenté par sa broche 5V.

J'ai fait mes essais et mesures avec une alimentation 5V et un FTDI sur RX/TX, donc je pouvais voir les messages affichés.

Je rectifie : j'ai fait mes essais avec USB + alimentation 5V.

La manipulation est la suivante :

brancher l'alimentation
installer un condensateur de 22µF
charger le sketch
débrancher l'USB
couper l'alimentation
rebrancher l'USB
l'ARDUINO affiche le contenu de l'EEPROM
le contenu est correct

La vérification est faite au boot (dans setup() : relecture de l'EEPROM et vérification du nombre MAGIC).

A chaque essai avec des valeurs de condensateur différentes :

modifier les données à sauvegarder (le nombre magic par exemple)
recharger le sketch

Mais on peut aussi faire la même chose avec un FTDI sans débrancher l'USB (c'est plus pratique).

Merci pour toutes ces réponses.
Je vais essayer tout ça la semaine prochaine et je reviens vite…

N'ayant pas de FTDI je vais essayé sans

Me revoilà...
J'ai enlevé les autres composants. Il ne me reste donc que le schéma avec l'alimentation externe 5V, la diode 1N5819, les 2 résistances et un condensateur de 470µF (donc largement suffisant selon les calculs pour sauvegarder un chiffre). J'ai aussi essayé avec 2 condo en parallèle pour le même résultat.

J'ai branché l'alim
Chargé le sketch avec valeur à écrire dans l'EEPROM : 5 (il y a à ce moment "1" dans l'EEPROM)
je débranche l'USB
Je coupe l'alim
Je rebranche l'USB
Selon le moniteur série il y a toujours le 1 en lecture de l'EEPROM

Maintenant si je rebranche l'alim (en laissant l'USB branché)
la nouvelle valeur est dans l'EEPROM

J'ai l'impression que la routine de sauvegarde ne s'exécute que lorsque l'USB est branché lorsque je branche aussi l'alim (ce qui a surement comme effet de couper l'alim par l'USB.)

Revoici le sketch :

#include <EEPROM.h>

int adresse = 100;
unsigned int mess = 5;
unsigned int messlue;

void setup() {
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(2), powerLoss, FALLING);
}

void powerLoss()
{
  EEPROM.put (adresse, mess);
}

void loop() {
  EEPROM.get (adresse, messlue);
  Serial.print("doit être écrit après coupure : ");
  Serial.println(mess);
  Serial.print("lu : ");
  Serial.println(messlue);

  delay(10000);
}

Etrange, non ?

J'ai lu ça ici

During a delay() call, you can’t respond to inputs, you can't process any data and you can’t change any outputs. The delay() ties up 100% of the processor. So, if any part of your code uses a delay(), everything else is dead in the water for the duration.

Ça peut être la cause?

Non, une interruption s'exécute pendant delay().

@hallucine : tu ne veux pas reprendre mon tuto pas à pas, y compris le code ?

Je coupe l'alim

Tu coupe comment l'alim?

savoriano:
Tu coupe comment l'alim?

Bouton ON/OFF. Pourquoi ? Ca change quelque chose la manière de couper l'alim ?

hbachetti:
tu ne veux pas reprendre mon tuto pas à pas, y compris le code ?

C'est par là que j'avais commencé et déjà cela ne marchait pas. C'est pour cela que j'ai simplifié le code au maximum pour voir si le problème était dans le code

Maintenant j'ai remarqué quelque chose d'étrange. A l'entrée D2 de l'Arduino normalement je dois avoir 4.64V lorsque l'alimentation est branchée mais je n'ai que environ 1V. Pourtant j'ai bien en R1 : 100Kohm (marron-noir-noir-orange-marron) et en R2 1Mohm (marron-noir-noir-jaune-marron).
Et pour R2 mon ohmmètre m'indique 20Kohm....
Il me semble que mes résistances made in China (!!!!) ont été mal coloriées et mal étiquetées….

Comme je n'ai pas d'autres paquets de résistances à 1 Mohm. j'ai rapidement testé avec R1 à 100ohm et R2 à 1Kohm (donc le même rapport R1 R2). J'ai pas fait tous les tests mais j'ai déjà pu constater que j'avais 4.5V en D2

Y a-t-il un risque de faire un pont avec des valeurs plus faible ou est-ce que cela ne change rien ?

Bouton ON/OFF. Pourquoi ? Ca change quelque chose la manière de couper l'alim ?

Parce que pour que ça marche il faut un chute brutale de l'alimentation. Si tu débranche l'alimentation avec un interrupteur qui coupe le 230v la chute de tension n'est pas brutale parce que dans l'alimentation il y a aussi des condenseurs. hbachetti est un spécialiste et il te dira si ma théorie est exacte ou pas.

Ta regardé ce topic?

Y a-t-il un risque de faire un pont avec des valeurs plus faible ou est-ce que cela ne change rien ?

Non, 1KΩ consomme 5mA sous 5V. Ce n'est pas bien grave pour une alimentation secteur.

Parce que pour que ça marche il faut un chute brutale de l'alimentation.

Oui, mais l'entrée digitale commute en dessous d'un certain seuil.
A la limite on peut diminuer la tension sur le pont diviseur pour plus de sensibilité (par exemple 3V), ou augmenter la capacité.

D'ailleurs c'est ce qui va se passer avec une alimentation genre chargeur de téléphone après une coupure secteur. La tension ne chute pas de manière brutale, et il faut absolument que cela fonctionne ainsi.

D'après la datasheet (29.1.5 Pin Threshold and Hysteresis), au dessus de 2.6V le niveau est considéré comme UN.
En dessous de 2.2V, le niveau est considéré comme ZERO.

Entre les deux c'est l’hystérésis.

Donc si l'alimentation chute vraiment lentement il suffit de recalculer le pont diviseur pour être à 3V par exemple pour 5V en entrée du pont.
Un rapport de 0.6 serait une bonne valeur (R2 = 1.5 fois R1).

Me revoilà après avoir testé.... et c'est pas mieux.
J'ai bien les 4.5V en D2 qui chutent brutalement lorsque je coupe la tension

J'ai utiliser le sketch complet de hbachetti
Comme je ne peux pas lire dans le moniteur ce qui se passe dans l'EEPROM pendant que j'ai l'USB débranché, j'ai fait une autre sketch basé sur le premier mais qui ne fait que lire l'EEPROM dans le loop (au lieu du setup)

Et là je vois clairement que rien n'a été sauvegardé dans l'EEPROM.
Par contre lorsque le sketch d'écriture est chargé, si je débranche l'alim lorsque l'USB est branché alors cela sauvegarde...

Que puis-je faire pour trouver le problème ?

T'as fait ça?

Donc si l'alimentation chute vraiment lentement il suffit de recalculer le pont diviseur pour être à 3V par exemple pour 5V en entrée du pont.
Un rapport de 0.6 serait une bonne valeur (R2 = 1.5 fois R1).

J'ai bien les 4.5V en D2 qui chutent brutalement lorsque je coupe la tension

Une chute brutale on la voit que avec un oscilloscope.
Je ne sais pas si ça peut marcher:
Fait un sketch qui vérifie l’état de ta D2 dans le loop.

Serial.print(digilalRead(2))

sans aucun delay.
Si dans le monitor tu ne vois pas des 0 à la fin c'est qu'il n'arrive pas à détecter la chute de tension à temps.