Arduio I2C LCD 16x2 näytön ongelma

Ohjelman lataamisen jälkeen näyttö toimii normaalisti. Virran katkaisun jälkeen ja uudelleen yhdistettäessä taustavalo syttyy, mutta tekstiä ei näy. Arduinon resetointi palauttaa näytön toimivaksi.
Löytyisikö konsteja ongelman ratkaisuun? Vähän hankala sellaisissa sovelluksissa, joissa arduino on välillä virrattomana.

Noilla tiedoilla on vaikea sanoa mitään tarkempaa, mutta kuulostaa Brown Outilta joko Arduinon tai sen näytön osalta. Onko sulla BOD päällä? Odotatko tarpeeksi kauan käyttöjännitteen tasaantumista ennen kuin alustat näytön? Arduino saattaa alkaa toimimaan jo paljon alemmalla jännitteellä kuin näyttö, jolloin liian nopeasti näytölle annetut komennot menevät harakoille. Kokeile alustaa näyttö uudelleen vaikkapa nappia painamalla.

Käytätkö jotain valmista ohjelmaa tuon ohjaamiseen? Itse tein aikanaa omat rutiinit 16x2 näytölle ja sitten myöhemmin 64x128 graafiselle näytölle, jolloin tuli kahlattua läpi nuo alustuskomennot ajoituksineen. Ei ollut I2C tosin, vaan rinnakkainen data ja SPI.

Kokeilin näyttöä “HELLO WORLD” sketsillä. Ylösvetovastuksilla ei ole vaikutusta toimitaan. Virran kytkennän jälkeen resetoimalla UNO, näyttö päivittyy.

En ole koskaan käyttänyt Arduinoa enkä sen sketsejä, joten niissä suoraan en osaa auttaa. Arduinohan on vain tuotteistettu AVR, jota taas olen käyttänyt koko 2000-luvun.

Jos kerran resetointi auttaa, vaikuttaa todennäköiseltä, että ongelma johtuu käyttöjännitteistä. Resetointihan käynnistää uudelleen mikrokontrollerin eli suorittaa alusta lähtien ohjelmansa. Ainoa ero virrankatkaisuun on siinä, että käyttöjännite on jo ollut stabiili pitkän aikaa resetointia tehdessä. Kokeile laittaa joku viivästys ennen kuin suoritat tuon “Hello Woldin”. Tekeekö se myös näytön resetoinnin vai pitääkö se tehdä erikseen. Noille näytöille ei voi vaan alkaa kirjoittamaan, vaan ne pitää alustaa. Alustuksen aikana initioidaan näyttö, kerrotaan datasiirtomuoto, tyhjennetään näyttö, laitetaan mahdollinen kursori päälle, kerrotaan liikkuuko kursori ja lopulta laitetaan näyttö päälle. Ilman oikein tehtyä alustusta näyttö ei toimi lainkaan tai toimii väärin. Taustavalo vaatii vain virtaa, joten sen saa kyllä päälle alustamattakin. Toisin sanoen juuri se alustus pitää tehdä vasta sitten kun näytön käyttöjännite on sen spekseissä ja aikaa tuosta on kulunut tarpeeksi.

Tässä vielä tekemäni alustuskoodi 2000-luvun alusta. Tuossa siis LCD saa käyttöjännitteensä AVR:n portista. Virtojen kytkemisen jälkeen odotetaan 16 ms ja sitten tehdään alustus. Koko lcd_init() kutsukin on vasta myöhäisessä vaiheessa, jolloin koko systeemin käyttöjännite on ehtinyt stabiloitua.

void lcd_init() { outp(0xff, LCD_DDR); /* Enable port as output */ outp(BV(POWER), LCD_PORT); /* Power on*/ msleep(16); /* 16 ms delay */ lcd_send(INIT | COMMAND, FUNCTION_SET | BITS_8); /* Init display */ msleep(5); /* 4.1 ms delay */ lcd_send(INIT | COMMAND, FUNCTION_SET | BITS_8); /* Init display */ msleep(1); /* 100 us delay */ lcd_send(INIT | COMMAND, FUNCTION_SET | BITS_8); /* Init display */ lcd_send(INIT | COMMAND, FUNCTION_SET); /* Init display to nibble*/ lcd_send(COMMAND , FUNCTION_SET | TWO_LINES); /* Nibble and two lines */ lcd_send(COMMAND, DSP_ON_OFF); /* Display off */ lcd_send(COMMAND, CLEAR_DSP); /* Clear display */ msleep(16); /* Slow instruction 16 ms delay */ lcd_send(COMMAND, ENTRY_MODE | CURSOR_INCR); /* Entry mode increment, no sift */ lcd_send(COMMAND, DSP_ON_OFF | DSP_ON); /* Display on, no cursor, no blink */ lcd_char(); }

koitappa seuraavaa muutosta:

void setup()
{
delay(1000) // n. 1 sekunnin viive
lcd.init(); // initialize the lcd

// Print a message to the LCD.
lcd.backlight();
lcd.print(“Hello, world!”);
}

jos tämä poistaa ongelmasi, on Uunossa, tai powerissa jokin vika.
oletettavasti käyttöjännite nousee hitaasti, ja ei ehdi stabiloitua ennen lcd.init(); komentoa…

Hei, kokeilin viiveen kanssa ja tuhdimmalla virtalähteellä, kuin USB (6,2 V), mutta käyttäytyminen ei muuttunut.

jos viive ei auttanut, luulen että vika on LCD’ssä, mutta kokeileppa vielä seuraavaa konstia.

void setup()
{
delay(1000) // n. 1 sekunnin viive
lcd.init(); // initialize the lcd

// Print a message to the LCD.
lcd.backlight(); // voi aiheuttaa jännitteen notkahtamisen
// jolloin uudelleen initointi “herättää” LCD’n
delay(100);
lcd.init(); // initialize the lcd
lcd.print(“Hello, world!”);
}

Hei, eipä tuottanut apua tämäkään muutos. Pääsin kokeilemaan uutta 20x4 näyttöä, se käyttäyti samalla tavalla. Ei siedä virran katkaisua.

Helpottaisi auttamista, jos kertoisit enemmän. Siis onko sinulla LCD joka tukee suoraan I2C väylää vai onko tuo tavallinen rinnakkaisväylällä toimiva + I2C->rinnakkaisväylä muunnin?

Mistä virta tulee LCD:lle? Suoraan samasta paikasta kuin Arduinolle vai Arduinon pinnistä? Näytä käyttämäsi koodi.

Onko näyttö täysin tyhjä kun “ei toimi”? Toimiiko Arduino normaalisti, kun näyttö ei toimi?

Näyttö on tuollainen ebay.com/itm/IIC-I2C-TWI-SP- … SweW5VRiZ3.
Virran syöttö arduinon kautta +5 V ja -. Arduino on saanut virtansa Usb:n katta sekä arduinon virran syöttöliittimestä ulkoisella virtalähteellä. Virran katkaisun jälkeen ja uudelleen yhdistettäessä, arduino jatkaa toimintaansa ja näytön taustavalo syttyy, mutta muuten näyttö on “pimeä”.
Luule, että virran katkaisun yhteydessä näyttö unohtaa ohjelman alussa olevat kirjastot ja void setupissa olevat asiat, kun taas arduino jatkaa toimintaansa void loopissa.

Tuolla olen kokeillut ja eri mittaisilla viiveillä eri kohdissa.

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

void setup()
{
// delay(20);
lcd.clear();
lcd.init();
lcd.backlight();
lcd.print(“Hello, world!”);
}
void loop()
{
delay(20);
lcd.setCursor(0,1);
lcd.print(“KOE”);
}

Oletko varma, että koodisi on toimiva?

Tässä näyttää olevan lcd.begin ja sitten tuolle lcd:lle on annettu pinnijärjestys.
https://arduino-info.wikispaces.com/LCD-Blue-I2C?responseToken=99cb398fb5c8d3091684bf7a9702465b

Hei, kiitokset vastaajille mielenkiinnosta ja vaivannäöstä ongelmaani kohtaan. “Yritys ja erehdys” menetelmällä sain näytön heräämään virran katkaisun jälkeen. Ohessa muutettu versio. Oleellista oli lcd.init():n siirto void loopin sisään.

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

void setup()
{
lcd.backlight();
}
void loop()
{
lcd.init();
lcd.print(“Hello, world!”);
lcd.setCursor(0,1);
lcd.print(“KOE”);
}

En nopeasti löytänyt mitään dokumentaatiota mitä tuo lcd.init() tarkemmin tekee. Olen kyllä melko varma, että sitä on tarkoitus kutsua vain kerran aloitettaessa LCD:n käyttö eli sen oikea paikka on tuo setup. Nyt koodisi kutsuu tuota lcd.ini():iä ja sitten kirjoittaa tekstit jatkuvasti nopealla tahdilla. Se siis tekee vähän saman kuin se resetointi eli alkaa uudestaan alusta LCD:n käytön. Jotain on pielessä, jos ei toimi setupissa.

Komppaan kyllä vahvasti tätä. Näyttö alustetaan käyttökuntoon kerran ohjelman käynnistyessä ja jos sillä ei toimi niin jotain on hassusti.

Vähän häiritsee tämä Arduino-kirjastojen käyttö. Niitä tai kyseistä kikkaretta kun itse ei ole oikeasti käpistellyt koskaan.