LCD顯示GPS時鐘[嵌入式系統]

                            夏任務102:作一個GPS鍾

 

實驗要求

  用RPi的串口鏈接一個GPS模塊,從GPS獲得實時時間,在7段數碼管或LCD上顯示html

實驗工具:

Raspberry Pi Model B主機,python

8G c10 SD卡,git

USB充電線,github

電源需自備5v 1A電源充電頭一個windows

PC機一臺(這裏用的操做系統是windows7 64bit旗艦版)ide

LED面板工具

GPS模塊+串口線ui

 

實驗步驟:

  1. 鏈接電路線路

        GPS板G3203:this

          VDD->RPi的3.3Vspa

          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

相關文章
相關標籤/搜索