给树莓派加一个小OLED屏

本文介绍了如何在树莓派上添加一个OLED屏幕,通过I2C通讯实现显示网口IP地址、CPU/MEM利用率和当前时间,展示了详细的代码实现过程。
摘要由CSDN通过智能技术生成

一、实验目标

给树莓派添加一个小的OLED屏幕,用来显示网口IP地址、CPU/MEM利用率和当前时间。

二、实验器材

1、oled屏通讯方式采用IIC通讯;

 

2、树莓派5,开启I2C功能;

3、杜邦线4根,采用I2C通信,连接树莓派的I2C pin引脚。

三、实现代码

字体文件拷贝到代码目录。

from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106
import netifaces
import time
import psutil
from PIL import ImageFont

font = ImageFont.truetype('./msyh.ttc', 11, encoding='unic')

WIDTH = 128
HEIGHT = 32

def getIPAddr():
    ip_addresses = {}
    for interface in netifaces.interfaces():
        if interface != 'lo':
            try:
                addrs = netifaces.ifaddresses(interface)
                ip_addresses[interface] = addrs[netifaces.AF_INET][0]['addr']
            except:
                ip_addresses[interface] = '0.0.0.0'
    return ip_addresses


def getCPU():
    return psutil.cpu_percent()

def getMem():
    free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
    total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
    memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
    return int(memory * 100)

def getCurDate():
    curDate = time.strftime("%Y年%m月%d日",time.localtime())
    return curDate

def getCurTime():
    curTime = time.strftime("%H:%M:%S",time.localtime())
    return curTime

def mydraw(draw,x,y,message):
    draw.text((x,y), message, font=font, fill='white')



disp = ssd1306(i2c(port=1, address=0x3C), rotate=2, width=WIDTH, height=HEIGHT)
while True:
    with canvas(disp) as draw:
        ipAddr = getIPAddr()
        mydraw(draw, 0, 0, f"有线 : {ipAddr['eth0']}")
        mydraw(draw, 0,16, f"无线 : {ipAddr['wlan0']}")
    time.sleep(5)
    disp.clear()
    with canvas(disp) as draw:
        cpuPer = getCPU()
        memPer = getMem()
        mydraw(draw, 0,0, f"CPU利用率:{cpuPer} %")
        mydraw(draw, 0,16, f"Mem利用率:{memPer} %")
    time.sleep(2)
    disp.clear()
    with canvas(disp) as draw:
        mydraw(draw,0,0, f"{getCurDate()}")
        mydraw(draw,0,16, f"{getCurTime()}")
    time.sleep(2)
    disp.clear()

 四、效果展示

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,树莓派使用wiringpi驱动oled屏幕的具体步骤如下: 1.安装wiringpi库 在终端中输入以下命令进行安装: ``` sudo apt-get update sudo apt-get install wiringpi ``` 2.连接oled屏幕oled屏幕的SDA和SCL引脚分别连接到树莓派的GPIO2和GPIO3引脚上。 3.编写代码 使用wiringpi库编写代码来控制oled屏幕的显示。以下是一个简单的示例: ``` #include <wiringPi.h> #include <wiringPiI2C.h> #define OLED_ADDR 0x3c int fd; void write_cmd(unsigned char cmd) { wiringPiI2CWriteReg8(fd, 0x00, cmd); } void write_data(unsigned char data) { wiringPiI2CWriteReg8(fd, 0x40, data); } void OLED_Init() { write_cmd(0xAE); // display off write_cmd(0x20); // set memory addressing mode write_cmd(0x00); // horizontal addressing mode write_cmd(0x21); // set column address write_cmd(0x00); // start column write_cmd(0x7F); // end column write_cmd(0x22); // set page address write_cmd(0x00); // start page write_cmd(0x07); // end page write_cmd(0xB0); // set page start address write_cmd(0xC8); // flip vertically write_cmd(0x00); // set low column address write_cmd(0x10); // set high column address write_cmd(0x40); // set display start line write_cmd(0x81); // set contrast control write_cmd(0xFF); // set maximum contrast write_cmd(0xA1); // set segment remap write_cmd(0xA6); // set normal display write_cmd(0xA8); // set multiplex ratio write_cmd(0x3F); // set maximum multiplex ratio write_cmd(0xA4); // set display mode write_cmd(0xD3); // set display offset write_cmd(0x00); // set offset to 0 write_cmd(0xD5); // set display clock divide ratio/oscillator frequency write_cmd(0xF0); // set divide ratio and oscillator frequency write_cmd(0xD9); // set pre-charge period write_cmd(0x22); // set pre-charge period to 2 DCLKs write_cmd(0xDA); // set COM pins hardware configuration write_cmd(0x12); // set alternate COM pins write_cmd(0xDB); // set VCOMH write_cmd(0x40); // set VCOMH to 0.83 VCC write_cmd(0x8D); // set charge pump write_cmd(0x14); // enable charge pump write_cmd(0xAF); // display on } void OLED_Clear() { int i, j; for (i = 0; i < 8; i++) { write_cmd(0xB0 + i); write_cmd(0x00); write_cmd(0x10); for (j = 0; j < 128; j++) { write_data(0x00); } } } void OLED_ShowString(unsigned char x, unsigned char y, unsigned char *str) { unsigned char c = 0, i = 0, j = 0; while (str[j] != '\0') { c = str[j] - 32; if (x > 120) { x = 0; y++; } write_cmd(0xB0 + y); write_cmd((x & 0x0F) | 0x10); write_cmd((x >> 4) | 0x00); for (i = 0; i < 8; i++) { write_data(pgm_read_byte(font8x16 + c * 16 + i)); } write_cmd(0xB0 + y); write_cmd((x & 0x0F) | 0x10); write_cmd((x >> 4) | 0x00); for (i = 8; i < 16; i++) { write_data(pgm_read_byte(font8x16 + c * 16 + i)); } x += 8; j++; } } int main(int argc, char **argv) { if (wiringPiSetup() < 0) { fprintf(stderr, "Failed to setup wiringPi\n"); return 1; } if ((fd = wiringPiI2CSetup(OLED_ADDR)) < 0) { fprintf(stderr, "Failed to setup I2C device: %s\n", strerror(errno)); return 1; } OLED_Init(); OLED_Clear(); OLED_ShowString(0, 0, "Hello, world!"); return 0; } ``` 这段代码实现了oled屏幕的初始化、清和显示字符串等功能。 4.编译运行 在终端中输入以下命令进行编译: ``` gcc -o oled oled.c -lwiringPi ``` 然后运行程序: ``` sudo ./oled ``` 此时,oled屏幕应该可以显示出“Hello, world!”这个字符串了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值