Hörrmann Supramatic mit arduino 433 MHz ansteuern
Basierend auf den Elro Funk-Steckdosen habe ich mein Gargentorantrieb von Hörrmann erweitert.
Update August 2017: Die Ansteuerung wurde nun in OpenHAB integriert.
Update Mai 2020: Es gibt eine neue Version mit Tasmota/ESP8266: Hörrmann Supramatic mit ESP8266 / Tasmota und 433 MHz ansteuern
Die Reichweite der Original-Fernbedienung war nicht ausreichend. Da ich weitere Sender benötigte, habe ich auch aus Kostengründen dann die Lösung mit dem arduino aufgebaut.
Folgende Baugruppen habe ich eingesetzt:
- DC/DC Wandler; 1,00 EUR inkl. Versand
LM2596 DC-DC Verstellbar Power Step-Down Stromversorgung Regler Modul - arduino Pro Mini; $2,50 inkl. Versand
Pro Mini Enhancement 3.3V or 5V adjustable 16MHz MEGA328P (Arduino-compatible) - 433 MHz Receiver
- 5V Relays Platine; 3,50 EUR inkl. Versand
2-Kanal Channel 5V Kanal Relais Modul Board für Arduino PIC AVR MCU DSP ARM RULE
Als Arduino habe ich den Pro Mini ausgewählt. Nano oder Uno funktionieren auch, sind aber beide größer und kostet etwas mehr. Der Pro Mini hat keine USB-Schnittstelle, kann aber mit dem USBtiny Adapter leicht programmiert werden. Eigentlich wollte ich einen ATtiny 85 verwenden. Dieser hat jedoch keine Signale dekodieren können. Meiner Vermutung nach laufen ProMini, Uno und Nano alle auf 16MHz und das Timing für die Übertragung ist hierfür ausgelegt worden. Sobald ich die 16MHz Quarze erhalten, werde ich dies mit dem ATtiny asuprobieren.
[codesyntax lang=”cpp”]
/* Receive signal from Elro Sender using an low cost 433 receiver based on RCSwitch 2015-02-28 T. Hoeser */ #include "Arduino.h" // #include <TinyDebugSerial.h> #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); // +----+ #define ELRO_TX 0 // Interrupt 0: Mini, Nano = D2 #define LED_PIN 9 // D4 = PB4 = PIN 3 #define REL1_PIN 8 // D4 = PB4 = PIN 3 #define REL2_PIN 7 // D4 = PB4 = PIN 3 void showCode (unsigned long receivedCode, unsigned int period); byte DIPcode[] = {1,0,1,1,1}; // 5-bit address (dip switches in remote). Range [0..31] byte sysCode = DIPcode[4] << 4 | DIPcode[3] << 3 | DIPcode[2] << 2 | DIPcode[1] << 1 | DIPcode[0]; unsigned long button = 0; // --------------------------------------------------------------- function() void blink(int ledpin, int time, int repeat){ int i, curVal; curVal = digitalRead(ledpin); // read current state for(i=0; i<repeat;i++){ digitalWrite(ledpin, !curVal); // inverse state delay(time); // wait digitalWrite(ledpin, curVal); // set back to 1st state } } // --------------------------------------------------------------- function() void setup() { Serial.begin(57600); Serial.println("\n> 433 Receiver: "); // Initialize receiver on interrupt 0 (= digital pin 2), calls the callback "showCode" // after 3 identical codes have been received in a row. (thus, keep the button pressed // for a moment) // RemoteReceiver::init(0, 5, showCode); mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2 pinMode(LED_PIN, OUTPUT); pinMode(REL1_PIN, OUTPUT); digitalWrite(REL1_PIN, HIGH); pinMode(REL2_PIN, OUTPUT); digitalWrite(REL2_PIN, HIGH); blink(LED_PIN,600,4); } // --------------------------------------------------------------- function() void loop() { int value; if (mySwitch.available()) { value = mySwitch.getReceivedValue(); if (value == 0) { Serial.print("Unknown encoding"); } else { button = mySwitch.getReceivedValue(); /* Serial.print("Received "); Serial.print( button ); Serial.print(" / "); Serial.print( mySwitch.getReceivedBitlength() ); Serial.print("bit "); Serial.print("Protocol: "); Serial.println( mySwitch.getReceivedProtocol() ); */ if(button == 1049937){ Serial.println(" button 1 received "); blink(LED_PIN,500,1); blink(REL1_PIN,500,1); button = 0; } else if ( button == 1049940){ Serial.println(" button 2 received "); blink(LED_PIN,500,2);blink(REL2_PIN,500,1); button = 0; } else if ( button == 1053009){ Serial.println(" button 3 received "); blink(LED_PIN,500,3);blink(REL1_PIN,500,1); button = 0; } else if ( button == 1053012){ Serial.println(" button 4 received "); blink(LED_PIN,100,4);blink(REL2_PIN,500,1); button = 0; } else if ( button == 1053777){ Serial.println(" button 5 received "); button = 0; } else if ( button == 1053780){ Serial.println(" button 6 received "); button = 0; } else if ( button == 1053969){ Serial.println(" button 7 received "); button = 0; } else if ( button == 1053972){ Serial.println(" button 8 received "); button = 0; } delay(100); } mySwitch.resetAvailable(); } delay(500); } // --------------------------------------------------------------- function() // Callback function is called only when a valid code is received. void showCode(unsigned long receivedCode, unsigned int period) { char *binCode; // Note: interrupts are disabled. You can re-enable them if needed. // Print the received code. // 000100000001010101011111 // 24bit Serial.print("Code: "); Serial.print(receivedCode); Serial.print(" BIN: "); Serial.print(receivedCode,BIN); Serial.print(", period duration: "); Serial.print(period); Serial.println("us."); if ( receivedCode== 118820){ button = 1; } else if ( receivedCode== 118824){ button = 2; } else if ( receivedCode== 119792){ button = 3; } else if ( receivedCode== 119796){ button = 4; } else if ( receivedCode== 120116){ button = 5; } else if ( receivedCode== 120120){ button = 6; } else if ( receivedCode== 120224){ button = 7; } else if ( receivedCode== 120228){ button = 8; } }
[/codesyntax]
Pingback: OpenHAB 2 – zentraler Knoten im Haus – Thomas Höser