Display OLED da 0,91 pollici – Introduzione al prodotto

Language

Il display OLED da 0,91 pollici è un modulo di visualizzazione a basso consumo basato sulla comunicazione I2C con risoluzione 128x32. Supporta il collegamento con diverse schede di sviluppo come i controller della serie Jetson, Raspberry Pi e Orange Pi e può visualizzare in tempo reale le informazioni sullo stato del sistema.

Funzionalità principali

  • 📊 Visualizzazione in tempo reale dell'utilizzo della CPU
  • ⏰ Visualizzazione dell'ora di sistema corrente
  • 💾 Visualizzazione dell'utilizzo della memoria e della memoria totale
  • 🗄️ Visualizzazione dello spazio della scheda TF
  • 🌐 Visualizzazione dell'indirizzo IP locale del dispositivo
  • 🔌 Supporto hot swap, stabile e affidabile

Collegamento hardware

Istruzioni di cablaggio

Utilizzando l'interfaccia di comunicazione I2C, il cablaggio avviene come segue:

Pin OLED Pin della scheda di sviluppo
VCC 3.3V
GND GND
SDA SDA I2C
SCL SCL I2C
⚠️ Nota: Assicurati che il cablaggio sia corretto ed evita i cortocircuiti dei pin, altrimenti si potrebbero danneggiare i componenti della scheda principale!

Guida all'uso del software

Piattaforme supportate:

  • ✅ Controller della serie Jetson
  • ✅ Tutti i modelli Raspberry Pi
  • ✅ Tutti i modelli Orange Pi
  • ✅ Altre schede di sviluppo Linux con comunicazione I2C

Passaggi di installazione per la serie Jetson

1. Installare le dipendenze

sudo apt install -y python3-pip
sudo pip3 install smbus
sudo pip3 install Adafruit_SSD1306

2. Rilevare i dispositivi I2C

# List all I2C buses
i2cdetect -l

# Detect I2C devices, OLED default address is 0x3c
i2cdetect -y -r *

3. Eseguire il codice di test

#!/usr/bin/env python3
# coding=utf-8
import time
import os
import sys
import Adafruit_SSD1306 as SSD
from PIL import Image, ImageDraw, ImageFont
import subprocess

class Juxi_OLED:
    def __init__(self, i2c_bus=1, debug=False):
        self.__debug = debug
        self.__i2c_bus = i2c_bus
        self.__top = -2
        self.__x = 0
        self.__total_last = 0
        self.__idle_last = 0
        self.__str_CPU = "CPU:0%"

    # Initialize OLED, return True on success, False on failure
    def begin(self):
        try:
            self.__oled = SSD.SSD1306_128_32(rst=None, i2c_bus=self.__i2c_bus, gpio=1)
            self.__oled.begin()
            self.__oled.clear()
            self.__oled.display()
            self.__width = self.__oled.width
            self.__height = self.__oled.height
            self.__image = Image.new('1', (self.__width, self.__height))
            self.__draw = ImageDraw.Draw(self.__image)
            self.__font = ImageFont.truetype("DejaVuSansMono.ttf",8)
            return True
        except:
            return False

    # Clear display, refresh=True to refresh immediately
    def clear(self, refresh=False):
        self.__draw.rectangle((0, 0, self.__width, self.__height), outline=0, fill=0)
        if refresh:
            self.refresh()

    # Add text at specified position
    def add_text(self, start_x, start_y, text, refresh=False):
        if start_x > 128 or start_x < 0 or start_y < 0 or start_y > 32:
            return
        x = int(start_x + self.__x)
        y = int(start_y + self.__top)
        self.__draw.text((x, y), str(text), font=self.__font, fill=255)
        if refresh:
            self.refresh()

    # Add text to specified line (1-4)
    def add_line(self, text, line=1, refresh=False):
        if line < 1 or line > 4:
            return
        y = int(8 * (line - 1))
        self.add_text(0, y, text, refresh)

    # Refresh OLED display
    def refresh(self):
        self.__oled.image(self.__image)
        self.__oled.display()

    # Get CPU usage
    def getCPULoadRate(self, index):
        count = 10
        if index == 0:
            f1 = os.popen("cat /proc/stat", 'r')
            stat1 = f1.readline()
            data_1 = []
            for i in range(count):
                data_1.append(int(stat1.split(' ')[i+2]))
            self.__total_last = sum(data_1)
            self.__idle_last = data_1[3]
        elif index == 4:
            f2 = os.popen("cat /proc/stat", 'r')
            stat2 = f2.readline()
            data_2 = []
            for i in range(count):
                data_2.append(int(stat2.split(' ')[i+2]))
            total_now = sum(data_2)
            idle_now = data_2[3]
            total = int(total_now - self.__total_last)
            idle = int(idle_now - self.__idle_last)
            usage = int(total - idle)
            usageRate = int(float(usage / total) * 100)
            self.__str_CPU = "CPU:" + str(usageRate) + "%"
            self.__total_last = 0
            self.__idle_last = 0
        return self.__str_CPU

    # Get system time
    def getSystemTime(self):
        cmd = "date +%H:%M:%S"
        date_time = subprocess.check_output(cmd, shell=True)
        str_Time = str(date_time).lstrip('b\'').rstrip('\\n\'')
        return str_Time

    # Get memory usage
    def getUsagedRAM(self):
        cmd = "free | awk 'NR==2{printf \"RAM:%2d%% -> %.1fGB \", 100*($2-$7)/$2, ($2/1048576.0)}'"
        FreeRam = subprocess.check_output(cmd, shell=True)
        str_FreeRam = str(FreeRam).lstrip('b\'').rstrip('\'')
        return str_FreeRam

    # Get disk usage
    def getUsagedDisk(self):
        cmd = "df -h | awk '$NF==\"/\"{printf \"SDC:%s -> %.1fGB\", $5, $2}'"
        Disk = subprocess.check_output(cmd, shell=True)
        str_Disk = str(Disk).lstrip('b\'').rstrip('\'')
        return str_Disk

    # Get local IP address
    def getLocalIP(self):
        ip = os.popen("/sbin/ifconfig enP8p1s0 | grep 'inet' | awk '{print $2}'").read()
        ip = ip[0: ip.find('\n')]
        if(ip == ''):
            ip = os.popen("/sbin/ifconfig wlP1p1s0 | grep 'inet' | awk '{print $2}'").read()
            ip = ip[0: ip.find('\n')]
            if(ip == ''):
                ip = 'x.x.x.x'
        if len(ip) > 15:
            ip = 'x.x.x.x'
        return ip

    # Main operation loop, support hot swap
    def main_program(self):
        state = False
        try:
            cpu_index = 0
            state = self.begin()
            while state:
                self.clear()
                str_CPU = self.getCPULoadRate(cpu_index)
                str_Time = self.getSystemTime()
                if cpu_index == 0:
                    str_FreeRAM = self.getUsagedRAM()
                    str_Disk = self.getUsagedDisk()
                    str_IP = "IPA:" + self.getLocalIP()
                self.add_text(0, 0, str_CPU)
                self.add_text(50, 0, str_Time)
                self.add_line(str_FreeRAM, 2)
                self.add_line(str_Disk, 3)
                self.add_line(str_IP, 4)
                self.refresh()
                cpu_index = cpu_index + 1
                if cpu_index >= 5:
                    cpu_index = 0
                time.sleep(.1)
        except:
            pass

if __name__ == "__main__":
    try:
        i2c_num = 7
        if len(sys.argv) > 1:
            if str(sys.argv[1]).isdigit():
                i2c_num = int(sys.argv[1])
        
        oled = Juxi_OLED(i2c_num, debug=True)
        while True:
            oled.main_program()
            time.sleep(2)
    except KeyboardInterrupt:
        oled.clear(True)
        del oled
        print(" Program closed! ")
        pass

4. Avviare il programma

# Default bus 7
python3 Oled_i2c.py

# Or specify bus (e.g. bus 1)
python3 Oled_i2c.py 1

Passaggi di installazione per Raspberry Pi / Orange Pi

1. Abilitare l'interfaccia I2C

Apri le impostazioni di sistema: Preferences → Raspberry Pi Configuration → Interfaces → Enable I2C option, quindi riavvia il sistema.

Oppure usa la modalità da riga di comando:

sudo raspi-config
# Select Interface Options → I2C → Enable → Restart system

2. Installare le dipendenze

sudo apt install -y python3-dev python3-smbus i2c-tools python3-pil python3-pip python3-setuptools python3-rpi.gpio python3-venv

# Install required font
sudo apt-get install -y fonts-dejavu-core

3. Configurare i permessi

sudo chmod a+rw /dev/i2c-* # Temporary effect, permanent effect requires udev rule configuration

4. Rilevare il dispositivo

i2cdetect -y 1
# Normally, device address 0x3c will be displayed

5. Creare un ambiente virtuale (consigliato)

# Install virtual environment tool (if not installed)
sudo apt-get install -y python3-venv

# Create virtual environment
python3 -m venv oled_env

# Activate virtual environment
source oled_env/bin/activate

# Install required libraries
pip install Adafruit_SSD1306 pillow -i https://mirrors.aliyun.com/pypi/simple/

6. Eseguire il programma

python3 Oled_i2c.py 1
# If permission error occurs, check sudo configuration or I2C device permissions

Effetto di visualizzazione

Dopo l'esecuzione corretta del programma, lo schermo OLED visualizza le seguenti informazioni su 4 righe:

  1. Prima riga: utilizzo della CPU + ora di sistema
  2. Seconda riga: utilizzo della memoria + memoria totale
  3. Terza riga: utilizzo della scheda TF + capacità totale
  4. Quarta riga: indirizzo IP locale del dispositivo

Link correlati

 

Questo articolo è un riassunto. Leggi la documentazione tecnica completa sul Wiki.

Leggi l'articolo completo sul Wiki →

Apri nel Wiki Feishu