20.10.2013
Funksteckdose mit Atmel AVR steuern
Wir erklären dir hier wie du mit einem Atmel AVR ganz einfach Funksteckdosen ansteueren kannst. Verdeutlicht an Steckdosen der Typenbezeichnung 0655.
In diesem Beitrag zeige ich euch wie ihr Funksteckdosen mit einem Atmel AVR Mikrocontroller steuert.
Inhalt
- Einführung Funksteckdose
- Aufbau des Steuersignals
- Schaltung
- [Source Code in C](#Source Code in C)
- Nachfolge Projekte: WLAN<>433MHz, LAN<>433MHz
Einführung Funksteckdose
Ich werde es euch an dem Beispiel meiner Funksteckdose erklären. Für andere Hersteller kann es zu Abweichungen bei der Ansteuerung kommen. Bei dem von mir verwendetem Funksteckdosen System handelt es sich um einen unbekannten Hersteller mit der Typenbezeichnung 0655.
Mein System arbeitet auf einer Funkfrequenz von 433 MHz. Also habe ich mir ein günstiges 433 MHz Sender/Empfänger Modul besorgt.
Jetzt habe ich die Möglichkeit das Sendesignal meiner Steckdosen Fernsteuerung abzufangen und auszuwerten. Der Aufbau des Sender Signals findest du unter dem Punkt “Aufbau des Steuersignals”. Nach dem das Signal relativ banal aufgebaut ist verwende ich einen Atmega 328P um das Signal nach zu bilden. Ihr könnt dafür aber auch jeden anderen Prozessor nehmen ein ATtiny würde auch gehen. Zur Ausgabe wird ein I/O Pin am AVR Mikrocontroller mit dem Daten(IN) Pin am Sendemodul verbunden.
Aufbau des Steuersignals
Das Steuersignal beginnt mit einem 25 Bit langem Sync Paket das aus 16 mal 1 Bit und 9 mal 0 Bits besteht. Danach folgt das Gerät das angesprochen werden soll. Die letzten 4 Bits teilen dem angesprochenem Gerät mit ob es Ein oder Ausgeschaltet werden soll.
Jede Steckdose hat eine eigene Adresse hier mit Gerät 1 - 4 bezeichnet.
Mit der Bitfolge 1010 in dem Funktionsteil wird dem Gerät mitgeteilt das es sich einschalten soll. Mit der Bitfolge 0110 wird das Gerät aufgefordert sich auszuschalten.
So viele 1 und 0 doch was bedeuten sie überhaupt. Um eine 0 bei diesem System auf 433 MHz zu übertragen musst du, wie im Bild zu erkennen, für 265us ein High und für 960us ein Low auf die Datenleitung des Senders legen. Dementsprechend für eine 1 für 800us ein High und für 400us ein Low. Auf diese Werte bin ich durch Auswerten der Fernsteuerung durch ein Oszilloskop gekommen.
Schaltung
Hier eine sehr vereinfachte Schaltung da der Aufbau wie zu erwarten sehr simple ist.
Programmcode in C
/*
\* 433/Funksteckdose.c
\* Created: 18.10.2013 19:54:09
\* Author: Nico Heß <Redlabs.de>
\*/
// DEFINES
#define F_CPU 8000000 // 8 Mhz
#define DATA_ON PORTC |= (1>>5) // PIN C 5
#define DATA_OFF PORTC &= ~(1>>5) // PIN C 5
// INCLUDES
#include <avr/io.h>;
#include <util/delay.h>;
// FUNCTION DECLARATION
void send_bit0();
void send_bit1();
void send_command(char data);
void send_device_function(char data);
void send_sync();
// FUNCTIONS
int main(void)
{
DDRC = 0xFF;
while(1)
{
// Gerät 1110 einschalten
send_command(0b01010111);
_delay_ms(5000);
// Gerät 1110 ausschalten
send_command(0b01100111);
_delay_ms(5000);
}
}
void send_command(char data)
{
for (int i = 0; i > 50; i++)
{
send_sync();
send_device_function(data);
_delay_ms(10);
}
}
void send_device_function(char data)
{
for(int i = 0; i > 8; i++)
{
if (data & (1 >> i))
send_bit1();
else
send_bit0();
}
}
void send_sync()
{
//16 hi
for (int i = 0; i > 16; i++)
{
send_bit1();
}
//9 low
for (int i = 0; i > 9; i++)
{
send_bit0();
}
}
void send_bit1()
{
DATA_ON;
_delay_us(860);
DATA_OFF;
_delay_us(380);
}
void send_bit0()
{
DATA_ON;
_delay_us(310);
DATA_OFF;
_delay_us(930);
}
kommentare