文档章节

树莓派上使用 LCD1602 显示基本状态

denua_
 denua_
发布于 06/15 01:04
字数 1027
阅读 58
收藏 0
点赞 0
评论 0

最近入手了一个新玩具,没错,就是树莓派了,这里我使用的是树莓派 3B+。但是在玩儿的时候遇到了一些问题,比如树莓派开机有时候特别慢,且 IP 地址什么的记不住,于是就买了一块便宜的 LCD1602 显示屏(5V).

先上效果图

效果图

这显示屏可以显示 16个 * 2行 (32)字符,且只标准 ASCII 码字符和日文希腊文字符,LCD1602 一共有 16 个针脚,如果直接将其连接在树莓派上的话非常占用资源,所以我们买的是和 IIC(I2C)模块集成在一起的板子。IIC 只有四个针脚,这样就可以大幅度节约树莓派针脚去干其他事,I2C接口引脚如下:

GND --- GND VCC --- 电源 (接树莓派5V) SDA --- I2C 数据 SCL --- I2C 时钟

将四个引脚接到树莓派同名 GPIO 引脚即可,VCC接5V,树莓派引脚如图:

树莓派3B+引脚图

接好了 LCD1602 后,我们就要登入树莓派了,首先安装 i2c-tools,和 Python 需要用到的 smbus , 然后查看 I2C 设备地址,这个地址将在后面用到。

pi[@raspberrypi](https://my.oschina.net/raspberrypi):~ $ sudo apt-get install i2c-tools
pi[@raspberrypi](https://my.oschina.net/raspberrypi):~ $ sudo apt-get install python-smbus
pi[@raspberrypi](https://my.oschina.net/raspberrypi):~ $ sudo i2cdetect -y 1

    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --   

看到地址为 0x27 .这说明 已经成功连接了 LCD1602 。接下来就可以用 Python 控制 LCD1602 显示信息了。 由于对 LCD1602 的指令不了解,这里从网上找了一个很好例子,并优化了以下,保存在 /home/lcd/lcd1602.py , 运行该 脚本,即可看到效果。

import time
import smbus
import logx
import logging

BUS = smbus.SMBus(1)
LCD_ADDR = 0x27
BLEN = 1 #turn on/off background light

def turn_light(key):
	global BLEN
	BLEN = key
	if key ==1 :
		BUS.write_byte(LCD_ADDR ,0x08)
		logging.info('LCD executed turn on BLight')
	else:
		BUS.write_byte(LCD_ADDR ,0x00)
		logging.info('LCD executed turn off BLight')

def write_word(addr, data):
	global BLEN
	temp = data
	if BLEN == 1:
		temp |= 0x08
	else:
		temp &= 0xF7
	BUS.write_byte(addr ,temp)

def send_command(comm):
	# Send bit7-4 firstly
	buf = comm & 0xF0
	buf |= 0x04               # RS = 0, RW = 0, EN = 1
	write_word(LCD_ADDR ,buf)
	time.sleep(0.002)
	buf &= 0xFB               # Make EN = 0
	write_word(LCD_ADDR ,buf)
	
	# Send bit3-0 secondly
	buf = (comm & 0x0F) << 4
	buf |= 0x04               # RS = 0, RW = 0, EN = 1
	write_word(LCD_ADDR ,buf)
	time.sleep(0.002)
	buf &= 0xFB               # Make EN = 0
	write_word(LCD_ADDR ,buf)

def send_data(data):
	# Send bit7-4 firstly
	buf = data & 0xF0
	buf |= 0x05               # RS = 1, RW = 0, EN = 1
	write_word(LCD_ADDR ,buf)
	time.sleep(0.002)
	buf &= 0xFB               # Make EN = 0
	write_word(LCD_ADDR ,buf)
	
	# Send bit3-0 secondly
	buf = (data & 0x0F) << 4
	buf |= 0x05               # RS = 1, RW = 0, EN = 1
	write_word(LCD_ADDR ,buf)
	time.sleep(0.002)
	buf &= 0xFB               # Make EN = 0
	write_word(LCD_ADDR ,buf)

def init_lcd():
	try:
		send_command(0x33) # Must initialize to 8-line mode at first
		time.sleep(0.005)
		send_command(0x32) # Then initialize to 4-line mode
		time.sleep(0.005)
		send_command(0x28) # 2 Lines & 5*7 dots
		time.sleep(0.005)
		send_command(0x0C) # Enable display without cursor
		time.sleep(0.005)
		send_command(0x01) # Clear Screen
		logging.info('LCD init over')
		BUS.write_byte(LCD_ADDR ,0x08)
		logging.info('LCD turning on BLight')
	except:
		return False
	else:
		return True

def clear_lcd():
	send_command(0x01) # Clear Screen

def print_lcd(x, y, str):

	if x < 0:
		x = 0
	if x > 15:
		x = 15
	if y <0:
		y = 0
	if y > 1:
		y = 1

	# Move cursor
	addr = 0x80 + 0x40 * y + x
	send_command(addr)
	
	for chr in str:
		send_data(ord(chr))

if __name__ == '__main__':
	init_lcd()
	print_lcd(0, 0, 'Hello, world!')
	print_lcd(8, 1, 'by Jerry')

在这个基础上,我们还需要添加一些功能,在每次开启自动启动为守护进程,在 LCD 上显示主机 ip 和已运行时间。

代码 > GitHub

  • deamon.py : 守护进程父类
  • host_status.py : 树莓派 IP ,可以添加更多内容,比如获取蓝牙状态显示到LCD
  • LCD1602.py : LCD1602 工具,上面的代码,用于在LCD上打印字符
  • pi_status.py : 主脚本,这里会开启的一个名为 pi-status 的守护进程,不断刷新 LCD 内容

先将代码下载到树莓派的 /home/lcd/ 目录下,使用命令:

启动

pi[@raspberrypi](https://my.oschina.net/raspberrypi):/home/lcd $ sudo python pi_status.py 
ready to starting ......

查看进程状态, PID

pi[@raspberrypi](https://my.oschina.net/raspberrypi):/home/lcd $ sudo python pi_status.py status  
is running ... PID 1116

重启进程

pi@raspberrypi:/home/lcd $ sudo python pi_status.py restart
stopping ...
Stopped!
ready to starting ......

停止

pi@raspberrypi:/home/lcd $ sudo python pi_status.py stop
stopping ...
Stopped!

我们还需要将这个脚本加入到开机启动,每次开启将显示状态。

vi /etc/rc.local

在 exit 0 之前插入一下内容,其中路径根据实际情况更改。

sudo python /home/lcd/pi-status.py

个人博客同步

(完)

© 著作权归作者所有

共有 人打赏支持
denua_
粉丝 0
博文 8
码字总数 7908
作品 0
九江
【目录】电子发烧友, 持续更新

目录内容: 1)Geek 2)C51单片机学习平台搭建 3)入门 4)提高 5)红外发射 6)树莓派 7)物联网 8)模电基础 【Geek】 C51单片机 SIM900A 手机给门禁解锁 智能家居 【C程序代码已开源,更新...

990487026
2015/09/26
0
0
【圣诞特辑】Keras+树莓派,130行代码找到圣诞老人

今天这篇文章是使用Keras在Raspberry Pi上运行深度神经网络的一个完整指南。 我把这个项目当做一个“不是圣诞老人”(Not Santa)检测器,教你如何实际地实现它(并且过程中乐趣无穷)。 第一...

技术小能手
2017/12/25
0
0
andyspider/Camkit

Camkit (Camera toolKit) Camkit是一个摄像头相关的工具箱,使用C语言写成,包含了从:图像采集-->色彩转换-->H264编码-->RTP打包-->网络发送的全套接口。 可到项目附件中下载已编译好的二进...

andyspider
2015/11/21
0
0
玩转树莓派——管理 Windows IoT 设备

安装完树莓派只是第一步,要让Windows 10 IoT Core在树莓派上跑起来,管理系统等成套的工具必不可少。 由于Windows 10 IoT Core运行在卡片电脑上,没有设置太多的UI操作,很多操作都要通过I...

HaoHu
2016/10/03
0
0
圣诞快乐——Keras+树莓派:用深度学习识别圣诞老人

  选自pyimagesearch   作者:Adrian Rosebrock   机器之心编译   参与:Panda      圣诞将至,你可能已经在商场、公园或自家的烟囱里发现了圣诞老人。随着机器识别技术的发展,...

机器之心
2017/12/25
0
0
【玩转树莓派】使用 sinopia 搭建私有 npm 服务器

简介 效果展示 使用 sinopia 的好处是,node系的工程师,内部协作时,使用自有 npm 包,会非常方便;另外,sinopia,会缓存已经下载过的包,可以在相当程度上,加速 npm install 相关命令的执...

ios122
2017/11/22
0
0
Python+树莓派 是谁在开门?

貌似已经好久没有鼓弄树莓派啦,这么有意思的东西,不能让它就这么吃灰了! 今天要和大家分享一个利用树莓派实现开门监控的DIY小设备,直接上图。 树莓派链接图 1.准备材料 1.树莓派(Raspbe...

高杆python
2017/10/09
0
0
树莓派安装gitliab ce版本

在树莓派上安装gitlab ce版本还是很简单的。就是下载包太费劲了,太慢了,需要翻墙才可以完成。 下面记录一下安装过程 1、在树莓派上安装raspbian 最新版本 2、更新国内的raspbian 源 3、安装...

eguotangseng
2016/08/16
0
0
Raspberry IO 开源 —— 树莓派创新集散地

在今年三月份的 PyCon 2013 大会中,PSF 为每个参会者提供了一个 Raspberry Pi,这是一个像信用卡一样大小的微型计算机,你可在上面使用 Python 编程语言。树莓派的强大功能和可移植性极大的...

oschina
2013/08/15
5.9K
17
树莓派 + Docker - 轻松实现人脸识别应用

人脸识别技术已经被广泛应用在众多场景中。今天我们将利用Docker容器在树莓派上快速打造一个人脸识别应用。 本文使用 https://github.com/ageitgey/facerecognition 开源框架,基于 dlib (De...

易立
01/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

自定义OkHttp的UA

背景 上次的问题很明显 由于我们的ua清一色OkHttp导致快速定位到内部应用。 既然如此我们是否考虑可以在UA上做点手脚。 自定义我们的UA呢??? 分析 首先UA在 均为okhttp/3.2.0 大概率是由于...

Mr_Qi
14分钟前
0
0
【scikit-learn】01:使用案例对sklearn库进行简单介绍

sklearn学习笔记:Quick Start 源地址:http://scikit-learn.org/stable/tutorial/basic/tutorial.html # -*-coding:utf-8-*-''' Author:kevinelstri Datetime:2017.2.16'''......

wangxuwei
18分钟前
0
0
Linux Kernel 4.16 系列停止维护,用户应升级至 4.17

知名 Linux 内核维护人员兼开发人员 Greg Kroah-Hartman 近日在发布 4.16.18 版本的同时,宣布这是 4.16 系列的最后一个维护版本,强烈建议用户立即升级至 4.17 系列。 Linux 4.16 于 2018 年...

问题终结者
20分钟前
0
0
Apache配置时.htaccess失效不起作用的原因分析

.htaccess 失效的原因 1. 重写规则有问题,检查自己的重写规则 2.Apache配置问题,配置中没有配置启用 rewrite a2enmod rewrite 3.网站配置文件没有启用配置需要配置 000-default.conf <Dire...

TU-DESGIN
40分钟前
1
0
两个求最大公约数C/C++算法实现

#include<stdio.h> #include<time.h> #include <iostream>using namespace std;//求最大公约数 LCD(Largest Common Division)//短除法 //m=8251, n=6105; int LCD_ShortDiv(int m, ......

失落的艺术
46分钟前
1
0
QueryPerformanceCounter

windows的Sleep函数,睡眠线程指定毫秒数,可以用来做毫秒延时。 对于微秒延时,没有一个现成的函数,但是可以通过 QueryPerformanceFrequency QueryPerformanceCounter 来间接实现。原理就是...

开飞色
今天
1
0
log4j2使用AsyncRoot不显示行号问题处理

<AsyncRoot level="info" includeLocation="true"> <AppenderRef ref="File"/></AsyncRoot><!--1.异步logger,还需要在pom.xml中添加disruptor的依赖。2.includeLocation结合异......

小翔
今天
3
0
安卓手机上 K 歌,声音延迟怎么解决?

这篇文章可以为你提供一个解决录音和播放同步问题的思路,而且解决了声音从手机传输到耳机上有延时的问题。 初识音频 在开始之前,我先简单介绍一下音频相关的基础知识,方便下文理解。 我们...

编辑部的故事
今天
2
0
使用token实现在有效期内APP自动登录功能

使用token实现在有效期内APP自动登录功能 http://sevennight.cc/2016/07/19/auto_login_impl.html

风云海滩
今天
2
0
Spring Boot集成RabbitMQ发送接收JSON

默认情况下RabbitMQ发送的消息是转换为字节码,这里介绍一下如何发送JSON数据。 ObjectMapper 最简单发送JSON数据的方式是把对象使用ObjectMapper等JSON工具类把对象转换为JSON格式,然后发送...

小致dad
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部