Lcd 20x4+sensore pressione

Salve, ho ricercato nel forum e anche su google ma senza successo l'aiuto che cerco. Ho acquistato di recente Arduino uno, un lcd 20x4 con protocollo I2C e un sensore di pressione MPX5700GP. Mettere in comunicazione Arduino con lcd è una cosa che ho già fatto (stampando a video sul lcd frasi), ma non riesco a capire come leggere la pressione dal sensore e stamparla a video sul lcd. Ho importato le due librerie Wire e LiquidCrystal_I2C. L'unica idea che ho avuto è leggere la pressione del sensore tramite queste due semplici righe di codice (ovviamente non so se sia un'operazione corretta essendo un sensore di pressione relativa):

ValoreSensore=analogRead(A0); Pressione=map(ValoreSensore, 0, 1023, 0, 7000000);

Il collegato è il seguente: Arduino uno + protocollo I2C (pin analogico A4,A5) + MPX5700GP (pin analogico A0) tutto alimentato a 5V direttamente dal pin power dell'Arduino.

La difficoltà che riscontro è nel leggere il valore corretto dal sensore ed ottenere tale lettura sullo schermo del lcd, in quanto la lettura dal sensore e la scrittura sul lcd deve avvenire nel void loop(). Grazie per la disponibilità.

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO … Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Salve, ho scritto il post di presentazione nell'apposito thread. Grazie

Tanto per cominciare, come visibile dal datasheet, pagina 4, figura 2, quel sensore, alimentato a 5V, fornisce un segnale analogico, che fino a 700 kPa è abbastanza lineare e che è funzione della pressione, secondo la formula:
VOUT = VCC * (0.0012858 * P + 0.04) ovviamente +/- l’errore dovuto alla precisione dell’oggetto ed al ADC di Arduino.

Nel loop() non dovrai fare altro che, ad intervalli regolari, funzione delle tue necessità (inutile farlo alla massima velocità del loop(), non avrebbe senso), acquisisce il segnale analogico, lo mappa come descritto e ne stampa il valore su LCD.

Dove incontri difficoltà? Prova a scrivere il codice da solo e poi mettilo qui (…mi raccomando, in conformità al regolamento, punto 7, il codice va racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> … primo a sinistra).

Guglielmo

Grazie Guglielmo,
non ho la possibilità di testare il codice in quanto mi trovo in viaggio e fisicamente non ho con me Arduino. Ho provato a scrivere il codice, seguendo le tue indicazioni. Non ho capito ancora bene l’errore da dover aggiungere nella funzione di trasferimento, penso che sia l’errore che commette il sensore.
Grazie

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd (0x27, 20, 4);

void setup() {
 lcd.init();
 lcd.backlight();
 lcd.print("Pressione");
}

void loop() {
  float ValoreSensore = analogRead(A0);
  float Pressione = 5000.0*(0.0012858*ValoreSensore+0.04)+ Errore?! // funzione sensore, non ho capito bene ancora l'errore da dover aggiungere in kPa
  lcd.setCursor(10,1);
  lcd.print(Pressione);
  delay(500);
}

Purtroppo l’“errore” NON è determinabile a priori …
… ti occorrerà avere una (o più) pressioni di riferimento e confrontare il valore letto con Arduino con tali valori per trovare il fattore di correzione :wink:

Un’altra cosa che devi considerar è che, comunque, i 5V di arduino (usati come riferimento dal ADC) NON sono stabilissimi e che quindi, al variare anche di pochi centesimi di V, avrai una variazione delle letture. La cosa più semplice e fare più letture e fare la media così da ridurre l’errore introdotto da tali oscillazioni.

Guglielmo

Grazie Guglielmo, sei stato davvero chiaro e molto comprensibile. Farò 10 letture e la media tra loro così da ottenere un valore più stabile possibile. Se facessi una conversione in mV subito dopo la lettura analogica, potrebbe aiutarmi, invece di usare i V? (oppure è un'operazione fine a se stessa?) Grazie.

Brufany: ... Se facessi una conversione in mV subito dopo la lettura analogica, potrebbe aiutarmi, invece di usare i V? (oppure è un'operazione fine a se stessa?)

No, non sarebbe di alcuna utilità ... la media delle letture è la cosa più semplice, senza dover andare ad usare un generatore di tensione costante (di precisione) esterno come "riferimento" delle misure.

Guglielmo

Grazie Guglielmo.
Ho provato a scrivere il codice effettuando 10 letture e la media scandite da un ciclo for, devo solo aggiungere i valore di OFFSET e FULLSCALE nel codice da prendere dal datasheet del sensore.

Secondo te va bene? Oppure devo migliorare il codice e cambiare impostazione?!

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd (0x27, 20, 4);

int ValoreGrezzo;
int offset = datasheet ;
int fullScale = datasheet;
float Pressione;

void setup() {
 lcd.init();
 lcd.backlight();
 lcd.print("Pressione");
}

void loop() {
  ValoreGrezzo=0;
  for(int x=0; x<10; x++)ValoreGrezzo = ValoreGrezzo + analogRead(A0);
  Pressione = (ValoreGrezzo - offset)*700.0/(fullscale - offset);
  lcd.print ("A/D è");
  lcd.print(ValoreGrezzo);
  lcd.setCursor(10,1);
  lcd.print(" Pressione è ");
  lcd.print(Pressione);
  lcd.print ("kPa");
  delay(500);
}

Puoi ottimizzare l'uso della memoria ... ricorda che tutto ciò che va da 0 a 255 sta tranquillamente in un byte e che l'uso di un "int" è uno spreco, quindi ... quella variabile 'x', usata nel for, puô tranquillamente essere byte. Inoltre, se non vado errato, dopo il for, devi dividere per 10 per ottenere il valore medio di 'ValoreGrezzo'.

Guglielmo

Grazie per la risposta come sempre Guglielmo. Riscontro delle difficoltà nel capire i valori di offset e fullScale dal datasheet, inoltre tali valori devono essere moltiplicati per 10 prima di essere inseriti nelle variabili rispettive di:

int offset=10*valore letto da datashhet; int fullScale=10*valore letto da datasheet;

Se non ho capito male l'offset è la minima pressione registrata dal sensore e fullscale e la massima registrata dal sensore? Oppure sono fuori strada?

Grazie