/* * ============================================================ * Tishvi OLED 1.3" 128×64 Display (SH1106) — Sample Sketch * guide.tishvi.com * ============================================================ * Wiring (I2C — 4 wires): * OLED GND → Arduino GND * OLED VCC → Arduino 5V * OLED SCL → Arduino A5 * OLED SDA → Arduino A4 * * I2C Address : 0x3C (pre-configured — no hardware change needed) * Controller : SH1106 (NOT SSD1306 — different chip, different library) * * ⚠ IMPORTANT — Library Required: * Install "U8g2" by oliver via Arduino IDE Library Manager. * Search: U8g2 → Install by "oliver" * Do NOT use Adafruit SSD1306 — it will not align correctly on SH1106. * * What this sketch does: * 1. Shows a Tishvi welcome screen with a border for 2.5 seconds * 2. Transitions to a live uptime counter (updates every second) * 3. Draws a horizontal separator line and a small footer * 4. Demonstrates: clearBuffer, setFont, drawStr, drawLine, sendBuffer * * U8g2 key pattern: * u8g2.clearBuffer(); // clear RAM buffer * // ... all draw calls go here ... * u8g2.sendBuffer(); // push buffer → display * ============================================================ */ #include #include #include // ── Display Constructor ────────────────────────────────────── // SH1106 · 128×64 · I2C · Hardware I2C pins (A4=SDA, A5=SCL) // _F_ = full framebuffer (requires ~1KB RAM — fine on UNO R3) U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset= */ U8X8_PIN_NONE); // ── Variables ──────────────────────────────────────────────── unsigned long lastUpdate = 0; unsigned long counter = 0; // ── Helper: print zero-padded 2-digit number ───────────────── void printPadded(uint8_t x, uint8_t y, int val) { char buf[3]; sprintf(buf, "%02d", val); u8g2.drawStr(x, y, buf); } void setup() { Serial.begin(9600); // Initialise display u8g2.begin(); Serial.println("Tishvi 1.3\" OLED (SH1106) — Ready"); // ── Welcome Screen ───────────────────────────────────────── u8g2.clearBuffer(); // Outer border u8g2.drawFrame(0, 0, 128, 64); // Title — large font u8g2.setFont(u8g2_font_logisoso16_tr); u8g2.drawStr(18, 26, "TISHVI"); // Subtitle — small font u8g2.setFont(u8g2_font_6x10_tr); u8g2.drawStr(22, 42, "1.3\" OLED Ready"); u8g2.drawStr(10, 57, "guide.tishvi.com"); u8g2.sendBuffer(); delay(2500); } void loop() { // Update display every second if (millis() - lastUpdate >= 1000) { lastUpdate = millis(); unsigned long totalSec = millis() / 1000; int hours = totalSec / 3600; int minutes = (totalSec % 3600) / 60; int seconds = totalSec % 60; u8g2.clearBuffer(); // ── Header ───────────────────────────────────────────── u8g2.setFont(u8g2_font_6x10_tr); u8g2.drawStr(10, 10, "Tishvi SH1106 Demo"); u8g2.drawHLine(0, 13, 128); // separator line // ── Counter label ─────────────────────────────────────── u8g2.setFont(u8g2_font_6x10_tr); u8g2.drawStr(0, 28, "Uptime:"); // ── HH:MM:SS — large font ─────────────────────────────── u8g2.setFont(u8g2_font_logisoso16_tr); char timeBuf[9]; sprintf(timeBuf, "%02d:%02d:%02d", hours, minutes, seconds); u8g2.drawStr(4, 50, timeBuf); // ── Footer ────────────────────────────────────────────── u8g2.drawHLine(0, 53, 128); u8g2.setFont(u8g2_font_5x7_tr); u8g2.drawStr(20, 62, "128x64 SH1106 I2C"); u8g2.sendBuffer(); // Log to Serial Monitor Serial.print("Uptime: "); Serial.println(timeBuf); counter++; } }