' LED Dimmer mit Touch Sensor Bedienung, basierend auf dem Quelltext von Arne Groh ' http://www.mikrocontroller.net/topic/156809#1744442 ' ' ausgestaltet von Uwe Krause-Gaudlitz ' 31.01.2015 ' ' konzipiert für 2 Sensoren, aktuell ist nur ein Sensor softwareseitig implementiert ' ' Verbesserungspotential ist gegeben :-) ' ' Funktion: ' - Einmal kurz an den Sensor tippen = EIN bzw. AUS schalten ' - Das Einschalten erfolgt beim 1. Mal mit maximaler Helligkeit, danach mit dem letzten Helligkeitswert ' - Beim Ausschalten wird der letzte Helligkeitswert gespeichert ' - Bei längerer Berührung des Sensors wird gedimmt, wechselweise von Max --> Min (= AUS) --> Max ' - 8-Bit PWM -- einstellbar in 8er Schritten ' ' Verwendung in der Praxis: ' - Die Platine mit Sensor (es geht auch eine Lachkarte mit abgesetztem Sensor) ist in einem Kunststoffgehäuse untergebracht ' - Stromversorgung mit einem geeigneten ECO-Netzteil 12V und Stepdown Wandler auf 5V ' - ein geeigneter MOSFET schaltet/dimmt die (IP65) LED-Stripes ' ' Jeder ATTiny mit Hardware-PWM und 2 freien Portpins für den Touch-Sensor und 1/2 Portpins für die Output Compare Pins ' mit 2k Flash ist geeignet ' $regfile = "ATTiny24.dat" $crystal = 8000000 $hwstack = 32 $swstack = 16 $framesize = 60 ' Definitionen IO Sens_a Alias PortA.1 Sens_a_ddr Alias DdrA.1 Sens_b Alias PortA.0 Sens_b_ddr Alias DdrA.0 Sens_b_pin Alias PinA.0 'Definitionen LED CONFIG PORTB.0 = Output CONFIG PORTB.1 = Output LED1 ALIAS PORTB.0 LED2 ALIAS PORTB.1 'Definition Timer + PWM CONFIG PORTB.2 = Output PWMLED1 ALIAS PORTB.2 Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 64 '______________________________________________________________________________ 'Definitionen Programm allgemein Dim Cycles As Word Dim BaseCycles As Word Dim EqualVal As Word Dim CyclesCnt As Word Dim BaseCalibCnt As Byte Dim IsCalibd As Bit Dim DimmDown As Bit Dim OutC1 As Integer ' aktueller DIMM-Wert Dim LastState As Byte ' Unterscheidung EIN/AUS und DIMMEN Dim LastHue As Byte ' letzter Helligkeitswert Dim OnOFF As Bit 'b PA0----+ ' | ' --- ' --- 25n ' | 'a PA1----+-- 1k----+-------- Touchpad 1 ' 'b PA2----+ ' | ' --- ' --- 25n ' | 'a PA3----+-- 1k----+-------- Touchpad 2 ' 5 Messungen zu Beginn um den Basiswert zu bestimmen BaseCalibCnt = 0 CyclesCnt = 0 BaseCycles = 0 LastState = 0 LastHue = 0 Compare0a = 0 '---------------------------------------------------------- ' Serielle Schnittstelle 'Open "coma.4:9600,8,n,1" For Output As #1 '---------------------------------------------------------- SET LED1 RESET LED2 Waitms 2000 SET LED2 Disable Interrupts Do Cycles = 0 'Alles Entladen 'beide out - beide low Sens_a_ddr = 1 Sens_a = 0 Sens_b_ddr = 1 Sens_b = 0 'auf vollstaendige Entladung warten Waitms 50 Do 'beide als tristate inp schalten, damit keine Ladung abfliessen kann Sens_a_ddr = 0 Sens_b = 1 Sens_b_ddr = 1 ' Sensor aufladen Sens_b_ddr = 0 ' umschalten auf tristate Sens_b = 0 ' und anschließend Sens_a_ddr = 1 ' Sensor entladen und vorbereiten zum messen (a=Masse) Sens_b = 0 ' ein Waitus() geht hier auch - Zeit zum umladen IF Sens_b_pin = 1 THEN ' nach Start kalibrieren IF IsCalibd = 0 THEN IF BaseCalibCnt < 17 THEN BaseCycles = BaseCycles + Cycles INCR BaseCalibCnt ELSE BaseCycles = BaseCycles / BaseCalibCnt CyclesCnt = BaseCycles IsCalibd = 1 END IF END IF EXIT Do ' Abbruch der Schleife END IF Incr Cycles Loop Until Cycles >= 2048 'wiederholen und im Zweifel beenden ' PRINT #1 , "Zyklen: " ; ' PRINT #1 , STR(Cycles) ' PRINT #1 , "Mittelwert: " ; ' PRINT #1 , STR(CyclesCnt) ' Schalten IF IsCalibd = 1 THEN ' (ANFANG) nach Kalibrieren erst Schalten erlauben EqualVal = CyclesCnt - 30 IF Cycles < EqualVal THEN RESET LED1 WAITms 50 IF OnOFF = 0 THEN ' EINschalten IF LastHue = 0 THEN Compare0a = 255 DimmDown = 1 ELSE Compare0a = LastHue END IF OnOFF = 1 LastState = 0 ELSE ' AUSschalten IF LastState = 0 THEN 'Status unverändert lassen in Helligkeit und Richtung 'LastHue = Compare0a 'DimmDown = 0 Compare0a = 0 OnOFF = 0 LastState = 0 END IF END IF '-- DIMMER +/- -------------------------------------------- IF OnOFF = 1 AND LastState > 0 THEN IF DimmDown = 0 THEN OutC1 = Compare0a + 8 IF OutC1 > 255 THEN Compare0a = 255 DimmDown = 1 ELSE Compare0a = Compare0a + 8 END IF ELSE OutC1 = Compare0a - 8 IF OutC1 < 0 THEN Compare0a = 0 DimmDown = 0 ELSE Compare0a = Compare0a - 8 END IF END IF LastHue = Compare0a ' letzten Helligkeitswert speichern END IF INCR LastState ' Unterscheidung Einfach-/Dauer-Betätigung '-- DIMMER +/- -------------------------------------------- ELSE SET LED1 LastState = 0 END IF END IF ' (ENDE) nach Kalibrieren erst Schalten erlauben Sens_b_ddr = 1 LED2 = IsCalibd Loop End