Stranezza lettura analogica

Salve ho un problema sulla lettura della tensione proveniente da un partitore.

La lettura è precisa fino a quando non accendo i 3 led (utilizzati solo per simulazione nel progetto finale saranno sostituiti da 2 relè e un mosfet).

La tensione letta aumenta ad ogni accensione dei led fino a un massimo di 1 volt. Quella misurata con multimetro rimane stabile.

Ho provato ad alimentare arduino sia da usb che da alimentatore esterno, ma il problema rimane.

Cosa ne pensate?

Di seguito Sketch e schemi

Grazie

#include "OneButton.h"
#include "U8g2lib.h"



U8G2_SH1106_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, SCL, SDA, U8X8_PIN_NONE);

OneButton Puls1 (6, true);

byte Opto = 2;
byte Presa_Usb = 3;
byte Presa_12V = 4;
byte Fendinebbia = 5;
int Partitore = A2;

byte Stato_Usb = 0;   // Presa USB
byte Stato_12V = 0;   // Presa 12V


float R1 = 46300.0;   // !! Valore della resistenza R1 !!
float R2 = 3920.0;   // !! Valore della resistenza R2 !!

byte ProvvVal_Fendinebbia = 0;
byte Val_Fendinebbia = 0;
byte VecchioVal_Fendinebbia = 1;
byte Stato_Fendinebbia = 0;


unsigned long durata;
unsigned long timer;




int Lettura = 0;
float Val = 0.0;
float Voltage = 0.0;
float tmpVoltage;
byte Decine, Unita, Decimale;

void draw_Tensione() {

  u8g2.setFont(u8g2_font_fub17_tf);
  u8g2.setFontPosCenter ();
  u8g2.setCursor (30, 32);
  u8g2.print(Decine);
  u8g2.print(Unita);
  u8g2.print(",");
  u8g2.print(Decimale);
  u8g2.print(" V");
}



void setup() {
  u8g2.begin();
  Serial.begin(9600);

  Puls1.attachClick(click1);
  Puls1.attachLongPressStart(longPressStart1);


  analogReference(INTERNAL);

  pinMode (Opto, INPUT_PULLUP);
  pinMode (Presa_Usb, OUTPUT);
  pinMode (Presa_12V, OUTPUT);
  pinMode (Fendinebbia, OUTPUT);


}

void loop() {

  Lettura = analogRead(Partitore);
  Val = (1.08 * Lettura / 1024.0);
  Voltage = (Val / (R2 / (R1 + R2)));

  tmpVoltage = Voltage;
  Decine = (int)(tmpVoltage / 10.0);
  tmpVoltage = tmpVoltage - (Decine * 10);
  Unita = (int)tmpVoltage;
  tmpVoltage = tmpVoltage - Unita;
  tmpVoltage = tmpVoltage * 10;
  Decimale = (int)tmpVoltage;


  Serial.println (Voltage);

  Puls1.tick();


  ProvvVal_Fendinebbia = digitalRead(Opto);

  if (ProvvVal_Fendinebbia == LOW) {
    durata = millis() - timer;
  }
  if (durata >= 1000) {
    Val_Fendinebbia = 0;
  }
  if (ProvvVal_Fendinebbia == HIGH) {
    timer = millis();
    Val_Fendinebbia = 1;
  }
  if ((Val_Fendinebbia == 0) && (VecchioVal_Fendinebbia == 1)) {
    Stato_Fendinebbia = 1 - Stato_Fendinebbia;
  }

  VecchioVal_Fendinebbia = Val_Fendinebbia;



  if (Stato_Fendinebbia == 1) {
    digitalWrite (Fendinebbia, HIGH);
  }
  else {
    digitalWrite (Fendinebbia, LOW);
  }

  if (Stato_Usb == 1) {
    digitalWrite (Presa_Usb, HIGH);
  }
  else {
    digitalWrite (Presa_Usb, LOW);
  }

  if (Stato_12V == 1) {
    digitalWrite (Presa_12V, HIGH);
  }
  else {
    digitalWrite (Presa_12V, LOW);
  }

  u8g2.firstPage ();
  do {
    draw_Tensione();
  }


  while ( u8g2.nextPage() );
}


void click1 () {
  Stato_Usb = 1 - Stato_Usb;
}

void longPressStart1() {
  Stato_12V = 1 - Stato_12V;
}

Secondo me non hai messo delle resistenze sui LED.
Ciao Uwe

Le resistenze le ho messe.

Avevo allegato gli schemi ma non ci sono.

Riprovo ora ad allegarli.

Dunque ho fatto delle prove

Sia la tensione in ingresso che il riferimento ADC rimangono costanti.

Cambia il valore letto da arduino sul partitore di tensione. Ma leggendolo col multimetro rimane costante.

Prima Prova

Lettura su partitore Voltaggio

0.96 12.35 Led spenti
0.98 12.55 1 Led acceso
0.99 12.74 2 Led accesi
1.01 12.90 3 Led accesi

Lettura su partitore Voltaggio

0.96 12.35 Led spenti
0.98 12.50 1 Led acceso
0.99 12.65 2 Led accesi
1.00 12.78 3 Led accesi

Scollegando il filo che va ai led dopo averli accesi i valori scendono fino a tornare alla normale lettura.

Ho caricato un nuovo sketch togliendo tutto quello che riguarda i pulsanti, i led impostati su HIGH e scollegati prima dell'accensione. Reinserendoli uno alla volta ecco il risultato

Prima Prova
Lettura su partitore Voltaggio

0.97 12.47 Led scollegati
0.98 12.51 1 Led collegato
0.99 12.65 2 Led collegato
1.00 12.78 3 Led collegato

Seconda Prova
Lettura su partitore Voltaggio

0.96 12.34 Led scollegati
0.97 12.38 1 Led collegato
0.97 12.44 2 Led collegato
0.98 12.51 3 Led collegato

Resettando la scheda con tutti i led inseriti:

Lettura su partitore Voltaggio

0.98 12.51

Avete qualche idea?

ciao ogiunto,

a me sembra che i due schemi che hai postato mostrino collegamenti diversi...nel senso che quello denominato "schem" sembra giusto...mentre quello denominato "bb" no...in quest'ultimo sembra tu abbia bypassato le resistenze dei LED...

ogiunto:
Le resistenze le ho messe.

Avevo allegato gli schemi ma non ci sono.

Riprovo ora ad allegarli.

Allora prova a controllare la tensione di alimentazione (5V) in funzione dei LED accesi.
Se non cambia allora mi sbaglio per la causa del problema.

Poi metti anche un condensatore da 0,1µF tra entrata A2 e massa.

Ciao Uwe

Le misure effettuate con il multimetro sono stabili indipendentemente dai led accesi, eccole:

Lettura su partitore Voltaggio

0.96 12.35

Si lo schema della breadboard è sbagliato ma i collegamenti li ho fatti giusti comunque lo riposto.

Il condensatore ho provato a metterlo da 100Nf (=0,1µF) ma non sembra porti miglioramenti.

Per la tensione di alimentazione ho misurato il pin Vin e gnd.
Con tutto spento è 4.51V e ad ogni accensione dei led scende di 0.1V.
Contemporaneamente la tensione visualizzata aumenta.

Ho provato quindi a alimentare nuovamente con un filo da +12v della breadboard a Vin arduino.

Adesso non da false letture, cosa è successo?
Il condensatore è meglio se lo metto ugualmente?

I 5V dell alimentazione vengono usati come tensione di riferimento. se quella cambia cambia anche la lettura analogica.

Per ovviare a questo problema usa o la tensione di riferiemnto interna o usi i 3,3V come riferimento esterno collegando i 3,3V a AREF. Devi ovviamente ridimensionare il partitore.

vedi analogReference() - Arduino Reference

Il condensatore serve per stabilizzare la tensione visto che per la misura serve per brevissimi tempi piú corrente che il partitore possa fornire.

Ciao Uwe

Il condensatore è meglio se lo metto ugualmente?

Si, anzi mettine uno anche tra l'AREF e il GND

Quello che non capisco é che misurando tra Aref e gnd ottengo sempre 1.08 anche al variare della lettura.
Possibile che cambino i decimali dopo l'8 che con il mio multimetro non riesco a leggere?

Prima di

Lettura = analogRead(Partitore);

aggiungi:
analogRead(Partitore);

cioè:

analogRead(Partitore);
Lettura = analogRead(Partitore);

così fa due letture di seguito e la seconda è sempre giusta! :slight_smile:

ogiunto:
Quello che non capisco é che misurando tra Aref e gnd ottengo sempre 1.08 anche al variare della lettura.
Possibile che cambino i decimali dopo l'8 che con il mio multimetro non riesco a leggere?

Ma hai attivato la referenza interna da 1,1V? In quel caso una lettura di 1,08V é possibile visto che i 1,1V non sono tanto precisi ma molto stabili.

Ciao Uwe

ogiunto:
...
Possibile che cambino i decimali dopo l'8 che con il mio multimetro non riesco a leggere?

Risposta breve: Si. (;))

Risposta normale: ovvio, l'ADC interno ha 10bit, cioe' 1023 passi (piu lo zero), se dividi 5V per 1023, ottieni 0.00488...eccetera ... quindi il risultato cambia ogni 0.0049V circa ... per cui anche i millesimi di V che non vedi sul tuo tester influiscono sulla lettura ... inoltre anche per il riferimento, pure i millesimi che non vedi, quando cambiano modificano l'intera scala ...