@Schwabe
Die v3 Platine besitzt einen eigenen Mikrocontroller (Attiny45) welcher den Shutdown regelt. Die v2 Software unterstützt diese Funktion.
Falls du mit einer Zusatzplatine die Funktion nachrüsten willst bei der Hardwareversion 2 dann musst du dir die Shutdownschaltung nachbauen:
Über den ISP Anschluß kannst du den Mikrocontroller Programmieren.
Hier der source code:
Fuses auf:
Low Fuse 0xE2
High Fuse 0xDC
Lg
Die v3 Platine besitzt einen eigenen Mikrocontroller (Attiny45) welcher den Shutdown regelt. Die v2 Software unterstützt diese Funktion.
Falls du mit einer Zusatzplatine die Funktion nachrüsten willst bei der Hardwareversion 2 dann musst du dir die Shutdownschaltung nachbauen:
Über den ISP Anschluß kannst du den Mikrocontroller Programmieren.
Hier der source code:
Code:
'-------------------------------------------------------------------------------
'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
'_______________________________________________________________________________
Fuses auf:
Low Fuse 0xE2
High Fuse 0xDC
Lg