Go Down

Topic: Consigllio su alimentazione Nano (Read 444 times) previous topic - next topic

ilarioQ

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

Patrick_M

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
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

ilarioQ

Patrick_M grazie per la risposta.

Quali controlli mi consigli di fare?


Grazie

Patrick_M

#3
Sep 18, 2018, 10:45 am Last Edit: Sep 18, 2018, 10:45 am by Patrick_M
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ù :)
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

steve-cr

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


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

Standardoil

Magari, se metti uno schema, e il programma e ci spieghi cosa vuoi fare, possiamo aiutarti un po' di più
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

Patrick_M

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

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
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

ilarioQ

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

Code: [Select]

/* 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

ilarioQ

gia, non ci avevo fatto caso :)

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

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
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

ilarioQ

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

Patrick_M

#12
Sep 18, 2018, 05:52 pm Last Edit: Sep 18, 2018, 05:53 pm by 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è
Code: [Select]

#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.... :)
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

ilarioQ

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è
Code: [Select]

#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

brunello22

#14
Sep 18, 2018, 06:57 pm Last Edit: Sep 18, 2018, 06:57 pm by brunello22
Oppure, ancora meglio, mettere la Nano in modalita' Sleep e ridurre quindi ancora i consumi



Code: [Select]


#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

Go Up