Ridurre consumi al minimo

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

  1. Che Arduino usi?
  2. 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 :smiley:

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 :slight_smile:
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