Attiny84A switch reed

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?

Bonjour

J'ai une résistance de 4.7kohms relié d'un côté au + et de l'autre à l'entrée Arduino

une entrée Arduino..... laquelle ?
AT Tiny84.png
Ou est le code ?

Aurais-je un problème au niveau de la résistance, valeur trop où pas assez basse?

Très peu probable....

AT Tiny84.png

Bonjour,

L'entrée de l'attiny et la 5 (PB2).

#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 connais pas le ou les modes de sommeil pout l'AT Tiny84A

l'ATMega 328 dispose de plusieurs modes de sommeil qui n'ont pas tous les mêmes source de reveil.

Est-il certain qu'une interruption externe puisse réveiller l'Attiny84 dans le mode de sommeil choisi par :

set_sleep_mode(SLEEP_MODE_PWR_DOWN);

Quels sont les autres modes de sommeil possibles pour l'ATtiny84 ?

Trois sleep mode sont disponibles:
SLEEP_MODE_IDLE
SLEEP_MODE_ADC
SLEEP_MODE_PWR_DOWN

On retrouve en page 12 de la datasheet les differentes possibilités de réveilhttps://www.google.com/url?sa=t&source=web&rct=j&url=http://ww1.microchip.com/downloads/en/devicedoc/Atmel-7701_Automotive-Microcontrollers-ATtiny24-44-84_Datasheet.pdf&ved=2ahUKEwjZwtfBzIrlAhWMHxQKHWa0C70QFjABegQIBxAI&usg=AOvVaw0PwpygKcSZyK6W6jDlLfkn

Il semble qu'il ya ait une restriction pour le reveil par interruption externe en mode POWERDOWN
Essayer le mode IDLE

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.

Bonjour

En attendant de trouver l'explication as-tu testé le comportement en mode IDLE ?

al1fch:
Bonjour

En attendant de trouver l'explication as-tu testé le comportement en mode IDLE ?

Non je n'ai pas encore eu le temps, si je peux je teste dans la soirée

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).

Bonjour,

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.

EnvoieInformation() envoie les données via un nrf24l01

void EnvoieInformation(){
        payload_t payload = { "test" };
	RF24NetworkHeader header(0);
	network.write(header, &payload, sizeof(payload));
}

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.

Je remet le schéma si besoin :

PS: en relisant mon schéma, j'ai l'impression que le condensateur côté ILS n'a rien à faire là

Bonjour

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.

Pour C1 10nF ou 100nF suffisent

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.

Pour C1 10nF ou 100nF suffisent

Ok, a voir si ce condensateur est vraiment utile, je vais tout de même commander celui là : https://psearch.en.murata.com/capacitor/product/GRM3192C2A103JA01%23.html
Celui-ci aurait pu causer le problème du NRF24 ?

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.

Merci d'avance