[Résolu] Projet Timer pour enfants (détection de "power down")

Dans un petit projet où j'essaie de faire tourner un arduino avec des batteries, j'aimerais pouvoir détecter le moment de la coupure (interrupteur ON/OFF) de l'arrivée de courant dans mon montage. A cette fin, j'ai imaginé ce montage :

Je comptais mettre la PIN OUT dès le départ en HIGH pour que le transistor continue à alimenter l'Arduino. Puis une fois l'interrupteur coupé, détecter cette "coupure" via la PIN IN de l'arduino (en PullDown) et prendre le temps d'écrire en EEPROM ce que j'aurais besoin de sauvegarder. Enfin, une fois que tout est proprement enregistré, j'aurais mis en "LOW" la PIN OUT de l'Arduino pour que l'alimentation soit effectivement coupée...

C'était bien joli en théorie, sauf qu'en pratique ca ne marche pas... C'est peut-être trop simple (?)

Edit de résolution : Pour ceux qui tomberaient sur ce post, voici la solution que j'ai trouvé : J'ai fini par trouver une solution qui serait "peu élégante", mais qui a l'avantage de fonctionner correctement dans mon cas tout du moins :

Les autres solutions proposées (y compris par moi même) ne fonctionnent pas ou fonctionnent partiellement... on continue à chercher une solution "simple" et adaptée, mais on n'a pas encore trouvé mieux...

Ceux qui souhaitent consulter le projet concerné par ce problème, c'est par ici

Intéressant comme idée

C’est pas un peu louche, de mettre la sortie de la diode en commun avec la PIN OUT, pour piloter le transistor?
J’aurais plutôt mis deux transistors en parallèle, mais comme toi je ne suis pas électronicien, donc c’est peut-être une grosse c…rie

Quoi qu’il en soit, “ça ne marche pas” n’a jamais été une manière claire de décrire un problème…
Quelles sont tes observations expérimentales ?

pourquoi ne pas utiliser un NE555, avec une tempo, d'une durée X, le temps d'écrire en EEPROM ce que tu auras besoin de sauvegarder.

|500x320

la sortie 3 est relié a l'arduino ( IN) La pin TRIG( 2) relié a l'arduino en ( OUT)

hello, pour info:

j’ai fais ça, mais en assembleur

alim batterie sur VIN + un gros condo
la meme alim batterie sur A0

le prg surveille l’entrée A0 dans sa boucle ( donc une coupure alim)
si A0 passe < seuil fixé alors sauvegarde en eeprom (le condo assure le maintien de la tension)
et flag pour ne faire qu’une seule sauvegarde. pour ne pas tomber en fin de condo au milieu d’une sauvegarde.
nota: je ne sauve qu’une valeur.

Oui mais ce n'est pas tout à fait la même solution

Avec un condo (qu'il faut gros) tu as un temps limité pour faire vite tout ce qu'il y a à faire pour s'arrêter proprement.

Alors que là, l'arduino est libre de prendre tout son temps avant de décider de s'arrêter.

Je fais une gestion "circulaire" de l'EEPROM, c'est à dire que pour éviter d'écrire tout le temps au même endroit, je dois écrire 3 fois à chaque "sauvegarde" : 2 x 1 octet + les données utiles (16 octets dans ce cas précis)... Ca permet de "l'user" de façon assez homogène quelque soit la taille des données à sauvegarder...

Concernant mon montage, j'ai aussi essayé d'inverser les choses : mettre directement la masse en Emetteur du NPN et les sorties GND de l'arduino sur le collecteur... Mais ca ne fonctionne pas non plus...

Pour répondre à la question à propos de ce que veut dire "ca ne fonctionne pas". Ca veut dire que lorsque je coupe le switch, dans le meilleur des cas j'arrive à détecter la coupure, mais lorsque je mets à LOW la PIN-OUT qui est sensée piloter le transistor, la tension (ou le courant) a l'air de "baisser" dans mon montage (les LEDS sont plus faibles) mais ca ne se coupe pas... En fait, j'ai comme l'impression que l'arduino arrive à "atteindre la masse" via ses PIN de gestion du transistor et du coup être alimenté quand même par là... j'ai essayé de mettre des diodes partout mais ca ne change rien non plus...

J'ai encore une fois l'impression d'être pas loin d'y arriver mais que la solution va être toute autre chose... :/ Concernant les deux transistors en parallèle : un pour le +5V et un pour le GND ? La solution du NE555 + condensateur : merci hazerty565 pour le schéma, ca me semble "compliqué", mais je me la garde sous le coude sachant que cela fonctionne... Ce qui me dérange c'est bel et bien comme dit bricoleau, que je ne disposerai que du temps du condensateur pour faire ma sauvegarde... dans ce cas ca va aller relativement vite vu que je n'ai "que" 18 octets à écrire, mais dans d'autres cas je me retrouverai de nouveau coincé... :(

Par deux transistors en parallèle, je voulais dire : Je garde ton schéma initial, mais je change le cablage de PIN OUT, que je relie à l'entrée de commande d'un second transistor parallèle au premier (c'est-à-dire branché entre la +batterie et VIN). Mais encore une fois, pas sûr que ce soit l'idée du siècle...

Au chapitre autres solutions possibles : pour ma part, je tire profit de la présence d'un DS1307 dans mon montage. Outre sa fonction d'horloge temps réel, celui-ci dispose de 56 octets de ram non volatile sauvegardés grâce à sa pile. Cette ram est sans limite de réécriture. Il suffit d'y écrire souvent sa configuration stable, pour la retrouver au démarrage suivant.

Zorro_X: En fait, j'ai comme l'impression que l'arduino arrive à "atteindre la masse" via ses PIN de gestion du transistor et du coup être alimenté quand même par là... j'ai essayé de mettre des diodes partout mais ca ne change rien non plus... J'ai encore une fois l'impression d'être pas loin d'y arriver mais que la solution va être toute autre chose... :/

as tu essayé d'utiliser ta PIN OUT en inverse (il faut revoir ton montage) cad low = marche et HIGH = arrêt ? il me semble (je suis pas certain) qu'au démarrage et a l'arrêt les ports passe a 1 ce qui expliquerait que ça ne s'arrête pas comme tu veux perso je fais comme Bricoleau j'utilise la ram de la RTC

Le problème si j'inverse la logique LOW/HIGH, c'est que si la sortie doit être HIGH lorsque l'arduino n'est plus alimenté ca repasse à LOW forcément dès que le jus est coupé, du coup il va se ré-alimenter (!) Edit : je viens d'essayer, ca ne fonctionne pas mieux, voici le schéma que j'ai appliqué

Ou alors je n'ai pas bien compris (un schéma ?)

Edit 2 : j'ai aussi essayé les "2 transistors en parallèle", ca ne change rien non plus...

Zorro_X: Ou alors je n'ai pas bien compris (un schéma ?)

c'est bien a cela que je pensais peut être qu'il vaut mieux travailler sur le + que sur le GND

Bon, je viens de faire un tout dernier essai, avec un optocoupleur :

Sauf que là, je ne vois vraiment pas où je peux avoir un courrant de fuite vers la masse qui continuerait à alimenter l'arduino (certes, faiblement, mais quand même...)

C'est un peu l'impasse...

Après investigation (dernier montage avec optocoupleur) il semblerait que ce soit la PIN-OUT la fautive : en effet elle est toujours reliée à une masse ce qui fait que l'Arduino semble l'utiliser comme GND faute de mieux... :confused: Le courant qui passe est cependant suffisamment faible pour que, si je débranche la PIN-OUT en mode "éteint" (interrupteur SW1 ouvert), tout s'éteigne bel et bien et ca reste éteint même si je la rebranche par la suite...

Je ne sais pas si un condensateur "quelque part" pourrait l'aider à "bien se vider" lorsque je mets l'interrupteur sur OFF, pour éviter cette espèce de "boucle résiduelle" qui ne me semble pas très "saine"...

Bonjour,

Pour les protéger contre les surtensions, les pins sont reliées à la masse et à Vcc via des diodes shotky. Pour que cela explique le dysfonctionnement de ton montage, il devait cependant avoir un autre problème (interconnexion des masses) qui n’apparait pas sur ton schéma …

par ailleurs je ne suis pas pour l’optocoupleur, du fait de la consommation de sa DEL

je te proposes ce schéma : tu peux remplacer le mosfet par ton PNP et sa résistance de base :

inter ardu.jpg

On nage un peu en plein délire Ce n'est pas en ajoutant un transistor par ci ou une résistance par là que le montage va être fiabilisé

Il faut regarder en face les objectifs à atteindre

Mais tout d'abord

Je fais une gestion "circulaire" de l'EEPROM, c'est à dire que pour éviter d'écrire tout le temps au même endroit, je dois écrire 3 fois à chaque "sauvegarde" : 2 x 1 octet + les données utiles (16 octets dans ce cas précis)... Ca permet de "l'user" de façon assez homogène quelque soit la taille des données à sauvegarder...

Sauvegarder 16 octets. Ok, mais tu sauvegardes quoi ? Apparement avec 16 octets, tu ne sauvegardes pas des données acquises, mais plutôt des paramètres de fonctionnement. Si c'est le cas, tu sauvegardes tes paramètres et t'as plus besoin d'y retoucher Et je me pose la question de comment tu fais pour retrouver tes données si tu les enregistre un peu n'importe où dans l'EEPROM. Ne me dis pas que tu sauvegarde l'adresse de sauvegarde, cette adresse devant forcement être sauvegardée à un emplacement connu, et la théorie de "l'usure" ne tient plus la route D'autre part l'EEPROM est validée pour 100 000 cycles. Autrement dit, avec une sauvegarde quotidienne, ton µcontrolleur devrait tenir un peu plus de 273 ans (si je me trompe, renvoies moi un post sur ce forum, mais je suis pas sur de pouvoir y répondre)

Mais revenons au projet Il me semble que l'objectif principal n'est pas de couper l'alimentation, mais plutôt de savoir si l'alimentation est toujours présente

Il faut dédier une entrée digitale à la scrutation de la validité de la tension d'alimentation. Dès que la tension n'est plus valide, le programme met à l'état LOW toutes les sorties qui controllent des organes qui ne doivent plus être alimentés et ensuite ne fait plus rien (la boucle loop() ) tourne à vide.

Pour controller la validité de la tension d'alimentation un simple AmpliOP monté en comparateur suffit Wiki AmpliOp Comparateur

trimarco232 : je vais tester ta solution, merci, je te dirais dès que j'aurais essayé.

Bonjour Alain46, je ne vois pas vraiment en quoi ma gestion de l'EEPROM change ma gestion de l'alimentation... Si dans mon application j'avais 150 octets à sauvegarder, le problème resterait le même. Ceci étant, pour répondre à ta question basée sur une supposition fausse : je n'écris pas l'adresse toujours au même endroit, la logique "circulaire pour user uniformément l'EEPROM" ne tiendrait pas. Je réserve une 100e d'octets au début pour cela, endroit où je mets à 1 le bit correspondant à l'adresse dans l'espace utile/utilisateur où j'ai stocké mes données. C'est donc sur cet espace d'une 100e d'octets qu'un "goulot" d'étranglement se fait quant au nombre de cycles d'usure en effet, mais cela permet quand même de rallonger considérablement la durée de vie (qui se trouve environ multipliée par 50, vu qu'il y a 2 écritures à chaque changement d'adresse) et uniformément l'usure de l'EEPROM. Pour info, c'est une sorte de "version très simplifiée" d'un système de fichiers (FS). Enfin, je pourrais pousser encore plus loin ce mécanisme en faisant de sorte que l'espace d'une 100e d'octets indiquant l'adresse utile soit "dynamique" et se déplace lui aussi dans l'EEPROM : je finirais certainement par le coder ainsi dans un futur proche...

Concernant le fait de mettre toutes les entrées à "LOW", c'est un peu trop simple, ca n'empêche pas l'Arduino de tourner à 16MHz et de consommer dans les 20-30mA tout le temps. Je rappelle que dans mon cas, il tourne sur batteries uniquement, ce pourquoi j'ai un bouton ON/OFF de coupure de l'alimentation. Donc si, l'objectif principal c'est bel et bien de couper l'alimentation, pas de détecter si elle est toujours là (ce qui peut être utile dans d'autres applications, je te l'accorde).

trimarco232: Bonjour,

Pour les protéger contre les surtensions, les pins sont reliées à la masse et à Vcc via des diodes shotky. Pour que cela explique le dysfonctionnement de ton montage, il devait cependant avoir un autre problème (interconnexion des masses) qui n'apparait pas sur ton schéma ...

par ailleurs je ne suis pas pour l'optocoupleur, du fait de la consommation de sa DEL

je te proposes ce schéma : tu peux remplacer le mosfet par ton PNP et sa résistance de base :

Lorsque je fais mon montage avec le transistor sur la masse de l'arduino, il n'y a rien d'autre sur la masse : le fil de masse de l'alim va sur l'émetteur du transistor (Q1) et la R2 de pulldown du capteur. Rien d'autre...

Par ailleurs, concernant ton schéma, j'ai comme un petit souci : comment je détecte que le courant a été coupé (switch ouvert) pour pouvoir désactiver la sortie digitale afin de couper le circuit définitivement ?

À la sortie de S1 comme sur tes autres schemas

Bon, j'ai enfin trouvé quelque chose qui fonctionne :

Ca me semble un peu tiré par les cheveux et "usine à gaz", mais au moins, en pratique, ca marche !

Maintenant je vais quand même essayer la solution de trimarco232 avec le transistor en parallèle, ce serait dommage de passer à côté d'une solution plus simple !

pour ton dernier schéma ta R2 est une pull-UP (pas DOWN) est provoque un courant permanent lorsque l'arduino fonctionne

Zorro_X: Maintenant je vais quand même essayer la solution de trimarco232 avec le transistor en parallèle, ce serait dommage de passer à côté d'une solution plus simple !

oui elle semble beaucoup plus "saine", sa résistance R1 n'est pas nécessaire si tu met le pull-up de ta PIN OUT en service

Je viens d'essayer le montage suivant, inspiré donc du montage proposé par trimarco232 :

Ca ne fonctionne pas chez moi non plus. Comme mon tout premier montage, cela se comporte comme si le transistor ne fonctionnait pas : pour faire mes tests je laisse la sortie PIN-OUT à HIGH pendant un moment "visible à l'œil humain" histoire de vérifier que tout reste bien allumé (le temps d'enregistrer dans l'EEPROM au moins). Malheureusement la sortie est bien a high (led allumée) mais le transistor ne semble pas faire son boulot (?). Du coup dès que j'ouvre le switch, ca coupe tout et ca n'enregistre rien... :(