Bonjour à tous,
Petite question, j'ai un circuit basé sur un attiny84A, un interrupteur à lame souple et un nrf24.
J'ai une résistance de 4.7kohms relié d'un côté au + et de l'autre à l'entrée Arduino et une broche de l'ILS.
L'autre broche de l'ILS est relié à la masse.
Entre les broches de l'ILS j'ai un condensateur de 4,7uf.
Le tout est en sleep power down le temps qu'il n'y a pas de changement d'état de l'ILS ou si le watchdog ne réveille pas.
Mon soucis est que si l'ILS change d'état le programme ne se réveille pas.
Aurais-je un problème au niveau de la résistance, valeur trop où pas assez basse?
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
#include <PinChangeInterrupt.h>
boolean ILSdetectchange = false;
boolean state = false;
void setup() {
attachPinChangeInterrupt(digitalPinToPCINT(2),InterruptILS,CHANGE ); // attache l'interruption externe n°0 à la fonction check_btn
}
ISR(PCINT0_vect) {
// Don't do anything here but we must include this
// block of code otherwise the interrupt calls an
// uninitialized interrupt handler.
}
void goSleep() {
watchdogSetup();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
sleep_disable();
}
void waitSleep() {
goSleep();
}
void SendILS()
{
if (ILSdetectchange)
{
EnvoieInformation() // fonction permettant d'envoyer le changement d'etat
ILSdetectchange = false;
}
}
void InterruptILS()
{
ILSdetectchange = true;
state = !state;
}
void loop() {
readvcc();
SendILS();
waitSleep();
}
Le watchdog réveille bien l'attiny la valeur de la batterie est bien envoyée en revanche lorsque l'ILS change d’état l'attiny n'envoie pas le changement d'état ( pas de réveil ) par contre une fois que le watchdog se réveille là il envoie le changement d'état de l'ILS
Je ne comprend pas trop cette note.
Ce que je ne comprend pas non plus c'est que si l'état change l'information n'est pas envoyée aussitôt par contre des que l'attiny sort de veille il envoye bien l'information de changement d'etat, ce qui veut dire que la fonction InterruptILS est bien appelée par l'interruption.
Apres être passé en mode SLEEP_MODE_IDLE, le problème est toujours le même.
Le changement d'état est bien détecté mais l'envoie s'effectue uniquement lorsque l'attiny sort de veille ( aprés le waitSleep).
On n'a pas le code en entier!
En particulier que fait EnvoieInformation()? Transmission série? Si c'est le cas il faut attendre que la transmission soit terminée avant de se mettre en sleep.
Un autre point ( s'il faut j'ouvre un autre topic), lorsque l'ILS se ferme des étincelles se forment au niveau du contact (j'ai remarqué cela en faisant contact avec un cable dupont).
Cela vous parait-il normal ?
L'arrivé n'est pas du 5V mais du 3.3V, je suppose que cela est dû au condensateur mais je ne sais pas si cela peut engendrer des dégâts au niveau des autres composants ?
J'ai aussi remarqué que maintenant afin que le nrf24L01 fonctionne normalement, je dois mettre un doigt sur l'antenne.
Un autre point ( s'il faut j'ouvre un autre topic), lorsque l'ILS se ferme des étincelles se forment au niveau du contact (j'ai remarqué cela en faisant contact avec un cable dupont).
C1 (4,7 µF) a une valeur anormalement élevée pour la fonction qu'il remplit.
Trop d'énergie emmagasinée, étincelle à la décharge, risque d'usure prématurée du contact ILS l'arc électrique détériorant le revêtement du contact.
al1fch:
BonjourC1 (4,7 µF) a une valeur anormalement élevée pour la fonction qu'il remplit.
Trop d'énergie emmagasinée, étincelle à la décharge, risque d'usure prématurée du contact ILS l'arc électrique détériorant le revêtement du contact.
En attendant d'avoir un nouveau condensateur, j'ai continué à chercher côté des interruptions et du mode sleep.
Il est bien possible de réveiller l'attiny avec la broche INT0.
L'ISR etait mal configuré, il était en PCINT0_vect au lieux de INT0_vect.
Maintenant il faut que j'essaye d'y ajouter un réveille basé sur un timer de quelques heures.
Si quelqu'un a déjà fait je suis preneur d'idée.