Spickzettel für ESP32

Installation in der Arduino-IDE

[Quelle]

Hardware ESP32 Dev Module

GPIO-Belegung zum ESP32-WROOM

Pins 30-Pin-Variante (schwarze Pinleiste)

Pins 36-Pin-Variante (gelbe Pinleiste)

Standard-Belegung

Programmierung des ESP32 Dev Module

Bootloader

Der Bootloader im ESP32 fragt nach einem Reset den Zustand von GPIO0 ab. Ist dieses Low startet der serielle Flashloader. IO0 muss dazu mind. 1ms nach EN=1 auf 0 gehalten werden. Die auf dem Eval-Board verwendete RTS/DTR-Logik verhindert ein gleichzeitiges Low an EN und IO0. Das esp32load.py schaltet RTS und DTR zu langsam um, sodass IO0 zu spät 0 ist. Abhilfe wäre die Vergrößerung der Reset-Zeitkonstante durch eine größere Kapazität.

[Quelle]

Pin lesen

digitalRead(switchPin);

Z.B. ist der BOOT-Switch mit IO0 verbunden (um nach dem Reset vom Bootloader in den Flash-Loader zu wechseln) und kann sofort als Taster im Programm genutzt werden (switchPin=0).

Pin schreiben

#define ledPin 2
digitalWrite(ledPin, HIGH);

Auf dem ESP32 Dev Module V1 ist an IO2 eine blaue LED angeschlossen.

A/D-Wandler

Das Lesen erfolgt wie üblich über

analogRead(ADC19); 

Serielle Schnittstelle

Der ESP32 hat 3 UARTs.

Die erste UART, die auf dem Dev-Modul mit dem CP2102 verbunden ist (über IO1 und IO3), wird wie üblich initialisiert mit

Serial.begin(115200);

Die zwei anderen UARTs werden durch den Konstruktor definiert und mit Angabe der Pin-Nummern in begin() initialisiert:

//Definition der beiden Schnittstellen
HardwareSerial Serial1(1);
HardwareSerial Serial2(2);
void setup()
{ //Starten der Schnittstellen
	Serial.begin(115200);
	//Serial1 auf Pin 12 und 13
	Serial1.begin(9600,SERIAL_8N1,12,13); //Serial2 auf Pin 22 und 23
	Serial2.begin(9600,SERIAL_8N1,22,23); //Startmeldung ausgeben
	Serial.println();
	Serial.println("Bitte eine Eingabe:");
}

[Quelle]

CAN-Schnittstelle

ESP32-CAN-Bibliothek: [Quelle] als .zip herunterladen und nach "Arduino\libraries" entpacken oder mittels Sketch > Include Library > Add .ZIP Library importieren

Self-Test-Mode

Im Self-Test-Mode wird kein ACK benötigt, was sich zum Testen bzw. am Bus mit nur einem, nicht immer aktiven Teilnehmer eignet. Um diesen zu aktivieren habe ich folgende Änderungen der ESP32CAN-Lib vorgenommen:

Datei Änderung/Erweiterung
ESP32CAN.cpp int ESP32CAN::CANSTM() {
return CAN_STM();
}
 
ESP32CAN.h class ESP32CAN {
public:
int CANSTM();
};
 
CAN.c int CAN_STM() {
// enter reset mode
MODULE_CAN->MOD.B.RM = 1;
MODULE_CAN->MOD.B.STM = 1;
MODULE_CAN->MOD.B.RM = 0;
return 0;
}

I2C-Schnittstelle

#include <Wire.h>                 // I2C
Wire.begin(21,22);
Wire.setClock(400000); // choose 400 kHz I2C rate
Wire.beginTransmission(0x3B); // Initialize the Tx buffer
Wire.write(0x0F); // Put WHO_AM_I address in Tx buffer
Wire.endTransmission(false); // Send the Tx buffer, but send a restart to keep connection alive
Wire.requestFrom(0x3B, 1); // Read two bytes from slave PROM address
while (Wire.available()) {
data = Wire.read(); } // Put read results in the Rx buffer
#include <Wire.h>
#define SDA1 21
#define SCL1 22
#define SDA2 17
#define SCL2 16
TwoWire I2Cone = TwoWire(0);
TwoWire I2Ctwo = TwoWire(1);

SPI-Schnittstelle

siehe Arduino->Beispiele->SPI

Preferences / NVS

#include <Preferences.h>
Preferences prefs;
prefs.begin(„nvs“, false);
prefs.putUChar(„addr“, 65);
byte b = prefs.getUChar(„addr“, 0);
prefs.remove(„nvs“);

[Quelle]

EEPROM

#include <EEPROM.h>
EEPROM.begin(EEPROM_SIZE);
EEPROM.write(address, value);
EEPROM.commit();
EEPROM.read(address);

[Quelle]

OLED-Display

SSD1306 128x64 I2C monochrom

SSD1351 128x160 SPI monochrom

SSD1353 128x160 SPI RGB15

Adafruit SSD1351 RGB

Pinout:

  u8glib
U8glib_Arduino v1.19.1
Wiki
U8g2_Arduino v2.26.4
Wiki
Arduino-Lib
Ucglib_Arduino v1.5.2
ucglib
Wiki
HAL
SSD1306 x x  
SSD1351 x   x
SSD1353 x    

Ucglib

U8glib

#include "U8glib.h"
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI 
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); // Fast I2C / TWI 
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send AC

void setup()
{
 // assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}

void loop(void)
{
// picture loop
u8g.firstPage(); 
do
{
draw();
} while( u8g.nextPage() );
}
// Page-Mode (_1_) oder FullyBuffered (_F_)
U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R2, /* clock=*/ 16, /* data=*/ 17, /* reset=*/ U8X8_PIN_NONE);   // ESP32 Thing, pure SW emulated I2C
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17);   // ESP32 Thing, HW I2C with pin remapping

void setup()
{
 u8g2.begin();
}

void loop(void)
{
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
// im Fully Buffered Mode wird nur eine große Page benötigt
u8g2.clearBuffer(); // clear the internal memory
u8g2.drawStr(0,10,"Hello World!"); // write something to the internal memory
u8g2.sendBuffer(); // transfer internal memory to the display
// im Page-Mode müssen die Befehle für jede Page wiederholt werden
do
{
  u8g2.drawStr( 0, 0, "drawLine");
} while( u8g2.nextPage() );} 

SSD1353 mit u8glib

Die u8glib enthält nur teilweise die Unterstützung für den SSD1353. Hinzugefügt habe ich:

Datei Änderung/Erweiterung
u8glib.h
class U8GLIB_SSD1353_160X128_HICOLOR : public U8GLIB
{
	public:
		U8GLIB_SSD1353_160X128_HICOLOR(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
			: U8GLIB(&u8g_dev_ssd1353_160x128_hicolor_sw_spi, sck, mosi, cs, a0, reset) { }
		U8GLIB_SSD1353_160X128_HICOLOR(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
			: U8GLIB(&u8g_dev_ssd1353_160x128_hicolor_hw_spi, cs, a0, reset) { }
};

class U8GLIB_SSD1353_160X128_332 : public U8GLIB
{
	public:
		U8GLIB_SSD1353_160X128_332(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
			: U8GLIB(&u8g_dev_ssd1353_160x128_332_sw_spi, sck, mosi, cs, a0, reset) { }
		U8GLIB_SSD1353_160X128_HICOLOR(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
			: U8GLIB(&u8g_dev_ssd1353_160x128_332_hw_spi, cs, a0, reset) { }
};
clib\u8g.h /* SSD1353 OLED Palmtronics */
extern u8g_dev_t u8g_dev_ssd1353_160x128_332_hw_spi;
extern u8g_dev_t u8g_dev_ssd1353_160x128_hicolor_hw_spi;

extern u8g_dev_t u8g_dev_ssd1353_160x128_332_sw_spi;
extern u8g_dev_t u8g_dev_ssd1353_160x128_hicolor_sw_spi;
   
   
   

SSD1351 vs. SSD1353

  SSD1351 SSD1353 ucglib
Set Column Address 0x15 Start End x
Set Row Address 0x75 Start End x
Write RAM Command 0x5C x
Read RAM Command 0x5D
Set Second Precharge speed N/A 0x8A AA
Set Re-map / Color Depth
(Display RAM to Panel)
0xA0 Bits
leicht unterschiedliche Reset-Werte, Bit 3 unterschiedlich
Set Display Start Line / vertical scroll by RAM 0xA1 Start
Set Display Offset 0xA2 Offset
Set Display Mode - All OFF 0xA4 0xA6
Set Display Mode - All ON, GS63 0xA5
Set Display Mode - Reset to normal 0xA6 0xA4
Set Display Mode - Inverse 0xA7
Function Selection (Vdd, Interface Width) 0xAB Bits N/A
Dim Mode setting N/A 0xAB AA BB CC DD EE
Display ON in dim mode N/A 0xAC
NOP 0xAD
0xB0
0xD1
N/A
Sleep Mode On (Display OFF) 0xAE x
Sleep Mode Off (Display ON) 0xAF
Set Reset (Phase 1) /
Pre-charge (Phase 2) period
0xB1 AB; vorwärtskompatibel
Display Enhancement 0xB2 AA BB CC N/A
Front Clock Divider (DivSet)/
Oscillator Frequency
0xB3 AB - unterschiedliche Wertezuordnung
Set Segment Low Voltage (VSL) 0xB4 AA BB CC N/A
Set GPIO 0xB5 Bits N/A
Set Second Precharge Period 0xB6 AA 0xB4 AA gleicher Wertebereicch
Look Up Table for Gray Scale Pulse width 0xB8 AA[63], aber unterschiedlicher Wertebereich
Use Built-in Linear LUT [reset= linear] 0xB9
Set Pre-charge voltage 0xBB AA, aber unterschiedlicher Wertebereich
Set VCOMH Voltage 0xBE AA, aber unterschiedlicher Wertebereich
OTP Write N/A 0xC0 AA BB
Set Contrast Current for Color A,B,C 0xC1 AA BB CC 0x81 AA
0x82 BB
0x83 CC
Master Contrast Current Control 0xC7 AA 0x87 AA, gleicher Wertebereich x
Set Multiplex Ratio 0xCA AA 0xA8 AA
Software Reset N/A 0xE2
NOP 0xE3
Set Command Lock 0xFD AA, aber unterschiedlicher Wertebereich [AA.2]
Graphic Acceleration
Horizontal Scroll 0x96 AA BB CC DD EE 0x27 AA BB CC DD EE, dazu 0xA3
Stop Moving 0x9E 0x2E
Start Moving 0x9F 0x2F
Set Vertical Scroll Area N/A 0xA3 AA BB
Draw Line N/A 0x21 D[7]
Drawing Rectangle N/A 0x22 D[10]
Copy N/A 0x23 D[6]
Dim Window N/A 0x24 D[4]
Clear Window N/A 0x25 D[4]
Fill Enable / Disable N/A 0x26 AA

Ucglib

Datei    
ucglib.h class Ucglib_SSD1353_18x160x128_HWSPI : public Ucglib4WireHWSPI
{
public:
Ucglib_SSD1353_18x160x128_HWSPI( uint8_t cd, uint8_t cs = UCG_PIN_VAL_NONE, uint8_t reset = UCG_PIN_VAL_NONE) :
Ucglib4WireHWSPI(ucg_dev_ssd1353_18x160x128_ilsoft, ucg_ext_ssd1353_18, /*cd=*/ cd , /*cs=*/ cs, /*reset=*/ reset)
{ }
};
 
clib\ucg.h ucg_int_t ucg_dev_ssd1353_18x160x128_dep(ucg_t *ucg, ucg_int_t msg, void *data); // ucg_dev_oled_160x128_dep.c
ucg_int_t ucg_ext_ssd1353_18(ucg_t *ucg, ucg_int_t msg, void *data); // ucg_dev_ic_ssd1353.c
ucg_int_t ucg_dev_ic_ssd1353_18(ucg_t *ucg, ucg_int_t msg, void *data); // ucg_dev_ic_ssd1353.c
 
     

Fonts

In der Fontbezeichnung sind verschiedene Dinge kodiert [Quelle]:

Web-Update

[Quelle]

WiFi

Zum Debugging bietet es sich an, die WiFi-Events zu beobachten:

void WiFiEvent(WiFiEvent_t event, system_event_info_t info){...}

WiFi.onEvent(WiFiEvent);

WiFi.begin()

Verbindet die Station mit DHCP.

auch interessant:


Erstellt 14.04.2019, zuletzt geändert 27.04.2020 11:01:02, Zugriffszähler Besuche. © Christian Enders

Home | Nach oben | D-Link DUB-C2 | TechSolo TN-270 | Hama PCI-USB 2.0 18882 | Promise FastTrak100 TX2 | Mustek 1200 CP | Plustek OpticFilm 7200 | Canon MX925 | HP P1110 | Digitus DN-7003GT | Digitus DN-7003GS | Digitus DN-7006GR | Option Fusion | WLAN-Adapter | USB RS232 Wandler | ESP32 | BlackMagic DeckLink | KNC DVB-C+ | MD-9717