Ergebnis 1 bis 3 von 3

Thema: Mikroprojekt Leseleuchte Kinderbett

  1. #1
    Sponsor
    Registriert seit
    04.11.2016
    Beiträge
    29

    Mikroprojekt Leseleuchte Kinderbett

    Nachdem der Nachwuchs 3 Jahre alt geworden ist wurde der Wunsch nach einer
    eigenen Leseleuchte immer größer.

    Wunsch wird doch promt erfüllt.

    Anforderung:
    - Akkubetrieb da lange Kabel am rollbaren Kinderbett eher lästig
    - Ladung mit USB-Lader möglich
    - Ein/Ausschalten mittels Taster am Kabel
    - Automatische Ausschaltung nach 20 Minuten
    - dabei langsames Verlöschen der Beleuchtung
    - Batterieüberwachung

    Verbaut wurden:
    - zur Stromversorgung eine 18650er LiIon-Zelle 4,2V mit integrierter Sicherheitsschaltung
    - USB auf 4,2V Ladeteil, z.B. Pollin http://www.pollin.de/shop/dt/Mjc1ODQ...LL_TP4056.html
    - 12 Stück warmweisse LEDs
    - Sperrholz, Plexiglas, Kleingemüse
    - und natürlich ein in der Bastelkiste reichlich vorhandener ATTINY13
    - Aufbau auf Lochraster, Platine lohnt hier nicht

    Das Programm ist einfach

    Ein Taster weckt über PCINT den AVR auf und schaltet über eine PWM langsam die LEDs ein
    Ausschalten andersrum, LEDs dimmen ab, ARV geht über Powerdown in den Schlafmodus
    Nach Ablauf von ca. 20 Minuten dimmen die LEDs langsam auf NULL, der AVR geht in den Schlafmodus. Kind ebenso.

    Batterieüberwachung erfolgt im Betrieb, hier wird ein Spannungsteiler über PB1 zugeschaltet und die Spannung am ADC2 gemessen. Da die Referenzspannung internal 1,1V genutzt wird funktioniert das.
    Bei Batteriespannung von weniger als 3,6V blinkert die LED am PB2 wie wild auf, die Leuchte wird abgeschaltet.

    Kind begeistert, will jetzt die Bilderbücher nur noch im eigenen Bett ansehen.
    Endlich Ruhe im Elternbett :=)

    Code:
    '-------------------------
    ' Steuerung der Beleuchtung für Bettlicht
    ' Stand 30.10.2016
    
    
    ' LED-Leiste
    ' Tastendruck EIN - Tastendruck AUS
    ' Nach 20 Minuten Dimmen auf 0%
    ' Batteriekontrolle, Ausschalten!
    
    
    $regfile = "ATtiny13.DAT"
    $crystal = 1200000                                          ' Default-Einstellungen lassen
    $hwstack = 10
    $swstack = 10
    $framesize = 10
    
    '-------------------------
    ' Config Ports
    
    Config Portb.0 = Output                                     ' PIN 5 PWM0a LED-Zeile
    Config Portb.1 = Output                                     ' PIN 6 Versorgung Spannungsteiler  3,3k / 1k
    Config Portb.2 = Output                                     ' PIN 7 LED-Kontrolle
    Config Portb.3 = Input                                      ' PIN 2 PCINT3 für Taster
    Portb.3 = 1                                                 ' Pull-Up setzen
    Config Portb.4 = Input                                      ' PIN3 ADC2 für Spannungsmessung
    
    
    '-------------------------
    ' Config ADC
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal       'Referenzspannung Des Adc Auf "Internal" = 1,1 V
    
    '-------------------------
    ' Config Interrupts
    
    Enable Pcint0
    On Pcint0 Irq_int0
    Pcmsk = &B00001000                                          ' PIN-Change auf Port 3 abfragen
    
    '-------------------------
    ' Config Timer
    
    Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down
    Enable Timer0
    
    Pwm0a = 255                                                 ' 255=AUS
    
    
    '-------------------------
    ' Config Variablen
    
    Dim Zaehler As Byte                                         ' aktuelles Programm
    Dim Wert1 As Byte                                           ' allg. Zählvariable
    Dim Zustand As Byte                                         ' Zustand, 1=Leuchten, 0=ausschalten
    Zustand = 1
    Dim Aus_zaehler As Long                                     ' AUTO-Aus-Funktion
    Aus_zaehler = 0
    Dim Flag As Byte                                            ' Zustand
    Flag = 0
    Dim Spannungsgrenze As Word                                 ' Schaltschwelle am ADC
    Spannungsgrenze = 785                                       '  ab < 3,6V abschalten
    
    '-------------------------
    ' Config Konstanten
    
    Const Max_hell_1 = 100                                      ' maximale Helligkeit LED1 (255=0%, 0=100%)
    Const Aus_schalten = 10900                                  ' nach 10900 Durchläufen schlafen legen
    
    '-------------------------
    ' Config Entprellung
    
    Config Debounce = 250                                       ' Tastaturentprellung länger
    
    '-------------------------
    ' Programmstart
    
    Anfang:
    
    Stop Adc
    Stop Ac
    Portb.1 = 0                                                 ' Spannungsteiler nicht versorgen
    Portb.2 = 0                                                 ' StatusLED aus
    Pwm0a = 255                                                 ' 255=AUS
    Disable Timer0
    
    Gosub Dreihundert_ms
    
    Enable Interrupts
    
    Config Powermode = Powerdown                                ' als erstes erst mal schlafen legen
    
    Disable Interrupts
    
    
    Flag = 0
    Zaehler = 1
    Aus_zaehler = 0
    Zustand = 1
    
    
    
    '-------------------------
    ' Hauptprogramm
    
    Do
    
    
    Gosub Hundert_ms
    
    If Flag = 1 Then
    Portb.1 = 1
      Start Adc
      If Getadc(2) < Spannungsgrenze Then Nop
      If Getadc(2) < Spannungsgrenze Then Goto Alarm
    Rem   Stop Adc
    End If
    
    
    
    Debounce Pinb.3 , 0 , Hochzaehlen , Sub                     ' Programmauswahl
    
    
    Incr Aus_zaehler                                            ' Countdown zum Abschalten
    If Aus_zaehler > Aus_schalten Then
       For Wert1 = Max_hell_1 To 255
           Portb.2 = 1
           Gosub Fuenfms
           Portb.2 = 0
           Gosub Dreihundert_ms
           Debounce Pinb.3 , 0 , Abbrechen
           Gosub Dreihundert_ms
           Debounce Pinb.3 , 0 , Abbrechen
           Gosub Dreihundert_ms
           Debounce Pinb.3 , 0 , Abbrechen                      ' Programmauswahl
           Pwm0a = Wert1                                        ' linke led langsam dunkler
       Next
       Goto Anfang                                              ' einschlafen
    End If
    
    
    If Zustand = 0 Then                                         ' Alles AUS, Vorbereitung zum einschlafen
       For Wert1 = Max_hell_1 To 255
           Gosub Fuenfms
           Pwm0a = Wert1                                        ' linke led langsam dunkler
       Next
       Goto Anfang
    End If
    
    If Zustand = 1 Then
         If Flag = 0 Then
          Flag = 1                                              ' led ein
          For Wert1 = 255 To Max_hell_1 Step -1
            Gosub Fuenfms
            Pwm0a = Wert1                                       ' linke led langsam heller
          Next
         End If
    End If
    
    
    
    
    Loop
    
    End                                                         'end program
    
    '-------------------------
    'Verzögerungen
    Dreihundert_ms:
      Waitms 200
    Hundert_ms:
      Waitms 95
    Fuenfms:
      Waitms 5
    Return
    
    '-------------------------
    ' Interrupt-routinen
    
    Irq_int0:                                                   ' nur DUMMY, muss nix tun!
      nop                                                       ' brauche ich nur nach dem Aufwachen
    Return
    
    '-------------------------
    Alarm:                                                      ' Bearbeitung Überstrom / Kurzschluss am Ausgang
    Pwm0a = 255                                                 ' linke led sofort AUS
    For Wert1 = 1 To 50                                         ' 50 x blinken
    Gosub Hundert_ms
      Toggle Portb.2
    Next
    Goto Anfang                                                 ' dann einschlafen
    
    '-------------------------
    Hochzaehlen:                                                ' Auf Tasterdruck nächste Funktion
      Zustand = 0                                               ' Funktionswechsel    --> Ausschalten
      Flag = 0
      Aus_zaehler = 0                                           ' Countdown Ausschalten beginnt von neuem
    Return
    '-------------------------
    Abbrechen:                                                  ' Auf Tasterdruck nächste Funktion
      Zustand = 0                                               ' Funktionswechsel    --> Ausschalten
      Flag = 0
      Aus_zaehler = 0                                           ' Countdown Ausschalten beginnt von neuem
    Goto Anfang
    '-------------------------
    Schaltplan siehe Anhang

    Klaras_Leuchte_20161031.bas
    Klaras_Leuchte.pdf
    Geändert von Riedleweg (07.11.2016 um 16:07 Uhr)

  2. #2
    tschoeatsch
    Gast
    Potzblitz, mit 3 Jahren hätte [B]ich[B] nicht unter der Leuchte gelesen, sonder die in den Mund gesteckt und ausgelutscht

    Aha, das B in eckigen Klammern heißt 'Fettdruck ab' bzw '- aus', nurmal so zur Erläuterung.

  3. #3
    Sponsor
    Registriert seit
    04.11.2016
    Beiträge
    29
    Der Nachwuchs zeigt sich anspruchsvoll.

    Es wurden 3 Helligkeitsstufen gewünscht.
    Stufe 1: Dämmerlicht zum Einschlafen
    Stufe 2: Halbe Helligkeit zum Geschichten Vorlesen lassen
    Stufe 3: Volle Helligkeit zum selbst in den Bilderbüchern blättern.

    Also kurz umgebaut :=)

    Code:
    '-------------------------
    ' Steuerung der Beleuchtung für Klaras Bettlicht
    ' Stand 19.11.2016
    
    
    
    $regfile = "ATtiny13.DAT"
    $crystal = 1200000                                          ' Default-Einstellungen lassen
    $hwstack = 10
    $swstack = 10
    $framesize = 10
    
    '-------------------------
    ' Config Ports
    
    Config Portb.0 = Output                                     ' PIN 5 PWM0a LED-Zeile
    Config Portb.1 = Output                                     ' PIN 6 Versorgung Spannungsteiler  3,3k / 1k
    Config Portb.2 = Output                                     ' PIN 7 LED-Kontrolle
    Config Portb.3 = Input                                      ' PIN 2 PCINT3 für Taster
    Portb.3 = 1                                                 ' Pull-Up setzen
    Config Portb.4 = Input                                      ' PIN3 ADC2 für Spannungsmessung
    
    
    '-------------------------
    ' Config ADC
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal       'Referenzspannung Des Adc Auf "Internal" = 1,1 V
    
    '-------------------------
    ' Config Interrupts
    
    Enable Pcint0
    On Pcint0 Irq_int0
    Pcmsk = &B00001000                                          ' PIN-Change auf Port 3 abfragen
    
    '-------------------------
    ' Config Timer
    
    Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down
    Enable Timer0
    
    Pwm0a = 255                                                 ' 255=AUS
    
    
    '-------------------------
    ' Config Variablen
    
    Dim Zaehler As Byte                                         ' aktuelles Programm
    Dim Wert1 As Byte                                           ' allg. Zählvariable
    Dim Zustand As Byte                                         ' Zustand, 0=ausschalten
    Zustand = 1
    Dim Max_hell_1 As Byte                                      ' gewünschte Helligkeit
    Dim Min_hell_1 As Byte
    Dim Aus_zaehler As Long                                     ' AUTO-Aus-Funktion
    Aus_zaehler = 0
    Dim Flag As Byte                                            ' Zustand
    Flag = 0
    Dim Spannungsgrenze As Word                                 ' Schaltschwelle am ADC
    Spannungsgrenze = 785                                       '  ab < 3,6V abschalten
    
    '-------------------------
    ' Config Konstanten
    
    Const Aus_schalten = 10900                                  ' nach 10900 Durchläufen schlafen legen
    Rem Const Aus_schalten = 50
    '-------------------------
    '-------------------------
    ' Programmstart
    
    Anfang:
    
    Stop Adc
    Stop Ac
    Portb.1 = 0                                                 ' Spannungsteiler nicht versorgen
    Portb.2 = 0                                                 ' StatusLED aus
    Pwm0a = 255                                                 ' 255=AUS
    Disable Timer0
    
    Gosub Dreihundert_ms
    
    Enable Interrupts
    
    Config Powermode = Powerdown                                ' als erstes erst mal schlafen legen
    
    Disable Interrupts
    
    
    Flag = 0
    Zaehler = 1
    Aus_zaehler = 0
    Zustand = 0                                                 ' Lichtstärke 1
    Min_hell_1 = 255
    
    
    
    
    '-------------------------
    ' Hauptprogramm
    
    Do
    
    
    Gosub Hundert_ms
    
    If Flag = 1 Then
    Portb.1 = 1
      Start Adc
      If Getadc(2) < Spannungsgrenze Then Nop
      If Getadc(2) < Spannungsgrenze Then Goto Alarm
    Rem Stop Adc
    End If
    
    ' Taster abfragen und Zustand setzen
    
    If Pinb.3 = 0 Then
       Gosub Dreihundert_ms
       If Pinb.3 = 0 Then
          Incr Zustand
          If Zustand > 3 Then Zustand = 0                       'Nach max. Helligkeit ausschalten
          Select Case Zustand
            Case 0                                              'Ausschalten
                  Flag = 0
                  Aus_zaehler = 0
                   For Wert1 = Min_hell_1 To 255
                     Gosub Fuenfms
                     Pwm0a = Wert1                              ' led langsam dunkler
                   Next
                  Goto Anfang
            Case 1                                              'Helligkeit Stufe 1
                  Max_hell_1 = 248
                  Flag = 1
                  Gosub Led_steuern
            Case 2                                              'Helligkeit Stufe 2
                  Max_hell_1 = 190
                  Flag = 1
                  Gosub Led_steuern
            Case 3                                              'Helligkeit Stufe 3
                  Max_hell_1 = 90
                  Flag = 1
                  Gosub Led_steuern
          End Select
       End If
    End If
    
    
    
    Incr Aus_zaehler                                            ' Countdown zum Abschalten
    If Aus_zaehler > Aus_schalten Then
       Min_hell_1 = Min_hell_1 + 1
       For Wert1 = Min_hell_1 To 255
           Portb.2 = 1
           Gosub Fuenfms
           Portb.2 = 0
           Gosub Dreihundert_ms
           If Pinb.3 = 0 Then Goto Abbrechen
           Gosub Dreihundert_ms
           If Pinb.3 = 0 Then Goto Abbrechen
           Gosub Dreihundert_ms
           If Pinb.3 = 0 Then Goto Abbrechen
           Pwm0a = Wert1                                        ' led langsam dunkler
       Next
       Goto Anfang                                              ' einschlafen
    End If
    
    
    
    Loop
    
    End                                                         'end program
    
    '-------------------------
    'Verzögerungen
    Dreihundert_ms:
     Waitms 200
    
    Hundert_ms:
      Waitms 95
    Fuenfms:
      Waitms 5
    Return
    
    '-------------------------
    ' Interrupt-routinen
    
    Irq_int0:                                                   ' nur DUMMY, muss nix tun!
      nop                                                       ' brauche ich nur nach dem Aufwachen
    Return
    
    '-------------------------
    Alarm:                                                      ' Bearbeitung Unterspannung
    Pwm0a = 255                                                 ' led sofort AUS
    For Wert1 = 1 To 50                                         ' 50 x blinken
    Gosub Hundert_ms
      Toggle Portb.2
    Next
    Goto Anfang                                                 ' dann einschlafen
    
    '-------------------------
    Led_steuern:
          For Wert1 = Min_hell_1 To Max_hell_1 Step -1
            Gosub Fuenfms
            Pwm0a = Wert1                                       ' led langsam heller
          Next
          Min_hell_1 = Wert1
    Return
    '-------------------------
    Abbrechen:
      Gosub Hundert_ms                                          ' Auf Tasterdruck nächste Funktion
      Zustand = 0                                               ' Funktionswechsel    --> Ausschalten
      Flag = 0
      Aus_zaehler = 0                                           ' Countdown Ausschalten beginnt von neuem
    Goto Anfang
    '-------------------------
    Geändert von Riedleweg (12.12.2016 um 23:37 Uhr)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •