Wer will das nicht, sich wie Adam West fühlen und mit Vollgas auf eine Wand zurasen, die sich wie von Geisterhand unvermittelt öffnet, dem dunklen Ritter Einlass gewährt, sich kurz daraufhin wieder schließt, und den über eine eben noch vorbeiflitzende Fledermaus wundernden kleinen Mann von der Straße mit einem Gefühl ratloser Ungewissheit ob des Verbleibs des finsteren Wesens zurück lässt.

Die Idee

Ein im Auto befindlicher 433Mhz Sender ist mit einer GPS Antenne ausgestattet. Sobald eine konfigurierbare Distanz zum Garagentor erreicht ist, öffnet der Sender das Tor. Beim Einschalten des Senders wird zusätzlich ermittelt, ob die Garage zuvor angefahren wurde. In diesem Fall öffnet der Sender das Tor erneut, das Auto kann die Garage wieder verlassen.

Der Prototyp

Benötigt werden die folgenden Bauteile

Der D1 Mini ist ein Arduino kompatibles mini WiFi Board mit USB2Serial Konverter. Eine Anleitung zum Programmieren mit VS-Code findet man z.B. hier: ESP-Mikrocontroller mit Visual Studio Code programmieren.

Die Schaltung

Prototyp - Steckplatine Prototyp - Steckplatine

Der Aufbau ist recht einfach. Die Daten-Ein- und Ausgänge sowie der Taster sind mit den GPIOs D0, D3 und D5 verbunden. D4 ist intern bereits mit einer On-Board LED verbunden, die bei LOW angeht. Der Taster geht über einen 10kΩ gegen Masse und setzt D5 bei Tastendruck auf HIGH.

Die Software

Unter Verwendung der rc-switch Library fällt das Auslesen der Signale recht leicht. Der Handsender vom Typ CAME TOP-432EV zum Öffnen meines Batcaves verwendet allerdings ein Protokoll, das von dieser Library nicht erkannt wird. Zum Glück gibt es einen alternativen Branch: Attila-FIN/rc-switch. Damit und mit folgendem Code sollte das Auslesen der Handsender-Signale problemlos funktionieren.

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <RCSwitch.h>

const int buttonPin = D5;
const int ledPin = D4;
const int rcSwitchRcvPin = D3;
const int rcSwitchTxPin = D0;

int buttonState = 0;
RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  
  // enable rcswitch
  mySwitch.enableReceive(rcSwitchRcvPin);
  mySwitch.enableTransmit(rcSwitchTxPin);
  mySwitch.setProtocol(12);
  mySwitch.setRepeatTransmit(15);

  // enable button pin
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // set initial state, LED off  
  digitalWrite(ledPin, buttonState);
}

void loop() {
  // read button state, HIGH when pressed, LOW when not
  buttonState = digitalRead(buttonPin);

  // if the push button pressed, state is pulled to low
  if (buttonState == HIGH) {  
    mySwitch.send(1234, 12); // insert real code and bit length here !!!!
    digitalWrite(ledPin, LOW);  // LED on
    delay(500);
  } else {
    digitalWrite(ledPin, HIGH); // LED off
  }

  if (mySwitch.available()) {
    
    Serial.print("Received ");
    Serial.print( mySwitch.getReceivedValue() );
    Serial.print(" / ");
    Serial.print( mySwitch.getReceivedBitlength() );
    Serial.print("bit ");
    Serial.print("Protocol: ");
    Serial.println( mySwitch.getReceivedProtocol() );

    mySwitch.resetAvailable();
  }
}

Nach dem Compile und Upload können über die Ausgabe am Terminal der jeweilige Tastencode, die Bitlänge sowie das Protokoll ausgelesen werden.

VS Code - main.cpp VS Code - main.cpp

Der Test

Für einen erfolgreichen Feldtest wird die Stromversorgung von USB auf LiPo umgestellt. Den nötigen Sprung von 3.7V auf 5V erledigt der gute alte DC-DC Wandler von adafruit.

ready for Feldtest ready for Feldtest

Wenn Batman alles richtig gemacht hat, kann das dynamische Duo nun seine Höhle verlassen.

great success great success

Fortsetzung folgt