Alles fing damit an, dass der Nachbar über schlechten Wlan Empfang im Garten klagte. Ich erläuterte ihm die Möglichkeit, das Wlan über die Stromleitung zu "vergrößern". Kurzum wurde ein Set von AVM "Fritz!Powerline 540E / 510E Wlan" bestellt. Die Installation war Dank vorhandener FritzBox und einer Steckdose in der Gartenhütte schnell gemacht. Nun funktionierte auch das Wlan im Garten.
Dann aber kamen ihm Bedenken, dass das Wlan angezapt werden könnte und eigentlich ja nicht ständig funken muss. Auch Strom wird verbraucht und brennen könnte es ja auch noch.
Sooo, und da waren sie wieder meine drei Probleme... Zu hilfsbereit, zu wenig Zeit und das Pflichtenheft wird während des Projektes immer dicker.
Die Lösung war recht schnell ersonnen. Es wird ein Taster (kein Schalter) außen an der Hütte installiert. In der Hütte wird die vorhandene Verkabelung angezapft, Strom auf ein Relais gegeben und dann auf einer neu installierten Steckdose wieder ausgegeben, in der der Wlan Sender steckt.
Der Aufbau ist relativ simpel. Die 230V Leitung (Phase) geht auf ein Relais. Dessen Ausgang dann auf ein AC/DC 5V Netzteil und die besagte Steckdose. Eingang und Ausgang des Relais sind mit dem erwähnten Taster verbunden, der bei Betätigung den Relaisausgang überbrückt.
Wird nun der Taster gedrückt, fließen 230V in die Steckdose und das Netzteil. Dieses versorgt einen ATtiny85, an den das Relais und eine LED angeschlossen sind. Sobald der ATtiny mit Strom versorgt ist, zieht er seinerseits das Relais für die programmierte Zeitspanne (zwei Stunden) an, wordurch der Taster nicht mehr gedrückt werden muss. Gleichzeitig beginnt die angeschlossene LED als Funktionskontrolle zu blinken. Die LED habe ich in den Taster eingebaut, so dass von draußen erkennbar ist, ob der Wlan Sender aktiv ist oder nicht.
Nun hat der Nachbar, was er wollte. Eine Schaltung, die keinen StandBy Stromverbrauch hat und trotzdem das Wlan automatisch wieder abschaltet.
Ich habe den ATtiny mit der Arduino IDE programmiert. Da ich nicht programmieren kann, habe ich das Beispiel "Blink without delay" lediglich um das Relais erweitert. (Danke an dieser Stelle an den Tipgeber!) Man kann das bestimmt schöner programmieren, aber die Schaltung macht genau das, was sie soll. Um eventuellen Problemen vorzubeugen habe ich noch einen Watchdog hinzu gefügt.
/* Blink without Delay
ATtiny85
+-------------+
Reset +-+(D5) +-+ 5V
|(A0) |
| |
+-+ D3 D2 +-+ Eingang
| A3 A1 | (Aus)Taster
| |
+-+ D4 D1 +-+ Ausgang
| A2 | LED
| |
GND +-+ D0 +-+ Ausgang
+-------------+ Relais
Der ATtiny bekommt Strom, indem der Taster das Relais überbrückt, wodurch der AC/DC Wandler versorgt wird und somit den Tiny startet.
Der Tiny schließt darauf hin das Relais für den eingestellten Zeitraum, indem D0 auf LOW gezogen wird.
Gleichzeitig blinkt eine LED (D1) im Taster in schneller Abfolge, um die Aktivierung des Wlan anzuzeigen.
Über D2 ist ein zweiter (kleiner SMD) Taster angeschlossen. Wird dieser gedrückt, wird D0 auf LOW gesetzt, wodurch die komplette Schaltung
vom Strom getrennt wird.
Damit die Restspannung des Netzteils den ATtiny nicht neu startet, wurde zum Schluss ein delay von 15000 ms gesetzt.
http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/
#include "avr/wdt.h"
const int ledPin = 1;
const int relaisPin = 0;
const int tasterPin = 2;
int ledState = LOW;
int relaisState = LOW;
int abschalten = HIGH;
unsigned long previousMillis = 0;
unsigned long previousMillisRelais = 0;
const long interval = 400;
const long intervalRelais = 7200000;
void setup() {
wdt_disable();
// set the digital pin as output:
pinMode(ledPin, OUTPUT);
pinMode(relaisPin, OUTPUT);
pinMode(tasterPin, INPUT);
digitalWrite(tasterPin, HIGH);
digitalWrite(relaisPin, LOW);
wdt_enable(WDTO_4S);
}
void loop()
{
abschalten = digitalRead(tasterPin);
unsigned long currentMillis = millis();
unsigned long currentMillisRelais = millis();
if(currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
}
if(currentMillisRelais - previousMillisRelais >= intervalRelais) {
previousMillisRelais = currentMillisRelais;
if (relaisState == LOW)
relaisState = HIGH;
else
relaisState = LOW;
digitalWrite(relaisPin, relaisState);
}
if(abschalten == LOW)
{
digitalWrite(relaisPin, HIGH);
delay(15000);
}
wdt_reset();
}
Alles anzeigen