ESP32 + mały OLED jako wyświetlacz biurka
Zbuduj tabliczkę na biurko, która sama pokazuje, kto dziś przy nim siedzi. ESP32 pyta API Hotdeska co pół minuty i rysuje wynik na ekranie OLED 0.96″. Całość za ~30 zł i bez lutowania.
1Czego potrzebujesz
- ESP32 DevKit (np. ESP32-WROOM-32, 30-pin) — dowolny klon za ~20 zł,
- OLED 0.96″ SSD1306, 128×64, wersja I2C (4 piny: GND, VCC, SCL, SDA) — ~10 zł,
- 4 przewody połączeniowe żeńsko-żeńskie (dupont),
- kabel micro-USB / USB-C (zależnie od płytki) do zasilania i wgrania kodu.
Ekran jest zasilany z pinu 3V3 płytki — nie potrzebujesz zasilacza ani płytki stykowej. Po wgraniu kodu wystarczy dowolna ładowarka USB.
2Podłączenie — 4 kable
OLED w wersji I2C łączy się z ESP32 czterema przewodami. Używamy domyślnych pinów I2C ESP32: GPIO 21 (SDA) i GPIO 22 (SCL).
| Pin OLED | Pin ESP32 | Rola |
|---|---|---|
GND | GND | masa |
VCC | 3V3 | zasilanie 3,3 V |
SCL | GPIO 22 | zegar I2C |
SDA | GPIO 21 | dane I2C |
GND i VCC (zależnie od producenta). Zawsze czytaj opisy wydrukowane na płytce ekranu, nie sugeruj się zdjęciem. Odwrotne podłączenie zasilania może uszkodzić ekran.3Wygeneruj token API
Endpoint GET /api/hotdesk/desk/:kod jest chroniony tokenem. Token znajdziesz (lub wygenerujesz) w panelu: Admin → Hotdesk → zakładka API. Tam też jest pełna dokumentacja API i przycisk „Pobierz .md".
Sprawdź token z komputera zanim wgrasz cokolwiek na ESP32:
curl "https://your-hotdesk.example/api/hotdesk/desk/A1?token=TWOJ_TOKEN"
Odpowiedź wygląda tak:
{ "code": "A1", "label": "Przy oknie", "occupied": true, "person": { "id": 16, "name": "Piotrek" } }
A1 to kod biurka z planu biura — każdy stolik ma swój. Wielkość liter nie ma znaczenia.
4Przygotuj Arduino IDE
- Zainstaluj Arduino IDE 2.x.
- File → Preferences → Additional boards manager URLs — dodaj:
https://espressif.github.io/arduino-esp32/package_esp32_index.json - Boards Manager → wyszukaj
esp32(Espressif) → Install. - Library Manager → zainstaluj trzy biblioteki:
Adafruit SSD1306(dociągnieAdafruit GFX),ArduinoJson(Benoît Blanchon).
- Wybierz płytkę ESP32 Dev Module i port USB. Jeśli port nie widnieje, doinstaluj sterownik
CP210xlubCH340(zależnie od klona).
5Kod — wgraj i zapomnij
Uzupełnij cztery stałe na górze (Wi-Fi, kod biurka, token) i wgraj. ESP32 łączy się z Wi-Fi, odpytuje API co 30 sekund i pokazuje wynik. Po utracie sieci samo się przełączy na ponawianie.
// Hotdesk desk display — ESP32 + SSD1306 128x64 (I2C)
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// ==== USTAWIENIA ============================================
const char* WIFI_SSID = "NazwaTwojegoWiFi";
const char* WIFI_PASS = "haslo-wifi";
const char* API_HOST = "https://your-hotdesk.example";
const char* DESK_CODE = "A1"; // kod biurka z planu
const char* API_TOKEN = "TWOJ_TOKEN"; // Admin → Hotdesk → API
const unsigned long POLL_MS = 30000; // odpytuj co 30 s
// ============================================================
Adafruit_SSD1306 display(128, 64, &Wire, -1);
unsigned long lastPoll = 0;
void show(const String& line1, const String& line2, bool big) {
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(line1);
display.drawLine(0, 12, 127, 12, SSD1306_WHITE);
display.setTextSize(big ? 2 : 1);
display.setCursor(0, 26);
display.println(line2);
display.display();
}
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // SDA, SCL
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // adres I2C ekranu
show("Hotdesk", "Lacze z WiFi...", false);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(300);
show("Hotdesk", "WiFi OK", false);
}
void poll() {
WiFiClientSecure client;
client.setInsecure(); // bez weryfikacji certyfikatu — patrz sekcja 6
HTTPClient http;
String url = String(API_HOST) + "/api/hotdesk/desk/" + DESK_CODE;
http.begin(client, url);
http.addHeader("X-Hotdesk-Token", API_TOKEN);
int code = http.GET();
if (code == 200) {
JsonDocument doc;
deserializeJson(doc, http.getStream());
String desk = doc["code"].as<String>();
bool occupied = doc["occupied"];
String who = occupied ? doc["person"]["name"].as<String>() : String("WOLNE");
show("Biurko " + desk, who, true);
} else if (code == 401) {
show("Blad 401", "Zly token", false);
} else if (code == 404) {
show("Blad 404", "Brak biurka " + String(DESK_CODE), false);
} else {
show("Blad HTTP", String(code), false);
}
http.end();
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
show("Hotdesk", "WiFi retry...", false);
WiFi.reconnect();
delay(2000);
return;
}
if (millis() - lastPoll >= POLL_MS || lastPoll == 0) {
lastPoll = millis();
poll();
}
delay(100);
}
6Najczęstsze problemy
Ekran nic nie pokazuje
- Sprawdź kolejność pinów na module (sekcja 2 — bywają zamienione GND/VCC).
- Część modułów ma adres I2C
0x3Dzamiast0x3C— zmień wdisplay.begin(...). Możesz to zweryfikować szkicem „I2C scanner".
Błąd 401 na ekranie
- Token jest zły albo został zregenerowany w panelu — skopiuj aktualny z Admin → Hotdesk → API.
Błąd 404
- Nie ma biurka o kodzie
DESK_CODE— sprawdź kody na planie biura.
Co z setInsecure()?
- Szkic pomija weryfikację certyfikatu TLS — dane to tylko „kto siedzi przy biurku", a upraszcza to kod (certyfikaty Let's Encrypt rotują co ~2 miesiące). Jeśli chcesz pełnej weryfikacji, wgraj root CA (ISRG Root X1) przez
client.setCACert(...).
Pełna dokumentacja API (wszystkie endpointy, format odpowiedzi): Admin → Hotdesk → zakładka API. Miłego budowania! 🔧