Community project

Wiadomości Dla Mamy

Arduino
Photo of Wiadomości Dla Mamy
Generated with AI

lenovoandrzej

Published October 5, 2026

Wiadomości Dla Mamy is a status display system built around an Arduino Uno that lets users communicate their current state with a simple button press. Four push buttons trigger different messages on a 16x2 LCD screen, each conveying a distinct status—from "occupied" to "available" to mood indicators—making it easy to share information without typing or speaking.

This guide provides a complete wiring diagram showing how to connect the four push buttons and I2C LCD display to the Arduino Uno, a full parts list, the complete firmware with debounce logic, and step-by-step assembly instructions. Builders will have everything needed to assemble and program a working status communicator.

Wiring diagram

Wiring diagram for Wiadomości Dla Mamy

Gather all the parts

QtyComponent
1

LCD 16x2 I2C

16x2 character LCD display with I2C backpack

1

Push Button

Momentary push button switch

1

Push Button

Momentary push button switch

1

Push Button

Momentary push button switch

1

Push Button

Momentary push button switch

Assemble it in 6 steps

1. Odłącz Arduino od USB

Najpierw wyjmij przewód USB z Arduino Uno. Dzięki temu przypadkowe zetknięcie kabelków podczas zmian nie uszkodzi płytki ani ekranu.

  • Nie przekładaj przewodów, gdy Arduino jest zasilane przez USB.

2. Zostaw ekran LCD podłączony

Ekran pozostaje podłączony tak jak wcześniej: VCC → 5V (zasilanie), GND → GND (powrót prądu), SDA → A4 (dane), SCL → A5 (zegar danych).

  • Upewnij się, że VCC i GND nie są zamienione — zamienione zasilanie może uszkodzić ekran.

3. Podłącz pierwszy i drugi przycisk

Pierwszy przycisk zostaw między D2 (sygnał) a GND (powrót prądu) — wybiera „ZAJETY / Wyjdz z pokoju”. Drugi zostaw między D3 (sygnał) a GND (powrót prądu) — wybiera „WOLNY / Mozna wejsc”.

  • W typowym małym przycisku wybierz nóżki po przeciwnych stronach, a nie dwie nóżki obok siebie.

4. Podłącz trzeci przycisk

Trzeci przycisk podłącz jedną stroną do D4 (sygnał), a nóżką po przeciwnej stronie do GND (powrót prądu). Ten przycisk pokaże „NORMALNY / Rob co chcesz”.

  • Jeżeli przycisk jest w płytce stykowej, włóż go przez środkową szczelinę płytki.

5. Podłącz czwarty przycisk

Czwarty przycisk podłącz jedną stroną do D5 (sygnał), a nóżką po przeciwnej stronie do GND (powrót prądu). Ten przycisk pokaże „ZLY / WYJAZD!”.

  • Nie podłączaj żadnego z czterech przycisków do 5V — każdy ma zwierać tylko swój pin D2, D3, D4 lub D5 z GND.

6. Podłącz zasilanie

Sprawdź, czy każdy przycisk ma jeden przewód do swojego pinu, a drugi do GND. Podłącz Arduino Uno do komputera przewodem USB.

Review all connections

1. Connections between "lcd_1" and "Arduino"

Functionlcd_1Arduino
powerVCC5V
groundGNDGND
i2cSDAGPIO 18
i2cSCLGPIO 19

2. Connections between "button_1" and "Arduino"

Functionbutton_1Arduino
groundGNDGND
digitalSIGNALGPIO 2

3. Connections between "button_2" and "Arduino"

Functionbutton_2Arduino
groundGNDGND
digitalSIGNALGPIO 3

4. Connections between "button_3" and "Arduino"

Functionbutton_3Arduino
groundGNDGND
digitalSIGNALGPIO 4

5. Connections between "button_4" and "Arduino"

Functionbutton_4Arduino
groundGNDGND
digitalSIGNALGPIO 5

Deploy the firmware

#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const uint8_t BUTTON_1_PIN = 2;
const uint8_t BUTTON_2_PIN = 3;
const uint8_t BUTTON_3_PIN = 4;
const uint8_t BUTTON_4_PIN = 5;
const unsigned long DEBOUNCE_MS = 35;

LiquidCrystal_I2C lcd(0x27, 16, 2);

struct Button {
  uint8_t pin;
  bool lastReading;
  bool stableState;
  unsigned long changedAt;
  const char *line1;
  const char *line2;
};

Button buttons[] = {
  {BUTTON_1_PIN, HIGH, HIGH, 0, "ZAJETY", "Wyjdz z pokoju"},
  {BUTTON_2_PIN, HIGH, HIGH, 0, "WOLNY", "Mozna wejsc"},
  {BUTTON_3_PIN, HIGH, HIGH, 0, "NORMALNY", "Rob co chcesz"},
  {BUTTON_4_PIN, HIGH, HIGH, 0, "ZLY", "WYJAZD!"}
};

const uint8_t BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0]);

void showMessage(const char *line1, const char *line2) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(line1);
  lcd.setCursor(0, 1);
  lcd.print(line2);
}

void setup() {
  for (uint8_t i = 0; i < BUTTON_COUNT; i++) {
    pinMode(buttons[i].pin, INPUT_PULLUP);
  }

  lcd.init();
  lcd.backlight();
  showMessage("Wybierz status", "Nacisnij guzik");
}

void loop() {
  const unsigned long now = millis();

  for (uint8_t i = 0; i < BUTTON_COUNT; i++) {
    Button &button = buttons[i];
    const bool reading = digitalRead(button.pin);

    if (reading != button.lastReading) {
      button.changedAt = now;
      button.lastReading = reading;
    }

    if ((now - button.changedAt) >= DEBOUNCE_MS && reading != button.stableState) {
      button.stableState = reading;
      if (button.stableState == LOW) {
        showMessage(button.line1, button.line2);
      }
    }
  }
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik