Opiszę po krótce problem z jakim spotkałem się przy probie wymiany LCD 16x2 z tzw podświetleniem i kontrolą kontrastu na nowszy OLED firmy Winstar : WEH001602ALPP5N00001...z kontrolerem WS0010 który jak zapewnia producent i dostawca jest wpełni kompatybilny z HD44780 a na samym LCD pisze :EH001602A REV.H(C) . Mnie zależało aby podłączyć w/w do magistrali I2C przez konwerter dolutowany do LCD ...nawet dlatego iż konfiguracji wymaga tylko 4 przewody połączeniowe. Całość obsługuje program / skrypt w pythonie i czasami program lcdproc z opcją wyświetlania zegara tzw. opcją BIG + oczywiście internetowe radio oparte o programy mpd / mpc. Wszystko ładnie i pięknie działa na LCD z tzw. podświetleniem i to nawet na dwóch przezemnie posiadanych np. 40x2 - v- ERM4002DNS-1 i jeszcze jeden 16x2 -v- CBC016002A29-00 firmy AV-Display.... na LCD 16x2 Oled + konwerter I2C. Niestety po podłączeniu LCD OLED Winstar działa on tylko do pierwszego uruchomienia ( inicjalizacji ) potem już są dziwne efekty w postaci chaotycznych przekłamań w kolejności wyświetlanego kodu czy innych ślaczków. np.
Jedynym wyjściem jest odłączenie na chwilę kabelka +3 V / +5V lub GND ...bo ten LCD może pracować na dwóch napięciach zasilania.Ja niestety muszę w mojej konfiguracji czasami włączyć / wyłączyć dany program / skrypt pythona ...włączyć inny program i tu występuje ten efekt. Nigdzie w internecie nie mogę znaleźć jakiś podpowiedzi czy poprawki . Niestety w tym stanie nie mogę w/w LCD użytkować ... i niestety nie jestem osamotniony z tym problemem. W necie znalazłem takie przykłady o których można poczytać i obejrzeć np.
https://forum.mikroe.com/viewtopic.php?f=76&t=66331
https://www.youtube.com/watch?v=mXbyB6htKGw
Na jednym z forum raspbery pi też widnieje temat odnośnie LCD Oled i jakieś informacje ale raczej dotyczące połączeń i konfiguracji GPIO. Popytałem i tam ..ale wsumie na 100% nie wiem czy jest to do przejścia pisząc jakieś poprawki w skrypcie pythona czy niestety to wina źle działającego Oleda ? .... temat jest tu
https://www.raspberrypi.org/forums/view ... 5&p=514131
...mam nadzieję że nie będę zmuszony do powrotu na stary LCD z tzw. podświetleniem i marnymi kontami wyświetlania takich paneli.
I tu moje pytanie i prośba o pomoc ....czy jest jakaś możliwość softwarowego naprawienia tego błędu np. w skryptach pythona / driverach do interfejsu I2C ?
Mam nadzieję że tak bo .... w pewnym momencie po licznych kombinacjach "skleciłem" skrypt który potrafi wymazać / wyczyścić ekran LCD Oleda nawet z błędami i uruchomić się bezproblemowo za każdym razem ...a po nim mogłem nawet uruchomić program lcdproc z opcją dużego zegarka : big clock ...jednak podstawowy skrypt obsługujący radio internetowe tzn / prog. mpc już się nie uruchamia
Sory za przydługie objaśnienia ....
Podam może jeszcze poszczególne skrypty i pliki konfiguracyjne do programów z których korzystam a ten utworzony przezemnie jako kod:
Kod: Zaznacz cały
#!/usr/bin/python
#--------------------------------------
# ___ ___ _ ____
# / _ \/ _ \(_) __/__ __ __
# / , _/ ___/ /\ \/ _ \/ // /
# /_/|_/_/ /_/___/ .__/\_, /
# /_/ /___/
#
# lcd_i2c.py
# LCD test script using I2C backpack.
# Supports 16x2 and 20x4 screens.
#
# Author : Matt Hawkins
# Date : 20/09/2015
#
# http://www.raspberrypi-spy.co.uk/
#
# Copyright 2015 Matt Hawkins
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#--------------------------------------
import smbus
import time
# Define some device parameters
I2C_ADDR = 0x3f # I2C device address
LCD_WIDTH = 16 # Maximum characters per line
# Timing constants for low level write operations
# NOTE: Enable cycle time must be at least 1 microsecond
# NOTE2: Actually, these can be zero and the LCD will typically still work OK
EDEL_TAS = 0.00001 # Address setup time (TAS)
EDEL_PWEH = 0.00001 # Pulse width of enable (PWEH)
EDEL_TAH = 0.00001 # Address hold time (TAH)
# Timing constraints for initialisation steps - IMPORTANT!
# Note that post clear display must be at least 6.2ms for OLEDs, as opposed
# to only 1.4ms for HD44780 LCDs. This has caused confusion in the past.
DEL_INITMID = 0.01 # middle of initial write (min 4.1ms)
DEL_INITNEXT = 0.0002 # post ssecond initial write (min 100ns)
DEL_POSTCLEAR = 0.01 # post clear display step (busy, min 6.2ms)
# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line
LCD_BACKLIGHT = 0x08 # On
#LCD_BACKLIGHT = 0x0C # Off
ENABLE = 0b00000100 # Enable bit
# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005
#Open I2C interface
bus = smbus.SMBus(0) # Rev 1 Pi uses 0 (and Orange PI PC, for pins 3 and 5)
#bus = smbus.SMBus(1) # Rev 2 Pi uses 1
def lcd_init():
# Initialise display
lcd_byte(0x33,LCD_CMD) # 110011 Initialise
lcd_byte(0x32,LCD_CMD) # 110010 Initialise
lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
lcd_byte(0x01,LCD_CMD) # 000001 Clear display
time.sleep(E_DELAY)
# Now perform remainder of display init in 4 bit mode - IMPORTANT!
# These steps MUST be exactly as follows, as OLEDs in particular are rather fussy
lcd_byte(0x28,LCD_CMD) # two lines and correct font
lcd_byte(0x08,LCD_CMD) # display OFF, cursor/blink off
lcd_byte(0x01,LCD_CMD) # clear display, waiting for longer delay
lcd_byte(0x06,LCD_CMD) # entry mode set
# extra steps required for OLED initialisation (no effect on LCD)
lcd_byte(0x17,LCD_CMD) # character mode, power on
# now turn on the display, ready for use - IMPORTANT!
lcd_byte(0x0C,LCD_CMD) # display on, cursor/blink off
def lcd_byte(bits, mode):
# Send byte to data pins
# bits = the data
# mode = 1 for data
# 0 for command
bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT
# High bits
bus.write_byte(I2C_ADDR, bits_high)
lcd_toggle_enable(bits_high)
# Low bits
bus.write_byte(I2C_ADDR, bits_low)
lcd_toggle_enable(bits_low)
def lcd_toggle_enable(bits):
# Toggle enable
time.sleep(E_DELAY)
bus.write_byte(I2C_ADDR, (bits | ENABLE))
time.sleep(E_PULSE)
bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
time.sleep(E_DELAY)
def lcd_string(message,line):
# Send string to display
message = message.ljust(LCD_WIDTH," ")
lcd_byte(line, LCD_CMD)
for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)
def main():
# Main program block
# Initialise display
lcd_init()
while True:
# Send some test
lcd_string("RPiSpy <",LCD_LINE_1)
lcd_string("I2C LCD <",LCD_LINE_2)
time.sleep(3)
# Send some more text
lcd_string("> RPiSpy",LCD_LINE_1)
lcd_string("> I2C LCD",LCD_LINE_2)
time.sleep(3)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
pass
finally:
lcd_byte(0x00, LCD_CMD)
lcd_byte(0x01, LCD_CMD)
lcd_byte(0x08, LCD_CMD)
Dostałem też informację od fachowca ....ale powiedzmy szczerze mnie to mało mówi :
Załączam zatem w/w i dostarczone kody demo ... a o zastosowanym konwerterze I2C mogę powiedzieć tyle iż jest to model z chipem : PCF 8574AT ( i2cdetect -y 0 = 0x3f ) .... więcej : https://www.rhydolabz.com/wiki/?p=16424Niestety brak tu tak na prawdę jakichkolwiek informacji o zastosowanym konwerterze I2C .To czy dany wyświetlacz będzie działał poprawnie z zapojektowanym wcześniej przez Pana układem można sprawdzić zaglądając do datasheetu.Jeżeli chodzi o model WEH001602ALPP5N00001 to obsługuje on interface-y serii 6800, 8080 i transmisję szeregową. W załączniku przesyłam przykładowe kody demo, zawierające kod inicjalizacyjny (język C). Jak można zauważyć każdy z plików odpowiada innemu interface-owi. Proszę o sprawdzenie czy poprawnie inicjalizuje wyświetlacz oraz czy stosuje dozwolony interface. I inna :Na pewno da się to ograć. Myślę, że nie chodzi to o samo I2C tylko coś innego.W zwykłym LCD niektóre bity są bez znaczenia w rozkazach OLED w nieużywanych ma dodatkowe funkcje.
Jeśli mamy poprawny kod zadziała po I2C i na LCD i na OLEDzie
https://tronixlabs.com.au/display/lcd/s ... australia/
pozdrawiam!