• LCD显示GPS时钟[嵌入式系统]


                                夏任务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 == ' ':

                    self.write4bits(0xC0) # next line

                else:

                    self.write4bits(ord(char),True)

    if __name__ == '__main__':

          lcd = Adafruit_CharLCD()

          mest="Lab102 GPS Clock 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

  • 相关阅读:
    vue系列教程:插值
    docker load 镜像时出现:open /var/lib/docker/tmp/docker-import-500852078/repositories: no such file or dir
    Day 18: 记filebeat内存泄漏问题分析及调优
    Filebeat 启动关闭流程
    docker加速
    Docker镜像保存save、加载load(外网转移至内网)
    filebeat.yml(中文配置详解)
    kafka介绍
    基于统一开发平台的微服务架构转型升级之路 | 某国有大型银行案例
    转 -Filebeat + Redis 管理 LOG日志实践
  • 原文地址:https://www.cnblogs.com/zxRPI/p/3147293.html
Copyright © 2020-2023  润新知