Codice per interfaccia I2C

Salve. Non ho ancora provato il codice qui sotto nella vita reale ma su thinkercad non funziona lo schermo 16x2.

int state = 0;
float rx = 0;
float r = 0;
float v1 = 0;
float r1 = 1000; //1kohm resistenza nota
#include <Wire.h> //libreria che consente la comunicazione con i2c                
#include <LiquidCrystal_I2C.h>  //libreria display i2c

//////////////////////addr, en,rw,rs,d4,d5,d6,d7,bl, blpol
LiquidCrystal_I2C lcd = LiquidCrystal_I2C (0x27 ,16 ,2 ); //impostazione indirizzo del display e pin del display LCD collegati all'i2c



void setup (){
 
 lcd.begin(16,2); //inizializzo il display. Il display LCD usato è 16x2
 lcd.backlight () ;
 lcd.clear ();
 lcd.setCursor (3,0);
 lcd.print ("Ciao Mazy");
 lcd.setCursor (3,1);
 lcd.print ("Ohmetro");
 delay (5000);
}


void loop() {
  int n = analogRead(A0); 
  
  v1 = map(n, 0, 1024, 0, 5000)/1000.0; //mV
  rx = (r1*(5.0-v1)) / v1;

if (rx > 1000.00) {
rx = rx/1000.00;  
lcd.clear(); //pulisce lo schermo
lcd.setCursor(1,0); //imposta il cursore nella prima riga e colonna,      
lcd.print("Resistenza = ");
lcd.setCursor(6,1); 
lcd.print (rx);
lcd.setCursor(13,1);
lcd.print ("KΩ");
}
else {
lcd.clear(); //pulisce lo schermo
lcd.setCursor(1,0); //imposta il cursore nella prima riga e colonna,      
lcd.print("Resistenza = ");
lcd.setCursor(6,1); 
lcd.print (rx);
lcd.setCursor(13,1);
lcd.print ("Ω");  
}
    
if (rx < 15.00) 
tone (5,900,900);
delay (10);
}

    
  
   
   
 
  

Sapete dirmi se c'è qualche errore che non mi permette di visualizzare qualcosa nel 16x2 usando interfaccia I2C ???
(ho collegato il pin SDA nel pin A4 di Arduino e il pin SCL nel pin A5)

Su Tinkercad si può impostare l'indirizzo I2C dell'LCD, ma è decimale e non esadecimale. Devi usare quello che hai messo e probabilmente l'LCD ha un indirizzo I2C diverso da 0x27 (ossia 39).
Ad esempio 0x20 (ossia 32):
image
Per usare 0x27 devi impostarlo su 39.

Ok proverò! Grazie mille

Oltre alla questione dell'indirizzo, ci sono problemi anche con il codice.

La libreria che stai usando ha un nome molto comune e ci sono almeno 3/4 versioni diverse che però condividono lo stesso nome.

Quella usata di default su Tinkercad va inizializzata in questo modo:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(32,16,2);


void setup() {
  lcd.begin(16,2);
  lcd.init();
  lcd.backlight();
  ...

Nel "mondo reale" è vero (e dipende da quale libreria si usa), ma quella su Tinkercard (ma anche su Wokwi) non richiede " lcd.begin(16,2);", basta l'"lcd.init();" (e backlight). D'altronde l'inizializzazione 16,2 già viene specificata nel costruttore.

Si è vero... ho dimenticato di cancellare la riga dopo il copia incolla.

Ok grazie ma nella vita reale può andare bene o non funzionerà?

Nelle vita reale installi una delle tante librerie per LCD con interfaccia i2c ed invece di fare copia e incolla dai tutorial online, apri gli esempi inclusi e parti da li per sviluppare il resto :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.