October 18, 20241 yr Hi there, recently I bought an Orange Pi Zero3 with 1GB RAM. I want to connect a 20*4 character LCD display(https://www.tinytronics.nl/en/displays/lcd/lcd-display-20*4-characters-with-white-text-and-blue-backlight-with-i2c-backpack) to it. I have previously used this display with Arduino UNO, which worked great. Now I want to use it with the Orange Pi Zero3 (Ubuntu 24.04). I have no experience with the Orange Pi or single-board computers in general. I followed some tutorials, but I couldn't make it work. I did this: Wiring: I2C Backpack Orange Pi Zero3 VCC Pin 2 GND Pin 6 SCL Pin 5 SDA Pin 3 Terminal: sudo apt-get install -y python-smbus i2c-tools user@orangepizero3:~$ sudo i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- user@orangepizero3:~$ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: 30 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 50: 50 -- -- -- 54 -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- It seems like the display cannot be found. How can I fix this? Edited October 18, 20241 yr by bjan04 Added wiring details
October 24, 20241 yr I currently have OrangePi3 LTS and I use the firmware provided by OrangePi and there you had to install wiringOP and also run during system startup: i2c0 in the file: orangepiEnv.txt That is, add the entry: overlays= i2c0 i2c1 i2c2 In Armbian firmware it is probably easier, you have to run the configuration from the terminal: armbian-config and there find the section: I2C and enable: i2c0 / system restart then proceed as you previously provided on the forum. How to connect LCD to your model ... probably like I did to my OPi 3-LTS according to this tutorial. Of course the board is different but you have to find the same pins on your OrangePiZero3 model. I managed to do it so you should too. for me it is: 3f sudo i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3f 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- I also use the lcdproc program to display the current time + install drivers for: hd44780 sudo apt-get install lcdproc lcdproc-extra-drivers Find in your system where you have the file: hd44780.so cd / find -name hd44780.so e.g. ./usr/lib/aarch64-linux-gnu/lcdproc/hd44780.so and add change the path to the file in the configuration : DriverPath=/usr/lib/aarch64-linux-gnu/lcdproc/ Example lcdproc configuration: file: LCDd.conf ## Server section with all kinds of settings for the LCDd server ## [server] DriverPath=/usr/lib/aarch64-linux-gnu/lcdproc/ Driver=hd44780 Bind=127.0.0.1 Port=13666 ReportLevel=3 User=root Foreground=no Hello="Welcome to" Hello="Armbian" GoodBye="Internet Radio" GoodBye="OrangePi3 LTS" WaitTime=5 ServerScreen=off Backlight=off Heartbeat=off TitleSpeed=4 ToggleRotateKey=Enter PrevScreenKey=Left NextScreenKey=Right ## The menu section. The menu is an internal LCDproc client. ## [menu] ## Hitachi HD44780 driver ## [HD44780] ConnectionType=i2c Device=/dev/i2c-0 Port=0x3f Backlight=no Size=16x2 DelayBus=false DelayMult=1 Keypad=no Speed=0 i2c_line_RS=0x01 i2c_line_RW=0x02 i2c_line_EN=0x04 i2c_line_BL=0x08 i2c_line_D4=0x10 i2c_line_D5=0x20 i2c_line_D6=0x40 i2c_line_D7=0x80 BacklightInvert=no # EOF in file lcdproc.conf # LCDproc client configuration file ## general options ## [lcdproc] # address of the LCDd server to connect to Server=localhost # Port of the server to connect to Port=13666 # set reporting level ReportLevel=2 # report to to syslog ? ReportToSyslog=false # run in foreground [default: false; legal: true, false] #Foreground=true # PidFile location when running as daemon [default: /var/run/lcdproc.pid] #PidFile=/var/run/lcdproc.pid # slow down initial announcement of modes (in 1/100s) #delay=2 # display name for the main menu [default: LCDproc HOST] #DisplayName=lcdproc ## screen specific configuration options ## [CPU] # Show screen Active=True OnTime=1 OffTime=2 ShowInvisible=false [Iface] # Show screen Active=True # Show stats for Interface0 Interface0=eth0 # Interface alias name to display [default: <interface name>] Alias0=LAN # Show stats for Interface1 #Interface1=eth1 #Alias1=WAN # Show stats for Interface2 #Interface2=eth2 #Alias2=MGMT # for more than 3 interfaces change MAX_INTERFACES in iface.h and rebuild # Units to display [default: byte; legal: byte, bit, packet] unit=bit # add screen with transferred traffic #transfer=TRUE [Memory] # Show screen Active=True [Load] # Show screen Active=True # Min Load Avg at which the backlight will be turned off [default: 0.05] LowLoad=0.05 # Max Load Avg at which the backlight will start blinking [default: 1.3] HighLoad=1.3 [TimeDate] # Show screen Active=True # time format [default: %H:%M:%S; legal: see strftime(3)] TimeFormat="%H:%M:%S" # date format [default: %x; legal: see strftime(3)] DateFormat="%x" [About] # Show screen Active=false [SMP-CPU] # Show screen Active=false [OldTime] # Show screen Active=false # time format [default: %H:%M:%S; legal: see strftime(3)] TimeFormat="%H:%M:%S" # date format [default: %x; legal: see strftime(3)] DateFormat="%x" # Display the title bar in two-line mode. Note that with four lines or more # the title is always shown. [default: true; legal: true, false] #ShowTitle=false [BigClock] # Show screen Active=false [Uptime] # Show screen Active=false [Battery] # Show screen Active=false [CPUGraph] # Show screen Active=false [ProcSize] # Show screen Active=false [Disk] # Show screen Active=false [MiniClock] # Show screen Active=True # time format [default: %H:%M; legal: see strftime(3)] TimeFormat="%H:%M" # EOF But this is an example configuration for OrangePi3 LTS and the Python scripts that are on the forum refer to Python 2 which is already old and in the systems there is only Python 3 and these scripts may be outdated and not work correctly Maybe there is some programmer who will convert it to Python 3 🙂 My configuration also has a fix for Polish diacritics that are displayed incorrectly on the LCD... as slashes and strange characters or question marks???? 🙂 And the script supports mpd / mpc programs for internet radio #!/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 LCD_HEIGHT = 2 # 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_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(): 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 = 7 else: lcd_string(ekran1L1,LCD_LINE_1) lcd_string(ekran1L2,LCD_LINE_2) if counter == 7: if ekran2 == "": counter = 14 else: lcd_string(ekran2L1,LCD_LINE_1) lcd_string(ekran2L2,LCD_LINE_2) if counter == 14: if ekran3 == "": counter = 25 else: lcd_string(ekran3L1,LCD_LINE_1) lcd_string(ekran3L2,LCD_LINE_2) if counter == 25: if ekran4 == "": counter = 35 else: lcd_string(ekran4L1,LCD_LINE_1) lcd_string(ekran4L2,LCD_LINE_2) sleep(0.1) counter = counter + 1 if counter == 40: 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) Edited October 24, 20241 yr by kris777
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.