拿鐵熊貓v1 OLED屏幕系統(tǒng)監(jiān)視器

效果展示

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)
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • due有14個(gè)數(shù)字i/o,6個(gè)模擬i/o,一個(gè)復(fù)位開關(guān),一個(gè)icsp下載口,7-12v電源供電 14個(gè)數(shù)字i/o,...
    麥牛2013閱讀 821評(píng)論 1 1
  • Arduino Due有14個(gè)數(shù)字I/O,6個(gè)模擬I/O,一個(gè)復(fù)位開關(guān),一個(gè)ICSP下載口,7-12v電源供電。 ...
    麥牛2013閱讀 3,527評(píng)論 0 8
  • 37款傳感器與執(zhí)行器的提法,在網(wǎng)絡(luò)上廣泛流傳,其實(shí)Arduino能夠兼容的傳感器模塊肯定是不止這37種的。鑒于本人...
    驢友花雕閱讀 1,315評(píng)論 0 1
  • 姓名:周崇杰 學(xué)號(hào):16140120059 專業(yè):機(jī)械設(shè)計(jì)制造及其自動(dòng)化 轉(zhuǎn)載自:http://blog.csd...
    CJbaby閱讀 3,650評(píng)論 0 3
  • 大家好!這是小編第二次做小項(xiàng)目~ 小編目前專業(yè)是電氣自動(dòng)化的,不搞點(diǎn)硬件方面的東西,不學(xué)點(diǎn)控制技術(shù)...
    世緣閱讀 11,227評(píng)論 4 15

友情鏈接更多精彩內(nèi)容