In diesem Beitrag will ich die gemachten Erfahrungen und gesammelten Informationen zum Auslesen von Chipinformationen am ESP32 weiter verfolgen und ein Skript dazu vorstellen.
Für diesen Adventure soll mir das ESP_WIKI_kit der Fa. Heltec dienen.
Ich habe hier einen Liegen mit dem Aufdruck DIY More, das soll hier aber nicht weiter interessieren.
Das Board hatte ich irgendwann bei Aliexpress bestellt.
Die wichtigsten Eigenschaften:
ESP32, Tensilica LX6 Dual-Core-Prozessor
getaktet mit 240 MHz
im Chip integrierter 520 KB SRAM, 802.11 b/g/n HT40 Wi-Fi-Transceiver
Integrierter 4-MByte-Flash
Wi-Fi-Antenne
blaues 0,96-Zoll-OLED-Display
CP2102-USB-zu-Seriell-Chip
UDP mit Durchsatz von 135 Mbit/s
Betriebsspannung: 3,3 V bis 7 V
Betriebstemperaturbereich: -40 °C bis +90 °C
Wenden wir uns der eigentlichen Aufgabe zu und schauen mal, was wir mit der ESP32.h so anstellen können, bzw. welche Funktionen uns ohne große Tricks zur Verfügung stehen.
#include <Arduino.h> void setup() { Serial.begin(115200); delay(1000); Serial.println(); // Heap Serial.println("Daten des Heap"); Serial.print("Heap Size: "); Serial.print(ESP.getHeapSize() / 1024, DEC); // Ausgabe in KB //total heap size Serial.println(" KB"); Serial.print("Available Heap Size: "); Serial.print(ESP.getFreeHeap() / 1024, DEC); // Ausgabe in KB ////available heap Serial.println(" KB"); Serial.print("lowest level of free heap since boot: "); Serial.print(ESP.getMinFreeHeap() / 1024, DEC); // Ausgabe in KB Serial.println(" KB"); Serial.print("largest block of heap that can be allocated at once: "); Serial.print(ESP.getMaxAllocHeap() / 1024, DEC); // Ausgabe in KB Serial.println(" KB"); Serial.println(); //SPI RAM Serial.println("Daten des PSRAM"); Serial.print("PSRAM Size: "); Serial.print(ESP.getPsramSize() / 1024, DEC); // Ausgabe in KB Serial.println(" KB"); Serial.print("Free PSRAM Size: "); Serial.print(ESP.getFreePsram() / 1024, DEC); // Ausgabe in KB Serial.println(" KB"); Serial.print("Min_Free PSRAM Size: "); Serial.print(ESP.getMinFreePsram() / 1024, DEC); // Ausgabe in KB Serial.println(" KB"); Serial.print("Free PSRAM Size: "); Serial.print(ESP.getMaxAllocPsram() / 1024, DEC); // Ausgabe in KB Serial.println(" KB"); Serial.println(); Serial.println("Daten des Chips"); //Chip Serial.print("Chip Revision: "); Serial.println(ESP.getChipRevision()); Serial.print("Chip Model: "); Serial.println(ESP.getChipModel()); Serial.print("Chip Cores: "); Serial.println(ESP.getChipCores()); Serial.print("Chip Freq: "); Serial.print(ESP.getCpuFreqMHz()); Serial.println(" MHz"); Serial.println(); Serial.println("Daten des Flash Speichers"); //Flash Serial.print("Flash Size: "); Serial.print(ESP.getFlashChipSize() / 1024, DEC); // Ausgabe in KB Serial.println(" KB"); Serial.print("Flash Chip speed: "); Serial.println(ESP.getFlashChipSpeed()); Serial.print("Flash Chip Mode: "); Serial.println(ESP.getFlashChipMode()); Serial.println(); Serial.println("Daten des Sketches"); // Sketch Serial.print("Sketch Size: "); Serial.print(ESP.getSketchSize() / 1024, DEC); // Ausgabe in KB Serial.println(" KB"); Serial.print("Sketch Size MD5: "); Serial.println(ESP.getSketchMD5()); Serial.print("Free sketch Space: "); Serial.print(ESP.getFreeSketchSpace() / 1024, DEC); // Ausgabe in KB Serial.println(" KB"); Serial.println(); Serial.println("Fuse: "); uint64_t macAddress = ESP.getEfuseMac(); Serial.print("MAC Address: "); Serial.print((macAddress >> 40) & 0xFF, HEX); // Erstes Byte Serial.print(':'); Serial.print((macAddress >> 32) & 0xFF, HEX); // Zweites Byte Serial.print(':'); Serial.print((macAddress >> 24) & 0xFF, HEX); // Drittes Byte Serial.print(':'); Serial.print((macAddress >> 16) & 0xFF, HEX); // Viertes Byte Serial.print(':'); Serial.print((macAddress >> 8) & 0xFF, HEX); // Fünftes Byte Serial.print(':'); Serial.println(macAddress & 0xFF, HEX); // Sechstes Byte } void loop() { // Nichts tun }
Die einzelnen Funktionen, die in der ESP.h verfügbar sind, habe ich im Beitrag „Was steckt in meinem ESP“ bereits genauer erläutert.
Aber den letzten Teil des Codes zur Ermittlung der MAC-Adresse will ich gerne noch genauer darstellen.
Was macht diese Zeile zum Beispiel: Serial.print((macAddress >> 40) & 0xFF, HEX); // Erstes Byte
Bitoperationen zur Extraktion der Bytes
1. macAddress >> 40
- macAddress ist eine 64-Bit-Zahl (uint64_t), die die MAC-Adresse des ESP32 darstellt.
- >> 40 ist ein bitweiser Rechtsverschiebungsoperator. Dieser Operator verschiebt die Bits der Zahl um 40 Positionen nach rechts.
- Durch diese Verschiebung wird das erste Byte der MAC-Adresse (die höchsten 8 Bits) an die niedrigsten 8 Bitpositionen der Zahl verschoben. Dies bedeutet, dass das erste Byte nun in der Position ist, die wir leicht extrahieren können.
2. & 0xFF
- 0xFF ist eine hexadezimale Konstante, die der binären Zahl 11111111 entspricht. Das sind 8 Einsen in der Binärdarstellung, was 255 in dezimaler Form entspricht.
- Der bitweise UND-Operator (&) wird verwendet, um nur die letzten 8 Bits der Zahl zu extrahieren. Dies hilft, den Wert auf einen Bereich von 0 bis 255 zu beschränken, der genau einem Byte entspricht.
- Ohne diesen Schritt könnten zusätzliche Bits in der höheren Position der Zahl erhalten bleiben, die für unsere Zwecke irrelevant sind.
3. Serial.print(…, HEX)
- Serial.print(…, HEX) gibt die resultierende Zahl in hexadezimaler Form aus.
- Der HEX-Parameter spezifiziert, dass die Ausgabe in hexadezimaler (also Basis 16) Darstellung erfolgen soll.
Zusammensetzung der gesamten Zeile
Die Zeile Serial.print((macAddress >> 40) & 0xFF, HEX); arbeitet also folgendermaßen:
Ausgabe: Das Ergebnis wird in hexadezimaler Form ausgegeben.
Rechtsverschiebung: Die MAC-Adresse wird um 40 Bits nach rechts verschoben, sodass das erste Byte der MAC-Adresse die niedrigsten 8 Bitpositionen einnimmt.
Maskierung: Durch das Bitwise-AND mit 0xFF wird nur das erste Byte behalten und alle anderen Bits entfernt.
Und nun will ich euch nicht die Ausgabe des oben gezeigten Codes vorenthalten.
Zur besseren Orientierung und Bezug zur Seite mit den Erläuterungen der Funktionen habe ich jeden Abschnitt verlinkt.
rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1184
load:0x40078000,len:13232
load:0x40080400,len:3028
entry 0x400805e4
Daten des Heap
Heap Size: 367 KB
Available Heap Size: 342 KB
lowest level of free heap since boot: 336 KB
largest block of heap that can be allocated at once: 111 KB
Daten des PSRAM
PSRAM Size: 0 KB
Free PSRAM Size: 0 KB
Min_Free PSRAM Size: 0 KB
Free PSRAM Size: 0 KB
Daten des Chips
Chip Revision: 1
Chip Model: ESP32-D0WDQ6
Chip Cores: 2
Chip Freq: 240 MHz
Daten des Flash Speichers
Flash Size: 4096 KB
Flash Chip speed: 40000000
Flash Chip Mode: 2
Daten des Sketches
Sketch Size: 268 KB
Sketch Size MD5: 0afef9566b4ff39e40d71f2869165042
Free Sketch Space: 1280 Kb
Fuse
MAC Address: B8:A4:C0:7E:B9:94
Da sind wir schon wieder am Ende diese DIYTechAdventure angekommen. Ich hoffe, ihr fandet den Ausflug genau so spannend wie ich beim Schreiben. Und es gilt – ein Kommentar ist gerne gesehen!