Buonasera a tutti.
Chiedo anticipatamente scusa per la banalità del mio quesito.
Avrei bisogno di visualizzare tre messaggi differenti sul display a seconda della tensione presentre sul PIN analogico A0 per monitorare un alimentatore.
Purtroppo, usando il seguente codice, mi vengono segnalati solo i primi due step (da 0 a 2 Volt e da 2 a 4 volt), ma se salgo oltre i 4 volt il messaggio inizia ad alternarsi con quello precedente.
Molto probabilemnte sbaglio l'uso del IF, ELSE.
Grazie infinite e buona serata!
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int entrata = A0;
int gradazione = 0;
void setup() {
// initialize the pin as an input:
pinMode(entrata, INPUT);
// set up the LCD's number of columns and rows:
lcd.begin(20, 4);
}
void loop() {
gradazione = analogRead(entrata);
float voltage = gradazione * (5.0 / 1023.0);
if (voltage < 2) {
lcd.setCursor(0, 0);
lcd.clear();
lcd.print("Sto sotto 2 Volt");
lcd.setCursor(0, 2);
lcd.print(voltage);
lcd.setCursor(0, 3);
lcd.print(gradazione);
delay(500);
}
else {
if (voltage > 2 || voltage < 4) {
lcd.setCursor(0, 0);
lcd.clear();
lcd.print("Sto tra 2 e 4 Volt");
lcd.setCursor(0, 2);
lcd.print(voltage);
lcd.setCursor(0, 3);
lcd.print(gradazione);
delay(500);
}
else {
if (voltage > 4) {
lcd.setCursor(0, 0);
lcd.clear();
lcd.print("Sto SOPRA 4 Volt!");
lcd.setCursor(0, 2);
lcd.print(voltage);
lcd.setCursor(0, 3);
lcd.print(gradazione);
delay(500);
}
}
}
}
@lorenzo, ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento
E' sbagliato, gli step di un ADC a 10 bit sono 1024, ossia da 0 a 1023. Ma nei calcoli di conversione non devi dividere per il valore massimo ma per il numero di passi
Grazie leo72, ma cosa intendi di preciso per "dividere per il numero dei passi"?
Dovendo simulare un vero "voltmetro", ho seguito le istruzioni pubblicate qui: http://arduino.cc/en/Tutorial/ReadAnalogVoltage
Intendo il numero di possibili valori che può restituire l'ADC. I valori vanno da 0 a 1023, e sono quindi 1024, non 1023 (2^10, ossia l'ADC a 10 bit, dà appunto come max valore 1024). Quando si fa una conversione da una scala all'altra si usa prendere il numero di valori, non il valore massimo.
Mettendo 1023 nella formula, potresti non avere mai come risultato il massimo valore di tensione misurabile. Dipende dall'approssimazione interna fatta dal compilatore quando tratta i float, potresti avere 4.9999 ma anche 5.0 se hai fortuna: ma è comunque errato.
Grazie ragazzi, tutto chiaro. Al fine pratico, per ora non ho bisogno di misurare il millesimo di Volt, ma il calcolo effettivo teorico illustrato nel post citato da @Guglielmo è molto interessante.