树莓派4B-通过OLED显示服务的IP地址与端口号

一、目标

1、为了方便将树莓派部署为一个本地web服务器,需要知道访问服务的IP地址与端口号;
2、使用OLED显示,且除了显示地址与端口号的字符位置外,还可以显示需要展示的logo;

二、环境

1、树莓派4;
2、oled屏幕;

三、实现方法

1、使用播放图片的方式在oled上播放包含logo与ip地址的图片,以达到logo动画运动与实时更新ip地址与端口号的功能;
2、准备具有logo的图片,限定好ip与端口显示位置,将ip与端口字符通过PIL库增加到图片中;
3、图片通过IIC在OLED上播放;

import os
import glob
import time
import socket  
import fcntl  
import struct  
from PIL import Image, ImageDraw, ImageFont  
import luma.oled as oled  
from luma.core.interface.serial import i2c    
from luma.oled.device import ssd1306  
  
WIDTH=128
HEIGHT=64   
  
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', ifname[:15].encode('utf-8'))  # 将字符串编码为字节对象  
    )[20:24]) 

def search_dir_pic(dir_name, suffix):
    # 设置文件夹路径  
    folder_path = os.path.join(os.getcwd(), dir_name)
      
    # 使用glob模块匹配以数字命名的文件  
    number_files = glob.glob(os.path.join(folder_path, 'frame_'+'[0-9]*.'+suffix)) 
    
    # print('图片文件名')
    # print(number_files)
    
    return sorted(number_files)
 
def load_device():
    # 创建I2C接口对象  
    serial = i2c(port=1, address=0x3C)  # 地址可能因显示屏型号而异  
      
    # 创建OLED设备对象  
    device = ssd1306(serial, WIDTH, HEIGHT) 
    
    return device
    
def draw_on_pic(image):
  
    # 创建一个可以在给定图像上绘制的对象  
    draw = ImageDraw.Draw(image)   
    font = './font/ARIALI.TTF' #设备上可能没有字体文件,此文件是通过everything软件搜索.ttf文件在电脑中查到的
    font_size = int(min(WIDTH, HEIGHT)/5)
    font = ImageFont.truetype(font, font_size)
    # 使用函数获取eth0的IP地址  
    ip_address = get_ip_address('eth0')  
    port = 80
    print("local eth0 addr"+ip_address)
    text = 'IP address:\n'+ip_address+'\nPort:\n'+str(port)
    # 定义文本内容和位置  
    x_position = 0  # x坐标  
    y_position = 0  # y坐标  
      
    # 在图片上写字,设置文本颜色为黑色  
    draw.text((x_position, y_position), text, fill=0, font=font)  
    
    return image

# 定义一个函数来将灰度图像转换为二值图像  
def convert_to_binary(image, threshold=128):  
    return image.point(lambda x: 0 if x < threshold else 255, '1')   

def load_pic(pic_name):
    # 加载图片并调整大小  
    print('ready show pic'+pic_name)
    
    image = Image.open(pic_name)
    image = image.resize((WIDTH, HEIGHT)).convert('L')
    image = convert_to_binary(image) # 转换为二值图像(黑白) 
    image = draw_on_pic(image)

    return image
 
def show(image):
    # 将图片数据发送到OLED  
    device.display(image)
    time.sleep(1/5)
    
if __name__=='__main__':
    
    global device
    device = load_device()
    
    pic_group = search_dir_pic('pic-s', 'jpg')
    
    while True:
        for pic_file in pic_group:
            image = load_pic(pic_file)
            show(image)

四、实现效果

打印:
在这里插入图片描述
效果图:
请添加图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值