Tutorial · DIY

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.

1. Części 2. Podłączenie 3. Token API 4. Arduino IDE 5. Kod 6. Problemy

1Czego potrzebujesz

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).

ESP32 USB ESP32 DevKit 3V3 GND G21 G22 … Biurko A1 Piotrek OLED 0.96″ SSD1306 (I2C) GND VCC SCL SDA 3V3 → VCC (zasilanie) GND → GND (masa) GPIO 21 → SDA (dane) GPIO 22 → SCL (zegar)
Cztery przewody dupont — kolory dowolne, ale trzymaj się konwencji: czerwony = zasilanie, czarny = masa.
Pin OLEDPin ESP32Rola
GNDGNDmasa
VCC3V3zasilanie 3,3 V
SCLGPIO 22zegar I2C
SDAGPIO 21dane I2C
Uwaga na kolejność pinów! Moduły OLED miewają zamienione 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

  1. Zainstaluj Arduino IDE 2.x.
  2. File → Preferences → Additional boards manager URLs — dodaj:
    https://espressif.github.io/arduino-esp32/package_esp32_index.json
  3. Boards Manager → wyszukaj esp32 (Espressif) → Install.
  4. Library Manager → zainstaluj trzy biblioteki:
    • Adafruit SSD1306 (dociągnie Adafruit GFX),
    • ArduinoJson (Benoît Blanchon).
  5. Wybierz płytkę ESP32 Dev Module i port USB. Jeśli port nie widnieje, doinstaluj sterownik CP210x lub CH340 (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);
}
Ekran OLED pokaże np. „Biurko A1 / Piotrek" albo „Biurko A1 / WOLNE". Po porannym losowaniu miejsc wynik zaktualizuje się sam przy najbliższym odpytaniu.

6Najczęstsze problemy

Ekran nic nie pokazuje

Błąd 401 na ekranie

Błąd 404

Co z setInsecure()?

Pełna dokumentacja API (wszystkie endpointy, format odpowiedzi): Admin → Hotdesk → zakładka API. Miłego budowania! 🔧