ESP32 Keypad

ESP32 Keypad für die Haustür

Willkommen auf der Projektseite für mein neuestes Projekt: ein ESP32 Keypad, das über Home Assistant ein Nuki Smart Türschloss steuert. Dieses Projekt kombiniert die Funktionalität eines 4×4 Matrix-Tastenfelds mit der Leistung eines ESP32-Mikrocontrollers, um eine sichere und bequeme Zugangskontrolle für dein Zuhause zu ermöglichen.

Projektübersicht

Ziel dieses Projekts:
Ein robustes und zuverlässiges Keypad für die Haustür zu entwickeln, das nahtlos mit Home Assistant und einem Nuki Smart Türschloss zusammenarbeitet. Zusätzlich sollte das Keypad in der Lage sein, Temperatur- und Feuchtigkeitsdaten zu erfassen und an Home Assistant zu übermitteln.

Technische Details

Hardware:

  1. ESP32 Mikrocontroller:
    • Verantwortlich für die Steuerung des Keypads und die Kommunikation mit Home Assistant.
  2. 4×4 Matrix-Tastenfeld:
    • Ermöglicht die Eingabe von Zugangscodes.
    • Bietet akustische Rückmeldung über einen integrierten Buzzer.
  3. Temperatur- und Feuchtigkeitssensor (AM2302):
    • Misst die Umgebungstemperatur und Luftfeuchtigkeit.
  4. Bluetooth-Tracker:
    • Überwacht die Temperatur von Flur und Außenbereich.
    • Überwacht den Garten mit einem Bluetooth Aqara Pflanzensensor.
  5. Gehäuse:
    • Das Gehäuse wurde in Fusion360 konstruiert und mit einem Prusa MK4 3D-Drucker gedruckt.

Funktionen:

  1. Zugangskontrolle:
    • Das 4×4 Matrix-Tastenfeld ermöglicht die Eingabe eines Zugangscodes, der das Nuki Smart Türschloss steuert.
    • Akustische Signale durch den Buzzer bestätigen die Eingabe.
  2. Umweltüberwachung:
    • Der AM2302-Sensor erfasst Temperatur- und Feuchtigkeitsdaten.
    • Über Bluetooth werden Temperaturdaten vom Flur und Außenbereich sowie Gartendaten an Home Assistant übermittelt.
  3. Home Assistant Integration:
    • Alle erfassten Daten werden an Home Assistant gesendet, wo sie überwacht und analysiert werden können.

Projekt im Detail

Aufbau des Keypads:

  • Das 4×4 Matrix-Tastenfeld ist mit dem ESP32 verbunden, um die Eingabe von Zugangscodes zu ermöglichen.
  • Ein Buzzer ist integriert, um akustische Rückmeldungen bei der Eingabe zu geben.
  • Der AM2302-Sensor ist ebenfalls integriert, um Temperatur- und Feuchtigkeitsdaten zu erfassen.
  • Das Gehäuse wurde in Fusion360 konstruiert und mit einem Prusa MK4 3D-Drucker gedruckt, um eine passgenaue und stabile Unterbringung der Elektronik zu gewährleisten.

Bluetooth-Integration:

  • Der ESP32 verwendet einen BLE-Tracker, um die Temperaturdaten von Sensoren im Flur und im Außenbereich zu erfassen und an Home Assistant zu übermitteln.
  • Ein Bluetooth Aqara Pflanzensensor überwacht den Garten und sendet Daten zu Temperatur, Feuchtigkeit, Beleuchtung und Bodenleitfähigkeit.

ESPHome Code:

  • Der ESPHome Code wurde speziell für dieses Projekt entwickelt und ermöglicht die nahtlose Integration des Keypads in Home Assistant.
  • Der Code steuert die verschiedenen Funktionen des Keypads, einschließlich der Eingabeüberwachung, der Buzzer-Steuerung und der Sensordatenübertragung.

Fazit

Dieses ESP32 Keypad-Projekt bietet eine sichere und bequeme Möglichkeit, dein Nuki Smart Türschloss zu steuern und gleichzeitig wichtige Umweltdaten zu erfassen und zu überwachen. Es ist ein großartiges Beispiel dafür, wie man moderne Mikrocontroller-Technologie nutzen kann, um praktische und nützliche Lösungen für den Alltag zu schaffen. Die Kombination aus selbst konstruiertem Gehäuse und maßgeschneidertem Code zeigt, wie viel man mit ein wenig Kreativität und technischem Know-how erreichen kann.

Vielen Dank, dass du dir die Zeit genommen hast, mehr über mein Projekt zu erfahren. Ich freue mich darauf, weitere interessante Projekte mit dir zu teilen!


esphome:
  name: keypad-esp32
  friendly_name: Keypad-ESP32

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "very secret key"

ota:
  - platform: esphome
    password: "very secret key"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Keypad-Esp32 Fallback Hotspot"
    password: "very secret key"

captive_portal:

output:
  - platform: gpio
    pin: 27
    id: buzzer

esp32_ble_tracker:
  scan_parameters:
    interval: 300ms # try with 300ms if you don't have LAN module
    window: 300ms # try with 300ms if you don't have LAN module
    active: false

button:
  - platform: template
    name: Buzzer 800ms
    id: buzzer_quit
    icon: mdi:volume-medium
    on_press:
      then:
        - output.turn_on: buzzer
        - delay: 800ms
        - output.turn_off: buzzer

  - platform: template
    name: Buzzer 200ms
    id: buzzer_progress
    icon: mdi:volume-low
    on_press:
      then:
        - output.turn_on: buzzer
        - delay: 200ms
        - output.turn_off: buzzer

  - platform: template
    name: Buzzer Double 200ms
    id: buzzer_double
    icon: mdi:volume-low
    on_press:
      then:
        - output.turn_on: buzzer
        - delay: 200ms
        - output.turn_off: buzzer
        - delay: 100ms
        - output.turn_on: buzzer
        - delay: 200ms
        - output.turn_off: buzzer

  - platform: template
    name: Buzzer 2000ms
    id: buzzer_long
    icon: mdi:volume-high
    on_press:
      then:
        - output.turn_on: buzzer
        - delay: 2000ms
        - output.turn_off: buzzer 

matrix_keypad:
  id: mykeypad
  rows:
    - pin: 22
    - pin: 21
    - pin: 17
    - pin: 16
  columns:
    - pin: 18
    - pin: 19
    - pin: 23
    - pin: 5
  keys: "123A456B789C*0#D"
  has_diodes: false

key_collector:
  - id: pincode_reader
    source_id: mykeypad
    end_keys: "#"
    end_key_required: true
    #back_keys: "*"
    #clear_keys: "C"
    allowed_keys: "0123456789ABCD*"
    timeout: 3s
    on_progress:
      - logger.log:
          format: "input progress: '%s', started by '%c'"
          args: [ 'x.c_str()', "(start == 0 ? '~' : start)" ]
      - text_sensor.template.publish:
          id: keypadp
          state: !lambda "return x.c_str();"
      - output.turn_on: buzzer
      - delay: 90ms
      - output.turn_off: buzzer
    on_result:
      - logger.log:
          format: "input result: '%s', started by '%c', ended by '%c'"
          args: [ 'x.c_str()', "(start == 0 ? '~' : start)", "(end == 0 ? '~' : end)" ]
      - text_sensor.template.publish:
          id: keypad
          state: !lambda "return x.c_str();"
      - delay: 3s
      - text_sensor.template.publish:
          id: keypad
          state: ""
    on_timeout:
      - logger.log:
          format: "input timeout: '%s', started by '%c'"
          args: [ 'x.c_str()', "(start == 0 ? '~' : start)" ]
    
text_sensor:
  - platform: template
    name: "Keypad Code"
    id: keypad
    icon: mdi:alarm-panel-outline

  - platform: template
    name: "Keypad Code Progress"
    id: keypadp
    icon: mdi:alarm-panel-outline

sensor:
  - platform: uptime
    name: "Uptime"

  - platform: internal_temperature
    name: "Internal Temperature"

  - platform: dht
    pin: 2
    model: AM2302
    temperature:
      name: "Temperatur Terrasse"
      id: air_temperature
    humidity:
      name: "Feuchtigkeit Terrasse"
      id: relative_humidity
    update_interval: 60s

  - platform: xiaomi_hhccjcy01
    mac_address: 'bluetooth mac adress'
    temperature:
      name: "Garden Temperature"
    moisture:
      name: "Garden Moisture"
    illuminance:
      name: "Garden Illuminance"
    conductivity:
      name: "Garden Soil Conductivity"
    battery_level:
      name: "Garden Battery Level"

  - platform: atc_mithermometer
    mac_address: "bluetooth mac adress"
    temperature:
      name: "Flur Temperature"
    humidity:
      name: "Flur Humidity"
    battery_level:
      name: "Flur Battery Level"
    battery_voltage:
      name: "Flur Battery-Voltage"
    signal_strength:
      name: "Flur Signal"

  - platform: atc_mithermometer
    mac_address: "bluetooth mac adress"
    temperature:
      name: "Aussen Temperature"
    humidity:
      name: "Aussen Humidity"
    battery_level:
      name: "Aussen Battery Level"
    battery_voltage:
      name: "Aussen Battery-Voltage"
    signal_strength:
      name: "Aussen Signal"

  - platform: absolute_humidity
    name: "Terrasse Absolute Feuchtigkeit"
    icon: 'mdi:water-percent-alert'
    temperature: air_temperature
    humidity: relative_humidity

switch:
  - platform: restart
    name: "Restart"