Skip to content

Instantly share code, notes, and snippets.

@kwdowicz
Created March 23, 2026 07:37
Show Gist options
  • Select an option

  • Save kwdowicz/cbab5f189fd8f0972ba5b869aed7e9b4 to your computer and use it in GitHub Desktop.

Select an option

Save kwdowicz/cbab5f189fd8f0972ba5b869aed7e9b4 to your computer and use it in GitHub Desktop.
shelter_display.ino
/*
Jak podłączyć OLED do Arduino Nano
To bardzo proste połączenie. Ekran ma cztery wyprowadzenia:
GND łączysz z pinem GND w Nano
VCC łączysz z pinem 5V w Nano
SDA łączysz z analogowym pinem A4 w Nano (to sprzętowa linia danych I2C)
SCK łączysz z analogowym pinem A5 w Nano (to sprzętowa linia zegara I2C)
Biblioteki i kod terminala RobCo
Aby Arduino zrozumiało, jak rysować piksele na tym ekranie, będziesz musiał pobrać dwie darmowe biblioteki w programie Arduino IDE (zakładka Szkic -> Dołącz Bibliotekę -> Zarządzaj Bibliotekami):
Adafruit GFX Library (główny silnik graficzny)
Adafruit SSD1306 (sterownik dla Twojego konkretnego modelu)
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Przyklad 1: Rysowanie wizualne 8x8 pikseli (Metoda zer i jedynek)
const unsigned char icon_skull[] PROGMEM = {
B00111100,
B01000010,
B10100101,
B10000001,
B10100101,
B01011010,
B00111100,
B00011000
};
// Przyklad 2: Wygenerowana tablica 16x16 pikseli (symbol radiacji)
const unsigned char icon_radiation[] PROGMEM = {
0x01, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x0e, 0x70, 0x1c, 0x38, 0x38, 0x1c, 0x30, 0x0c, 0x23, 0xc4,
0x67, 0xe6, 0x47, 0xe2, 0x47, 0xe2, 0x63, 0xc6, 0x20, 0x04, 0x30, 0x0c, 0x38, 0x1c, 0x1c, 0x38
};
// Nowa rozbudowana struktura klatki
struct ScreenFrame {
int textSize; // Wielkosc tekstu (1 lub 2)
String message; // Tekst do wyswietlenia
unsigned long duration; // Czas trwania klatki w milisekundach
const unsigned char* bitmap; // Nazwa grafiki (lub NULL jesli brak)
int bmpWidth; // Szerokosc grafiki
int bmpHeight; // Wysokosc grafiki
int bmpX; // Pozycja X grafiki na ekranie (od lewej)
int bmpY; // Pozycja Y grafiki na ekranie (od gory)
};
// GLOWNA PLAYLISTA
ScreenFrame sequence[] = {
// 1. Tylko tekst (zwróc uwage na slowo NULL i zera na koncu)
{1, "ROBCO INDUSTRIES\nUNIFIED OS V. 85", 2500, NULL, 0, 0, 0, 0},
// 2. Tekst plus mała wizualna czaszka po prawej stronie
{1, "FATAL ERROR\nIN SECTOR 7", 2000, icon_skull, 8, 8, 100, 10},
// 3. Tekst plus wiekszy symbol radiacji
{1, "WARNING:\nRADIATION SPIKE", 2000, icon_radiation, 16, 16, 90, 8},
// 4. Mruganie (krotki czas, sam duzy tekst)
{2, " DANGER", 500, NULL, 0, 0, 0, 0},
{1, "", 200, NULL, 0, 0, 0, 0}, // Pusta klatka = wygaszenie ekranu
{2, " DANGER", 500, NULL, 0, 0, 0, 0}
};
const int totalFrames = sizeof(sequence) / sizeof(sequence[0]);
void setup() {
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
for(;;);
}
display.setTextColor(SSD1306_WHITE);
}
void loop() {
for (int i = 0; i < totalFrames; i++) {
display.clearDisplay();
// Rysowanie tekstu
display.setTextSize(sequence[i].textSize);
display.setCursor(0, 0);
display.print(sequence[i].message);
// Rysowanie grafiki tylko jesli nie zostala oznaczona jako NULL
if (sequence[i].bitmap != NULL) {
display.drawBitmap(sequence[i].bmpX, sequence[i].bmpY, sequence[i].bitmap, sequence[i].bmpWidth, sequence[i].bmpHeight, SSD1306_WHITE);
}
display.display();
delay(sequence[i].duration);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment