Problemi nella misurazione della carica di una batteria con attiny85

Poichè mi serve misurare la carica di una batteria LiPo da 1 cella e pilotare un transistor in modo che mi spenga tutto se la batteria è scarica, ho pensato di usare un attiny85 con cui leggere il voltaggio della batteria tramite analogRead(). Il codice che ho usato è il seguente:

void setup() {
  pinMode(PB4, OUTPUT);
  digitalWrite(PB4, HIGH);
  pinMode(3, INPUT);
  pinMode(PB2, OUTPUT);
  digitalWrite(PB3, HIGH);
}

void loop() {
  int sensorValue = analogRead(3);
  float voltage = sensorValue * (5.0 / 1023.0);
  if(voltage < 3.1); {
    digitalWrite(PB4, LOW);
  }
  if(voltage > 3.1) {
    digitalWrite(PB4, HIGH);
  }
  delay(1);
}

Tuttavia, testando il funzionamento tramite un potenziometro usato come partitore di tensione (il pin centrale collegato all' ingresso analogico e gli altri due pin uno a gnd e uno a +5v) e un led al posto del transistor, ho notato che quando il valore è vicino ai 3.1 volt, il led non rimane spento, ma lampeggia, mentre scendendo, arrivando per esempio a 2.9v, il problema sparisce. Come posso fare per evitare che il led lampeggi?

Grazie

Che ci fa quel punto e virgola?!? :stuck_out_tongue_closed_eyes:

if(voltage < 3.1); {
digitalWrite(PB4, LOW);
}

Hai messo una resistenza sul LED?
Se non l' hai messa il consumo eccessivo di corrente del LED puó far scendere di quel poco la tensione da far oscillare la tensione intorno al livello di spegnimento.

Il ATtiny lo vorrai alimentare alla fine con la LIPO? Non puoi misurare una tensione e usarla in contemporanea come riferimento. Ti da sempre come valore 1023.
Puoi misurare la tensione di riferimento interno come descritto in http://www.instructables.com/id/Secret-Arduino-Voltmeter/
Se alimenti il ATtiny con la LIPO devi risparmiare corrente usando il sleep.

Ciao Uwe

Il problema del riferimento di tensione non si presenta nel mio caso perchè l' attiny85serve per controllare la carica di una batteria all' interno di un caricabatterie con uscita usb, quindi alimenteró il micro con i 5v uscenti dal convertitore step- up. La resistenza non l' ho messa perchè stavo provando il tutto su breadbord, quindi riproveró con la resistenza.

Scusa gigi, lo hai letto il mio intervento?
Mi sa di no, il tuo problema è tutto lì. Quel punto e virgola NON ci dev'essere. Perché col punto e virgola dici al compilatore che l'if termina SENZA istruzioni da eseguire e che il blocco di codice messo dopo è a sé stante.
In pratica lo hai diviso così:

void loop() {
  int sensorValue = analogRead(3);
  float voltage = sensorValue * (5.0 / 1023.0);
  if(voltage < 3.1);
  digitalWrite(PB4, LOW);
  if(voltage > 3.1) {
    digitalWrite(PB4, HIGH);
  }
  delay(1);
}

Quindi con tensioni sopra a uguali a 3V1 tu accendi e spengi il led continuamente.

Quindi, togli quel punto e virgola :wink: :wink:

L' ho letto e l'ho tolto. Ho anche aggiunto la resistenza. Ora lampeggia ancora sulle tensioni molto vicine , ma decisamente meno rispetto a prima.

Edit: Comunque sopra i 3.1V stava acceso normalmente, o almeno sembra (potrebbe essere come per il PWM che il led in realtà lampeggia ma chi guarda lo vede sempre acceso?)

Alcuni consigli:

  1. prova cambiando pot, magari quello che hai ha un pò di gioco quindi non hai una lettura stabile;
  2. aumenta un pò l'intervallo di aggiornamento, con solo 1 delay di attesa se la lettura fluttua intorno a 3.1V, passi da una condizione all'altra in rapida successione.

Per quanto riguarda il delay tra ogni lettura, se io metto in modalità sleep il micro per 1 sec e faccio quindi una lettura ogni sec, consumo meno e dovrei anche risolvere il problema giusto?
Per quanto riguarda il potenziometro ne ho anche di un altro tipo, proverò con quelli.

gigicookie:
Per quanto riguarda il delay tra ogni lettura, se io metto in modalità sleep il micro per 1 sec e faccio quindi una lettura ogni sec, consumo meno e dovrei anche risolvere il problema giusto?
Per quanto riguarda il potenziometro ne ho anche di un altro tipo, proverò con quelli.

consumi di meno ma non pochissimo visto che il convertitore Step up é sempre acceso.
Ti si scarica la batteria comunque.

Ciao Uwe

In sleep consumi molto di meno (ovviamente solo a livello di MCU, come ha precisato Uwe).

Si ovviamente solo a livello di MCU, ma visto che con i 5v dello step-up ci devo caricare il telefono le batterie mi si scaricherebbero comunque in qualche ora, quindi non è un problema che mi consumi comunque qualcosa.