Problema schermo i2c

buonasera a tutti

lo so immagino siate stanchi di leggere post in cui si chiede aiuto per l'interfaccia i2c su un lcd.
Mi trovo tuttavia costretto a chiedere aiuto perchè nonostante le mie ricerche sul forum e in generale su internet non riesco proprio a risolvere il mio problema.

Da qualche settimana sono sto cercando di programmare il mio arduiono due per comandare un'apparecchiatura.

Acquisto anche un lcd 20x4 che collego direttamante a 12 fili per mostrami le temperature, tuttavia mi accorgo che una volta attivato il tutto quest'ultimo comincia ad avere problemi di interferenze (mostra ogni tanto caratteri strani ect) quindi mi viene consigliato di provare il collegamento i2c

mi prendo uno di questi

e provo a smanettarci un po
dopo un bel po di tentativi vari, post letti, ricerche eseguite, sono ancora al punto di partenza il mio lcd non visualizza nessun messaggio

Ora lanciando i2c scanner su che l'indirizzo del mio dispositivo è 27x0;
guardando LCD blue i2c vedo che il mio modulo rispecchia il 1° tipo e copio il codice di prova;
scarico la newliquidcrystal avendo cura di eliminare prima le librerie della liquidcrystal classica;
provo il tutto e nulla
muovo il potenziometro e vedo correttamente i 32 quadratini bianchi torno leggermente indietro e nulla

ora il codice che utilizzio è questo:

#include <Wire.h>  // Comes with Arduino IDE
// Get the LCD I2C Library here: 
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
// Move any other LCD libraries to another folder or delete them
// See Library "Docs" folder for possible commands etc.
#include <LiquidCrystal_I2C.h>

/*-----( Declare Constants )-----*/
/*-----( Declare objects )-----*/
// set the LCD address to 0x27 for a 16 chars 2 line display
// A FEW use address 0x3F
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

/*-----( Declare Variables )-----*/
//NONE

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);  // Used to type in characters

  lcd.begin(16,2);   // initialize the lcd for 16 chars 2 lines, turn on backlight

// ------- Quick 3 blinks of backlight  -------------
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on  

//-------- Write characters on the display ------------------
// NOTE: Cursor Position: (CHAR, LINE) start at 0  
  lcd.setCursor(0,0); //Start at character 4 on line 0
  lcd.print("Hello, world!");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("HI!YourDuino.com");
  delay(8000);

// Wait and then tell user they can start the Serial Monitor and type in characters to
// Display. (Set Serial Monitor option to "No Line Ending")
  lcd.clear();
  lcd.setCursor(0,0); //Start at character 0 on line 0
  lcd.print("Use Serial Mon");
  lcd.setCursor(0,1);
  lcd.print("Type to display");


}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  {
    // when characters arrive over the serial port...
    if (Serial.available()) {
      // wait a bit for the entire message to arrive
      delay(100);
      // clear the screen
      lcd.clear();
      // read all the available characters
      while (Serial.available() > 0) {
        // display each character to the LCD
        lcd.write(Serial.read());
      }
    }
  }

}/* --(end main loop )-- */


/* ( THE END ) */

L'unico effetto che vedo è l'accensione e rapido spegnimento della backlight per 3 volte come da prime righe del setup

Ho provato per scrupolo anche gli altri codici caricati nella pagina LCD blue ma nulla
Ho ricontrollato i cavi ma sembra tutto corretto

IL dubbio che mi è venuto è che effettivamente la newliquid funzioni correttamente con arduino 2 ma non trovo nulla a riguardo

Vi ringrazio in anticipo per l'aiuto

Mi accorgo ora che probabilamete la sezione corretta era software e non hardware :cold_sweat:

nel codice troverete scritto un lcd.begin 16x2 (è corretto lo sto testato su questo)

Due cose ...

... primo, ho tolto, dal tuo primo post, un tuo riferimento ad un qualche cosa che funziona a tensione di rete ... il punto 15 (... e suoi sottopunti) del REGOLAMENTO (che dovresti aver letto), NON permette discussioni in cui si parli di oggetti che lavorano oltre la bassissima tensione ... ti prego quindi di NON fare alcun riferiemnto ad oggetti operanti con tensioni superiori o ... dovrò chiudere immediatamente il thread. :confused:

... secondo, come da te indicato, ho provveduto a spostare il tuo thread dalla sezione hardware a quella software.

Buona continuazione. :slight_smile:

Guglielmo

Mah, io quando vedo una libreria LiquidCrystal_I2c che non è quella di Testato, ne sto alla larga.
Ancora più alla larga da una libreria a cui devi dire i pin del LCD che hai collegato all'interfaccia !!!

Quindi, prima di tutto, prova con QUESTA. Mai avuto problemi da ANNI.

Poi spero che i collegamenti tra l'interfaccia I2c e display siano stati fatti correttamente, magari meglio una foto.

Per ultimo, quel display ha dei problemi di disturbi, conosciuti e meno conosciuti, però prima cerchiamo di far apparire qualcosa, poi ne parliamo.

Grazie steve-cr della risposta
ecco le immagini dei collegamenti


spero sia sufficentemente visibile

Ho appena scaricato la libreria di Testato e l'ho installata
ho provato uno sketch hello world

#include <Wire.h> 
#include <PCF8574_HD44780_I2C.h>


// Address 0x27, 16 chars, 2 line display
PCF8574_HD44780_I2C lcd(0x27,16,2);


void setup()
{
  lcd.init();           // LCD Initialization              
  lcd.backlight();      // Backlight ON
  lcd.clear();          // Clear the display
  
  lcd.setCursor(0,0);   // Set the cursor to col 0, row 0
  lcd.print("Hello");   // Print the first word
  lcd.setCursor(0,1);   // Set the cursor to col 0, row 1
  lcd.print("World!");  // Print the second word
}

void loop()
{
}

ma mi da questo errore

Arduino: 1.8.13 (Windows 10), Board: "Arduino Due (Programming Port)"

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp: In member function 'void PCF8574_HD44780_I2C::begin(uint8_t, uint8_t, uint8_t)':

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp:82:19: error: '_BV' was not declared in this scope

  write4bits(_BV(P4) | _BV(P5)); 

                   ^

In file included from C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp:11:0:

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp: In member function 'void PCF8574_HD44780_I2C::backlight()':

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.h:29:29: error: '_BV' was not declared in this scope

 #define LCD_BACKLIGHT _BV(P3)  // Led ON

                             ^

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp:215:16: note: in expansion of macro 'LCD_BACKLIGHT'

  _backlightval=LCD_BACKLIGHT;

                ^

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp: In member function 'virtual size_t PCF8574_HD44780_I2C::write(uint8_t)':

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.h:33:18: error: '_BV' was not declared in this scope

 #define Rs _BV(P0)     // Register select

                  ^

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp:228:14: note: in expansion of macro 'Rs'

  send(value, Rs);

              ^

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp: In member function 'void PCF8574_HD44780_I2C::pulseEnable(uint8_t)':

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.h:31:18: error: '_BV' was not declared in this scope

 #define En _BV(P2)     // Enable

                  ^

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp:256:24: note: in expansion of macro 'En'

  expanderWrite(_data | En); // En high

                        ^

exit status 1

Error compiling for board Arduino Due (Programming Port).



This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.


ecco le immagini

La macro _BV() è definita, in <avr/sfr_defs. h>, solo per MCU AVR e tu stai usano Arduino DUE che invece monta una MCU ARM (AT91SAM3X8E) e quindi tale macro NON è definita.

Puoi aggiungerla tu alla libreria dato che è semplicemente definita come:

#define _BV(n) (1 << n)

Guglielmo

P.S.: Comunque non ho idea se la libreria e se quel adattatore I2C, funzionino con Arduino DUE ... ::slight_smile:

ok allora se ho capito bene mi basta modificare il codice in questo modo

#include <Wire.h> 
#include <PCF8574_HD44780_I2C.h>

#define _BV(n) (1 << n)

// Address 0x27, 16 chars, 2 line display
PCF8574_HD44780_I2C lcd(0x27,16,2);


void setup()
{
  lcd.init();           // LCD Initialization              
  lcd.backlight();      // Backlight ON
  lcd.clear();          // Clear the display
  
  lcd.setCursor(0,0);   // Set the cursor to col 0, row 0
  lcd.print("Hello");   // Print the first word
  lcd.setCursor(0,1);   // Set the cursor to col 0, row 1
  lcd.print("World!");  // Print the second word
}

void loop()
{
}

provo a caricarlo ma mi da ancora errore

Arduino: 1.8.13 (Windows 10), Board: "Arduino Due (Programming Port)"



C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp: In member function 'void PCF8574_HD44780_I2C::begin(uint8_t, uint8_t, uint8_t)':

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp:82:19: error: '_BV' was not declared in this scope

  write4bits(_BV(P4) | _BV(P5)); 

                   ^

In file included from C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp:11:0:

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp: In member function 'void PCF8574_HD44780_I2C::backlight()':

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.h:29:29: error: '_BV' was not declared in this scope

 #define LCD_BACKLIGHT _BV(P3)  // Led ON

                             ^

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp:215:16: note: in expansion of macro 'LCD_BACKLIGHT'

  _backlightval=LCD_BACKLIGHT;

                ^

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp: In member function 'virtual size_t PCF8574_HD44780_I2C::write(uint8_t)':

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.h:33:18: error: '_BV' was not declared in this scope

 #define Rs _BV(P0)     // Register select

                  ^

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp:228:14: note: in expansion of macro 'Rs'

  send(value, Rs);

              ^

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp: In member function 'void PCF8574_HD44780_I2C::pulseEnable(uint8_t)':

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.h:31:18: error: '_BV' was not declared in this scope

 #define En _BV(P2)     // Enable

                  ^

C:\Users\Roby\Documents\Arduino\libraries\PCF8574_HD44780_I2C\PCF8574_HD44780_I2C.cpp:256:24: note: in expansion of macro 'En'

  expanderWrite(_data | En); // En high

                        ^

exit status 1

Error compiling for board Arduino Due (Programming Port).



This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Non avevo visto il tuo p.s gpb

Stavo pensando se a questo punto qualcuno puo consigliarmi un adattatore i2c che dia meno problemi di compatibiltà.

Potrei anche provare ad utilizzare un mkr1010 che ho a disposizione
in questo caso questa parte di codice resterebbe invariata?

#define _BV(n) (1 << n)

Mullen26:
ok allora se ho capito bene mi basta modificare il codice in questo modo ...

NO, quella #define la devi mettere dentro al .h della libreria NON nel tuo codice, altrimenti NON viene vista quando compila la libreria.

Guglielmo

non avevo capito per nulla :cold_sweat: :smiley:
Ora l'ho inserita nel file h

Effettivamente il codice viene caricato correttamente, tuttavia per quanto riguarda lo schermo purtroppo non appare ancora nessun carattere

Mullen26:
Effettivamente il codice viene caricato correttamente, tuttavia per quanto riguarda lo schermo purtroppo non appare ancora nessun carattere

... ma sei sicuro che quell'adattatore sia fatto per lavorare con Arduino DUE che ha tutti i pin di I/O a 3.3V (... inclusi i pin del I2C) e NON a 5V come, di solito, è richiesto?

Guglielmo

..e, aggiungo: ma devi per forza lavorare con la DUE? :wink:

In realtà no anche perche non riesco a trovare le specifiche e il datasheet dell'adattatore in questione...

Pet quanto riguarda le board ho a disposizione una due e una mkr1010 purtroppo anche quella a 3,3 v

Allora per semplificare ti direi di provare semplicemente con un convertitore di livello da mettere in mezzo ai pin I2C, ma significa pure che devi avere una sorgente a 5V.

docdoc:
Allora per semplificare ti direi di provare semplicemente con un convertitore di livello ...

... mmm, molto meglio quello di Adafruit appositamente fatto per il bus I2C e che contiene già le pull-up su entrambi i lati. Io lo uso ormai dovunque :smiley:

Guglielmo

*P.S.: Su AliExpress si trova a meno di un decimo del prezzo * :grin:

Allora ragazzi

Comincio nel ringraziare tutti per le risposte che mi avete fornito fino ad ora e vi aggiorno sulla situazione attuale

Stasera ho dedicato ancora qualche ora al mio schermo nel tentativo di capirci qualcosa.
Praticamento ho resettato tutto quanto, reinstallato tutte le librerie e rifatto upload dello sketch sul mkr1010....praticamente ho visto i caratteri per circa un sec e poi sparito tutto.
quindi ho ripreso il 20x4 al posto del 16x2 riprovato e questo funziona :-X

Riprovato anche con arduino 2 e funziona correttamente solo il 20x 4

Presenta solo un picco problema di instabilita sulla seconda riga(tende a lampeggiare in corrispondeza del refesh)
Mi chiedo se a questo punto converrebbe installare il famoso convertitore di livello di cui mi parlavate prima per tentare di eliminare eventuali disturbi. potrebbe aiutare?

Domanda forse sciocca: ma tu i display li alimenti a 5V, vero?....

Si corretto per ora alimentato dal 5v del mkr
poi quando sarà installato verrà alimentato dal lm7805.

... alimenta anche il convertitore I2C a 5V ed usa i "level shifter" sui due pin I2C.

Guglielmo