E come dice
Ciao.
Paolo.


EcoTan ha scritto:...sicuramente dirò una grossa bestialità.. ma se dopo ogni analogRead mettessi un breve delay, e magari ripetessi la stessa analogRead, cambierebbe qualcosa?
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int ACS714 = A6;
int partitore = A0;
int lm35 = A7;
int relay = 7;
int reading = 0;
int sensorValue = 0;
int outputValue = 0;
float vout = 0.0;
float amps = 0.0;
float ampsTmp = 0.0;
float vref = 5.0;
int valV = 0;
float volt = 0.0;
float R1 = 68220.0;
float R2 = 9781.0;
float corr = 1.02;
float temp;
float tempOld;
void setup() {
lcd.init(); //dipende da che libreria usi ma potrebbe non servire, vedi sotto
lcd.clear();
lcd.backlight();
pinMode(relay, OUTPUT);
//qui tu vai a leggere i pin analogici senza assegnare il valore letto ad alcuna variabile
//cosi com'è non è un operazione utile al resto del programma
analogRead(lm35);
analogRead(ACS714);
analogRead(partitore);
lcd.begin(16, 2); //in teoria questo dovrebbe richiamare lcd.init() - da verificare su documentazione libreria che stai usando
delay (100);
// Test LCD
lcd.print("Test LCD OK") ; // messaggio di test
delay(1000); // pausa di 1 secondi
lcd.clear(); // cancellazione display
delay(10); // pausa per effettuazione operazione
}
void loop() {
//leggiamo due volte il sensore
temp = analogRead(lm35);
temp = analogRead(lm35);
temp = temp * 0.488; //calcolo per trovare temperatura come consiglia MarcoD
// amps = 0.0742 * analogRead(ACS714) - 37.87;
//riscriviamo in 2 passaggi per fare la doppia lettura
ampsTmp = analogRead(ACS714);
ampsTmp = analogRead(ACS714);
amps = 0.0742 * ampsTmp - 37.87;
if (amps < 0.15) amps = 0.0;
//solita doppia lettura
valV = analogRead(partitore); //Lettura del valore fornito dal partitore
valV = analogRead(partitore);
// sebbene questa parte sia formalmente corretta, fai lavorare per niente il micro nel senso che
// il rapporto R2/r1+r2 è sempre uguale ogni ciclo, come pure Vref e 1024
//per cui potresti calcolarti il rapporto totale in setup, o addirittura con la calcolatrice e metterlo come costante
//e sostutuire
vout = (valV * vref) / 1024.0; //Conversione del valore in di
volt = (vout / (R2 / (R1 + R2))) * corr; //Calcolo valore letto
//con
//vOut = valV * rapportoTotale;
//aggiunto uno spazio su "on ", ora on e off si sovrascrivono senza lasciare caratteri in più
//eliminato lcd.clear, spostato setCursor
//aggiunto S.D.P.
//valutare aggiunta isteresi per evitare che l'uscita "vibri" tra on ed off e viceversa in fase di passaggio della temperatura per il setpoint
if (temp != tempOld){ //se temperatura attuale diversa da temperatura old
lcd.setCursor(13, 1); //imposto posizione
if (temp > 28) {
digitalWrite(7, HIGH);
lcd.print("on ");
}
else if (temp < 28) {
digitalWrite(7, LOW);
lcd.print("off");
}
tempOld=temp;
}
lcd.setCursor(0, 0); //setta il cursore sulla prima linea display
lcd.print("A "); //scrivi la parola A:
lcd.print(amps, 1); // riporta il valore calcolato degli ampere
lcd.setCursor(11, 0);
lcd.print (temp); //Stampo sul LCD la temperatura con ",1" imposto il numero di decimali dopo la virgola
lcd.setCursor(0, 1); // setta il cursore sulla prima linea display
lcd.print("V "); // scrive la parola volt:
lcd.print(volt, 1); // riporta il valore calcolato dei volt
delay (500); //pausa lettura
}
[code=php]per il codice a colori[/code]Visitano il forum: Nessuno e 19 ospiti