树莓派上使用python实现LCD1602显示当前ip

2023-05-16

树莓派一般运行Linux操作系统后通过远程控制来运行,但是往往由于网络原因导致树莓派分配的ip地址被改变,致使需要重新连接屏幕后才能查看树莓派的当前ip。最近手头有个LCD1602,所以尝试将通过驱动LCD屏,使用Python获取到相关网卡的ip,再循环显示到屏幕上。如下为主要的代码,已经通过了测试。

#!/usr/bin/python3
#import
import RPi.GPIO as GPIO
import time
import socket
import fcntl
import struct
# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18

def get_host_ip():
    try:
        s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        s.connect(('8.8.8.8',80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip
# Define some device constants
LCD_WIDTH = 16    # Maximum characters per line
LCD_CHR = True
LCD_CMD = False

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line

# Timing constants
#E_PULSE = 0.0005
#E_DELAY = 0.0005
E_PULSE = 0.001
E_DELAY = 0.001


def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
            s.fileno(),
            0x8915,  # SIOCGIFADDR
            struct.pack('256s', bytes(ifname[:15],'utf-8'))
    )[20:24])
def main():
    # Main program block
  GPIO.setwarnings(False)
  GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
  GPIO.setup(LCD_E, GPIO.OUT)  # E
  GPIO.setup(LCD_RS, GPIO.OUT) # RS
  GPIO.setup(LCD_D4, GPIO.OUT) # DB4
  GPIO.setup(LCD_D5, GPIO.OUT) # DB5
  GPIO.setup(LCD_D6, GPIO.OUT) # DB6
  GPIO.setup(LCD_D7, GPIO.OUT) # DB7
  time.sleep(15)

  # Initialise display
  lcd_init()
  ip1 = get_ip_address('wlan0')
  ip2 = get_ip_address('eth0')
  count = 0;
  while True:
    lcd_string("wlan0:",LCD_LINE_1)
    lcd_string(ip1,LCD_LINE_2)
    time.sleep(2)
    lcd_string("eth0:",LCD_LINE_1)
    lcd_string(ip2,LCD_LINE_2)
    time.sleep(2)
    count += 1
    if count == 10:
        lcd_clr()
        get_ip(ip1,ip2)
        count = 0
def lcd_clr():
    lcd_byte(0x01,LCD_CMD)
    lcd_byte(0x06,LCD_CMD)
    time.sleep(1)
def get_ip(ip1,ip2):
    ip1 = get_ip_address('wlan0')
    ip2 = get_ip_address('eth0')


def lcd_init():
    # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  time.sleep(E_DELAY)

def lcd_byte(bits, mode):
    # Send byte to data pins
  # bits = data
  # mode = True  for character
  #        False for command

  GPIO.output(LCD_RS, mode) # RS

  # High bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x10==0x10:
      GPIO.output(LCD_D4, True)
  if bits&0x20==0x20:
      GPIO.output(LCD_D5, True)
  if bits&0x40==0x40:
      GPIO.output(LCD_D6, True)
  if bits&0x80==0x80:
      GPIO.output(LCD_D7, True)

  # Toggle 'Enable' pin
  lcd_toggle_enable()

  # Low bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x01==0x01:
      GPIO.output(LCD_D4, True)
  if bits&0x02==0x02:
      GPIO.output(LCD_D5, True)
  if bits&0x04==0x04:
      GPIO.output(LCD_D6, True)
  if bits&0x08==0x08:
      GPIO.output(LCD_D7, True)

  # Toggle 'Enable' pin
  lcd_toggle_enable()

def lcd_toggle_enable():
    # Toggle enable
  time.sleep(E_DELAY)
  GPIO.output(LCD_E, True)
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)
  time.sleep(E_DELAY)

def lcd_string(message,line):
    # Send string to display

  message = message.ljust(LCD_WIDTH," ")

  lcd_byte(line, LCD_CMD)

  for i in range(LCD_WIDTH):
      lcd_byte(ord(message[i]),LCD_CHR)

if __name__ == '__main__':

  try:
        main()
  except KeyboardInterrupt:
      pass
  finally:
    lcd_byte(0x01, LCD_CMD)
    lcd_string("Goodbye!",LCD_LINE_1)
    GPIO.cleanup()
  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派上使用python实现LCD1602显示当前ip 的相关文章

随机推荐

  • Profinet协议解析-过程数据

    新的一篇文章 xff0c 开始讲下一个点 过程数据 过程数据 xff0c 顾名思义 xff0c 就是一直循环传输的数据 xff0c 在整个过程中不间断的传输 xff0c 其每次传输的时间称为同步周期 这点类似于Ethercat中的PDO数据
  • 无题

    漫无目的的写点东西 很多事情在文字面前显得特别无力 xff0c 又不得不用它来描述记录 记得读本科那会儿 xff0c 机械专业被称为一个万金油的行业 xff0c 所以宁愿用一本的分数去一个二本学校 xff0c 也要报机械专业 xff0c 谁
  • PROFINET的时钟同步(一)

    最近发现CSDN的编辑工具越来越不好用了 xff0c 直接用word导出PDF转图片 xff0c 发上来 清晰度受CSDN的影响 xff0c 不是很清楚
  • PROFINET 链路简述

    如上为 Profinet 的简易收发链路图 xff0c 其中收发各有四条路径 xff0c 三个中继桥 租用分别如下 xff1a RX 端 xff1a CTRL xff1a 控制管理帧的通道 xff0c 例如 LLDP 的邻居协议相关帧 xf
  • DSP中GPIO位域

    在TMS320F2812中 xff0c 对于程序中寄存器的名称是如何映射到物理地址的 xff0c 这里做一下详细的讲解 主要应用到三个文件 xff1a CMD h DSP28 GLobalVariableDefs c xff0c 其中CMD
  • 使用UART串口下调试CH376芯片

    CH376是文件管理控制芯片 xff0c 用于单片机系统读写U 盘或者SD 卡中的文件 CH376支持USB设备方式和USB主机方式 xff0c 并且内置了USB通讯协议的基本固件 xff0c 内置了处理Mass Storage海量存储设备
  • Ubuntu(arm)22.04配置清华源

    1 xff0c 清华源地址 地址 xff1a https mirror tuna tsinghua edu cn help ubuntu 2 xff0c 获取ubuntu arm 的源 ubuntu arm 要使用清华源中ubuntu po
  • DGUS调试笔记一

    0 串口的通讯配置 xff1a 在机器背面VHC86芯片有两个焊点 xff0c 若焊点短接 xff0c 即屏工作在TTL电平下 xff0c 默认出厂处于分离状态 xff0c 即RS232电平下 直接将DIN与232的TX相连 xff0c D
  • 使用HAL库函数建立STM32F2工程笔记

    一 建立一个新的文件夹 xff0c 新建三个文件夹User Driver Project xff0c 还可以加一个Doc存放工程的相关说明等等 1 将STM32F2xx的库函数 xff08 HAL函数库 xff09 中的Drivers文件夹
  • STM32伺服编码器接口

    在STM32的高级定时器和一般定时器中有Encoder interface mode xff08 编码器接口 xff09 xff0c TI1和TI2分别对应TIM CH1 和TIM CH2 通道 一 计数规则如下 xff1a 表55的是编码
  • STM32下调试CAN通信

    基本流程 xff1a 1 初始化CAN模块 xff1a 启用CAN时钟 配置CAN功能寄存器 xff08 包括位定时 xff0c 分频等等 xff09 配置CAN过滤器 打开中断 2 初始化I O口 启用GPIO时钟 打开CAN对应的GPI
  • JLINK固件修复

    0 开始前准备工具 1 SAM BA v2 12 exe 用于烧写固件 下载地址 xff1a http download csdn net detail hzt12345hf 9457629 新版本的SAM BA xff08 例如sam b
  • Keil4,Keil5下使用STlink II 仿真调试

    1 关闭Keil软件 2 下载以下压缩包STlink II相关文件 xff0c 包含三个文件ST LINKII KEIL dll xff0c StorAcc dll和TOOLS INI 3 将ST LINKII KEIL dll和StorA
  • Centos下PHP5升级PHP7

    首先下载PHP7安装包 xff0c 使用wget http am1 php net distributions php 7 2 0 tar bz2 或者直接访问下载 xff0c 然后ftp到linux服务器解压压缩包 xff0c tar x
  • STM32F1xx及STM32F2系列串口,SPI配置,CAN配置

    平时常用的串口和SPI配置在这里列出来 xff0c 以便不时之需 xff0c 直接拿过来用 同时指出了STM32F1系列和STM32F2系列经常出现的问题 使用的库函数为标准库函数 xff0c 而非HAL库 一 串口的配置 xff1a ST
  • 嵌入式中缓冲区队列的实现

    在串口 xff0c IIC或SPI以及CAN等通信中 xff0c 往往需要一次性发送一帧完整的数据 xff0c 由于硬件发送的速度问题 xff0c 硬件不能及时发送出去 xff0c 就会导致数据丢失等一系列问题 通常采用建立缓冲区解决 队列
  • FreeRTOS中断优先级,临界区的配置(特别重要)

    一 背景 网上有许多关于FreeRTOS中断优先级的配置资料 xff0c 但是在v10 0中个别配置项发生了变化 xff0c 在这篇文章中详细的介绍了整个优先级管理配置方案 ARM芯片的优先级为0 255 不同的芯片厂商所用的优先级不同 x
  • 推荐EI、SCI期刊及投稿建议-备忘(转)

    推荐EI SCI期刊及投稿建议 备忘 EI检索期刊计算机方面SCI和EI期刊 xff08 EI期刊会议注册前推荐 xff09 大会注册前推荐的EI期刊 xff1a 英文投稿的一点经验 转载 再加两封催稿信 英语不好 xff0c 但意思表达到
  • arm linux的入口部分的代码分析笔记

    原文转载自http bbs chinaunix net thread 2039668 1 1 html xff0c 写的不错 xff0c 在这里首先感谢作者 查看带有图片的文章请移步 https blog zh123 top p 61 27
  • 树莓派上使用python实现LCD1602显示当前ip

    树莓派一般运行Linux操作系统后通过远程控制来运行 xff0c 但是往往由于网络原因导致树莓派分配的ip地址被改变 xff0c 致使需要重新连接屏幕后才能查看树莓派的当前ip 最近手头有个LCD1602 xff0c 所以尝试将通过驱动LC