Intelligenter Dämmerungsschalter mit Schaltuhr-Eingang

  von Hubert Freisinger, OE3FHA

                          Elektronik-Labor   Projekte   AVR 




Eine bekannte Frisörin hatte den Wunsch, das Auslagenlicht entsprechend des Dämmerzustand zu steuern mit einer lichtlosen Kernzeit in der Nacht (z.B. 23:00-05:00 aus). Zusätzliches Handicap, in Großstadt, an sehr belebter Straße, also Fremdlicht in Hülle und Fülle.

Es gibt viele Dämmerungsschalter am Markt, preiswerte, teure, unbrauchbare, etwas funktionellere. Habe bei einer namhaften Firma ein brauchbares Teil gefunden, wollte jedoch keine Kleinschaltzentrale montieren und noch dazu um hunderte Euro. Also ran an den Entwicklungsplatz und das Ganze, wenn möglich, mit Bascom in einen Attiny13 reinpressen. Die SW arbeitet mathematisch nach dem Prinzip der Mengenlehre, der Abwägung wie viele hell und Dunkelphasen gesehen auf den Schwellwert pro Messzeitraum vorkommen, gesagt getan.





Der Forderungskatalog:


1. Einknopfbedienung

2. unter widrigen Helligkeitsbedingungen ( Vorbeifahrende erleuchtete Straßenbahn,
    Autoscheinwerfer, Straßenbeleuchtung) den Schaltzustand zu halten,

3. leichtes Eichen des Schaltpunkt ohne Einstellregler, permanent Speichern des
   Schwellwert,

4. Kompensation unterschiedlicher optoelektronischer Sensoren, wird automatisch
    berücksichtigt,

5. da fix verbaut, Servicestellung für den Elektriker implementiert, (mit der
    Gelegenheit die Programmierung zu verfälschen, also Sicherung raus!) spätestens
    beim Lampentest unter Tage doch notwendig

6. und zu guter Letzt ein Zeitfenster in der Nacht wo das Licht ausgeschaltet ist
    (Schaltuhreingang)


Die Außenbeschaltung des Attiny13 hält sich sehr in Grenzen, wie es sein soll, je mehr Teile desto mehr Fehlerquellen, der µC hat ohnehin alles implementiert was notwendig ist. Der Speicher ist ziemlich voll belegt, habe es geschafft nicht zum Attiny 85 greifen zu müssen.




Testaufbau


Die Funktionen:


Da Ein-Tastenbedienung das Ziel war ist eine zeitliche Reihenfolge zu beachten!

Nach der Inbetriebnahme leuchtet grüne LED und je nachdem welcher Datenschrott im Eeprom steht, ist ja noch kein Schwellwert drinnen, auch die rote LED. Das Schaltelement (Relais/SSR etc.) wird bei roter LED angesteuert. Jetzt wäre auch schon der DS bereit geeicht zu werden. Es kann aufgrund der absolut unmöglichen Berechenbarkeit des Schaltpunktes (Schwelle), dieser ist abhängig vom verwendeten Sensor (LDR 10k/100k oder Phototransistor), des Montageort usw., nur durch einmalige Anwesenheit vor Ort zum geeigneten Zeitpunkt (Dämmerung) eingespeichert werden. Dazu ist der Taster T 2mal innerhalb von 2 Sekunden zu drücken, nach einmaligem drücken leuchtet gelbe LED, nach dem 2ten mal wird der momentane Wert in's Eeprom eingespeichert. Es leuchtet LED rot, LED grün, Schaltelement (Relais/SSR etc.) ist aktiv. Nun sollte sowohl abends als auch morgens bei gleichem Hellwert ein oder ausgeschaltet werden. Wenn jetzt ein ausgeschaltetes Zeitfenster gewünscht ist so ist der Schaltuhrausgang mit dem entsprechenden Eingang zu verbinden (siehe Schaltbild). In meinem Fall ist die Schaltuhr in der Zeit von 05:00-23:00 Uhr aktiv, der Kontakt geschlossen, ohne Schaltuhr ist dieser Eingang kurzzuschließen! Achtung: Hochlast-Relaiskontakte brauchen eine Mindestlast (besonders wenn sie schon verwendet waren), entsprechend ist R4 anzupassen oder ein kleinlast-Relais in die Schaltuhr einzubauen (Netztrennung beachten).

Die Servicefunktionen:

Taste T länger 2s drücken, LED gelb/LED grün blinkt langsam, LED rot ist aus. Der
DS ist permanent ausgeschaltet, Servicearbeiten an den angeschlossenen Leuchten
ist möglich.

Nach Ende der Servicearbeiten Taste T drücken, LED gelb/LED grün blinkt schnell,
LED rot ist an, DS ist permanent eingeschaltet, Leuchten können kontrolliert werden.

Taste T nochmals drücken, zurück zum Regelbetrieb.

Die Taste Reset kann entfallen da über die vorgelagerte Sicherung im Fall des Falles ein Power-Reset möglich ist.

Ein ganz wichtiger Punkt ist die Montage des Helligkeitssensor. Er soll möglicht geschützt vor Fremdlicht und auf einen lichttechnisch ruhigen Hintergrund gerichtet sein, dies muss jeweils vor Ort individuell entschieden werden. Phototransistoren (Dioden) haben den Nachteil, dass sie in der Regel im IR-Bereich am empfindlichsten sind und in der morgendlichen und abendlichen Blauphase an ihre Grenzen stoßen, also LDR bevorzugt.

Ich verwende eine externe Schaltuhr, gibt es mit guter Funktionalität um ein paar Euro in China, mit Pufferakku und Gehäuse mit Tasten, der Selbstbau ist da eher eine persönliche Sache. Sollte jemand inspiriert sein so kann das Programm in einen Atmega8 mit 16x2 Display integriert werden und zusätzlich eine Schaltuhr programmiert werden (Pufferung bei Stromausfall nicht vergessen!).

Download: Lichtsteuerung.zip

'
'############################################################################
'# Dämmerungsschalter mit Einknopfbedienung, Serviceroutine für #
'# Lampenwartung und Sperrzeit mit Schaltuhreingang #
'############################################################################
'
'Funktionsablauf nach dem Start: Schaltausgang wird entsprechend dem
' gespeicherten Schwellwert in Verbindung mit
' einem Algorithmus der Mengenlehre und einer
' optional angeschlossenen Schaltuhr überwacht.
'
'Funktionen:
'
'1.) Taste T 1x drücken: LED gelb an, wenn keine weitere Aktion
' nach ca. 2 Sek. wieder Normalbetrieb (LED grün an)
'
'2.) Taste T innerhalb von 2 Sek. 2x drücken: momentaner Helligkeitswert
' wird als Schaltpunkt im EEPROM
' gespeichert (LED grün wieder an)
'
'3.) Serviceroutine1: Leuchtenreparatur kann erfolgen,
' Taste T 1x länger 3 Sek. drücken,
' Relais permanent aus, LED rot aus,
' LED grün/gelb blinkt langsam
'
'4.) Serviceroutine2: Kontrolle der Beleuchtung auf Funktion,
' Taste T 1x drücken,
' Relais permanent an, Led rot an,
' LED grün/gelb blinkt schnell
'
'5.) Taste T 1x drücken, zurück zum Normalbetrieb
'
'
' Schaltausgang/LED rot PB0, Pin5
' Taste für Eingabe PB1, Pin6
' 24 Stunden Timerport PB2, Pin7
' LDR/Phototransistor PB3, Pin2
' Eingabeanzeige LED grün/gelb PB4, Pin3
'
'
' FUSES im Auslieferzustand
'
'############################################################################


'Anweisungen für den Kompiler

$regfile = "attiny13A.dat" 'Prozessortyp
$crystal = 1200000 'Takt 1,2MHz
$hwstack = 8 'Speicherreservierung
$swstack = 15
$framesize = 10


'Definition der Variablen

Dim Dw As Word 'Dunkelwert
Dim Ew As Byte 'Ereigniswert
Dim Hw As Word 'Hellwert
Dim Z As Word 'Schleifenzähler
Dim Uinput As Word 'ADC Wert
Dim Ueeprom As Word 'Gespeicherter Wert


'Konfiguration der Register

Config Adc = Single , Prescaler = Auto 'Configuration des ADC
Uinput = Getadc(3)

Stop Ac 'Switch off the power to the Analog Comparator
Reset Acsr. Acbg 'Disable Analog Comparator Bandgap Select

Ddrb = &B0001_0001 'konf Port's B auf > 0=Eingabe 1=Ausgabe 'Output B.0
Portb = &B0000_0000 'konf Port's B auf 0 oder 1
Pinb = &B0000_1010 'konf Pin's B auf 1 oder 0 (PullUp Widerstände)

$eeprom 'initialisiere EEPROM

Ldr: 'Definition Speicher im EEPROM, ADC-Daten
Data 1 , 2

$data 'zurück zur Datendefinition


'Warten bis LDR-Spannung stabil (Parallel-C 0,1µ geladen) und Schaltuhr bereit
Wait 1




'Begin des Programmablauf ###################################################

Vergleich:

Readeeprom Ueeprom , Ldr 'Schwellwert aus EEPROM lesen
Uinput = Getadc(3) 'Pin 2 LDR Wert abfragen
If Ueeprom < Uinput And Pinb.2 = 1 Then Portb.0 = 1 'nach Stromausfall neu vergleichen, ist Timer ON/OFF?



'Messroutine, feststellen der Helligkeit am LDR

Messen:
Portb.4 = 1 'LED grün ON/gelb OFF
Dw = 0 'Dunkelwert
Hw = 0 'Hellwert


For Z = 1 To 30000 'Zeitschleife ca. 90sek

Uinput = Getadc(3) 'Pin 2 LDR Input

Debounce Pinb.1 , 0 , Prefatch 'Pin 6 Taste T schließer gegen GND

If Uinput > Ueeprom Then Dw = Dw + 1 'gemessene Dunkelwerte
If Uinput < Ueeprom Then Hw = Hw + 1 'gemessene Hellwerte

Waitms 3

Next Z


'Messung bewerten

If Dw = 0 Or Hw = 0 Then Goto Entscheidung 'Messwert eindeutig, weiter
If Dw > 0 And Hw > 0 Then Ew = Ew + 1 'Messwert nicht eindeutig, zurück zum Messen
If Ew => 3 Then Goto Entscheidung '3x nicht eindeutig trotzdem weiter

Goto Messen

'Auswertung des Mittelwert in Verbindung mit dem Timerport (Schaltuhr)

Entscheidung:

Ew = 0 'Nicht-Eindeutigkeitszähler auf 0
If Dw < Hw Then Portb.0 = 0 'Pin 5 Schaltausgang=0

'Ist Timereingang 0 oder 1

If Pinb.2 = 0 Then Portb.0 = 0 'Sperre durch Schaltuhr
If Dw > Hw And Pinb.2 = 1 Then Portb.0 = 1 'Freigabe durch Schaltuhr oder Jumper

Goto Messen


'Unterroutinen ###############################################################

'Momentanen ADC-Wert als Trigger speichern oder Serviceroutine schalten
'----------------------------------------------------------------------
'Taste innerhalb 2 Sek. nochmals drücken = Schaltschwelle speichern
'Taste T länger als 3 Sek. gedrückt halten ist Serviceroutine1


Prefatch:

Portb.4 = 0 'LED grün OFF/gelb ON

For Z = 1 To 60000 'Zeitschleife ca. 2sek
Debounce Pinb.1 , 0 , Eichen 'Schaltschwelle speichern
Next Z

If Pinb.1 = 0 Then Goto Service1

Goto Messen


'Servicestufe 1, Schaltausgang PortB.0 auf 0 setzen und warten auf Tastendruck

Service1:

Portb.0 = 0

Do

Toggle Portb.4 'LED grün/gelb langsames Blinken
Debounce Pinb.1 , 0 , Service2
Waitms 300

Loop


'Servicestufe 2, Schaltausgang PortB.0 auf 1 setzen und warten auf Tastendruck

Service2:

Portb.0 = 1

Do

Toggle Portb.4 'LED grün/gelb schnelles Blinken
Debounce Pinb.1 , 0 , Service2a
Waitms 100


Loop

'Schaltausgang PortB.0 auf 0 setzen und zurück zur Messroutine

Service2a:

Portb.0 = 0

Goto Vergleich




'Routine zum Einspeichern der Schaltschwelle

Eichen:

Writeeeprom Uinput , Ldr 'Wert in EEPROM speichern

Goto Vergleich




Elektronik-Labor   Projekte   AVR