'-------------------------------------------------------------------------------
'name : Raspberry Pi WLANThermo v3 REV.1
'copyright : (c) 2014-2015, Florian R.
'version : v1.6
'micro : Attiny45
'quarz : int 8Mhz
' -----------------------Attiny_45-----------------------
' +---v---+
' (Reset) PB5 |1 8| VCC (5V)
' (LCD Beleuchtung) PB3 |2 7| PB2 (IRLU024)
' (Shutdown Signal) PB4 |3 6| PB1 (Taster)
' GND |4 5| PB0 (Status LED)
' +-------+
' -------------------------------------------------------
'-------------------------------------------------------------------------------
'$sim
$regfile = "attiny45.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 68
$framesize = 68
' Status LED ------------------------------------------------------------
Config Portb.0 = Output 'Pin als Ausgang setzen
Status_led Alias Portb.0 ' Status LED
Dim Led_flash_slow As Bit , Led_flash_fast As Bit , Led_flash As Byte
Const Status_led_on = 0 ' Status LED on/off deklarieren
Const Status_led_off = 1 ' Status LED on/off deklarieren
Status_led = Status_led_off
' ------------------------------------------------------------------------------
' "Taster"-befehl von AVR zu RaspberryPi für den Shutdown
Config Pinb.4 = Input
Set Portb.4
Dim Command_from_raspberry As Bit
' Taster -----------------------------------------------------------------------
Config Pinb.1 = Input ' Tastenpin als Eingang
Set Portb.1 ' Pullup ein, Taste schaltet nach GND
Taster Alias Pinb.1 ' Passenden Alias vergeben
' ------------------------------------------------------------------------------
' Taster Auswertung ------------------------------------------------------------
Const True = 1 : Const False = 0
Dim Counts_pressed As Word , Counts_released As Byte , Clicks As Byte
Dim Key_state As Byte , Old_key_state As Byte , Key_event As Byte
Dim Tmr_event_1 As Byte
Const Key_not_pressed = 0
Const Key_long_pressed = 1
Const Key_single_klick = 2
Const Key_double_klick = 3
Const Key_tripple_klick = 4
' ------------------------------------------------------------------------------
' Setup Menü ------------------------------------------------------------
Dim Setup_flag As Bit
Dim Setup_counter As Integer
Dim Setup_counter_2 As Integer
Dim Flash_sequence As Integer
Const Setup_1 = 1
Const Setup_2 = 2
Const Setup_3 = 3
Const Setup_4 = 4
' ------------------------------------------------------------------------------
' LCD Hintergrundbeleuchtung ---------------------------------------------------
Config Portb.3 = Output 'Pin als Ausgang setzen
Lcd_backlight Alias Portb.3 ' LCD
Const Lcd_backlight_on = 0 ' LCD Hintergrundbeleuchtung on/off deklarieren *
Const Lcd_backlight_off = 1 ' LCD Hintergrundbeleuchtung on/off deklarieren *
Const Lcd_time_short = 1500 'Zeit für Displaybeleuchtung (default 1500=15 Sekunden)
Const Lcd_time_long = 30000 'Zeit für Displaybeleuchtung bei doppelklick (default 30000=5min)
Const Lcd_max_brightness = 50 'Maximal Wert für Hintergrundhelligkeit (darf nicht höher als 50 sein)
Const Lcd_min_brightness = 5 'Minimal Wert für Hintergrundhelligkeit
Dim Lcd_backlight_flag As Bit , Lcd_counter As Integer , Lcd_brightness As Byte
Dim Lcd_brightness_counter As Byte , Incr_brightness_timer0 As Byte ' Zähler
Dim Lcd_brightness_fadein_flag As Bit , Lcd_brightness_fadeout_flag As Bit
Dim Brightness_menue_flag As Bit , Lcd_fade_counter As Byte
Dim Lcd_time As Long
Lcd_backlight = Lcd_backlight_off
'* Zum invertieren 0 und 1 tauschen
' ------------------------------------------------------------------------------
' Raspberry Pi Stromversorgung -------------------------------------------------
Raspi_power Alias Portb.2 ' IRLU024
Raspi_power = 0
Config Portb.2 = Output ' IRLU024
Const Raspi_power_on = 1 ' Raspberry Pi Stromversorgung on/off deklarieren *
Const Raspi_power_off = 0 ' Raspberry Pi Stromversorgung on/off deklarieren *
Const Shutdown_time = 3000 ' Shutdown Zeit = 30 Sekunden
Const Boot_time = 5000 ' Startzeit für die Led_Sequenze (Raspberry braucht ca. 50Sekunden zum starten)
Dim Shutdown_flag As Bit
Dim Shutdown_counter As Integer
Dim Boot_flag As Bit
Dim Boot_counter As Integer
'* Zum invertieren 0 und 1 tauschen
' ------------------------------------------------------------------------------
' Timer0 -----------------------------------------------------------------------
Config Timer0 = Timer , Prescale = 64 ' Interrupt alle 1ms
Enable Timer0
On Timer0 Tmr_isr
Enable Interrupts
Timer0 = 131
Dim Lcd_backlight_allways_on As Bit
Dim Incr_timer0 As Byte
' ------------------------------------------------------------------------------
' Timer1 -----------------------------------------------------------------------
Config Timer1 = Timer , Prescale = 64
On Timer1 Isr_timer1
Enable Timer1
Start Timer1
Timer1 = 205
Enable Interrupts
' ------------------------------------------------------------------------------
' EERAM ------------------------------------------------------------------------
Dim Eedummy As Eram Byte ' Erste Speicheradresse Freilassen
Dim Ee_autoboot As Eram Byte ' EEPROM Variable setzen für Bootmenü
Dim Ee_lcd_brightness As Eram Byte ' EEPROM Variable setzen für LCD Helligkeit
' ------------------------------------------------------------------------------
' Autoboot ---------------------------------------------------------------------
Dim Autoboot As Byte ' Variable
Autoboot = Ee_autoboot
Select Case Autoboot
Case 1 : 'Menü 1 : Raspberry startet Automatisch + LCD Hintergrundbeleuchtung ist bei Tastendruck für x Sekunden aktiviert
Set Boot_flag
Boot_counter = 0
Status_led = Status_led_on 'Status LED on
Case 2 : 'Menü 2 : Raspberry startet Automatisch + LCD Hintergrundbeleuchtung ist immer ein
Set Boot_flag
Boot_counter = 0
Status_led = Status_led_on 'Status Led on
Set Lcd_backlight_allways_on 'LCD backlight on
Case 3 : 'Menü 3 : Raspberry startet erst bei Tastendruck + LCD Hintergrundbeleuchtung ist bei Tastendruck für x Sekunden aktiviert
Case 4 : 'Menü 4 : Raspberry startet erst bei Tastendruck + LCD Hintergrundbeleuchtung ist immer ein
Set Lcd_backlight_allways_on 'LCD backlight on
Case Else : ' Falls im EEPROM noch kein wert hinterlegt ist...
Autoboot = 1
Ee_autoboot = Autoboot ' Menü wird auf 1 gesetzt
Ee_lcd_brightness = Lcd_max_brightness ' LCD Helligkeit wird auf max gesetzt
Set Boot_flag ' Raspberry wird gestartet
End Select
Lcd_brightness = Ee_lcd_brightness
' ------------------------------------------------------------------------------
DO
'_______________________________________________________________________________
'LCD Hintergrundbeleuchtung dauerhaft einschalten falls eingestellt-------------
If Raspi_power = Raspi_power_on And Lcd_backlight_allways_on = 1 And Setup_flag = 0 Then
Lcd_backlight = Lcd_backlight_on
End If
'_______________________________________________________________________________
'____________________________________________________________________________
'Tastendruck verarbeiten-----------------------------------------------------
If Tmr_event_1 = True Then
Tmr_event_1 = False
Gosub Key_manager
If Key_event = True Then
Select Case Key_state
'Case Key_not_pressed :
'________________________________________________________________
'Taste lange gedrückt--------------------------------------------
Case Key_long_pressed :
'_____________________________________________________________
'Setup Menue verlassen----------------------------------------
If Setup_flag = 1 Then ' Wenn der AVR im Setupmenue ist dann...
Ee_autoboot = Autoboot 'neue Einstellungen im Ram speichern
Reset Setup_flag ' Setup Flag ruecksetzen
Status_led = Status_led_off 'Status Led auschalten
Set Boot_flag 'Bootflag setzen
Boot_counter = 0 'Bootcounter auf rücksetzen
End If
'_____________________________________________________________
'_____________________________________________________________
'Shutdown befehl wurde erteilt--------------------------------
If Raspi_power = Raspi_power_on And Setup_flag = 0 And Boot_flag = 0 Then ' Wenn Raspberry schon läuft dann...
Command_from_raspberry = 0
Shutdown_flag = 1 ' Shutdown einleiten
Shutdown_counter = 0 ' Counter auf 0 stellen
Led_flash_slow = 1 ' Led blinken lassen
'_____________________________________________________________
'In das Setup Menue wechseln----------------------------------
Elseif Raspi_power = Raspi_power_off And Setup_flag = 0 And Boot_flag = 0 Then ' Wenn Raspi noch nicht läuft...
Set Setup_flag 'Setup Flag setzen
Setup_counter = 0 'Counter zuruecksetzen
Setup_counter_2 = 0 'Counter zuruecksetzen
End If
'_____________________________________________________________
'________________________________________________________________
'Taste einfach gedrückt------------------------------------------
Case Key_single_klick : ' Einfacher Tastendruck wurde erkannt
'_____________________________________________________________
'Wenn sich der AVR nicht im Setupmodus befindet...------------
If Setup_flag = 0 Then
If Raspi_power = Raspi_power_off And Setup_flag = 0 And Brightness_menue_flag = 0 Then
Boot_counter = 0
Set Boot_flag ' Raspberry Pi starten
Elseif Raspi_power = Raspi_power_on And Setup_flag = 0 And Brightness_menue_flag = 0 Then
Set Lcd_backlight_flag ' Lcd Hintergrundbeleuchtung wird für x Sekunden eingeschaltet
Lcd_time = Lcd_time_short
Lcd_brightness_fadein_flag = 1
Lcd_counter = 0 ' Counter zurücksetzen
Elseif Raspi_power = Raspi_power_on And Setup_flag = 0 And Brightness_menue_flag = 1 Then
'_______________________________________________________
'Display Helligkeit wird bei Tastendruck um x erhöht----
If Lcd_fade_counter <= Lcd_max_brightness Then
Lcd_fade_counter = Lcd_fade_counter + 5
Lcd_counter = 0
End If
If Lcd_fade_counter > Lcd_max_brightness Then
Lcd_fade_counter = Lcd_min_brightness
Lcd_counter = 0
End If
'_______________________________________________________
End If
'_________________________________________________________
End If
'_____________________________________________________________
'_____________________________________________________________
'Wenn sich der AVR im Setupmodus befindet...------------------
If Setup_flag = 1 Then
Status_led = Status_led_off
Setup_counter_2 = 0 'Counter zuruecksetzen
Setup_counter = 0 'Counter zuruecksetzen
Select Case Autoboot
Case 1:
Autoboot = 2 'Autoboot wird bei Tastendruck um 1 erhöht
Set Lcd_backlight_allways_on 'Flag setzen damit LCD Beleuchtung immer leuchtet
Case 2:
Autoboot = 3 'Autoboot wird bei Tastendruck um 1 erhöht
Reset Lcd_backlight_allways_on 'Flag löschen damit LCD Beleuctung nur bei Tastendruck für x Sekunden leuchtet
Case 3:
Autoboot = 4 'Autoboot wird bei Tastendruck um 1 erhöht
Set Lcd_backlight_allways_on 'Flag setzen damit LCD Beleuchtung immer leuchtet
Case 4:
Autoboot = 1 'Autoboot wird bei Tastendruck auf 1 zurückgesetzt
Reset Lcd_backlight_allways_on 'Flag löschen damit LCD Beleuctung nur bei Tastendruck für x Sekunden leuchtet
End Select
End If
'________________________________________________________________
'Taster zweimal gedrückt-----------------------------------------
Case Key_double_klick :
If Raspi_power = Raspi_power_on And Setup_flag = 0 And Brightness_menue_flag = 0 Then
Set Lcd_backlight_flag ' Lcd Hintergrundbeleuchtung wird für x Sekunden eingeschaltet
Lcd_time = Lcd_time_long
Lcd_brightness_fadein_flag = 1
Lcd_counter = 0 ' Counter zurücksetzen
End If
'________________________________________________________________
'Taster dreimal gedrückt-----------------------------------------
Case Key_tripple_klick :
If Raspi_power = Raspi_power_on And Setup_flag = 0 Then
If Brightness_menue_flag = 0 Then
Set Brightness_menue_flag
Set Lcd_backlight_flag ' Lcd Hintergrundbeleuchtung wird für x Sekunden eingeschaltet
Lcd_time = Lcd_time_short
Lcd_brightness_fadein_flag = 1
Lcd_counter = 0 ' Counter zurücksetzen
Elseif Brightness_menue_flag = 1 Then
If Lcd_brightness <> Lcd_fade_counter Then
Lcd_brightness = Lcd_fade_counter
Ee_lcd_brightness = Lcd_brightness
Reset Brightness_menue_flag
End If
End If
End If '________________________________________________________________
'----------------------------------------------------------------
End Select
End If
End If
'____________________________________________________________________________
'____________________________________________________________________________
'Shutdown wurde eingeleitet--------------------------------------------------
If Shutdown_flag = 1 Then
If Command_from_raspberry = 0 And Shutdown_counter < 300 Then
Config Portb.4 = Output
Portb.4 = 1
End If
If Command_from_raspberry = 0 And Shutdown_counter > 300 Then
Reset Portb.4
Config Pinb.4 = Input
Set Portb.4
End If
If Shutdown_counter > Shutdown_time And Status_led = Status_led_off Then
Reset Led_flash_slow
Shutdown_flag = 0
Reset Command_from_raspberry
Lcd_backlight = Lcd_backlight_off
Raspi_power = Raspi_power_off
Status_led = Status_led_off
End If
End If
If Shutdown_flag = 0 And Raspi_power = Raspi_power_on Then
Debounce Pinb.4 , 1 , Shutdown_from_raspberry , Sub
End If
'____________________________________________________________________________
'____________________________________________________________________________
'Bootvorgang wurde eingeleitet-----------------------------------------------
If Boot_flag = 1 Then
'_________________________________________________________________________
'Wenn die Bootsequenz vorbei ist...---------------------------------------
If Boot_counter > Boot_time Then
Reset Led_flash_fast 'Schnelles LED Blinekn ausschalten
Reset Boot_flag 'Bootflag loeschen
Boot_counter = 0 'Counter zuruecksetzen
Status_led = Status_led_on 'Status Led dauerhaft einschalten
'_________________________________________________________________________
' Wenn die Bootsequenz noch nicht vorbei ist...---------------------------
Else
Raspi_power = Raspi_power_on ' Raspberry Pi starten
Set Led_flash_fast 'Status Led schnell blinken lassen
End If
End If
'____________________________________________________________________________
'____________________________________________________________________________
'Hintergrundbeleuchtung wurde Aktiviert--------------------------------------
If Lcd_backlight_flag = 1 Then
If Lcd_counter > Lcd_time Then
Set Lcd_brightness_fadeout_flag
Reset Brightness_menue_flag ' Helligkeitsmenue Flag löschen
Reset Lcd_backlight_flag ' Backlight Flag löschen
End If
End If
'____________________________________________________________________________
If Setup_flag = 1 Then
Gosub Setup
End If
Loop
End
'_______________________________________________________________________________
' Subroutinen ------------------------------------------------------------------
'###############################################################################
'_______________________________________________________________________________
' Setup ------------------------------------------------------------------------
Shutdown_from_raspberry:
Command_from_raspberry = 1
Shutdown_flag = 1
Shutdown_counter = 0
Led_flash_slow = 1
Return
Setup:
Flash_sequence = Autoboot * 70
If Setup_counter = 35 And Setup_counter_2 <= Flash_sequence Then
Toggle Status_led
Setup_counter = 0
End If
Flash_sequence = Flash_sequence + 100
If Setup_counter_2 = Flash_sequence Then
Setup_counter_2 = 0
Setup_counter = 0
End If
Return
'_______________________________________________________________________________
' Tastendruck auswerten --------------------------------------------------------
Key_manager:
'Betätigungsprüfung
If Taster = 0 Then
If Counts_released < 15 Then Incr Clicks 'Wiederholte Betätigung
If Counts_pressed < 1000 Then Incr Counts_pressed 'Betätigungsdauer
Counts_released = 20
Else
If Counts_released <> 0 Then Decr Counts_released 'Keine Betätigung mehr
Counts_pressed = 0
End If
'Auswertung
If Counts_pressed = 500 Then 'langer Tastendruck
Key_state = Key_long_pressed
Clicks = 0
Counts_pressed = 1000
End If
If Counts_released = 0 Then
Select Case Clicks
Case 0 : Key_state = Key_not_pressed
Case 1 : Key_state = Key_single_klick
Case 2 : Key_state = Key_double_klick
Case 3 : Key_state = Key_tripple_klick
End Select
Clicks = 0
End If
'Ergebnis
If Old_key_state <> Key_state Then
Old_key_state = Key_state
Key_event = True
Else
Key_event = False
End If
Return
'_______________________________________________________________________________
'_______________________________________________________________________________
'Timer0 ------------------------------------------------------------------------
Tmr_isr:
Timer0 = 131 ' Timer preload (läuft alle 1ms über)
Incr Incr_timer0
Incr Incr_brightness_timer0
'_________________________________________________________________________
'Lcd Hintergrundbeleuchtung ein/aus-blenden-------------------------------
If Incr_brightness_timer0 > 14 Then ' Wird alle 15ms aufgerufen
'______________________________________________________________________
'FadeIn----------------------------------------------------------------
If Lcd_brightness_fadein_flag = 1 Then
If Lcd_fade_counter < Lcd_brightness Then
Incr Lcd_fade_counter
Else
Lcd_brightness_fadein_flag = 0
End If
End If
'______________________________________________________________________
'FadeOut---------------------------------------------------------------
If Lcd_brightness_fadeout_flag = 1 Then
If Lcd_fade_counter > 0 Then
Decr Lcd_fade_counter
Else
Lcd_brightness_fadeout_flag = 0
End If
End If
'______________________________________________________________________
'Zaehler zurücksetzen--------------------------------------------------
Incr_brightness_timer0 = 0
End If
'_________________________________________________________________________
'-------------------------------------------------------------------------
'_________________________________________________________________________
'Timer 10ms---------------------------------------------------------------
If Incr_timer0 > 9 Then ' Wird alle 10ms aufgerufen
'____________________________________________________________________
'Flag für Taster-----------------------------------------------------
Tmr_event_1 = True
'____________________________________________________________________
'Status Led langsam blinken lassen-----------------------------------
If Led_flash_slow = 1 Then ' Led langsam blinken lassen
Incr Led_flash
If Led_flash >= 50 Then ' Led im 50 x 10ms (500ms) takt blinken lassen
Toggle Status_led ' Led Port toggeln
Led_flash = 0 ' Counter zurücksetzen
End If
End If
'____________________________________________________________________
'Status Led schnell blinken lassen-----------------------------------
If Led_flash_fast = 1 Then ' Led schnell blinken lassen
Incr Led_flash
If Led_flash >= 35 Then ' Led im 35 x 10ms (350ms) takt blinken lassen
Toggle Status_led ' Led port toggeln
Led_flash = 0 ' Counter zurücksetzen
End If
End If
'____________________________________________________________________
'Bei Tastendruck für Hintergrundbeleuchtung wird der Counter erhöht--
If Lcd_backlight_flag = 1 Then ' Lcd Flag
Incr Lcd_counter
End If
'____________________________________________________________________
'Bei Bootvorgang wird der Counter erhöht-----------------------------
If Boot_flag = 1 Then ' Boot Flag
Incr Boot_counter
End If
'____________________________________________________________________
'Bei Shutdown wird der Counter erhöht--------------------------------
If Shutdown_flag = 1 Then ' Shutdown Flag
Incr Shutdown_counter
End If
'____________________________________________________________________
'Im Setup Menue wird der Counter erhöht------------------------------
If Setup_flag = 1 Then 'Setup Flag
Incr Setup_counter
Incr Setup_counter_2
End If
'____________________________________________________________________
'Counter zuruecksetzen-----------------------------------------------
Incr_timer0 = 0
'____________________________________________________________________
End If
'_________________________________________________________________________
Return
'_______________________________________________________________________________
'_______________________________________________________________________________
' Timer1 interrupt -------------------------------------------------------------
Isr_timer1: ' Timer für Software PWM
Timer1 = 205
Incr Lcd_brightness_counter
If Lcd_brightness_counter = 50 Then
Lcd_brightness_counter = 0
End If
If Lcd_brightness_counter < Lcd_fade_counter Then
Lcd_backlight = Lcd_backlight_on
Else
Lcd_backlight = Lcd_backlight_off
End If
Return
'_______________________________________________________________________________