Quellcode Teil 2 ...
und nun der Rest mit den SUBs hinter der Hauptroutine ...
CodeBox BASCOM
' ============================================
' ===== Sub fuer DS18S20 Messung starten =====
' ============================================
Ds18s20_mess:
' ===== Befehlsbytes =====
' SEARCH ROM [F0h]
' READ ROM [33h]
' MATCH ROM [55h]
' SKIP ROM [CCh]
' ALARM SEARCH [ECh]
' CONVERT T [44h]
' WRITE SCRATCHPAD [4Eh]
' READ SCRATCHPAD [BEh]
' COPY SCRATCHPAD [48h]
' RECALL E2 [B8h]
' READ POWER SUPPLY [B4h]
1wreset ' 1Wire-Bus zuruecksetzen
1wwrite &HCC ' Alle 1Wire-Devices ansprechen
1wwrite &H44 ' Temperaturmessung starten
Return
' ================================================
' ===== Sub fuer DS18S20 Temperatur einlesen =====
' ================================================
Ds18s20_temp:
' ===== Scratchpad =====
' 1. Byte 0 - Temperature LSB
' 2. Byte 1 - Temperature MSB
' 3. Byte 2 - TH Register or User Byte 1 <-> TH Register or User Byte 1
' 4. Byte 3 - TL Register or User Byte 2 <-> TL Register or User Byte 2
' 5. Byte 4 - Reserved (FFh)
' 6. Byte 5 - Reserved (FFh)
' 7. Byte 6 - COUNT REMAIN
' 8. Byte 7 - COUNT PER deg
' 9. Byte 8 - CRC8
' ===== Seriennummer / ROM-Code =====
' 8-BIT CRC , 48-BIT SERIAL NUMBER , 8-BIT FAMILY CODE (10h)
' ===== Temperaturberechnung =====
' After reading the scratchpad, the TEMP_READ value is obtained
' by truncating the 0.5°C bit (bit 0) from the temperature data
' TEMPERATURE = TEMP_READ - 0,25 + ( COUNT_PER_C - COUNT_REMAIN ) / COUNT_PER_C
'
1wreset ' 1Wire-Bus zuruecksetzen
1wwrite &HCC ' Alle 1Wire-Devices ansprechen
1wwrite &HBE ' Scratchpad einlesen
For Count = 1 To 9 ' alle 9 Bytes bearbeiten
Ds18s20(count) = 1wread() ' Scratchpad in Array uebertragen
' Print #1 , Count ; " - " ; Ds18s20(count) ' Zeile uebrig vom Testbetrieb
Next
If Ds18s20(9) = Crc8(ds18s20(1) , 8) Then ' Wenn CRC8 korrekt dann Berechnung starten
Ds_temp = Makeint(ds18s20(1) , Ds18s20(2)) ' LSB und MSB zu 16Bit-Integer zusammensetzen
' ===== Ab hier eine genaue Berechnung =====
' Shift Ds_temp , Right , 1 ' durch 2 teilen
' If Ds_temp.14 = 1 Then Ds_temp.15 = 1 ' Vorzeichen wieder herstellen (2er Komplement)
' Ds_count = Ds18s20(8) - Ds18s20(7) ' Formelteil ... ( COUNT_PER_C - COUNT_REMAIN )
' Temperatur = Ds_count / Ds18s20(8) ' Formelteil ... / COUNT_PER_C
' Temperatur = Temperatur + Ds_temp ' Der Rest der Formel
' Temperatur = Temperatur - .25 ' Der Rest der Formel
' ===== oder eine Berechnung auf 0,5 Grad genau =====
Temperatur = Ds_temp / 2 ' Nachkommateil erzeugen
' Print #1 , "Temperatur : " ; Temperatur ; "deg" ' Zeile uebrig vom Testbetrieb
Else
Print #1 , "DS18S20 Messfehler" ' Die CRC8-Checksumme hat nicht gepasst
End If
Return
' ===============================
' ===== Eingaenge abscannen =====
' ===============================
Reedscan:
' PD.7 , 6 , 5 , 4 => Ausgaenge zu den Dioden
' PB.5 , 4 , 3 => Eingaenge mit PullUps
'
' Reeds sind bei geschlossenen Tueren geschlossen (Eingang = 0)
'
' Ausgaenge-> PortD.7 PortD.6 PortD.5 PortD.4
' ------- ------- ------- -------
' | | | |
' - - - -
' 3x 1k wegen ISP A A A A Dioden
' | | | |
' PINB.3 ---##1k##-------12-------11-------06-------05
' | | | |
' PINB.4 ---##1k##-------10-------09-------04-------03
' | | | |
' PINB.5 ---##1k##-------08-------07-------02-------01
'
Ddrb.3 = 0 ' Die Datenrichtung richtig zurückschalten
Ddrb.4 = 0 ' weil eventuell eine Signal-LED an war
Ddrb.5 = 0
Portb.3 = 1 ' Auch die internen PullUps aktivieren
Portb.4 = 1
Portb.5 = 1
Portd.4 = 0 ' Ports fuer die erste Aktion definieren
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1
Waitms 1 ' Ports beruhigen lassen
Reed_tmp = Pinb ' Einlesen
Shift Reed_tmp , Right , 3 ' Bits 5-3 auf 2-0 schieben (3 Positionen nach rechts)
Reed_in1 = Reed_tmp Or &B1111_1000 ' geschlossene Reeds als 0 uebrig lassen
Portd.4 = 1 ' Ports fuer die naechste Aktion definieren
Portd.5 = 0
Waitms 1 ' Ports beruhigen lassen
Reed_tmp = Pinb Or &B1100_0111 ' Einlesen und geschlossene Reeds als 0 uebrig lassen
Reed_in1 = Reed_in1 And Reed_tmp ' die ersten 3 Reeds mit den naechsten zusammenfuegen
' === die ersten 3 Stecker mit 6 Reeds sind fertig. Nun die naechsten 3 Stecker mit 6 Reeds einlesen
Portd.5 = 1 ' Ports fuer die naechste Aktion definieren
Portd.6 = 0
Waitms 1 ' Ports beruhigen lassen
Reed_tmp = Pinb ' Einlesen
Shift Reed_tmp , Right , 3 ' Bits 5-3 auf 2-0 schieben (3 Positionen nach rechts) ' Bits 5-3 auf 2-0 schieben (3 Positionen nach rechts)
Reed_in2 = Reed_tmp Or &B1111_1000 ' geschlossene Reeds als 0 uebrig lassen
Portd.6 = 1 ' Ports fuer die naechste Aktion definieren
Portd.7 = 0
Waitms 1 ' Ports beruhigen lassen
Reed_tmp = Pinb Or &B1100_0111 ' Einlesen und geschlossene Reeds als 0 uebrig lassen
Reed_in2 = Reed_in2 And Reed_tmp ' die ersten 3 Reeds mit den naechsten zusammenfuegen
Portd.7 = 1 ' alle PortBits wieder auf 1
' Change Eingang
' ---xor-- ---in---
' v v Reed geschlossen = 0
' 00000000 11111111
' 00010000 11101111 geaendert auf zu
' 00000000 11101111 ist jetzt zu
' 00010000 11111111 geaendert auf offen
' 00000000 11111111 ist jetzt offen
' 654321 654321
Reed_ch1 = Reed_in1 Xor Reed_in1_alt ' Bit bei Aenderung = 1 sonst 0
Reed_tmp = Reed_in1 Or Reed_ch1 ' Prellen (Aenderung wegen XOR auf 1) als Offen hinzufuegen
Reed_open1 = Reed_tmp And &B0011_1111 ' alle anderen Bits auf 0 setzen
Reed_ch2 = Reed_in2 Xor Reed_in2_alt ' Bit bei Aenderung = 1 sonst 0
Reed_tmp = Reed_in2 Or Reed_ch2 ' Prellen (Aenderung wegen XOR auf 1) als Offen hinzufuegen
Reed_open2 = Reed_tmp And &B0011_1111 ' alle anderen Bits auf 0 setzen
' Reed_open1 --> -- -- 02 04 06 01 03 05
' Reed_open2 --> -- -- 08 10 12 07 09 11
If Reed_in1_alt <> Reed_in1 Then ' Wenn sich was geaendert hat moechte ich eine Debug-Meldung
Print #1 , "-- -- 02 04 06 01 03 05 : " ; Bin(reed_open1) ; " " ; Bin(reed_ch1)
End If
If Reed_in2_alt <> Reed_in2 Then
Print #1 , "-- -- 08 10 12 07 09 11 : " ; Bin(reed_open2) ; " " ; Bin(reed_ch2)
End If
Reed_in1_alt = Reed_in1 ' Fuer naechsten Durchlauf sichern
Reed_in2_alt = Reed_in2 ' um Aenderungen erkennen zu koennen
Return
' =================================
' ===== Signal-LED anschalten =====
' =================================
Sigled_on:
' Durch die Entkopplungswiderstaende die eigentlich fuer den ISP-Port da sind
' kann selbst bei einem Programmierfehler und geschlossenem Reed-Kontakt kein
' Port-Treiber auf Kurzschluss fahren. Und die LED hat auch gleich einen
' Vorwiderstand ...
' Durchlass-Spannnug einer roten LED = 1,3V
' Durchlass-Spannung der Diode (1N4148) = 0,65V
' Spannungsdifferenz zwischen High und Low Ausgangspegel = ca. 4,2V
' das macht ... 4,2V - 1,3V - 0,65V = 2,25V
' mit einem 1k Widerstand ... 2,25V / 1k = 2,25mA durch die LED
' es sollten also superhelle LEDs verwendet werden.
'
' Ausgaenge-> PortD.7 PortD.6 PortD.5 PortD.4
' ------- ------- ------- -------
' | | | |
' - - - -
' 3x 1k wegen ISP A A A A Dioden
' | | | |
' PINB.3 ---##1k##-------12-------11-------06-------05
' | | | |
' PINB.4 ---##1k##-------10-------09-------04-------03
' | | | |
' PINB.5 ---##1k##-------08-------07-------02-------01
'
' LED an Matrixposition 10 anschalten
Portd.7 = 0 ' PortD.7 auf GND damit die Diode durchschaltet
Ddrb.4 = 1 ' Signalrichtung von PortB.4 auf Ausgang setzen
Portb.4 = 1 ' PortB.4 auf Vcc damit die LED an Position 10 leuchtet
Return
' ==================================
' ===== Signal-LED ausschalten =====
' ==================================
Sigled_off:
' LED an Matrixposition 10 ausschalten => gleichen Spannungspegel an PD.7 und PB.4 herstellen (beide auf Vcc)
Portd.7 = 1 ' PortD.7 auf Vcc
Ddrb.4 = 0 ' Signalrichtung von PortB.4 auf Eingang setzen
Portb.4 = 1 ' PullUp bei PinB.4 einschalten
Return
' ###############################################
' ##### Programm Ende ###########################
' ###############################################
End
Und hier nochmal in voller Schönheit zum Download ...
Anhang anzeigen Kleiderschrankbeleuchtung_110118.bas
Flash-Füllung liegt jetzt bei 40%
Vorausgesetzt es sind keine Fehler mehr drin dann ist das einzige was sich
jetzt noch ändert die Zuordnung der Reed-Kontakte zu den SolidStates.
Ich werde aber die nächsten Tage noch die Signal-LED und die Notabschaltung
testen in dem ich die Temperaturschwellen auf 34°C und 32°C setze.
Die Innentemperatur liegt jetzt immer noch bei 31,0°C
EDIT: Die Diodenmatrix sieht nicht ganz so aus wie im Programmtext.
Das Schaltbild ist hier das, was entscheidet. Es wird pro Reed-Kontakt
eine Diode verwendet. Das Prinzip ist aber vergleichbar. Nur das ich mit
den zusätzlichen Dioden "Phantom-Schalter" unterdrücke. Wer wissen will
was "Phantom-Schalter" sind der möge hier im Projekt-Bereich nach meinem
Mini-ASCII-Terminal mit Tiny2313 suchen und nachlesen.
EDIT: knapp 19:00 und die Temperatur pendelt sich so auf 31,0...31,5°C ein.
Das scheint die normale Arbeitstemperatur zu sein. Außen am Gehäuse fühlt
man keine Erwärmung. Scheint auf Zimmertemperatur zu sein. Also das
"Thermal Management"
scheint soweit OK zu sein
EDIT2: OK es ist jetzt 20:15 und ich hab vergessen das Ding abzuschalten
Die Temperatur liegt jetzt bei 30,0°C ... jetzt werd ich es erstmal vom Strom
nehmen
Gruß
Dino