夏任务102:做一个GPS钟

实验要求

  用RPi的串口连接一个GPS模块,从GPS得到实时时间,在7段数码管或LCD上显示

实验工具:

Raspberry Pi Model B主机,

8G c10 SD卡,

USB充电线,

电源需自备5v 1A电源充电头一个

PC机一台(这里用的操作系统是windows7 64bit旗舰版)

LED面板

GPS模块+串口线

实验步骤:

  1. 连接电路线路

        GPS板G3203:

          VDD->RPi的3.3V

          TXD->RPi的RXD

          GND->RPi的GND

  2。在树莓派上安装pyserial:

下载地址:http://sourceforge.net/projects/pyserial/files/pyserial/2.5/

解压后进入目录 运行

  python setup.py install

  

  1. 编写代码Adafruit_CharLCD.py:

      (LCD显示代码引自git clone https://github.com/lifanxi/rpimenu.git)

#!/usr/bin/python

#

# based on code from lrvick and LiquidCrystal

# lrvic - https://github.com/lrvick/raspi-hd44780/blob/master/hd44780.py

# LiquidCrystal - https://github.com/arduino/Arduino/blob/master/libraries/LiquidCrystal/LiquidCrystal.cpp

#

from time import sleep

import serial

import traceback

import os

import commands

import string

class Adafruit_CharLCD:

# commands

LCD_CLEARDISPLAY            = 0x01

LCD_RETURNHOME               = 0x02

LCD_ENTRYMODESET           = 0x04

LCD_DISPLAYCONTROL              = 0x08

LCD_CURSORSHIFT               = 0x10

LCD_FUNCTIONSET               = 0x20

LCD_SETCGRAMADDR         = 0x40

LCD_SETDDRAMADDR         = 0x80

# flags for display entry mode

LCD_ENTRYRIGHT          = 0x00

LCD_ENTRYLEFT             = 0x02

LCD_ENTRYSHIFTINCREMENT = 0x01

LCD_ENTRYSHIFTDECREMENT        = 0x00

# flags for display on/off control

LCD_DISPLAYON             = 0x04

LCD_DISPLAYOFF           = 0x00

LCD_CURSORON             = 0x02

LCD_CURSOROFF            = 0x00

LCD_BLINKON          = 0x01

LCD_BLINKOFF         = 0x00

# flags for display/cursor shift

LCD_DISPLAYMOVE              = 0x08

LCD_CURSORMOVE              = 0x00

# flags for display/cursor shift

LCD_DISPLAYMOVE              = 0x08

LCD_CURSORMOVE              = 0x00

LCD_MOVERIGHT           = 0x04

LCD_MOVELEFT              = 0x00

# flags for function set

LCD_8BITMODE               = 0x10

LCD_4BITMODE               = 0x00

LCD_2LINE                 = 0x08

LCD_1LINE                 = 0x00

LCD_5x10DOTS          = 0x04

LCD_5x8DOTS            = 0x00

def show_time(i,interval):

global num

while True:

try:

show(num)

except Exception as ep:

print ep

def __init__(self, pin_rs=4, pin_e=25, pins_db=[17, 18, 27, 22], GPIO = None):

# Emulate the old behavior of using RPi.GPIO if we haven't been given

# an explicit GPIO interface to use

if not GPIO:

import RPi.GPIO as GPIO

self.GPIO = GPIO

self.pin_rs = pin_rs

self.pin_e = pin_e

self.pins_db = pins_db

self.GPIO.setmode(GPIO.BCM)

self.GPIO.setup(self.pin_e, GPIO.OUT)

self.GPIO.setup(self.pin_rs, GPIO.OUT)

for pin in self.pins_db:

self.GPIO.setup(pin, GPIO.OUT)

self.write4bits(0x33) # initialization

self.write4bits(0x32) # initialization

self.write4bits(0x28) # 2 line 5x7 matrix

self.write4bits(0x0C) # turn cursor off 0x0E to enable cursor

self.write4bits(0x06) # shift cursor right

self.displaycontrol = self.LCD_DISPLAYON | self.LCD_CURSOROFF | self.LCD_BLINKOFF

self.displayfunction = self.LCD_4BITMODE | self.LCD_1LINE | self.LCD_5x8DOTS

self.displayfunction |= self.LCD_2LINE

""" Initialize to default text direction (for romance languages) """

self.displaymode =  self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT

self.write4bits(self.LCD_ENTRYMODESET | self.displaymode) #  set the entry mode

self.clear()

def begin(self, cols, lines):

if (lines > 1):

self.numlines = lines

self.displayfunction |= self.LCD_2LINE

self.currline = 0

def home(self):

self.write4bits(self.LCD_RETURNHOME) # set cursor position to zero

self.delayMicroseconds(3000) # this command takes a long time!

def clear(self):

self.write4bits(self.LCD_CLEARDISPLAY) # command to clear display

self.delayMicroseconds(3000) # 3000 microsecond sleep, clearing the display takes a long time

def setCursor(self, col, row):

self.row_offsets = [ 0x00, 0x40, 0x14, 0x54 ]

if ( row > self.numlines ):

row = self.numlines - 1 # we count rows starting w/0

self.write4bits(self.LCD_SETDDRAMADDR | (col + self.row_offsets[row]))

def noDisplay(self):

""" Turn the display off (quickly) """

self.displaycontrol &= ~self.LCD_DISPLAYON

self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)

def display(self):

""" Turn the display on (quickly) """

self.displaycontrol |= self.LCD_DISPLAYON

self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)

def noCursor(self):

""" Turns the underline cursor on/off """

self.displaycontrol &= ~self.LCD_CURSORON

self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)

def cursor(self):

""" Cursor On """

self.displaycontrol |= self.LCD_CURSORON

self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)

def noBlink(self):

""" Turn on and off the blinking cursor """

self.displaycontrol &= ~self.LCD_BLINKON

self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)

def noBlink(self):

""" Turn on and off the blinking cursor """

self.displaycontrol &= ~self.LCD_BLINKON

self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)

def DisplayLeft(self):

""" These commands scroll the display without changing the RAM """

self.write4bits(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVELEFT)

def scrollDisplayRight(self):

""" These commands scroll the display without changing the RAM """

self.write4bits(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVERIGHT);

def leftToRight(self):

""" This is for text that flows Left to Right """

self.displaymode |= self.LCD_ENTRYLEFT

self.write4bits(self.LCD_ENTRYMODESET | self.displaymode);

def rightToLeft(self):

""" This is for text that flows Right to Left """

self.displaymode &= ~self.LCD_ENTRYLEFT

self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)

def autoscroll(self):

""" This will 'right justify' text from the cursor """

self.displaymode |= self.LCD_ENTRYSHIFTINCREMENT

self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)

def noAutoscroll(self):

""" This will 'left justify' text from the cursor """

self.displaymode &= ~self.LCD_ENTRYSHIFTINCREMENT

self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)

def write4bits(self, bits, char_mode=False):

""" Send command to LCD """

self.delayMicroseconds(1000) # 1000 microsecond sleep

bits=bin(bits)[2:].zfill(8)

self.GPIO.output(self.pin_rs, char_mode)

for pin in self.pins_db:

self.GPIO.output(pin, False)

for i in range(4):

if bits[i] == "1":

self.GPIO.output(self.pins_db[::-1][i], True)

self.pulseEnable()

for pin in self.pins_db:

self.GPIO.output(pin, False)

for i in range(4,8):

if bits[i] == "1":

self.GPIO.output(self.pins_db[::-1][i-4], True)

self.pulseEnable()

def delayMicroseconds(self, microseconds):

seconds = microseconds / float(1000000)    # divide microseconds by 1 million for seconds

sleep(seconds)

def pulseEnable(self):

self.GPIO.output(self.pin_e, False)

self.delayMicroseconds(1)              # 1 microsecond pause - enable pulse must be > 450ns

self.GPIO.output(self.pin_e, True)

self.delayMicroseconds(1)              # 1 microsecond pause - enable pulse must be > 450ns

self.GPIO.output(self.pin_e, False)

self.delayMicroseconds(1)              # commands need > 37us to settle

def message(self, text):

""" Send string to LCD. Newline wraps to second line"""

for char in text:

if char == '\n':

self.write4bits(0xC0) # next line

else:

self.write4bits(ord(char),True)

if __name__ == '__main__':

lcd = Adafruit_CharLCD()

mest="Lab102 GPS Clock \n time: "

  message="show"

while True:

try:

tmp=ser.readline()

if tmp.find('GPRMC')==1:

buf = tmp.split(',')

tim = buf[1]

print tim

num = tim[0:8]

message= mest+num

lcd.clear()

lcd.message(message)

except Exception as e:

print e

#ser.close()

ser = serial.Serial('/dev/ttyAMA0')

      3.SSH连接树莓派,运行该代码,LCD显示如图:

        

sudo python Adafruit_CharLCD.py

LCD显示GPS时钟[嵌入式系统]的更多相关文章

  1. 嵌入式系统图形库GUI核心模块介绍

    本文转载自:http://blog.csdn.net/xteda/article/details/6575278 (作者 冯青华 信庭嵌入式工作室(www.xteda.com)- CEO Blog:h ...

  2. C语言嵌入式系统编程修炼之二:软件架构篇

    模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求.C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行 ...

  3. C语言嵌入式系统编程修炼

    C语言嵌入式系统编程修炼 2008-08-19 作者:宋宝华 来源:天极网 C语言嵌入式系统编程修炼之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程 ...

  4. 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)

    嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...

  5. C语言嵌入式系统编程修炼之四:屏幕操作

    汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能.例如,一个微波炉的LCD上没有必要提供显示"电子邮件"的功 ...

  6. 《嵌入式系统原理与接口技术》——嵌入式系统接口应用基础

    本文为我负责编写的电子工业出版社出版的<嵌入式系统原理与接口技术>一书第七章部分,这里整理的仍然是修改稿,供需要的同学参考,本书为普通高等教育"十二五"规划教材,电子信 ...

  7. 【swupdate文档 三】SWUpdate: 嵌入式系统的软件升级

    SWUpdate: 嵌入式系统的软件升级 概述 本项目被认为有助于从存储媒体或网络更新嵌入式系统.但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWU ...

  8. [读书笔记2]《C语言嵌入式系统编程修炼》

    第3章 屏幕操作   3.1 汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能.例如,一个微波炉的LCD上没有必要提供显示&qu ...

  9. 嵌入式Linux驱动学习之路(一)嵌入式系统的软硬件架构

    硬件资料: 操作系统:(非虚拟机) zws@z-pc:~$ lsb_release -aNo LSB modules are available.Distributor ID: Ubuntu Desc ...

随机推荐

  1. 使用angular4和asp.net core 2 web api做个练习项目(一)

    这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net一样. 我用的是windows 10 安装工具: git for ...

  2. 脱壳第三讲,UPX压缩壳,以及补充壳知识

    脱壳第三讲,UPX压缩壳,以及补充壳知识 一丶什么是压缩壳.以及壳的原理 在理解什么是压缩壳的时候,我们先了解一下什么是壳 1.什么是壳 壳可以简单理解为就是在自己的PE文件中包含了代码.而有不影响我 ...

  3. 数据处理不等式:Data Processing Inequality

    我是在差分隐私下看到的,新解决方案的可用性肯定小于原有解决方案的可用性,也就是说信息的后续处理只会降低所拥有的信息量. 那么如果这么说的话为什么还要做特征工程呢,这是因为该不等式有一个巨大的前提就是数 ...

  4. Leetcode题解(22)

    66. Plus One 题目 这题很简单,直接代码: class Solution { public: vector<int> plusOne(vector<int> &am ...

  5. dfs序和欧拉序

    生命不息,学习不止,昨天学了两个算法,总结一下,然而只是略懂,请路过的大佬多多谅解.   一.dfs序 1.什么是dfs序? 其实完全可以从字面意义上理解,dfs序就是指一棵树被dfs时所经过的节点的 ...

  6. jQuery选择器(表单元素过滤选择器)第八节

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  7. js数组元素的添加和删除

    简单测试例子: var arr = new Array(); arr[0] = "aaa"; arr[1] = "bbb"; arr[2] = "cc ...

  8. IE下 GIF不动失效的奇葩问题

    IE下(IE6~IE9都有该问题),对页面进行了某些操作之后,页面上的GIF动画就停留在某一帧不动了~~~ !! 我大IE 就是这么奇葩. 搜索了一下,搞了好久总算搞定. 下面说下目前了解的所有的可能 ...

  9. Nginx安装、平滑升级与虚拟机配置

    Nginx 高性能HTTP反向代理服务器,也是 LAMP/POP3/SMTP代理服务器 由内核和模块组成,内核通过找配置文件讲客户端请求映射到一个location(location是Nginx配置中的 ...

  10. jquery的img的动态title换行

    因业务需要,需要在图片悬浮的时候显示动态加载的title,如果图片的title为固定的可以使用以下方式换行: <img src="1.jpg" title="第一行 ...