Das Wio Terminal von Seeed Studio ist ein Entwicklungsgerät, das standalone oder z.B. mit dem Raspberry Pi betrieben werden kann. Hierbei ist es möglich einfache Daten, wie Speicherinformationen, CPU Auslastung, etc. anzuzeigen, oder den Pi sogar um einen dritten Screen zu erweitern.
Daneben bringt das Wio Terminal u.a. auch ein Gyroskop, SD-Karten-Slot, Mikrofon, Buzzer, Buttons, uvm. mit. All diese Bausteine können individuell oder durch den Raspberry Pi ausgelesen und programmiert werden. In diesem Tutorial fokussieren wir uns darauf, wie man vom Raspberry Pi verschiedene System-Daten an das Wio Terminal per serieller Schnittstelle sendet und diese anzeigt.
Zubehör & Spezifikationen
In diesem Tutorial werden wir lediglich folgende Teile benötigen:
- Wio Terminal von Seeed Studio
- Raspberry Pi
- USB Type-C Kabel
Wie bereits erwähnt, hat das Wio Terminal (D51R) interessante Hardware-Spezifikationen:
Hauptchip |
Prozessor |
ARM® Cortex®-M4F |
Maximum Speed |
200MHz |
|
Externer Flash Speicher |
4 MB |
|
LCD |
Auflösung |
320 x 240 Pixel |
Größe |
2.4 Zoll |
|
Kabellose Verbindungen |
WLAN |
802.11 a/b/g/n 1×1, 2.4GHz & 5GHz |
Bluetooth |
unterstützt BLE5.0 |
|
Module |
Gyroskope |
LIS3DHTR |
Mikrofon |
1.0V-10V -42dB |
|
Lautsprecher |
≥78dB @10cm 4000Hz |
|
Lichtsensor |
400-1050nm |
|
Infrarotsender |
940nm |
|
Interfaces |
MicroSD Karten Slot |
max. 16GB |
GPIO |
40-PIN (kompatibel mit dem Raspberry Pi) |
|
Grove |
2 (multifunktional) |
|
FPC |
20 Pins |
|
USB Type-C |
Power & USB-OTG |
Wio Terminal Vorbereitung – Installation der Arduino IDE
Der Code für das Wio Terminal wird über die Arduino IDE übertragen. Auch für den Arduino bzw. ESP8266 nutzen wir die IDE. Falls du sie noch nicht installiert hast, fange damit an. Nun laden wir uns noch die LCD Library von Seeed Studio von Github (Code > Download ZIP).
https://github.com/Seeed-Studio/Seeed_Arduino_LCD
Anschließend wählen wir in der Arduino IDE unter „Sketch“ > „Include Library“ > „Add ZIP Library“ die geladene Datei aus.
Danach wählen wir im gleichen Menüpunkt „Manage Libraries“ aus, suchen nach Adafruit Zero DMA und installieren sie.
Zu guter Letzt geben wir unter „File“ > „Preferences“ > „Additional Board Manager URLs“ noch folgende URL an:
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
Falls du bereits für den ESP8266 eine URL eingetragen hast, ist das kein Problem. Du kannst pro Zeile einen Wert hinterlegen.
Unter „Tools“ werden nun weitere Boards angezeigt. Als letzten Punkt wählen wir „Tools“ > „Board“ > „Seeed SAMD …“ > „Seeduino Wio Terminal“ aus. Übernimm ebenfalls die weiteren Einstellungen, falls sie nicht wie hier gezeigt sind:
Wenn du das Modul nun per USB anschließt, sollte der Port direkt erkannt werden (du musst ihn vorher mit dem linken Button starten).
Coding – Wio Terminal & Raspberry Pi
Wir fangen damit an, den Code auf das Wio Terminal zu laden. Lege dazu auf deinem PC einen Ordner mit dem Namen „readRasp“ an und erstelle dort eine Datei namens „readRasp.ino“ (alternativ von hier herunterladen und einfügen). Die Datei kann mit der Arduino IDE bearbeitet werden und bekommt folgenden Inhalt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
#include"TFT_eSPI.h" #include"Free_Fonts.h" //include the header file TFT_eSPI tft; char buffer[100]; String CPU_temp, CPU_usage, Ram_total, Ram_used, Ram_free, Disk_total, Disk_used, Disk_Per; const unsigned char ram[] = { 0x00, 0xC3, 0x18, 0xC3, 0x00, 0x00, 0xE7, 0x18, 0xE7, 0x00, 0x00, 0xC3, 0x18, 0xC3, 0x00, 0x00, 0xC3, 0x18, 0xC3, 0x00, 0x00, 0xE7, 0x18, 0xE7, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xE0, 0x01, 0x00, 0x80, 0x07, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x72, 0xF0, 0xFF, 0x0F, 0x4E, 0x60, 0xF8, 0xFF, 0x1F, 0x06, 0x60, 0x3C, 0x00, 0x3C, 0x06, 0x72, 0x1C, 0x00, 0x38, 0x4E, 0x7F, 0x0C, 0x00, 0x30, 0xFE, 0x7F, 0x0C, 0x00, 0x30, 0xFE, 0x60, 0x0C, 0x00, 0x30, 0x06, 0x60, 0x0C, 0x00, 0x30, 0x06, 0x60, 0x0C, 0x00, 0x30, 0x06, 0x7F, 0x0C, 0x00, 0x30, 0xFE, 0x7F, 0x0C, 0x00, 0x30, 0xFE, 0x60, 0x0C, 0x00, 0x30, 0x06, 0x60, 0x0C, 0x00, 0x30, 0x06, 0x60, 0x0C, 0x00, 0x30, 0x06, 0x7F, 0x0C, 0x00, 0x30, 0xFE, 0x7F, 0x0C, 0x00, 0x30, 0xFE, 0x72, 0x1C, 0x00, 0x38, 0x4E, 0x60, 0x3C, 0x00, 0x3C, 0x06, 0x60, 0xF8, 0xFF, 0x1F, 0x06, 0x72, 0xF0, 0xFF, 0x0F, 0x4E, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x01, 0x00, 0x80, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0xE7, 0x18, 0xE7, 0x00, 0x00, 0xC3, 0x18, 0xC3, 0x00, 0x00, 0xC3, 0x18, 0xC3, 0x00, 0x00, 0xE7, 0x18, 0xE7, 0x00, 0x00, 0xC3, 0x18, 0xC3, 0x00, }; const unsigned char cpu[] = { 0x00, 0x42, 0x18, 0x42, 0x00, 0x00, 0x42, 0x18, 0x42, 0x00, 0x00, 0x42, 0x18, 0x42, 0x00, 0x00, 0x42, 0x18, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x00, 0x00, 0x02, 0x4F, 0x00, 0x00, 0x00, 0xF2, 0x40, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x02, 0x40, 0xF0, 0xFF, 0x0F, 0x02, 0x4F, 0xF8, 0xFF, 0x1F, 0xF2, 0x40, 0x18, 0x00, 0x18, 0x02, 0x40, 0xD8, 0xBD, 0x1E, 0x02, 0x40, 0x78, 0xBC, 0x1E, 0x02, 0x40, 0x78, 0xA4, 0x1E, 0x02, 0x4F, 0x78, 0xBC, 0x1E, 0xF2, 0x4F, 0x78, 0xBC, 0x1E, 0xF2, 0x40, 0x78, 0x84, 0x1E, 0x02, 0x40, 0x78, 0x84, 0x1E, 0x02, 0x40, 0xD8, 0x85, 0x1B, 0x02, 0x40, 0x18, 0x00, 0x18, 0x02, 0x4F, 0xF8, 0xFF, 0x1F, 0xF2, 0x40, 0xF0, 0xFF, 0x0F, 0x02, 0x40, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x02, 0x4F, 0x00, 0x00, 0x00, 0xF2, 0x40, 0x00, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x00, 0x00, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x18, 0x42, 0x00, 0x00, 0x42, 0x18, 0x42, 0x00, 0x00, 0x42, 0x18, 0x42, 0x00, 0x00, 0x42, 0x18, 0x42, 0x00, }; const unsigned char disk[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x03, 0xFC, 0xFB, 0xFF, 0xDF, 0x06, 0x06, 0x02, 0x00, 0x40, 0x0C, 0x06, 0x02, 0x00, 0x5F, 0x18, 0x06, 0x02, 0x00, 0x51, 0x30, 0x06, 0x02, 0x00, 0x59, 0x60, 0x06, 0x02, 0x00, 0x59, 0x40, 0x06, 0x02, 0x00, 0x59, 0x60, 0x06, 0x02, 0x00, 0x59, 0x60, 0x06, 0x02, 0x00, 0x59, 0x60, 0x06, 0x02, 0x00, 0x5F, 0x60, 0x06, 0x02, 0x00, 0x40, 0x60, 0x06, 0xFE, 0xFF, 0x7F, 0x60, 0x06, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x60, 0xC6, 0xFF, 0xFF, 0xFF, 0x63, 0x66, 0x00, 0x00, 0x00, 0x66, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0xFC, 0xFF, 0x3F, 0x64, 0x26, 0xFC, 0xFF, 0x3F, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0xFC, 0xFF, 0x3F, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0xFC, 0xFF, 0x3F, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0x26, 0x00, 0x00, 0x00, 0x64, 0xEC, 0xFF, 0xFF, 0xFF, 0x37, 0xF8, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, }; String getStringPartByNr(String data, char separator, int index) { // spliting a string and return the part nr index // split by separator int stringData = 0; //variable to count data part nr String dataPart = ""; //variable to hole the return text for(int i = 0; i<data.length()-1; i++) { //Walk through the text one letter at a time if(data[i]==separator) { //Count the number of times separator character appears in the text stringData++; }else if(stringData==index) { //get the text when separator is the rignt one dataPart.concat(data[i]); }else if(stringData>index) { //return text and stop if the next separator appears - to save CPU-time return dataPart; break; } } //return text if this is the last part return dataPart; } void setup() { // initialize serial ports: Serial.begin(115200); Serial.flush(); tft.begin(); tft.setRotation(3); //Homescreen when there is no data tft.fillScreen(TFT_WHITE); while(1) { HomeScreen(); if (Serial.available()) break; } } void loop() { // Try to get the data from serial port if (Serial.available() > 0) { int index = 0; int numChar = Serial.available(); if (numChar>50) { numChar=50; } memset(buffer, 0, sizeof(buffer)); while (numChar--) { buffer[index++] = Serial.read(); } CPU_temp = getStringPartByNr(buffer, '.', 0); CPU_usage = getStringPartByNr(buffer, ':', 1); Ram_total = getStringPartByNr(buffer, ':', 2); Ram_used = getStringPartByNr(buffer, ':', 3); Ram_free = getStringPartByNr(buffer, ':', 4); Disk_total = getStringPartByNr(buffer, ':', 5); Disk_used = getStringPartByNr(buffer, ':', 6); Disk_Per = getStringPartByNr(buffer, ':', 7); } //checking the last piece of data is not empty if (Disk_Per != "") { TempScreen(); delay(2000); RamScreen(); delay(2000); DiskScreen(); delay(2000); } } void TempScreen() { tft.fillScreen(TFT_BLACK); tft.setTextColor(TFT_WHITE); tft.setTextSize(1); tft.setFreeFont(FSSB12); //select Free, Sans, Bold, Oblique, 12pt. tft.drawString("Raspberry CPU Data",40,17); tft.drawFastHLine(0,45,320,TFT_RED); tft.drawFastHLine(0,46,320,TFT_RED); tft.drawFastHLine(0,47,320,TFT_RED); tft.drawRoundRect(34,66,82,32,5,TFT_WHITE); tft.fillRoundRect(35,67,80,30,5,TFT_DARKGREY); tft.setFreeFont(FMB12); tft.setTextColor(TFT_WHITE); tft.drawString("TEMP:",40,70); tft.drawRoundRect(34,116,92,32,5,TFT_WHITE); tft.fillRoundRect(35,117,90,30,5,TFT_DARKGREY); tft.drawString("USAGE:",40,120); tft.drawFastHLine(0,220,320,TFT_RED); tft.drawFastHLine(0,221,320,TFT_RED); tft.drawFastHLine(0,222,320,TFT_RED); tft.fillCircle(15,80, 5, TFT_DARKGREY); tft.fillCircle(15,130, 5, TFT_DARKGREY); tft.drawCircle(15,80,6,TFT_WHITE); tft.drawCircle(15,130,6,TFT_WHITE); tft.setTextColor(TFT_WHITE); tft.drawString(CPU_temp+'C',130,70); tft.drawString(CPU_usage+'%',130,120); tft.drawXBitmap(245,110,cpu, 40, 40, TFT_DARKGREY); } void RamScreen() { tft.fillScreen(TFT_BLACK); tft.setTextColor(TFT_WHITE); tft.setTextSize(1); tft.setFreeFont(FSSB12); //select Free, Sans, Bold, Oblique, 12pt. tft.drawString("Raspberry RAM Data",40,17); tft.drawFastHLine(0,45,320,TFT_BLUE); tft.drawFastHLine(0,46,320,TFT_BLUE); tft.drawFastHLine(0,47,320,TFT_BLUE); tft.drawRoundRect(34,66,92,32,5,TFT_WHITE); tft.fillRoundRect(35,67,90,30,5,TFT_PINK); tft.setFreeFont(FMB12); tft.setTextColor(TFT_WHITE); tft.drawString("TOTAL:",40,70); tft.drawRoundRect(34,116,92,32,5,TFT_WHITE); tft.fillRoundRect(35,117,90,30,5,TFT_PINK); tft.drawString("USED:",40,120); tft.drawRoundRect(34,166,92,32,5,TFT_WHITE); tft.fillRoundRect(35,167,90,30,5,TFT_PINK); tft.drawString("FREE:",40,170); tft.drawFastHLine(0,220,320,TFT_BLUE); tft.drawFastHLine(0,221,320,TFT_BLUE); tft.drawFastHLine(0,222,320,TFT_BLUE); tft.fillCircle(15,80, 5, TFT_PINK); tft.fillCircle(15,130, 5, TFT_PINK); tft.fillCircle(15,180, 5, TFT_PINK); tft.drawCircle(15,80,6,TFT_WHITE); tft.drawCircle(15,130,6,TFT_WHITE); tft.drawCircle(15,180,6,TFT_WHITE); tft.setTextColor(TFT_WHITE); tft.drawString(Ram_total+"MB",130,70); tft.drawString(Ram_used+"MB", 130,120); tft.drawString(Ram_free+"MB", 130,170); tft.drawXBitmap(245,110,ram, 40, 40, TFT_PINK); } void DiskScreen() { tft.fillScreen(TFT_BLACK); tft.setTextColor(TFT_WHITE); tft.setTextSize(1); tft.setFreeFont(FSSB12); tft.drawString("Raspberry Disk Data",35,17); tft.drawFastHLine(0,45,320,TFT_ORANGE); tft.drawFastHLine(0,46,320,TFT_ORANGE); tft.drawFastHLine(0,47,320,TFT_ORANGE); tft.drawRoundRect(34,66,92,32,5,TFT_WHITE); tft.fillRoundRect(35,67,90,30,5,TFT_DARKCYAN); tft.setFreeFont(FMB12); tft.drawString("TOTAL:",40,70); tft.drawRoundRect(34,116,92,32,5,TFT_WHITE); tft.fillRoundRect(35,117,90,30,5,TFT_DARKCYAN); tft.drawString("USED:",40,120); tft.drawRoundRect(34,166,92,32,5,TFT_WHITE); tft.fillRoundRect(35,167,90,30,5,TFT_DARKCYAN); tft.drawString("PERC.:",40,170); tft.drawFastHLine(0,220,320,TFT_ORANGE); tft.drawFastHLine(0,221,320,TFT_ORANGE); tft.drawFastHLine(0,222,320,TFT_ORANGE); tft.fillCircle(15,80, 5, TFT_DARKCYAN); tft.fillCircle(15,130, 5, TFT_DARKCYAN); tft.fillCircle(15,180, 5, TFT_DARKCYAN); tft.drawCircle(15,80,6,TFT_WHITE); tft.drawCircle(15,130,6,TFT_WHITE); tft.drawCircle(15,180,6,TFT_WHITE); if (Disk_Per != 0) { int perc = atoi(Disk_Per.c_str()); float ratio = perc*(0.01) * 30; tft.drawRect(180,168,10,30,TFT_WHITE); tft.fillRect(180,(168+(30-(int)ratio)),10,(int)ratio,TFT_WHITE); } tft.drawString(Disk_total+'B',130,70); tft.drawString(Disk_used+'B', 130,120); tft.drawString(Disk_Per+'%', 130,170); tft.drawXBitmap(245,110,disk, 40, 40, TFT_DARKCYAN); } void HomeScreen() { tft.setFreeFont(FSSB9); tft.setTextColor(TFT_BLACK); tft.drawString("Starting...", 120,120); } |
Zusätzlich laden von hier noch die Datei „Free_Fonts.h“ und legen sie in den Ordner.
Bevor wir weiter machen werfen wir kurz einen Blick auf den Code:
- Zeile 5/6: Zuweisungen von Variablen
- Zeile 8-63: Bitmap Arrays
- In Zeile 66-92 ist die Funktion
getStringPartByNr
, welche einen String aufteilt und einen bestimmten Teil zurückgibt (mehr dazu gleich). - In Zeile 94-109 wird
setup
einmalig beim Start aufgerufen (Initialisierung, Öffnen der seriellen Schnittstelle) - Zeile 111-144:
loop
– wird per Endlosschleife aufgerufen – hier wird das Rendering aufgerufen. Wir warten auf eine Nachricht über die serielle Schnittstelle und extrahieren die Daten daraus. Anschließend werden 3 Screens mit jeweils 2 Sekunden Verzögerung hintereinander angezeigt. - Ab Zeile 146: Render Funktionen der einzelnen Screens. Mittels
tft
können die LCD Funktionen des Wio Terminals aufgerufen werden (und damit können Grafiken gezeichnet werden).
Nun laden wir den Code auf das Gerät. Verbinde das Wio Terminal nach Abschluss des Uploads mit dem Raspberry Pi und starte beide. Am Anfang wird ein weißer Screen mit „Starting…“ angezeigt (wie in der Funktion HomeScreen
definiert).
Raspberry Pi
Nun wechseln wir auf den Raspberry Pi per SSH. Dort erstellen wir zunächst eine neue Python Datei.
sudo nano wio_terminal_example.py
Wir fügen folgenden Inhalt hinein:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
import os import time import serial # Settings for reading from Arduino Serial serialPort= "/dev/ttyACM0" #Change it to your Serial Port, Check in Arudino IDE baudRate = 115200 ser = serial.Serial(serialPort, baudRate, timeout=0.5) time.sleep(2) # Return CPU temperature as a character string def getCPUtemperature(): res = os.popen('vcgencmd measure_temp').readline() return(res.replace("temp=","").replace("'C\n","")) # Return RAM information (unit=kb) in a list # Index 0: total RAM # Index 1: used RAM # Index 2: free RAM def getRAMinfo(): p = os.popen('free') i = 0 while 1: i = i + 1 line = p.readline() if i==2: return(line.split()[1:4]) # Return % of CPU used by user as a character string def getCPUuse(): return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip())) # Return information about disk space as a list (unit included) # Index 0: total disk space # Index 1: used disk space # Index 2: remaining disk space # Index 3: percentage of disk used def getDiskSpace(): p = os.popen("df -h /") i = 0 while 1: i = i +1 line = p.readline() if i==2: return(line.split()[1:5]) def main(): while True: # CPU informatiom CPU_temp = getCPUtemperature() CPU_usage = getCPUuse() # RAM information # Output is in kb, here I convert it in Mb for readability RAM_stats = getRAMinfo() RAM_total = str(round(int(RAM_stats[0]) / 1000,1)) RAM_used = str(round(int(RAM_stats[1]) / 1000,1)) RAM_free = str(round(int(RAM_stats[2]) / 1000,1)) # Disk information DISK_stats = getDiskSpace() DISK_total = DISK_stats[0] DISK_used = DISK_stats[1] DISK_perc = DISK_stats[3] temp=ser.write(str.encode(CPU_temp+' '+CPU_usage)) data=ser.write(str.encode(CPU_temp+':'+CPU_usage+':'+RAM_total+':'+RAM_used+':'+RAM_free+':'+DISK_total+':'+DISK_used+':'+DISK_perc)) ser.flush() time.sleep(2) print('') print('CPU Temperature = '+CPU_temp) print('CPU Use = '+CPU_usage) print('') print('RAM Total = '+str(RAM_total)+' MB') print('RAM Used = '+str(RAM_used)+' MB') print('RAM Free = '+str(RAM_free)+' MB') print('') print('DISK Total Space = '+str(DISK_total)+'B') print('DISK Used Space = '+str(DISK_used)+'B') print('DISK Used Percentage = '+str(DISK_perc)) if __name__ == '__main__': try: main() except KeyboardInterrupt: if ser != None: ser.close() |
Dieses Skript liest die Systemdaten aus, stellt eine serielle Verbindung zum Wio Terminal her und sendet darüber die Daten in der definierten Reihenfolge.
Anschließend speichern (STRG+O) und beenden (STRG+X) wir den Editor und führen das Skript aus:
sudo python wio_terminal_example.py
Nun wirst du die Daten auf dem Display angezeigt bekommen.
Fazit & Weiteres
Das Wio Terminal von Seeed Studio ist in meinen Augen ein sehr interessantes Tool, welches für bestimmte Projekte einfach so genutzt werden kann (z.B. mittels MQTT) oder einen Raspberry Pi um ein Display, Sensoren, Buttons, uvm. erweitern kann. Für alle weiteren Funktionen gibt es auf der Wiki Seite auch Code-Beispiele, welche direkt so in die Arduino IDE übernommen werden können. Zwar ist es genauso gut möglich, all jene Sensoren und Module separat zu betreiben, aber dafür hat man dabei nicht alles in einem kompakten kleinen Gehäuse.
Einziges Manko, das mir aufgefallen ist: Man braucht einen zusätzlichen „Stacking Header“, wenn man das Terminal auf die GPIOs stecken will, da es ansonsten bei einem Raspberry Pi 4 nicht obendrauf passt.
Falls Interesse an weiteren Tutorials (standalone oder in Verbindung mit dem Raspberry Pi) besteht, schreib gerne einen Kommentar 🙂
Bildquellen: Seeed Studio
4 Kommentare
Interessantes Thema und guter Beitrag! Gerne mehr über das Wio-Terminal, Stand alone, wie auch in Verbindung mit Raspi, Arduino und auch externen Sensoren.
Leider kann ich die Datei „wio_terminal_example.py“ nicht herunterladen. An dieser Stelle wir nur
„Ein Fehler ist aufgetreten. Bitte versuchen Sie es später erneut.“
ausgegeben. Dies passiert sowohl bei Firefox als auch bei Opera. Ist die Datei, die dort angezeigt werden sollte nicht mehr vorhanden? Oder könnte der Fehler bei meinem Rechner liegen. Ich habe den Virenscanner von Kaspersky bei mir laufen.
Kannst du es nochmal prüfen?
Bin leider erst jetzt wieder hierher gekommen. Vielen Dank, das Script steht ja jetzt direkt im Artikel. Ist bestimmt sicherer. So kann man es jetzt ja direkt dort kopieren.
Vielen Dank und weiter so