Community project

Button-Controlled 90° Lock

Arduino
Photo of Button-Controlled 90° Lock
Generated with AI

lenovoandrzej

Published October 5, 2026

This project builds a simple electromechanical lock controlled by two push buttons. An Arduino Uno drives an SG90 servo motor that rotates between two positions (0° and 90°) to lock and unlock a mechanism, with debouncing logic to ensure reliable button presses.

The guide includes a complete wiring diagram showing how to connect the servo and buttons to the Arduino, a full parts list, the Arduino sketch with debounce handling, and step-by-step assembly instructions. Builders will have everything needed to create a functional button-controlled lock suitable for boxes, cabinets, or other applications requiring simple two-position locking.

Wiring diagram

Wiring diagram for Button-Controlled 90° Lock

Gather all the parts

QtyComponent
1

SG90 Servo

Micro servo motor (SG90)

1

Push Button

Momentary push button switch

1

Push Button

Momentary push button switch

Assemble it in 4 steps

1. Odłącz Arduino podczas składania

Odłącz Arduino Uno od przewodu USB. Połóż Arduino, serwo i dwa przyciski tak, aby ich metalowe nóżki nie stykały się przypadkiem.

  • Przycisk ma dwie nóżki po każdej stronie, które są już ze sobą połączone; umieść go w poprzek środkowej szczeliny płytki stykowej.
  • Nie wkładaj ani nie wyjmuj przewodów serwa przy podłączonym USB — przypadkowe zwarcie może uszkodzić płytkę.

2. Podłącz serwo

Podłącz przewody serwa: czerwony VCC → 5V (zasilanie), brązowy albo czarny GND → GND (masa), pomarańczowy albo żółty SIGNAL → D9 (sygnał sterujący).

  • Po włączeniu serwo ustawi się na pozycję otwartą, czyli 0°.
  • Wszystkie części muszą mieć wspólny przewód GND — bez niego serwo nie będzie reagowało poprawnie. Jeżeli serwo szarpie albo Arduino resetuje się pod obciążeniem, zasil serwo z osobnego stabilnego źródła 5 V i połącz jego GND z GND Arduino.

3. Podłącz przycisk zamykania

Podłącz jedną nóżkę pierwszego przycisku do D2 (sygnał), a nóżkę po przeciwnej stronie przycisku do GND (masa). Ten przycisk obraca serwo do 90°.

  • Nie dodawaj rezystora: program używa wbudowanego zabezpieczenia wejścia Arduino.
  • Podłącz nóżki po przeciwnych stronach przycisku; dwie nóżki po tej samej stronie są już połączone wewnątrz.

4. Podłącz przycisk otwierania

Podłącz jedną nóżkę drugiego przycisku do D3 (sygnał), a nóżkę po przeciwnej stronie przycisku do GND (masa). Ten przycisk przywraca serwo do 0°.

  • Nie łącz D2 ani D3 bezpośrednio z 5V — w tym układzie przyciski mają łączyć piny wyłącznie z GND.

Review all connections

1. Connections between "servo_1" and "Arduino"

Functionservo_1Arduino
powerVCC5V
groundGNDGND
pwmSIGNALGPIO 9

2. Connections between "close_button" and "Arduino"

Functionclose_buttonArduino
groundGNDGND
digitalSIGNALGPIO 2

3. Connections between "open_button" and "Arduino"

Functionopen_buttonArduino
groundGNDGND
digitalSIGNALGPIO 3

Deploy the firmware

#include <Arduino.h>
#include <Servo.h>

const byte CLOSE_BUTTON_PIN = 2;
const byte OPEN_BUTTON_PIN = 3;
const byte SERVO_PIN = 9;

const byte STEP_ANGLE = 90;
const byte MIN_ANGLE = 0;
const byte MAX_ANGLE = 180;
const unsigned long DEBOUNCE_MS = 40;

Servo doorServo;
byte servoAngle = MIN_ANGLE;
bool lastCloseReading = HIGH;
bool lastOpenReading = HIGH;
unsigned long lastCloseChange = 0;
unsigned long lastOpenChange = 0;

void setup() {
  pinMode(CLOSE_BUTTON_PIN, INPUT_PULLUP);
  pinMode(OPEN_BUTTON_PIN, INPUT_PULLUP);
  doorServo.attach(SERVO_PIN);
  doorServo.write(servoAngle);
}

void loop() {
  bool closeReading = digitalRead(CLOSE_BUTTON_PIN);
  bool openReading = digitalRead(OPEN_BUTTON_PIN);
  unsigned long now = millis();

  if (closeReading != lastCloseReading) {
    lastCloseChange = now;
    lastCloseReading = closeReading;
  }
  if (openReading != lastOpenReading) {
    lastOpenChange = now;
    lastOpenReading = openReading;
  }

  if (closeReading == LOW && now - lastCloseChange > DEBOUNCE_MS) {
    if (servoAngle <= MAX_ANGLE - STEP_ANGLE) {
      servoAngle += STEP_ANGLE;
      doorServo.write(servoAngle);
    }
    while (digitalRead(CLOSE_BUTTON_PIN) == LOW) delay(5);
    lastCloseReading = HIGH;
    lastCloseChange = millis();
  }

  if (openReading == LOW && now - lastOpenChange > DEBOUNCE_MS) {
    if (servoAngle >= MIN_ANGLE + STEP_ANGLE) {
      servoAngle -= STEP_ANGLE;
      doorServo.write(servoAngle);
    }
    while (digitalRead(OPEN_BUTTON_PIN) == LOW) delay(5);
    lastOpenReading = HIGH;
    lastOpenChange = millis();
  }
}

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