Schermo 16x2 e 4EGT su Auto

Salve ragazzi chiedo in anticipo scusa per la mia nubbiaggine,ma sto veramente messo male come creazione di codice.
Allora,io sono appassionato di motori e sulla mia macchina in cui vado in pista(4 cilindri) ho montato una Sonda K per ogni cilindro. La mia centralina ripogrammabile ha la possibilità di effettuare cambiamenti di carburazione per ogni cilindro,ma qui arriva la questione,vorrei visualizzare sullo schermo i 4 valori realtime.

Ho a disposizione:
Arduino Uno
Schermo 16x2 ( https://www.amazon.it/gp/product/B07CQG6CMT/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)
Una schedino con 4 AD8495 per trasformare il segnale della sonda K in un segnale 0-5v(0v =0° 5v=1250°)
4 Sonde K

L'idea era di dividere lo schermo in 4 e sui 4 lati mettere la temperatura dei cilindri.
Ovviamente collegare l'output del modulo con i 4 AD8495 a 4 entrate analogiche di arduino e avere un refresh piu alto possibile,per avere un feedback il piu rapido possibile.

Però a livello di codice non so bene da dove partire,avevo fatto 4/5 anni fa un progetto simile(scopiazzando qui e la,ma utilizzavo solo una sonda),ma non mi ricordo nemmeno da dove avevo cominciato.
Grazie a chi mi darà una mano e chiedo scusa nel caso fosse un progetto esistente(o cercato nel forum italiano,ma un progetto uguale a questo non mi pare di averlo trovato)

Non riesci a recuperare il progetto di 4/5 anni fa?
Sarebbe un ottimo punto di partenza.

Se questo è vero e supponiamo che le uscite siano collegate ai pin A0, A1, A2 e A3 senza dimenticare di collegare il gnd della scheda sonda e l'arduino.

Un semplice codice per i test, che ovviamente può essere migliorato, potrebbe essere il seguente:

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

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
  lcd.init();                      // initialize the lcd
  lcd.backlight();
}


void loop() {
  lcd.setCursor(0, 0);
  lcd.print("1-");
  lcd.print(map(analogRead (A0),0,1024,0,1250));
  lcd.print("º");
  lcd.setCursor(8, 0);
  lcd.print("2-");
  lcd.print(map(analogRead (A1),0,1024,0,1250));
  lcd.print("º");
  lcd.setCursor(0, 1);
  lcd.print("3-");
  lcd.print(map(analogRead (A2),0,1024,0,1250));
  lcd.print("º");
  lcd.setCursor(0, 1);
  lcd.print("4-");
  lcd.print(map(analogRead (A0),0,1024,0,1250));
  lcd.print("º");
  lcd.clear();
}

nel frattempo ho cambiato 2/3 pc e quell'arduino non è piu in mio possesso

grazie mille,domani pomeriggio,quando stacco dal lavoro mi ci metto subito e vediamo che ne esce fuori.
lo schermo lo collego SDA A4 e SCL A5?(oltre ovviamente 5v e gnd)
grazie 1000 ancora

Corretta.

Ho provato lo sketch,ma c'è qualcosa che non va vedo solo 3 valori(sembra che il numero 3 e 4 si sovrappongono) e i numeri sembrano impazziti


la questione che si sovrappongono credo sia semplice da risolvere in questo modo

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

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
  lcd.init();                      // initialize the lcd
  lcd.backlight();
}


void loop() {
  lcd.setCursor(0, 0);
  lcd.print("1-");
  lcd.print(map(analogRead (A0),0,1024,0,1250));
  lcd.print("º");
  lcd.setCursor(8, 0);
  lcd.print("2-");
  lcd.print(map(analogRead (A1),0,1024,0,1250));
  lcd.print("º");
  lcd.setCursor(0, 1);
  lcd.print("3-");
  lcd.print(map(analogRead (A2),0,1024,0,1250));
  lcd.print("º");
  lcd.setCursor(8, 1);
  lcd.print("4-");
  lcd.print(map(analogRead (A0),0,1024,0,1250));
  lcd.print("º");
  lcd.clear();
}

invece devo capire come funziona la questione "refresh" perchè in pratica vedo tipo i numeri impazziti

Bene, almeno ho capito bene l'indirizzo I2C, te l'ho già detto che potrebbe essere migliorato. Prova il prossimo.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup() {
  lcd.init();                      // initialize the lcd
  lcd.backlight();
}


void loop() {
  lcd.setCursor(0, 0);
  lcd.print("1-");
  lcd.print(map(analogRead (A0),0,1024,0,1250));
  lcd.print("C");
  lcd.setCursor(8, 0);
  lcd.print("2-");
  lcd.print(map(analogRead (A1),0,1024,0,1250));
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("3-");
  lcd.print(map(analogRead (A2),0,1024,0,1250));
  lcd.print("C");
  lcd.setCursor(8, 1);
  lcd.print("4-");
  lcd.print(map(analogRead (A0),0,1024,0,1250));
  lcd.print("C");
  delay (500); // regolare per un corretto aggiornamento LCD
  lcd.clear();
}

I numeri "impazziscono" perché fai il clear() a raffica. Come dice @gonpezzi puoi rallentare il loop() con un delay più o meno lungo, così riduci l'effetto refresh. Però così rallenti anche la lettura dei sensori... Vedi tu cosa preferisci sacrificare.
In alternativa puoi scrivere ogni valore solo quando cambia, così eviti i clear() inutili e i numeri stanno sereni.

Provato il codice,ora è impaginato bene e i numeri sono più stabili


Ora non guardate che si vede male,perché con la fotocamera ho beccato il momento di refresh.

Il problema è che mi pare che non legga nulla dai sensori,cioè vedo che i valori vanno dove vogliono da 0° a 1250° come gli pare proprio.
Controllato con il tester ed è estremamente stabile il voltaggio.

Non è ho proprio idea su come si faccia :smiley:

Collega il pull_up interno dei pin ADC per vedere se migliora le cose, per farlo aggiungi al setup

void setup() {
  pinMode (A0,INPUT_PULLUP);
  pinMode (A1,INPUT_PULLUP);
  pinMode (A2,INPUT_PULLUP);
  pinMode (A3,INPUT_PULLUP);
  lcd.init();                      // initialize the lcd
  lcd.backlight();
}

Ma devo fare anche un pull up elettrico o inserisco solo il codice?
E poi scusa l'ignoranza,lo.devo mettere in coda al codice principale o alla fine?

Solo nel codice, lo faccio già perché ho avuto un altro piccolo errore.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
  pinMode (A0,INPUT_PULLUP);
  pinMode (A1,INPUT_PULLUP);
  pinMode (A2,INPUT_PULLUP);
  pinMode (A3,INPUT_PULLUP);
  lcd.init();                      // initialize the lcd
  lcd.backlight();
}


void loop() {
  lcd.setCursor(0, 0);
  lcd.print("1-");
  lcd.print(map(analogRead (A0),0,1024,0,1250));
  lcd.print("C");
  lcd.setCursor(8, 0);
  lcd.print("2-");
  lcd.print(map(analogRead (A1),0,1024,0,1250));
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("3-");
  lcd.print(map(analogRead (A2),0,1024,0,1250));
  lcd.print("C");
  lcd.setCursor(8, 1);
  lcd.print("4-");
  lcd.print(map(analogRead (A3),0,1024,0,1250));
  lcd.print("C");
  delay (500); // regolare per un corretto aggiornamento LCD
  lcd.clear();
}

Be ora quasi ci siamo.
La cosa un po' strana è che l'egt appena collegata segna 100° ma mi pare sia irreale come valore perché sta a temperatura ambiente.
Domani mattina riprovo,così misuro il voltaggio con il tester e vediamo quanto segna e se coincide con la scala
Certo che quello che schermo ha un refresh schifoso,sembra che lasci la scia

Stamattina mi ci sono rimesso al volo.
Nel frattempo ho stabilizzato i collegamenti elettrici,che erano tutti volanti e provvisori,ho saldato quello che andava saldato e sistemato il tutto.
Ho riacceso arduino e mi segna 100°.
ho misurato con il tester fra il negativo di arduino e l'uscita analogica e leggo 0,33v,che se la scala è 0-1250 dovrebbero essere 82,5° e non 100°,anche se è pure strano che sono 82° con sonda fredda(avevo una egt in casa,magari è rotta,dopo ne rimedio un'altra e riprovo).

questo è il datasheet del modulo che converte il segnale EGT in un segnale analogico 0-5v.
Ho provato piu "delay" per il refresh dello schermo,alla fine non funziona cosi male,il problema è che lo schermo quando fai il refresh "pulsa" e fa un effetto un po strano,non so se la soluzione di @fratt possa essere piu pratica,ma ovviamente non saprei come agire sul codice.

Ogni quanto possono cambiare i singoli valori?
E cambiano sempre tutti e 4 insieme o può cambiare solo uno per volta?

Intanto prova semplicemente a togliere il clear() per vedere se l'effetto sfarfallio si attenua.

Anche io proverei a togliere del tutto il clear(), ripulendo solo dove necessario, tipo così:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
  pinMode (A0,INPUT_PULLUP);
  pinMode (A1,INPUT_PULLUP);
  pinMode (A2,INPUT_PULLUP);
  pinMode (A3,INPUT_PULLUP);
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("1-");
  lcd.setCursor(8, 0);
  lcd.print("2-");
  lcd.setCursor(0, 1);
  lcd.print("3-");
  lcd.setCursor(8, 1);
  lcd.print("4-");
  
}

void loop() {
  lcd.setCursor(0, 2);
  lcd.print("     ");  //cancella scritta precedente
  lcd.setCursor(0, 2);
  lcd.print(map(analogRead (A0),0,1024,0,1250));
  lcd.print("C");
  lcd.setCursor(0, 10);
  lcd.print("     ");  //cancella scritta precedente
  lcd.setCursor(0, 10);
  lcd.print(map(analogRead (A1),0,1024,0,1250));
  lcd.print("C");
  lcd.setCursor(1, 2);
  lcd.print("     ");  //cancella scritta precedente
  lcd.setCursor(1, 2);
  lcd.print(map(analogRead (A2),0,1024,0,1250));
  lcd.print("C");
  lcd.setCursor(1, 10);
  lcd.print("     ");  //cancella scritta precedente
  lcd.setCursor(1, 10);
  lcd.print(map(analogRead (A3),0,1024,0,1250));
  lcd.print("C");
  delay (500); // regolare per un corretto aggiornamento LCD
}

Ciao, Ale.

edit: ho corretto un evidente errore, non riposizionavo il cursore tra le 2 print!

i valori cambiano in continuazione,non stanno praticamente mai fermi tutti e 4

domani nel tardo pomeriggio lo testo e vedo se trovo un'altra egt per fare i test.(perchè le 4 egt del progetto sono montate in macchina e attualmente il progetto è un po in fase embrionale ed è un problema fare le prove in macchina