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

最近入手了一个新玩具,没错,就是树莓派了,这里我使用的是树莓派 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,树莓派引脚如图:


GPIO

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

pi@raspberrypi:~ $ sudo apt-get install i2c-tools   

pi@raspberrypi:~ $ sudo apt-get install python-smbus   

pi@raspberrypi:~ $ sudo i2cdetect -y 1 


I2C 设备地址

        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 和已运行时间。

deamon.py : 守护进程父类

host_status.py : 树莓派 IP ,可以添加更多内容,比如获取蓝牙状态显示到LCD

LCD1602.py : LCD1602 工具,上面的代码,用于在LCD上打印字符

pi_status.py : 主脚本,这里会开启的一个名为 pi-status 的守护进程,不断刷新 LCD 内容

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

启动

    pi@raspberrypi:/home/lcd $ sudo python pi_status.py

    ready to starting ......

查看进程状态, PID

    pi@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

(完)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容