[树莓派]桌面时钟

8

夏任务103:做一个网络时钟

浙江大学计算机科学与技术学院 / 课程:嵌入式系统 / 指导教师:翁恺

做一个网络时钟,通过ntp从一个互联网服务器得到时间,实时在7段数码管或LCD上显示时间

先决条件:完成任务16:配置ntp客户端

1.       焊接LCD1602

略……嗯……我不是在卖萌,而是因为……之前买过一块Sparten-3E的板子(就是和体系实验用的一样的板子)然后刚好有一块已经焊好的1602的屏,就直接拆下来拿过来用了^_^而且是块蓝屏,我喜欢的颜色~

2.       连接LCD1602与树莓派

LCD1602液晶屏提供了16列x2行的ASCII字符显示能力,工作电压5V,提供4位数据与8位数据两种工作模式,Raspberry Pi的GPIO口数量很有限,所以我们使用4位数据模式。

gpio

LCD1602液晶屏模块提供了16个引脚,我们只需接其中的12个即可:

1)         VSS,接地,RPi PIN 6

2)         VDD,接5V电源,PRi PIN 2

3)         VO,液晶对比度调节,接电位器中间的引脚

4)         RS,寄存器选择,接GPIO 14,RPi PIN 8

5)         RW,读写选择,接地,表示写模式,PRi PIN 6

6)         EN,使能信号,接GPIO 15,RPi PIN 10

7)         D0,数据位0,4位工作模式下不用,不接

8)         D1,数据位1,4位工作模式下不用,不接

9)         D2,数据位2,4位工作模式下不用,不接

10)     D3,数据位3,4位工作模式下不用,不接

11)     D4,数据位4,接GPIO 17,RPi PIN 11

12)     D5,数据位5,接GPIO 18,RPi PIN 12

13)     D6,数据位6,接GPIO 27,RPi PIN 13

14)     D7,数据位7,接GPIO 22,RPi PIN 15

15)     A,液晶屏背光+,接5V,RPi PIN 2

16)     K,液晶屏背光-,接地,RPi PIN 6

lc_wire

注意:

u  请注意GIPO引脚编号与Raspberry Pi上P1扩展口的PIN编号的区别,别搞混了。

u  如果你的液晶屏没有背光,则15,16脚可能不会引出,也就不用接线。

u  LCD1602工作电压是5V,而RPi的GPIO口工作电压是3.3V,所以RW脚请确保接地进入写模式,否则尝试从LCD1602读取数据可能会烧掉RPi。

u  VO脚接的是电位器,电位器的另外两个脚分别接5V和地。通过调节这个电位器,可以调节液晶屏的对比度。

u  Raspberry Pi有Rev 1和Rev 2两个版本,它们对于PIN 13的定义是不同的。市面上现在大部分都是Rev 2版本,PIN 13对应GPIO 27。如果你的RPi是老的Rev 1版本,PIN 13对应是GPIO 21,你需要调整程序中的参数,把27改为21。

3.       显示时间日期

驱动LCD1602

wget https://raw.github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code/master/Adafruit_CharLCD/Adafruit_CharLCD.py

显示时间的python脚本clock.py

nano clock.py

贴入以下内容(基于https://raw.github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code/master/Adafruit_CharLCD/Adafruit_CharLCD_IPclock_example.py修改)

#!/usr/bin/python

from Adafruit_CharLCD import Adafruit_CharLCD

from subprocess import *

from time import sleep, strftime

from datetime import datetime

lcd = Adafruit_CharLCD()

lcd.begin(16,1)

while 1:

        lcd.clear()

        lcd.message(datetime.now().strftime(‘%Y %b %d %a\n  %H : %M : %S’))

        sleep(1)

执行脚本

sudo python clock.py

效果如图:

WP_20130525_007

当然也可以直接用一个脚本来完成这件事:

4. 写在后面

这个接线真是接的我头昏眼花,我必须得说,在做这个任务的时候我最大的愿望就是……我能把那一排杜邦线和面包线撕开一根一根用或者几根几根用……这一排在一起接真是要人命的!

WP_20130525_008

 

Acknowledgement

http://www.freemindworld.com/blog/2013/130310_raspberry_pi_with_lcd.shtml

http://hugozhu.myalert.info/2013/03/23/19-raspberry-pi-drive-1602-lcd.html

http://learn.adafruit.com/drive-a-16×2-lcd-directly-with-a-raspberry-pi/wiring

 

Comments

  1. Len / 6月 19th, 2014 15:18 Quote 回复

    92行的 if (lines > 1):,不对吧?貌似原版程序是lines > 1

  2. Li Fanxi / 5月 27th, 2013 0:01 Quote 回复

    目测又逮到一个引用他人CC授权文章不写出处的…

    直接wget下来的Adafruit_CharLCD.py按文章中描述的接法是不能正常工作的,因为构造函数中传的默认参数的引脚编号与文中的接线说明的编号顺序不对应。

    • ADMIN
      Axel / 5月 27th, 2013 23:53 Quote 回复

      嗯,原作者附上的两幅接线图都是错的,但是文字描述是正确的,所以那幅接线图我是按照最后连接成功的接线方式重新画过的……另出处已补上,谢提醒~

      • Li Fanxi / 5月 28th, 2013 0:21 Quote 回复

        @Axel
        你说的“原作者”指谁?

        Adafruit网站的教程是对的,它的图跟程序和描述都是一致的。

        我引用到我的文章中时,因为我的设计中需要用更多的GPIO口,所以我就把它的程序给改了改放在我的Github上了,我的程序跟我的文章也是可以对应的。

        后来hugozhu引用我文章时,用了我文章中的描述,但配上了Adafruit网站的接线图,结果就是不匹配的,是错的。上次跟他说了,不过他懒得改了,呵呵。

        • ADMIN
          Axel / 5月 28th, 2013 10:08 Quote 回复

          @Li Fanxi
          我一开始是按照Adafruit网站的教程接的线,用的也是直接从github上wget下来的程序,但是输出满屏的乱码……
          之后按照您和hugozhu博客上的中文说明重新接线之后再运行程序就正常了。所以我那副接线图准确地说说是按照中文说明接线并测试成功之后重新改过的。

        • ADMIN
          Axel / 5月 28th, 2013 10:22 Quote 回复

          @Li Fanxi
          我大概知道我这边为什么这么混乱的原因了。虽然第一次按照Adafruit的教程和程序接线结果乱码的原因暂时还不清楚,不过之后的事情应该都能解释清楚了。
          我按照您和hugozhu博客上的中文接线说明重新接线的时候对着那幅树莓派的GPIO定义的图改过”def __init__(self, pin_rs=14, pin_e=15, pins_db=[17, 18, 27, 28], GPIO = None):”这部分内容的。刚才我对比了我的python和您的rpimenu里面的python脚本发现这里是一样的,也就是说……我在按照中文说明重新接线并修改了Adafruit的python脚本之后,新的脚本和您的python脚本一样了~

    • ADMIN
      Axel / 5月 28th, 2013 0:09 Quote 回复

      也欢迎李老师多多指导~

您的电子邮箱地址不会被公开。 必填项已用*标注