效果展示

cpu占用顯示 內(nèi)存占用顯示 IP地址顯示 網(wǎng)速顯示
lattepanda 拿鐵熊貓 v1 同時(shí)具有x86處理器和arduino單片機(jī), 單片機(jī)與x86直接通過板上的uart接口通訊, 單片機(jī)引入了眾多的gpio引腳, 大大擴(kuò)展了開發(fā)板的可玩性
硬件情況
開發(fā)板: lattepanda v1 Win10 (Linux應(yīng)該也可以使用, 可能需要自行修改x86腳本)
屏幕: IIC協(xié)議 128x64 OLED SH1106
接線方式
根據(jù)官方文檔接線


代碼
分為單片機(jī)部分的代碼與x86的代碼
-
代碼的使用
單片機(jī)代碼使用拿鐵熊貓官方自帶的arduino ide上傳至板載單片機(jī)
- 其中board選擇Arduino Leonardo
- com口選擇非COM1以外的那個(gè)COM口
- 編譯需要依賴u8glib庫(kù), 找教程導(dǎo)入即可
另外x86部分是python代碼
- python 3.11
- 需要安裝pyserial與psutil庫(kù)
待單片機(jī)燒好后, 雙擊執(zhí)行python代碼即可
-
單片機(jī)部分代碼
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口沒對(duì)上, 可以在arduino ide里找找當(dāng)前板上單片機(jī)的COM號(hào)是幾
import serial #導(dǎo)入模塊 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" #波特率,標(biāo)準(zhǔn)值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200 bps=9600 #超時(shí)設(shè)置,None:永遠(yuǎn)等待操作,0為立即返回請(qǐng)求結(jié)果,其他值為等待超時(shí)時(shí)間(單位為秒) timex=5 # 打開串口,并得到串口對(duì)象 ser=serial.Serial(portx,bps,timeout=timex) psutil.cpu_percent(None) # 第一次返回的結(jié)果是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 # 寫數(shù)據(jù) 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()#關(guān)閉串口 except Exception as e: print("---異常---:",e)