如何用树莓派驱动16x2 LCD

概述
向任何项目添加lcd会立即使它提高一个档次。本教程说明了如何使用6个gpio引脚将廉价的hdd44780兼容lcd连接到raspberry pi。尽管还有其他方法可以使用i2c或uart进行连接,但这是直接使用裸机的最直接方法。
此技术:
允许使用廉价lcd
不需要任何 i2c驱动程序
不会窃取pi上唯一的串行端口。
示例python代码发送日期,时间和pi的ip地址到显示器。如果您在无头模式下运行pi,一眼就能确定ip地址非常方便。
要遵循本教程,您将需要
标准lcd 16x2 +其他功能
pi t-cobbler plus,pi cobbler plus用于模型b +/pi 2或原始pi补鞋匠
(2)半尺寸面包板
连接线
a raspberry pi(与所有26pin和40pin pi兼容
您几乎可以将任何字符lcd与本教程-适用于16x1、16x2、20x2、20x4 lcd。它不适用于40x4 lcd
将补鞋匠连接到lcd
lcd
每当遇到带有16个连接器的lcd显示器时,最有可能使用hd44780控制器。这些设备提供相同的引出线,使其相对易于使用。 lcd使用并行接口,这意味着我们需要树莓派的许多引脚来控制它。在本教程中,我们将使用4个数据引脚(4位模式)和两个控制引脚。
数据引脚很简单。他们正在将数据发送到显示器(高/低切换)。我们将仅使用写入模式,而不读取任何数据。
寄存器选择引脚有两种用途。拉低时,它可以向lcd发送命令(例如移至或清除屏幕的位置)。这称为写指令或命令寄存器。当以另一种方式切换(1)时,寄存器选择引脚进入数据模式,并将其用于将数据发送到屏幕。
读/写引脚将被拉低(仅写)。 ),因为我们只希望基于此设置写入lcd。
启用引脚将被切换为将数据写入寄存器。
lcd引脚排列
接地
vcc- 5v不是3.3v
电位器的对比度调整(vo)
寄存器选择(rs)。 rs = 0:命令,rs = 1:数据
读/写(r/w)。 r/w = 0:写,r/w = 1:读(我们将不使用此引脚)
时钟(启用)。触发下降沿
位0 (4位操作中不使用)
位1 (4位操作中不使用)
位2 (在4位操作中不使用)
位3 (在4位操作中不使用)
第4位
第5位
第6位
第7位
背光led阳极( +)
背光led阴极(-)
在接线前,请检查lcd是否具有led背光,而不是el背光。 led背光使用10-40ma的功率,el背光使用200 + ma! el背光灯通常价格便宜但无法使用,请确保不要使用背光灯,否则pi会过载。一些带有led背光的廉价lcd在lcd模块的背光上没有电阻,如果不确定,请在15针和5v引脚之间连接一个1kohm电阻,而不是直接连接。 所有adafruit液晶显示器都具有带内置电阻器的led背光灯,因此您不需要额外的电阻器!
5v lcd vs 3.3v pi
树莓派gpio设计for3.3v,但我们的lcd是5v设备。 使用5v显示屏很好,但前提是我们要从pi向外发送数据。我们不会在补鞋匠上使用3.3v电源轨,我们将显示器的 rw (读/写)引脚连接到gnd,因为我们不希望显示器发送5v信号进入pi。
别越过溪流!
接线图
首先,将补鞋匠电源引脚连接到面包板电源导轨。补鞋匠提供的+ 5.0v连接至红色条纹导轨(红色线),补鞋匠提供的gnd连接至蓝色条纹导轨(黑色线)
为了将数据发送至lcd,我们将其接线为遵循
lcd的引脚#1接地
lcd的引脚#2达到+ 5v
引脚#3(vo)连接到电位计的中间
4号针(rs)连接到补鞋匠#22
pin#5(rw)接地
pin #6(en)连接到补鞋匠#17
跳过lcd引脚#7,#8,#9和#10
引脚#11(d4)连接到补鞋匠#25
pin#12(d5)连接到cobbler#24
pin#13(d6)连接到cobber#23
pin#14(d7)连接到cobber#18
针#15(led +)转到+ 5v(红线)
针#16(led-)接地(黑色线)
然后连接电位计,左引脚接地(黑线),右引脚接地+ 5v(红线)
以下是t-cobbler plus版本的草图:
》素描以26针的补鞋匠覆盆子pi(v1,v2)
准备lcd
开始之前,请进行以下操作确保您有一个带0.1“公头的排针和一个10k电位器。所有adafruit字符lcd都带有这些部件,因此您应该一切顺利。
大多数lcd都有顶部有16个针脚的条带,如果标头稍长,请将其断开,直到其正确的长度
接下来,您需要将接头连接到lcd。 您必须执行此操作,仅尝试“压入” lcd是不可行的!
首先连接补鞋匠的 5v 和 gnd 线到面包板。然后将针脚#1,#2和#15,#16连接到面包板电源导轨,如图所示。背光应点亮。如果没有,请检查接线!
接下来,进行对比电位计,如上图所示,中间引脚连接到lcd引脚#3,另两个引脚连接到5v并接地。
扭转电位计,直到您看到lcd的第一行充满了方框。如果看不到方框,请检查接线!
完成 rs,rw,en,d4,d5,d6,和 d7 引脚的接线,如图所示
就是这样!现在您可以运行python脚本在屏幕上绘制文本了!
必要的软件包
最新的raspbian
您的pi必须运行最新版本的raspbian。本教程使用raspbian stretch(2018年11月)编写。如果尚未为raspberry pi准备sd卡,请查阅我们的指南。安装完成后,请确保并运行以下命令以确保您的安装软件包是最新的。
下载:文件
复制代码
$ sudo apt-get update -y
$ sudo apt-get upgrade -y $ sudo apt-get update -y
$ sudo apt-get upgrade -y
安装pip3
pip3已与完整的raspbian安装一起安装,但raspbian lite并未安装包括pip3,因此需要按如下所示进行安装。
下载:文件
复制代码
$ sudo apt-get install python3-pip $ sudo apt-get install python3-pip
安装adafruit-blinka
下载:文件
复制代码
$ sudo pip3 install adafruit-blinka $ sudo pip3 install adafruit-blinka
安装adafruit-circuitpython-charlcd
下载:文件
c opy代码
$ sudo pip3 install adafruit-circuitpython-charlcd $ sudo pip3 install adafruit-circuitpython-charlcd
python脚本
以下代码可以下载到您的树莓派上,并运行以在lcd显示屏上获取机器的日期,时间和ip地址。
代码
下载:project zip 或 drive_a_16x2_lcd_with_the_raspberry_pi.py | 在github上查看
复制代码
from subprocess import popen, pipe
from time import sleep
from datetime import datetime
import board
import digitalio
import adafruit_character_lcd.character_lcd as characterlcd
# modify this if you have a different sized character lcd
lcd_columns = 16
lcd_rows = 2
# compatible with all versions of rpi as of jan. 2019
# v1 - v3b+
lcd_rs = digitalio.digitalinout(board.d22)
lcd_en = digitalio.digitalinout(board.d17)
lcd_d4 = digitalio.digitalinout(board.d25)
lcd_d5 = digitalio.digitalinout(board.d24)
lcd_d6 = digitalio.digitalinout(board.d23)
lcd_d7 = digitalio.digitalinout(board.d18)
# initialise the lcd class
lcd = characterlcd.character_lcd_mono(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6,
lcd_d7, lcd_columns, lcd_rows)
# looking for an active ethernet or wifi device
def find_interface():
find_device = “ip addr show”
interface_parse = run_cmd(find_device)
for line in interface_parse.splitlines():
if “state up” in line:
dev_name = line.split(‘:’)[1]
return dev_name
# find an active ip on the first live network device
def parse_ip():
find_ip = “ip addr show %s” % interface
find_ip = “ip addr show %s” % interface
ip_parse = run_cmd(find_ip)
for line in ip_parse.splitlines():
if “inet ” in line:
ip = line.split(‘ ’)[5]
ip = ip.split(‘/’)[0]
return ip
# run unix shell command, return as ascii
def run_cmd(cmd):
p = popen(cmd, shell=true, stdout=pipe)
output = p.communicate()[0]
return output.decode(‘ascii’)
# wipe lcd screen before we start
lcd.clear()
# before we start the main loop - detect active network device and ip address
sleep(2)
interface = find_interface()
ip_address = parse_ip()
while true:
# date and time
lcd_line_1 = datetime.now().strftime(‘%b %d %h:%m:%s ’)
# current ip address
lcd_line_2 = “ip ” + ip_address
# combine both lines into one update to the display
lcd.message = lcd_line_1 + lcd_line_2
sleep(2)
from subprocess import popen, pipe
from time import sleep
from datetime import datetime
import board
import digitalio
import adafruit_character_lcd.character_lcd as characterlcd
# modify this if you have a different sized character lcd
lcd_columns = 16
lcd_rows = 2
# compatible with all versions of rpi as of jan. 2019
# v1 - v3b+
lcd_rs = digitalio.digitalinout(board.d22)
lcd_en = digitalio.digitalinout(board.d17)
lcd_d4 = digitalio.digitalinout(board.d25)
lcd_d5 = digitalio.digitalinout(board.d24)
lcd_d6 = digitalio.digitalinout(board.d23)
lcd_d7 = digitalio.digitalinout(board.d18)
# initialise the lcd class
lcd = characterlcd.character_lcd_mono(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6,
lcd_d7, lcd_columns, lcd_rows)
# looking for an active ethernet or wifi device
def find_interface():
find_device = “ip addr show”
interface_parse = run_cmd(find_device)
for line in interface_parse.splitlines():
if “state up” in line:
dev_name = line.split(‘:’)[1]
return dev_name
# find an active ip on the first live network device
def parse_ip():
find_ip = “ip addr show %s” % interface
find_ip = “ip addr show %s” % interface
ip_parse = run_cmd(find_ip)
for line in ip_parse.splitlines():
if “inet ” in line:
ip = line.split(‘ ’)[5]
ip = ip.split(‘/’)[0]
return ip
# run unix shell command, return as ascii
def run_cmd(cmd):
p = popen(cmd, shell=true, stdout=pipe)
output = p.communicate()[0]
return output.decode(‘ascii’)
# wipe lcd screen before we start
lcd.clear()
# before we start the main loop - detect active network device and ip address
sleep(2)
interface = find_interface()
ip_address = parse_ip()
while true:
# date and time
lcd_line_1 = datetime.now().strftime(‘%b %d %h:%m:%s ’)
# current ip address
lcd_line_2 = “ip ” + ip_address
# combine both lines into one update to the display
lcd.message = lcd_line_1 + lcd_line_2
sleep(2)
下载代码
为了简单起见,将此文件放在您的主目录中。 wget命令使事情变得简单。
下载:文件
复制代码
$ wget https://raw.githubusercontent.com/adafruit/adafruit_learning_system_guides/master/drive_a_16x2_lcd_with_the_raspberry_pi/drive_a_16x2_lcd_with_the_raspberry_pi.py $ wget https://raw.githubusercontent.com/adafruit/adafruit_learning_system_guides/master/drive_a_16x2_lcd_with_the_raspberry_pi/drive_a_16x2_lcd_with_the_raspberry_pi.py
运行代码
以下命令将启动该程序,您应该会看到lcd显示屏上显示了日期,时间和ip地址。
下载:文件
复制代码
$ sudo python3 。/drive_a_16x2_lcd_with_the_raspberry_pi.py $ sudo python3 。/drive_a_16x2_lcd_with_the_raspberry_pi.py
在每次启动时显示时间和ip
拥有一个可以手动运行的脚本是一件好事,但花时间和时间来做不是很好raspberry pi启动时,显示屏上会弹出ip地址吗?这是使用初始化脚本完成的,该脚本在每次raspberry pi启动时都会运行我们的python代码。
下载服务文件
以下命令将使您可以将lcd.service文件直接下载到您的pi。 p》
下载:文件
复制代码
$ wget https://raw.githubusercontent.com/adafruit/adafruit_learning_system_guides/master/drive_a_16x2_lcd_with_the_raspberry_pi/lcd.service $ wget https://raw.githubusercontent.com/adafruit/adafruit_learning_system_guides/master/drive_a_16x2_lcd_with_the_raspberry_pi/lcd.service
下载:project zip 或 lcd.service | 在github上查看
复制代码
[unit]
description=lcd date|time|ip
requires=network-online.target
after=network-online.target
[service]
execstart=/usr/bin/python3 drive_a_16x2_lcd_with_the_raspberry_pi.py
workingdirectory=/home/pi
standardoutput=inherit
standarderror=inherit
restart=always
user=pi
[install]
wantedby=network-online.target
[unit]
description=lcd date|time|ip
requires=network-online.target
after=network-online.target
[service]
execstart=/usr/bin/python3 drive_a_16x2_lcd_with_the_raspberry_pi.py
workingdirectory=/home/pi
standardoutput=inherit
standarderror=inherit
restart=always
user=pi
[install]
wantedby=network-online.target
放置lcd.service文件
lcd.service文件需要复制到正确的位置,并且可以使用systemctl命令来启动|停止|启用服务。在启用此功能之前,最好先进行测试,因为系统上的路径可能存在细微差别。
下载:文件
复制代码
$ sudo cp lcd.service /etc/systemd/system $ sudo cp lcd.service /etc/systemd/system
测试lcd.service
下载:文件
复制代码
$ sudo systemctl daemon-reload
$ sudo systemctl start lcd.service
$ ps auxww | grep -i 16x2 $ sudo systemctl daemon-reload
$ sudo systemctl start lcd.service
$ ps auxww | grep -i 16x2
以下命令读取对服务文件的更新,启动lcd.service并确认该进程正在运行。如果脚本显示在“ ps”命令输出中,则说明您已正确完成所有操作,现在可以启用服务并重新启动。该服务应在启动时自动激活。
启用lcd.service
下载:文件
复制代码
$ sudo systemctl enable lcd.service $ sudo systemctl enable lcd.service
现在,每次启动时,lcd都会在启动时自动显示日期/时间/ip地址。这意味着您无需插入监视器即可知道何时可以访问pi以及ip地址是什么。
时区
最后,但并非最不重要:我的pi已配置了ut(通用时间)。我更喜欢根据我的时区(山)来查看时间。这是在pi上为任何位置配置时间的方法。这是一次配置设置,将在两次重启之间保留。
我们可以使用raspi-config轻松设置时区。选择以下内容:
本地化选项
更改时区
大陆/国家/地区
时区
运行raspi-config
下载:文件
复制代码
$ sudo raspi-config $ sudo raspi-config


伺服系统执行元件的种类及其特点
AIGC加速成长,算力需求变化带来系统级创新
云知声8月大事件回顾
Python 简化函数调用的3种技巧
IR推出SupIRBuck集成式负载点 (POL) 稳压器系
如何用树莓派驱动16x2 LCD
Digi-Key斩获EM杂志2019年度电子元器件分销商奖
高性能STM32H7物料,无人问津了?
魅族flyme 6最新版发布:掌握解锁新姿势!Flyme6.7.4.11 beta发布
底部填充胶胶水的常见问题
区块链一大批疫情紧急应用落地
联想YOGA 27 2022:全面升级的超强配置
可穿戴设备未来将呈现以下三大趋势 预计到2023年市场出货量近2亿
大爆料! 小米MIX2S设计图 也将使用屏下指纹识别技术
你了解过Linux IIC的设备驱动?
柔性线路板(FPC)压合辅材测试方法
单相照明双路互备自投供电电路图
分立元件定时器电路图
联电疑似窃取美光商业机密被美司法部起诉
搭建游戏是选云服务器还是选物理服务器