Consigllio su alimentazione Nano

Ciao a tutti,

avrei bisogno di qualche indicazione di massima su come migliorare l'alimentazione di un Arduino Nano.
Al Nano sono collegati un dht22 e un lcd 16X2 con retroilluminazione normalmente spenta e che viene attivata una decina di volte al giorno per circa due secondi ogni volta, il nano viene alimentato tramite il pin VIN con quattro batterie ricaricabili da 2450 maH che riescono ad alimentarlo per circa 120 ore, passate le quali la leggibilità del display arriva a livelli inutilizzabili.
Vi sembra consono il consumo del Nano?
Come posso prolungare la durata delle batterie?

Grazie mille

Ilario

quindi in 120 ore viene acceso il display per circa 100 secondi e nelle 120 ore l'ambaradan ti consuma 10A mi pare tanto anche se poi sono 81 mAh

Patrick_M grazie per la risposta.

Quali controlli mi consigli di fare?

Grazie

be se ci sono solo il dht22 e l'lcd.... ci sono pochi controlli da fare, potresti googlare un po e cercare come mettere in sleep il tuo nano per risparmiare un po anche se credo che tra dissipazione del riduttore di tensione e ammenicoli vari non salvi molto...
aspetta che passi qualcun altro, magari ti da qualche idea in più :slight_smile:

Vorrei sapere "cosa c'è in mezzo" tra le batterie e tutto il resto.
C'è un riduttore di tensione?
Oppure sono 4 batterie in parallelo da 4,8 Volt ? (?)
Perché se utilizzi un riduttore di tensione allora sviluppi calore che è poi uno spreco e ti conviene usare uno step-down, mentre se vai diretto allora non vedo dove risparmiare...

Steve-cr,
in mezzo non c'è nulla, sono quattro batterie ricaricabili in serie, in un astuccio di plastica. La tensione erogata è di 5,05 volt.
Se cambio il display e ne uso uno oled o e-ink risparmio qualcosa?
Esiste qualche Arduino che faccia al mio scopo ma consumi meno?

Grazie

Magari, se metti uno schema, e il programma e ci spieghi cosa vuoi fare, possiamo aiutarti un po' di più

ilarioQ:
Steve-cr,
in mezzo non c'è nulla, sono quattro batterie ricaricabili in serie, in un astuccio di plastica. La tensione erogata è di 5,05 volt.
Se cambio il display e ne uso uno oled o e-ink risparmio qualcosa?
Esiste qualche Arduino che faccia al mio scopo ma consumi meno?

Grazie

gia, non ci avevo fatto caso :slight_smile:

se sono 4 batterie ricaricabili dovrebbero avere una tensione di 1,2V l'una e appunto 4,8V totali
per cui se alimenti da Vin stai dando una tensione insufficiente perchè 5V più la perdita del regolatore dovrebbero essere almeno 6,5V
Con quella tensione vai direttamente al pin +5V

Standardoil:
Magari, se metti uno schema, e il programma e ci spieghi cosa vuoi fare, possiamo aiutarti un po' di più

Ciao, uno schema non saprei come farlo, il nano è inserito qui sopra https://www.amazon.it/gp/product/B01C2QKJ4G/ref=crt_ewc_img_huc_5?ie=UTF8&psc=1&smid=AL6TLLXOOXV2J
i collegamenti sono quelli classici per il dht e lo schermo lcd, il ponticello della retroilluminazione del lcd è chiuso al bisogno da un pulsante sulla breadboard.
il codice in esecuzione è:

/* How to use the DHT-22 sensor with Arduino uno
   Temperature and humidity sensor
   More info: http://www.ardumotive.com/how-to-use-dht-22-sensor-en.html
   Dev: Michalis Vasilakis // Date: 1/7/2015 // www.ardumotive.com 
*/

//Libraries
#include <DHT.h>
#include <Wire.h> 
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

//Constants
#define DHTPIN 4     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino

//ALWAYS USE THIS WITH LCD I2C and Addres 0x3F
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

//Variables
int chk;
float hum;  //Stores humidity value
float temp; //Stores temperature value

void setup()
{
  Serial.begin(9600);
  dht.begin();
  lcd.begin(16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
}

void loop()
{
  
  delay(2000);
  //Read data and store it to variables hum and temp
  hum = dht.readHumidity();
  temp = dht.readTemperature();
  //Print temp and humidity values to serial monitor
  Serial.print("Humidity: ");
  Serial.print(hum);
  Serial.print(" %, Temp: ");
  Serial.print(temp);
  Serial.println(" Celsius");

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.print(" ");
  lcd.print((char)223);
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("Hum:  ");
  lcd.print(hum);
  lcd.print(" %");

  delay(2000); //Delay 2 sec.

}

il cavo del positivo del pacco batterie è sul pin VIN il negativo su uno dei due ground.

Grazie

Patrick_M:
gia, non ci avevo fatto caso :slight_smile:

se sono 4 batterie ricaricabili dovrebbero avere una tensione di 1,2V l'una e appunto 4,8V totali
per cui se alimenti da Vin stai dando una tensione insufficiente perchè 5V più la perdita del regolatore dovrebbero essere almeno 6,5V
Con quella tensione vai direttamente al pin +5V

Grazie per le info.

Per cortesia, quale voltaggio accetta il pin VIN?
Non è troppo pericoloso alimentare con una fonte instabile come un pacco batterie direttamente il pin 5Volt?
Cosa ne pensi di sostituire lcd e Nano con qualcosa di meno esoso?

Grazie

instabile un pacco batterie ?

ti da 4,8V da carico e poi scende lentamente man mano che si scarica

su VIn come dal jack dovresti alimentare tra i 7V e 12V, ma la tensione migliore è tra i 7V e 9V

Patrick_M:
instabile un pacco batterie ?

ti da 4,8V da carico e poi scende lentamente man mano che si scarica

su VIn come dal jack dovresti alimentare tra i 7V e 12V, ma la tensione migliore è tra i 7V e 9V

Lo consideravo instabile in virtù del fatto che scaricandosi potessero non fornire la tensione corretta, ma io di elettricità ne capisco poco.
Quindi sul vin potrei collegarci due batterie da 3.7Volt in serie?
Scusa se insisto secondo te qualche alternativa meno esosa?

Grazie

allora per limitare i consumi:
prima di tutto elimina tutte le stampe su serial, una volta sicuro che funziona non ti servono più

poi potresti anzichè continuare ogni 2 secondi a stampare dull'lcd, usare l'istruzione setbacklight per spegnere l'lcd (al posto del pulsante sulla breadboard) e usare il pulsante come condizione per eseguire sia la lettura del dht che la visualizzazione sull'lcd cioè

#define pulsante 12
//nel setup aggiungi
void setup() {
...
pinMode(pulsante, INPUT) ; // o INPUT_PULLUP a seconda di come è collegato

}
//e nel loop
void loop() {
  // quando premo il pulsante eseguo le letture e vedo i risultati sull'lcd
  if (digitalRead(pulsante==HIGH) {  //o LOW a seconda del collegamento
    // ci vorrebbe anche il debounce del pulsante ma quello te lo lascio 
    // questo è il tuo codice
    // Read data and store it to variables hum and temp
    hum = dht.readHumidity();
    temp = dht.readTemperature();
    // aggiungo il'accensione dell'lcd
    lcd.setBacklight(HIGH);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(temp);
    lcd.print(" ");
    lcd.print((char)223);
    lcd.print("C");
    lcd.setCursor(0, 1);
    lcd.print("Hum:  ");
    lcd.print(hum);
    lcd.print(" %");

    // ora decidi per quanti secondi restare acceso
    delay(2000) // 2 secondi
    lcd.setBacklight(LOW)
  }
}

così dovrebbe andare.... :slight_smile:

Patrick_M:
allora per limitare i consumi:
prima di tutto elimina tutte le stampe su serial, una volta sicuro che funziona non ti servono più

poi potresti anzichè continuare ogni 2 secondi a stampare dull'lcd, usare l'istruzione setbacklight per spegnere l'lcd (al posto del pulsante sulla breadboard) e usare il pulsante come condizione per eseguire sia la lettura del dht che la visualizzazione sull'lcd cioè

#define pulsante 12

//nel setup aggiungi
void setup() {
...
pinMode(pulsante, INPUT) ; // o INPUT_PULLUP a seconda di come è collegato

}
//e nel loop
void loop() {
  // quando premo il pulsante eseguo le letture e vedo i risultati sull'lcd
  if (digitalRead(pulsante==HIGH) {  //o LOW a seconda del collegamento
    // ci vorrebbe anche il debounce del pulsante ma quello te lo lascio
    // questo è il tuo codice
    // Read data and store it to variables hum and temp
    hum = dht.readHumidity();
    temp = dht.readTemperature();
    // aggiungo il'accensione dell'lcd
    lcd.setBacklight(HIGH);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(temp);
    lcd.print(" ");
    lcd.print((char)223);
    lcd.print("C");
    lcd.setCursor(0, 1);
    lcd.print("Hum:  ");
    lcd.print(hum);
    lcd.print(" %");

// ora decidi per quanti secondi restare acceso
    delay(2000) // 2 secondi
    lcd.setBacklight(LOW)
  }
}



così dovrebbe andare.... :)

Grazie mille!
ero troppo concentrato sulla parte hardware e non avevo capito che dovevo migliorare la parte software.
Parte che non sarei comunque stato in grado di migliorare. Adesso vado a vedere cosa sia il debounce e poi provo, sicuramente ci sentiremo ancora per la correzione del codice.

Grazie a tutti quelli che mi hanno risposto.

Ilario

Oppure, ancora meglio, mettere la Nano in modalita' Sleep e ridurre quindi ancora i consumi

#include <DHT.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include "LowPower.h" // https://github.com/rocketscream/Low-Power

#define DHTPIN 4     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino

//ALWAYS USE THIS WITH LCD I2C and Addres 0x3F
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);

//Variables
int chk;
float hum;  //Stores humidity value
float temp; //Stores temperature value
const int wakeUpPin = 2;  // pin a cui e' collegato il pulsante

void setup() {
  // Serial.begin(9600);
  dht.begin();
  lcd.begin(16, 2);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 // lcd.setBacklight(HIGH);
  pinMode(wakeUpPin, INPUT_PULLUP);
}

void loop() {
  lcd.setBacklight(LOW);
  
  attachInterrupt(0, wakeUp, LOW);
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
  detachInterrupt(0);

  delay(500);

  //Read data and store it to variables hum and temp
  hum = dht.readHumidity();
  temp = dht.readTemperature();
//  //Print temp and humidity values to serial monitor
//  Serial.print("Humidity: ");
//  Serial.print(hum);
//  Serial.print(" %, Temp: ");
//  Serial.print(temp);
//  Serial.println(" Celsius");
  lcd.setBacklight(HIGH);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.print(" ");
  lcd.print((char)223);
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("Hum:  ");
  lcd.print(hum);
  lcd.print(" %");
  delay(8000); // quanto tempo deve restare acceso il display
  }

void wakeUp()
{
  // Just a handler for the pin interrupt.
}

PS. Devi eliminare i led presenti, per ridyùurre il consumo

brunello22:
Oppure, ancora meglio, mettere la Nano in modalita' Sleep e ridurre quindi ancora i consumi

...omissis

si come avevo suggerito nel post #3 :smiley:

->brunello22 sai darmi una stima del risparmio con lo sleep su una scheda nano standard, cioè secondo tutto quello che ho letto su uno stand alone ha senso ma qui tra regolatore di tensione led e ammenicoli, ne vale la pena?

Una Nano ( così com'è ) passa da circa 13mA a circa 5mA in sleep
Una Nano con LCD I2C ( e dipende anche dal LCD ) si passa da 29mA a circa 9mA.
Altri 4/5 mA si risparmiano togliendo i Led ( sulla Nano e sul modulo I2C )

mmmm pensavo si risparmiasse di meno

thank's

però se non ho sbagliato i calcoli qui eravamo a 81 mA (con i comandi a seriale e a lcd in continuo anche se senza backlight)

81 mA ??
guarda che le batterie sono in serie, mica in parallelo
2450/120= circa 20mA ( quasi sempre senza Backlight, ci sta' )

Grazie brunello22 mi ero perso il tuo primo post.