Voltmetro abbassa tensione del ds1307

Buonasera a tutti.
Ho un piccolo problema, o meglio un capriccio che vorrei togliermi e volevo il vostro parere per sapere se fosse possibile o meno risolvere il problema.

Ho un modulo rtc il ds1307 collegato al micro controllore azdelivery (riproduzione di arduino uno).
Il modulo ds1307 ha un pin (bat) con cui invia ad un pin analogico del micro controllore lo stato di carica della batteria da 3v (cr2032). Tramite un voltmetro digitale, vorrei leggere lo stato della batteria.

Il codice utilizzato è il seguente. Collegato alla porta seriale c'è anche un display 20x4, collegati con resistenza da 5kohm.

#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>

RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);

int batteria = A0;
int voltmetro = 9;

void setup () {
  lcd.init();
  lcd.backlight();
  pinMode(voltmetro, OUTPUT);
}

void loop () {
  int stato = analogRead(batteria);
  int volt = map(stato, 0, 1023, 0, 255);
  analogWrite(voltmetro, volt);
  delay(10);

  DateTime now = rtc.now();
    
  lcd.setCursor(0, 0);
  lcd.print(now.day(), DEC);
  lcd.print('/');
  lcd.print(pad(now.month()));
  lcd.print('/');
  lcd.print(pad(now.year()));
  lcd.print("  ");
  lcd.print(pad(now.hour()));
  lcd.print(':');
  lcd.print(pad(now.minute()));
  lcd.print(':');
  lcd.print(pad(now.second()));
}

char *res = malloc(5);

String pad(int n) {
  sprintf(res, "%02d", n);
  return String(res);
}

Caricando lo sketch sul micro controllore dal pc, tutto funziona correttamente dandomi data e ora aggiornati, una volta staccata l'alimentazione, passato qualche minuto, se ridò alimentazione, la data e l'ora sono da reimpostare come se la batteria non ci fosse. Togliendo il collegamento analogico tra il pin A0 e bat. Il problema non c'è e data e ora restano aggiornati.

Lo stato della batteria (nuova) verificata con il multimetro è di 3v, ma quando in funzione, il voltmetro digitale mi da una tensione che varia tra 1.9 e 2.5v.

Ora vorrei gentilmente chiedere a voi esperti, se ci fosse un modo per non avere questo problema oppure se non si può fare nulla. Vi allego le foto del voltmetro, del modulo rtc ds1307 e il circuito di collegamento (il voltmetro è figurativo, ha due pin di alimentazione e uno di lettura).

Vi ringrazio per l'attenzione.
Ciao a tutti.
Simone

modulo RTC DS1307.jpg

Non collegare direttamente l'A0 alla batteria, ma interponi una resistenza da 10Kohm, altrimenti quando stacchi l'alimentazione dell'Arduino la batteria si ritrova ad alimentare l'MCU tramite i diodi posti sugli ingressi , prova a cercare con google 'Arduino phantom power' per una spiegazione più dettagliata.

Ciao, Ale.

ilguargua:
Non collegare direttamente l'A0 alla batteria, ma interponi una resistenza da 10Kohm, altrimenti quando stacchi l'alimentazione dell'Arduino la batteria si ritrova ad alimentare l'MCU tramite i diodi posti sugli ingressi , prova a cercare con google 'Arduino phantom power' per una spiegazione più dettagliata.

Ciao, Ale.

Cerco subito e nei prossimi giorni farò la prova con la resistenza da 10Kohm e ti farò sapere.
Quindi in realtà io davo la colpa al voltmetro quando era il MCU ad assorbire.

Grazie mille del tuo intervento!
Buona serata.
Simone

Mi scuso con i moderatori, chiedo una piccola informazione off topic, per non aprire un nuovo post per una domanda che magari per voi risulterà banale.
Utilizzando un relè da 5v, devo sempre mettere un diodo in parallelo alla bobina? O si mette solo con l'utilizzo di un transistor?
Grazie.

sigy_joe:
Utilizzando un relè da 5v, devo sempre mettere un diodo in parallelo alla bobina? O si mette solo con l'utilizzo di un transistor?

NON puoi collegare ad un pin un relè senza usare un transistor !!! Rischi solo di bruciare il pin o la MCU.

Guglielmo

gpb01:
NON puoi collegare ad un pin un relè senza usare un transistor !!! Rischi solo di bruciare il pin o la MCU.

Guglielmo

Grazie mille della risposta Guglielmo, scusa ma non ho specificato che è un relè collegato tramite un alimentatore esterno, non è collegato alla MCU, era proprio una domanda a parte.
La bobina del relè è alimentata esternamente tramite un alimentatore, il quale tramite il contattato mi manda un impulso al MCU (pin del relè comune a 5v, pin del contatto NO al pin 8 del MCU).

Sapevo infatti che per gestirlo tramite il MCU dovessi usare un transistor ed un diodo, ma non so se vale la stessa cosa anche se non è alimentato tramite il MCU.

Grazie mille.
Simone

Il diodo serve per proteggere dalle extratensioni inverse di apertura l'elemento che pilota il relè. In alternativa si usano anche diodi Zener, e reti RC-diodo. Il semplice diodo, detto anche "di ricircolo", ritarda un po' la diseccitazione, in quanto, quando viene tolta alimentazione al relè, continua a far circolare corrente nello stesso finché non viene consumata tutta l'energia magnetica accumulata nella bobina (insieme al nucleo). L'uso di uno Zener limita notevolmente questo effetto, che in certi casi può essere un problema.

ilguargua:
Non collegare direttamente l'A0 alla batteria, ma interponi una resistenza da 10Kohm, altrimenti quando stacchi l'alimentazione dell'Arduino la batteria si ritrova ad alimentare l'MCU tramite i diodi posti sugli ingressi , prova a cercare con google 'Arduino phantom power' per una spiegazione più dettagliata.
Ciao, Ale.

Il voler misurare la tensione battera é una cosa insensata
Il mettere una resistenza da 10kOhm altretanto insensato.

Il ATmega328 ha dei diodi di protezione verso massa e verso l'aliemntazione su ogni pin. Se l'ATmega328 non é alimentato la batteria viene scariacata attraverso il diodo.
Se metti una resistenza da 10kOhm diminuisci la corrente ma resta comunque sempre grande:
(3V-0,5V) / 10kOhm = ca 250µA

La CR2032 (per esempio della Varta) ha una capacitá di 230mAh e autoscarica di meno di 0,1% al mese

0,1% di 230 mAh sono 0,23mAh
per arrivare ala corrente da questo valore divido per 30 giorni e 24 h
0,23 /30/24 = 0,32µA

Consumo della batteria da parte del DS1307 é specificato minore 0,5µA

Una batteria che viene scaricata meno di 0,8µA Tu la scarichi con 250µA per sapere quando é vuota?

Te lo dico io: dopo ca 1000 ore se Arduino é spento. E se non sono 1000 ore ma 2000 ore ( da 1 a 3 mesi) contro una vita media data 10 anni.

Ciao Uwe

uwefed:
Il voler misurare la tensione battera é una cosa insensata
Il mettere una resistenza da 10kOhm altretanto insensato. ....

Grazie mille per il tuo intervento, ti chiedo umilmente scusa, ma credo di non aver percepito il messaggio.
Il voler misurare la tensione della batteria con il voltmetro ammetto che è una cavolata :cold_sweat: era più per fare scena sul mio controller del simulatore che sto creando, per mettere qualche display in più, e visto che avevo questo voltmetro, per non misurare una tensione di 5v tanto per, avevo pensato di tenere sotto controllo la batteria.
Uwe il punto che vorrei capire era se il problema che mi dava l'rtc era dovuto dal pin bat e perché? (magari me lo hai appena spiegato, ma sono sincero non l'ho capito, per mia ignoranza in materia, non per colpa tua)
Dato che levando quello, il problema è sparito.

Datman:
Il diodo serve per proteggere dalle extratensioni inverse di apertura l'elemento che pilota il relè. ....

Grazie mille della risposta "Datman", ti allego un piccolo schema di esempio del circuito che sto usando io, per capire se fosse o meno davvero necessario il diodo.
Ammetto che non conosco molto questo componente, io ho dei diodi dello starter kit elegoo con soglia di intervento di 0.7v se non dico una cavolate.

Grazie mille del vostro tempo e pazienza.
Simone

>sigy_joe: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce, inoltre, se si risponde al post immediatamente precedente, normalmente NON è necessario alcun "quote" dato che è sottinteso. :slight_smile:

Gli utenti da device "mobile" (piccoli schermi) ringrazieranno per la cortesia :wink:

Guglielmo

P.S.: Ho troncato io i "quote" del tuo post qui sopra :wink:

Grazie mille Guglielmo, hai pienamente ragione. Non ci avevo pensato, scusate. :sweat_smile:

Ho trovato questo schema elettrico:

Quel modulo monta normalmente un LIR2032 una batteria al litio ricaricabile. Quella viane caricata tramite R5 e D1.
La tensione BAT sui contatti secondo me viene prelevato non direttamente dalla batteria ma dal pin3 Vbat del DS1307.

La batteria é collegato con R6, una resistenza da 510kOhm che poi con R4 funge da partitore. Non capisco il perché di questo partitore, forse per una particolaritá del DS1307 che abilita l' interfaccia I2C solo se la tensione esterna é maggior di 1,25x VBAT. Una LIR2032 ha una tensione nominale di 3,6V e uan tensione massima di carica con 0,5mA di 4,2V (vedi https://asset.conrad.com/media10/add/160267/c1/-/en/000252279DS01/datasheet-252279-conrad-energy-lir2032-button-cell-rechargeable-lir2032-lithium-45-mah-36-v-1-pcs.pdf )
Per una alimentazioen con 5V la tensioen di batteria puó essere al massimo di 4V visto che USB spesso arriva anche a 4,5V VBAT puó essere minore di 3,6V. Perché questo sia garantito é presente questo partitore che fa arrivare al DS1307 al massimo 3/4 della tensione batteria. Questo non é un problema per la scheda Tiny RTC.

Adesso collegando il A0 al pin BAT hai tra la batteria e l'entrata analogia di Arduino una resistenza da 510kOhm. Questa é molto troppo alta per garantire una lettura analogica corretta. Il condensatore che avevi messo in paralello al entrata analogica é un mezzo per avere una corrente sufficiente per caricare un condensatore interno (Sample and Hold) al convertitore AD e avrebbe dovuto garantire la lettura corretta. Non so perché nel Tuo caso non ha funzionato.

Il convertitore AD del ATmega328 fa la conversione in vari passi e la tensione da convertire deve essere stabile per quel tempo. per quello il ADC ha un condensatore Sample and Hold) interno che viene caricato per un certo tempo con la tensione da misurare. Il breve tempo, le resistenze interne e la grandezza del condensatore S&H possono essere tradotta in un inpedenza interna di 10kOhm. In pratica sembra che una resistenza da 10kOhm tra entrata analogiac e condensatore interno che frena la carica di questo. Se adesso la sorgente della tensione (la batteria del RTC) ha una resistenza di 510kOhm in serie il condensatre S&H non viene mai caricato correttamente e percui leggi una tensione errata che dipende dalla tensione della batteria, ma anche dalla carica residua delle ultima conversione. Il risultato sono tensioni errate e in certi casi anche non costanti.

Penso con questo che sia spiegato i sintomi da te verificati. Spero che sono stato chiaro e capibile.
Ciao Uwe

dal Datasheet del DS1307 https://datasheets.maximintegrated.com/en/ds/DS1307.pdf:

The nominal power-fail trip point (VPF) voltage at which access to the RTC and user RAM is denied is set by the internal circuitry as 1.25 x VBAT nominal. A lithium battery with 48mAh or greater will back up the DS1307 for more than 10 years in the absence of power at +25°C
...
When VCC falls below 1.25 x VBAT, the device terminates an access in progress and resets the device address counter. Inputs to the device will not be recognized at this time to prevent erroneous data from being written to the device from an out-of-tolerance system. When VCC falls below VBAT, the device switches into a low-current battery-backup mode. Upon power-up, the device switches from battery to VCC when VCC is greater than VBAT +0.2V and recognizes inputs when VCC is greater than 1.25 x VBAT. The block diagram in Figure 1 shows the main elements of the serial RTC

Grazie mille Uwe, sei stato gentilissimo! Si il modulo DS1307 può montare una batteria ricaricabile e ricaricarla collegandolo tramite 5v, nel mio caso, la batteria non lo è, dunque ho letto di alimentare il modulo a 3v per non rovinarla.

Questo è il video tutorial che ho seguito.

È in Portoghese ma si capisce abbastanza e poi si possono utilizzare i sottotitoli volendo.
Al minuto 1:50 parla della batteria, mentre al minuto 16:10 parla del pin BAT.

Grazie ancora della gentile spiegazione.
Simone

Il DS1307 NON carica assolutamente la batteria ... studiatevi i datasheet invece di affidarvi a youtube !!!

Collegalo a 5V e metti una normale CR da 3V ... è disegnato per funzionare così.

Guglielmo

Quello predisposto per ricaricare la batteria (trickle charger) è il DS1302 che è completamente diverso ... ::slight_smile:

Guglielmo