Salve come da titolo vi scrivo per un problema mentre sperimentavo la regolazione del contrasto di un lcd 20x4 con chip compatibile con l'HD4478 attraverso un potenziometro digitale MCP4251 da 10k.
In più utilizzo un PCF8574AP per la comunicazione i2c col lcd e due pulsanti per incrementare o decrementare la tensione sul pin di contrasto sul lcd.
il codice è il seguente:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <buttons.h>
#define CS_DIGIPOT 10
int pos = 20;
unsigned long time;
LiquidCrystal_I2C lcd(0x38,4,5,6); // Set the LCD I2C address
Button UP, DOWN;
//LiquidCrystal_I2C lcd(0x38, BACKLIGHT_PIN, POSITIVE); // Set the LCD I2C address
// Creat a set of new characters
const uint8_t charBitmap[][8] = {
{ 0xc, 0x12, 0x12, 0xc, 0, 0, 0, 0 },
{ 0x6, 0x9, 0x9, 0x6, 0, 0, 0, 0 },
{ 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0, 0x0 },
{ 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0, 0x0 },
{ 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0x0 },
{ 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0x0 },
{ 0x0, 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0x0 },
{ 0x0, 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0x0 }
};
void setup()
{
pinMode(CS_DIGIPOT, OUTPUT);
digitalWrite(CS_DIGIPOT, HIGH);
SPI.begin();
int charBitmapSize = (sizeof(charBitmap ) / sizeof (charBitmap[0]));
UP.assign(7); UP.setMode(OneShot); UP.turnOnPullUp();
DOWN.assign(5); DOWN.setMode(OneShot); DOWN.turnOnPullUp();
write_digipot(0,pos);
lcd.begin(20,4); // initialize the lcd
for ( int i = 0; i < charBitmapSize; i++ )
{
lcd.createChar ( i, (uint8_t *)charBitmap[i] );
}
UP.check(); DOWN.check();
lcd.home (); // go home
lcd.print("Hello, ARDUINO ");
lcd.setCursor ( 0, 1 ); // go to the next line
lcd.print (" FORUM - fm ");
delay ( 1000 );
time = 0;
}
void loop()
{
if(millis() - time > 200){
time = millis();
lcd.home ();
// Do a little animation by writing to the same location
for ( int i = 0; i < 4; i++ )
{
lcd.setCursor ( 0, i );
for ( int j = 0; j < 20; j++ )
{
lcd.print (char(random(7)));
}
}
}
if(UP.check() == ON)
{if(pos < 250) write_digipot(0, pos++);}
else if(DOWN.check() == ON)
if(pos > 0) write_digipot(0, pos--);
}
void write_digipot(int pot, int value){
int _selectPot;
if(pot == 0)
_selectPot = B00000000;
else
_selectPot = B00010000;
digitalWrite(CS_DIGIPOT, LOW);
SPI.transfer(_selectPot);
SPI.transfer(value);
digitalWrite(CS_DIGIPOT, HIGH);
}
allora, il problema è che 4 volte su 6 l'lcd si accende ma vengono visualizzati solo i quadratini nero chiaro. Anche se premo i due pulsanti però i quadratini si schiariscono o si anneriscono come è normale aspettarsi ma nessuna traccia dei caratteri che andrebbero scritti.
Invece, a volte, l'lcd si accende e il programma parte senza problemi: vengono visualizzati i caratteri e coi pulsanti regolo il contrasto. Come mai, senza cambiare l'hardware, a volte funziona e a volte no?
Grazie in anticipo per le risposte ![]()