Ciao a tutti e buon anno!
Qui avevo letto tempo fa che c'è un modo per mettere tipo in sleep Arduino in modo da ridurre i consumi.
Io vorrei applicarlo al mio progetto il quale è composto da 1 relè e 2 semplici contatti (uno per attivare e uno per disattivare il relè).
Il relè è alimentato dal pin +5v di Arduino, io vorrei riuscire anche a spegnere proprio la sua scheda di gestione quando il sistema è a riposo.
È possibile?
Fattibile è fattibile, solo che sei stato scarno di dettagli...
- Che Arduino usi?
- I due contatti sono agganciati a due interrupt?
Per disattivare anche la scheda del relé dovrai per forza di cose usare un transistor e pilotarlo con un pin di Arduino, in modo che (ad esempio) mettendo a LOW il pin il transistor non condurrà e quindi verrà eliminata l'alimentazione alla scheda relé.
Considera che se stai usando Arduino uno così com'è tutta l'elettronica a contorno della MCU consuma più della MCU stessa, quindi metterla in sleep serve a poco o nulla
Se la scheda a relè non comunica tramite I2C, non è necessario mettere un transistor: quando i relè non sono pilotati non consuma corrente.
si scusate, ho dimenticato qualche dettaglio:
la scheda è una nano, il relè è di quelli con già la sua schedina tipo questo: 5v 12v relè di potenza del modulo 10a 220v 1 canale di automazione arduino braccio dsp aprile picco
dite che a riposo non consuma? il mio dubbio è anche se posso o no togliere quei due led (non so se sono indispensabili per il circuito) perchè mi dà fastidio la luce, ora li ho coperti con del nastro isolante
interrupt non ne uso, questo il codice:
#include <EEPROM.h> //libreria scrittura su memoria assenza rete
//#define DEBUG //decommentare per attivare la scrittura su seriale per PC
#define carico 2
#define scarico 3
#define segnale 4
byte stato;
byte flag = 0;
unsigned long iniziocarico; //variabile per ritardo portello carico
unsigned long tempocarico; //variabile per ritardo portello carico
void setup()
{
pinMode(carico, INPUT_PULLUP);
pinMode (scarico, INPUT_PULLUP);
pinMode (segnale, OUTPUT);
digitalWrite (segnale, HIGH);
tempocarico = 150; //millisecondi ritardo portello carico
#ifdef DEBUG
Serial.begin(9600); // inizializzo la comunicazione seriale
#endif
stato = EEPROM.read(0); //lettura memoria eeprom per stato precedente alla mancanza rete elettrica
}
void loop()
{
if ((digitalRead(carico) == LOW) and (stato == 0) and (flag == 0) ) //apertura portello
{
iniziocarico = millis();
flag = 1;
#ifdef DEBUG
Serial.println ("inizio carico");
#endif
}
if ((digitalRead (carico) == HIGH) and (flag == 1 ) ) //reset variabile apertura portello
{
flag = 0;
#ifdef DEBUG
Serial.println("reset timer");
#endif
}
if ((digitalRead(carico) == LOW) and (stato == 0) and (flag == 1) and ((millis() - iniziocarico) >= (tempocarico)))
{
stato = 1;
delay (100);
EEPROM.write(0, stato);
flag = 0;
#ifdef DEBUG
Serial.println ("carico");
#endif
}
else if ((digitalRead(scarico) == LOW) and (stato == 1))
{
stato = 0;
delay (100);
EEPROM.write(0, stato);
#ifdef DEBUG
Serial.println ("scarico");
#endif
}
if (stato == 1)
{
digitalWrite (segnale, LOW);
}
if (stato == 0)
{
digitalWrite (segnale, HIGH);
}
delay (100);
}
Alora i due led li puoi dissaldare senza problemi, a livello di funzionamento del relé non impattano in nessun modo. Si il relé a riposo non consuma quindi se la necessità di eliminargli l'alimentazione è quella esposta togli i led e non ti serve il transistor ne eliminarli l'alimentazione.
I due segnali che comandano il tutto (carico e scarico) devi collegarli a due pin gestibili con interrupt (pin 2 e 3 per la nano) perché è l'unico sistema di intercettare ciò che ti arriva dall'esterno con la MCU in sleep mode e per tua fortuna già li hai collegati a quei pin
In realtà se l'impulso che arriva dall'esterno è sufficientemente lungo puoi pensare anche di risvegliare perioicamente la MCU e controllare lo stato del pin e agire di conseguenza ma questo ha due problemi, il primo è che potresti perderti degli impulsi se la MCU non si sveglia in tempo per intercettarlo e il secondo è che i consumi aumentano.
Studiati il link dell'interrupt e anche questo link sullo sleep mode, ti consiglio di iniziare cambiando il tuo codice per gestire il tutto tramite interrupt e solo dopo che funziona aggiungere lo sleep