Hörrmann Supramatic mit arduino 433 MHz ansteuern

1. März 2015 at 13:23
Print Friendly, PDF & Email

Basierend auf den Elro Funk-Steckdosen habe ich mein Gargentorantrieb von Hörrmann erweitert.
Update August 2017: Die Ansteuerung wurde nun in OpenHAB integriert.

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:

  1. DC/DC Wandler; 1,00 EUR inkl. Versand
    LM2596 DC-DC Verstellbar Power Step-Down Stromversorgung Regler Modul
  2. arduino Pro Mini; $2,50  inkl. Versand
    Pro Mini Enhancement 3.3V or 5V adjustable 16MHz MEGA328P (Arduino-compatible)
  3. 433 MHz Receiver
  4. 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.

 

Hörrmann-0-Taster Hörrmann-2-Taster

Tor-3 Tor-2

 

Tor-1

 

 

/*
  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;
  }
}