Costruire un lettore stechiometrico

io ho provato a collegare il display 16x2 I2C, con lo sketch hello world, ho modificato la dicitura e va bene, diciamo che a copiarlo non e stato difficile, ma vorrei capire if che tipo di funzione è? digitalWryte dovrebbe essere la scritta che esce nel display

Come ti ho già detto ... bisogna che ti metti a STUDIARE ...

  1. i testi che trovi al punto 16.1 del REGOLAMENTO

  2. usa il reference di Arduino (sulla sinistra i vari argomenti)

  3. un buon libro di 'C'

... ciò che chiedi sono veramente le BASI e, almeno le BASI, occorre studiarle prima di cominciare a giocare con Arduino.

Con copia/incolla senza capire nulla di ciò che si copia/incolla NON vai da nessuna parte :confused:

Guglielmo

IF NON è una funzione ... anche i termini sono importanti ... dal reference

a parte che è digitalWrite() ... sempre dal dal reference

... e così via ... gli altri dubbi che hai, li cerchi e li studi ... io t'ho detto dove :wink:

Guglielmo

grazie mille

È un po' che vi seguo, e mi sembra che vi state perdendo il principio KISS

Per fare quel lavoro serve di saper usare le sonde, programmare in C, conoscere l'elettronica e Arduino, oltre a un bel mucchio di altre competenze collaterali (come ad esempio sapere che misure serve fare e saper scegliere lo strumento adatto, solo per esempio, perché ne avete parlato)

Imparare tutto questo a partire da zero non è facile, anzi è proprio impossibile.

Partite da una cosa certa e provate la sonda in condizioni reali con il tester (condizioni reali vuol dire ben montata sullo scarico e motore acceso)

Partire da programmare Arduino senza sapere se la sonda va è inutile
È come comperare la benzina prima di sapere se vi promuovono all'esame della patente

E questa non copiatemela, per cortesiaalle volte sono geloso anch'io

1 Like

E lo so, purtroppo non ho le basi, pensavo che non fosse tanto complicato, perché leggendo su internet avevo capito che bastasse misurare la tensione in uscita dalla sonda e ricalcolare per avere la lettura esatta. A me piace l'elettronica ma purtroppo non la capisco :sob::sob::sob:.

Comunque grazie a tutti per l'aiuto che mi avete dato, e mi spiace avervi fatto perdere del tempo con me.

Mi ero illuso che tu avessi una maggiore determinazione

Invece finché c'è stata speranza che altri lavorassero al posto tuo c'eri e chiedevi

Adesso che è chiaro che ti tocca lavorare a te, rinunci

Fammi capire una cosa:

Ma la sonda che hai comperato cosa fai? La butti?
Soldi sprecati?

Ricorda e sfrutta i tuoi errori per imparare in futuro

2 Likes

TIA
Ovvero
thanks in advance

Comincio a sospettare che i "ringraziatori anticipati" siano da evitare e basta

Però lascia amaro in bocca

No no, non rinuncio, ma mi ci vuole tempo per cercare d'imparare la scrittura in C++. Non voglio che altri lavori o al posto mio e che non avendo le basi purtroppo mi serve qualcuno che me le spiegasse. Il Sig. Guglielmo gentilmente mi ha indirizzato verso alcune pagine di questo sito per poter imparare qualcosa.

1 Like

I miei ringraziamenti anticipati sono solo perché mi ci vuole del tempo a cercare d'imparare qualcosa dalle pagine indicatomi gentilmente dal sig. Guglielmo. E non voglio farvi perdere del tempo con me, perché ho visto che siete molto disponibili e se c'è altra gente che richiede di aiuto è giusto che vengano aiutati come avete fatto con me, quindi non ritengo giusto togliervi del tempo che dovete dedicare a me.

1 Like

ho provato a scrivere questo sketch, modificando il potenziometro i valori cambiano nel display, ho messo in parallelo il tester per verificare l'esattezza della lettura, c'è un margine di 0,010 mV.

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0X27, 16, 2);
void setup () {
    lcd.init();              // per inizializzare il display
    lcd.backlight();         // per la retro illuminazione del display
    lcd.setCursor(6, 0);     // il posizionamento della scritta 6 è la colonna, 0 la riga
    lcd.print("VOLT");       // la scritta visualizzata
    lcd.setCursor(10, 1);    // il posizionamento della seconda scritta 10 è la colonna, 1 è la riga
    lcd.print("mV");         // la scritta visualizzata
    
}

void loop() {

  int sensorValue = analogRead(A0); // legge il valore della batteria e lo
// trasforma in un valore numerico tra 0 e 1023

      lcd.setCursor(4, 1); // il posizionamento della scritta dove 4 è la colonna, 
// ed 1 è la riga
      lcd.print(sensorValue*(446000/1023L)/100); // 446000 è la tensione letta con
//il multimetro per eliminare i decimali ho moltiplicato 4460x100, 1023L è il valore
//numerico intero dato da 10 bit compreso da 0 a 1023. Il risultato l'ho diviso
//per 100 per avere il valore in mV.
    delay(100);
}

0,010mV?... Se sbagli le unità di misura non funziona, eh!

1 Like

Si, perché questa: lcd.print(sensorValue*(446000/1023L)/100); ...
... da dove ha preso quei valori messi li senza un commento?

Guglielmo

446000 sono i volt che leggo col tester all'uscita di Arduino, leggendo i vari post la porta analogica legge da 0 a 1023. Quindi ho fatto la divisione fra la tensione letta e 1024, il risultato diviso ancora per 100 per avere i millivolt. Se ho ho capito bene, ma sicuramente mi starò sbagliando.

Ciao, ti consiglio di fare debug delle variabili, cioè stamparle nel serial monitor.
Ad esempio: Serial.println(sensorValue);

Verifica cosa stampa ponendo A0 direttamente su GND, dovrebbe stampare 0.
Se stampa 0, allora stamperà 1 quando la tensione applicata sarà di: 5.0 / 1024 = 0,0048828125V (4.88mV). Supponiamo che il valore di sensorValue sia 913, allora 0,0048828125×913 = V(A0).
Se al posto dei volts vuoi i millesimi moltiplica per 1000, cioè: (5000/1024.0) * sensorValue.

Ops, devi aggiungere nella setup():
Serial.begin(115200);
per potere stampare nel serial monitor.
Ciao.

1 Like

scusate ho sbagliato la differenza è di 0,010 V

inserendo la stringa Serial.println(sensorValue);
ponendo A0 su GND il valore mi da 0 come descritto da lei.

avevo aggiunto il Serial.begin(9600);
non va bene?

Ma certo che si, solo abitudine di selezionate una velocità di trasmissione più alta di 9600 bit al secondo.

PS:sarebbe interessante se condividessi l'output e il codice con cui sperimenti e ottieni risultati coerenti, altri utenti in seguito potrebbero trarne vantaggio.

Ciao.

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0X27, 16, 2);

void setup () {
  
    lcd.init();               // inizializzazione lcd
    lcd.backlight();          // accensione retroilluminazione display
    lcd.setCursor(6, 0);      // posizionamento 6a colonna, riga 0
    lcd.print("VOLT");        // scritta nel display
    lcd.setCursor(10, 1);     // posizionamento 10a colonna, riga 1
    lcd.print("V");           // scritta display
  Serial.begin(115200);       // velocita di trasmissione
    
}

void loop() {
 
  int sensorValue = analogRead(A0);             // legge il valore della sonda e lo trasforma in un valore numerico tra 0 e 1023
    
          lcd.setCursor(4, 1);                  // posizionamento 4a colonna, riga 1
      lcd.print((4.95/1024)*sensorValue);       // tensione che c'è nell'ingresso A0. Divido la tensione che da arduino per 1024
                                               // il risultato lo moltiplico per la tensione d'uscita del sensore 
    delay(100);                                 
    Serial.println(sensorValue);                // risultato del valore scritto nel serial monitor
    delay(100);                                
  
} 

ho fatto le prove anche con tinkercad, se non si hanno i strumenti o componenti fisici a casa si può provare a farli li e testare se funziona.