LCD 16x2 / OLED firmy Winstar / I2C - nie działa prawidłowo po ponownej inicjalizacji

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
kobrawerde
Piegowaty Guziec
Piegowaty Guziec
Posty: 15
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontaktowanie:

LCD 16x2 / OLED firmy Winstar / I2C - nie działa prawidłowo po ponownej inicjalizacji

Postautor: kobrawerde » 20 cze 2017, 22:23

Obrazek Obrazek
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.
Obrazek
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ć :cry: ... 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/viewtopic.php?t=68055&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)
   

Może ktoś znający się dobrze na programowaniu w pythonie ... lub na samych wyświetlaczach LCD / Oled i ich programowaniu coś podpowie ...

Dostałem też informację od fachowca ....ale powiedzmy szczerze mnie to mało mówi :
Niestety 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

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=16424
https://tronixlabs.com.au/display/lcd/serial-i2c-backpack-for-hd44780-compatible-lcd-modules-australia/



pozdrawiam!
Załączniki
kody demo.rar
(5.57 KiB) Pobrany 10 razy
konfig.rar
(4.14 KiB) Pobrany 11 razy
Awatar użytkownika
kobrawerde
Piegowaty Guziec
Piegowaty Guziec
Posty: 15
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontaktowanie:

Re: LCD 16x2 / OLED firmy Winstar / I2C - nie działa prawidłowo po ponownej inicjalizacji

Postautor: kobrawerde » 27 cze 2017, 11:37

Co najlepsze w Oled tej samej firmy Winstar ale w wersji 40x2 występuje ten sam kontroler : WS0010 ...ale jak można dokładnie wyczytać są w nim dwa takie kontrolery :pt36: ... i pewnie znowu będzie "zagwozdka dla przyszłych nabywców" wymagana zmiana kodu bo nie będzie działał z oprogramowaniem pod HD44780 ani nawet z dostosowanym do Oleda 16x2 ... a może nie ? ... :mrgreen:
Apropo trochę udało mi się z tym Oledem na kontrolerze WS0010 ......mimo braku znajomości pythona i programowania ... dostosowałem / no może prawidłowo skleciłem :-) .... jakieś wpisy do pracy tego Oled-a ....zlepek różnych kodów i wpisów , skryptów ( znalezionych w necie ) ...nie działa jeszcze tak jak powinien ale o dziwo coś wyświetla. Pomoc dalej potrzebna !....a swoje "wypociny" jak mi się uda ....i będzie obsługiwać ten Oled 16x2 choć w 40 % zamieszczę tutaj

Kod: Zaznacz cały

#!/usr/bin/python
# -*- coding: utf-8 -*-

import smbus
import time
import subprocess

from time       import sleep, strftime
from datetime   import datetime
from subprocess import *

# 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.005
E_DELAY = 0.005

#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)


  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 replace_pl(chars):
  pl = {  'ą': 'a',
          'ć': 'c',
          'ę': 'e',
          'ł': 'l',
          'ń': 'n',
          'ó': 'o',
          'ś': 's',
          'ź': 'z',
          'ż': 'z',
          'Ą': 'A',
          'Ć': 'C',
          'Ę': 'E',
          'Ł': 'L',
          'Ń': 'N',
          'Ó': 'O',
          'Ś': 'S',
          'Ź': 'Z',
          'Ż': 'Z',
  }
  for f, t in pl.items():
    chars = chars.replace(f,t)
  return chars

def main():

  # Initialise display
  lcd_init()

  counter = 0

  while True:

  # Get current status and playtime
    process = subprocess.Popen('sudo mpc -v', shell=True, stdout=subprocess.PIPE)
    ekran1 = process.communicate()[0]
    ekran1 = replace_pl(ekran1)
    statusLines = ekran1.split('\n')
    ekran1 = statusLines[1]
    if ekran1 <> '':
      ekran1L1 = ekran1.split(' ',1)[0].strip()
      ekran1L2temp = ekran1.split(' ',1)[1].strip()
      ekran1L2 = ekran1L2temp.split(' ',1)[0].strip()

    process = subprocess.Popen('sudo mpc -f %name%', shell=True, stdout=subprocess.PIPE)
    ekran2 = process.communicate()[0]
    ekran2 = replace_pl(ekran2)
    statusLines = ekran2.split('\n')
    ekran2 = statusLines[0]
    ekran2L1 = ekran2[0:16]
    ekran2L2 = ekran2[16:31]

    process = subprocess.Popen('sudo mpc -f %artist%', shell=True, stdout=subprocess.PIPE)
    ekran3 = process.communicate()[0]
    ekran3 = replace_pl(ekran3)
    statusLines = ekran3.split('\n')
    ekran3 = statusLines[0]
    ekran3L1 = ekran3[0:16]
    ekran3L2 = ekran3[16:31]

    process = subprocess.Popen('sudo mpc -f %title%', shell=True, stdout=subprocess.PIPE)
    ekran4 = process.communicate()[0]
    ekran4 = replace_pl(ekran4)
    statusLines = ekran4.split('\n')
    ekran4 = statusLines[0]
    ekran4L1 = ekran4[0:16]
    ekran4L2 = ekran4[16:31]

    if counter == 1:
      if ekran1 == "":
        counter = 15
      else:
        lcd_string(ekran1L1,LCD_LINE_1)
        lcd_string(ekran1L2,LCD_LINE_2)
    if counter == 15:
      if ekran2 == "":
        counter = 30
      else:
        lcd_string(ekran2L1,LCD_LINE_1)
        lcd_string(ekran2L2,LCD_LINE_2)
    if counter == 30:
      if ekran3 == "":
        counter = 45
      else:
        lcd_string(ekran3L1,LCD_LINE_1)
        lcd_string(ekran3L2,LCD_LINE_2)
    if counter == 45:
      if ekran4 == "":
        counter = 60
      else:
        lcd_string(ekran4L1,LCD_LINE_1)
        lcd_string(ekran4L2,LCD_LINE_2)

    sleep(0.1)
    counter = counter + 1
    if counter == 61:
      counter = 1


if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x00, LCD_CMD)
    lcd_byte(0x01, LCD_CMD)
    lcd_byte(0x08, LCD_CMD)


Ten skrypt uruchamia się za każdym razem ...jednak czasem są przestawione wpisy z góry na dół Oled-a ? ... i czasem ale rzadko występuje podany błąd jak w pierwszym poście ?... jednak kombinacją pewnych wpisów / skryptów uruchamianych w pewnej kolejności prawie nie mam już błędów tzn u mnie uruchamiana skryptu obsługująceo radiointernetowe a dokładnie program mpc / mpd oraz programu lcdproc i prostej w nim opcji dużego zegarka : big Clock
Trik polega iż w pewnej kolejności uruchamiam skrypt w pythonie do ...hmmy chyba czysczenia wyświetlacza ? ..może pamięć ram nie mam pojęcia ale działa :-) skrypt który używam do czyszczenia wyświetlacza :

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
LCD_HEIGHT = 2

# 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.0001
E_DELAY = 0.0001

#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_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 main():
  # Main program block



    # Send some test
    lcd_string("RPiSpy         <",LCD_LINE_1)
    lcd_string("I2C LCD        <",LCD_LINE_2)


if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x00, LCD_CMD)
    lcd_byte(0x01, LCD_CMD)
    lcd_byte(0x08, LCD_CMD)


Pod przyciski w pilocie przypisałem skrypty w bash np. mpc-start.sh (uruchamia skrypt do obsługi mpc) / mpc-stop.sh (zatrzymuje mpc / skrytp pod niego i uruchamia pr. lcdproc z obsługą zegarka )

Kod: Zaznacz cały

#! /bin/sh
/bin/sh /root/1.sh
python /root/radio.py &

Kod: Zaznacz cały

#! /bin/sh
mpc stop
killall python
killall lcdproc
killall LCDd
python /root/lcd-clear.py
LCDd -c /etc/LCDd.conf
lcdproc -c /etc/lcdproc.conf

Stosuje jeszcze jeden skrypt ....1.sh który czyści wyświetlacz i jest używany w kombinacji

Kod: Zaznacz cały

#!/bin/bash
killall lcdproc
killall LCDd
python /root/lcd-clear.py

Nie powiem wam czemu tak ...bo jak wspomnialem nie jestem programistą ...jednak dla mnie to działa :-) .... no barzdzo żadko ale jednak od czasu do czasu jeszcze przy przełączaniu między programem lcdproc ( killall lcdproc / LCDd ) a skryptem występuje błąd jak zwykle : ślaczki itp ale można go zlikwidować skryptem lcd-clean.sh choć czasem trzeba uruchomić go 2X ...jak widać nie wpełni to funkcjonuje ...ale jednak :-)
może komuś się przyda ... ale najlepiej jakby ktoś to napisał profesjonalnie ..i z głową ...na bezrybiu i rak ryba :-D

Ps. dodam jeszce załączniki / przykładowe kody inicjalizacyjne do OLED-a 40x2 WEH004002ALPP5N00000 wraz z funkcją wpisującą dane ( to raczej info dla zaawansowanych ) ...dostarczone wcześniej od serwisu / dystrybutorów w/w Oled-ów Winstar

LINK
pozdrawiam!
Załączniki
kody-oled-40x2.rar
(2.9 KiB) Pobrany 11 razy
Awatar użytkownika
kobrawerde
Piegowaty Guziec
Piegowaty Guziec
Posty: 15
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontaktowanie:

Re: LCD 16x2 / OLED firmy Winstar / I2C - nie działa prawidłowo po ponownej inicjalizacji

Postautor: kobrawerde » 13 sie 2017, 14:44

Trochę dłubaniny było ale chyba się udało tu efekt :
https://youtu.be/lhN4EJJ47qo

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości