效果展示
cpu占用显示 内存占用显示 IP地址显示 网速显示
lattepanda 拿铁熊猫 v1 同时具有x86处理器和arduino单片机, 单片机与x86直接通过板上的uart接口通讯, 单片机引入了众多的gpio引脚, 大大扩展了开发板的可玩性
硬件情况
开发板: lattepanda v1 Win10 (Linux应该也可以使用, 可能需要自行修改x86脚本)
屏幕: IIC协议 128x64 OLED SH1106
接线方式
根据官方文档接线
代码
分为单片机部分的代码与x86的代码
-
代码的使用
单片机代码使用拿铁熊猫官方自带的arduino ide上传至板载单片机
- 其中board选择Arduino Leonardo
- com口选择非COM1以外的那个COM口
- 编译需要依赖u8glib库, 找教程导入即可
另外x86部分是python代码
- python 3.11
- 需要安装pyserial与psutil库
待单片机烧好后, 双击执行python代码即可
-
单片机部分代码
OLED_PRINTER.ino
#include "U8glib.h" #include <String.h> U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI char str[1000]; void serial_read(void) { int i = 0; while (Serial.available()) { str[i++] = Serial.read(); if (i == 800) while (Serial.read() >= 0 ); } str[i] = '\0'; } void draw(void) { u8g.setFont(u8g_font_6x10); u8g.setFontRefHeightExtendedText(); u8g.setDefaultForegroundColor(); u8g.setFontPosTop(); char s[2] = " "; uint8_t x, y, i = 0; for( y = 0; y < 6; y++ ) { for( x = 0; x < 18; x++ ) { if (str[i] == '\0') return; if (str[i] == '\n') { ++i; break; } s[0] = str[i++]; u8g.drawStr(x*7, y*10, s); } } } void setup(void) { // flip screen, if required // u8g.setRot180(); Serial.begin(9600); pinMode(8, OUTPUT); } void loop(void) { // picture loop u8g.firstPage(); do { if(Serial.available()) { delay(100); serial_read(); } draw(); } while (u8g.nextPage()); }
-
x86代码 oled_print.py
若闪退, 可能是COM口没对上, 可以在arduino ide里找找当前板上单片机的COM号是几
import serial #导入模块 import socket import psutil import time 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 try: #端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等 portx="COM3" #波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200 bps=9600 #超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒) timex=5 # 打开串口,并得到串口对象 ser=serial.Serial(portx,bps,timeout=timex) psutil.cpu_percent(None) # 第一次返回的结果是0 tx_before = psutil.net_io_counters().bytes_sent rx_before = psutil.net_io_counters().bytes_recv while(1): time.sleep(1) ram = psutil.virtual_memory().percent cpu = psutil.cpu_percent(None) tx_now = psutil.net_io_counters().bytes_sent rx_now = psutil.net_io_counters().bytes_recv tx = tx_now - tx_before rx = rx_now - rx_before tx_before = tx_now rx_before = rx_now # 写数据 result=ser.write(("CPU: "+ str(cpu) + "%\nRAM: " + str(ram) + "%\nIP: " + get_host_ip()).encode("ascii")) result=ser.write(("\n\nSent: {0}MB/s".format("%.3f"%(tx/1024/1024))).encode("ascii")) result=ser.write(("\nRecv: {0}MB/s".format("%.3f"%(rx/1024/1024))).encode("ascii")) ser.close()#关闭串口 except Exception as e: print("---异常---:",e)