|
Erste Version zur TemperaturmessungIm ersten Versuch messe ich eine Temperatur mit einem DS1820 und mache diese im Internet verfügbar. Zusätzlich gebe ich noch ein paar Statusinformationen über das LCD Display aus. $regfile = "m32def.dat" $crystal = 14318180 $baud = 19200 $hwstack = 128 $swstack = 64 $framesize = 200 ' Konstanten definieren Const Sock_stream = $01 Const Sock_dgram = $02 Const Sock_ipl_raw = $03 Const Sock_macl_raw = $04 Const Sel_control = 0 Const Sel_send = 1 Const Sel_recv = 2 Const Sock_closed = $00 Const Sock_arp = $01 Const Sock_listen = $02 Const Sock_synsent = $03 Const Sock_synsent_ack = $04 Const Sock_synrecv = $05 Const Sock_established = $06 Const Sock_close_wait = $07 Const Sock_last_ack = $08 Const Sock_fin_wait1 = $09 Const Sock_fin_wait2 = $0a Const Sock_closing = $0b Const Sock_time_wait = $0c Const Sock_reset = $0d Const Sock_init = $0e Const Sock_udp = $0f Const Sock_raw = $10 Declare Function Temperatur(byval Sc(9) As Byte) As Integer Declare Sub Allesekunde ' Timer für Software Uhr einstellen Config Timer2 = Timer , Prescale = 1024 Timer2 = 0 On Timer2 Timer2_isr Enable Timer2 Enable Interrupts Config Tcpip = Int0, Mac = 12.128.12.34.56.78, Ip = 192.168.0.200, Submask = 255.255.255.0,_ Gateway = 0.0.0.0, Localport = 1000, Tx = $55, Rx = $55, Twi = &H80, Clock = 400000 Config Lcdpin=Pin, Db4=Porta.4, Db5=Porta.5, Db6=Porta.6, Db7=Porta.7, E=Porta.3, Rs=Porta.2 Config Lcd = 16 * 2 Config Porta = Output Deflcdchar 1, 14, 10, 14, 32, 32, 32, 32, 32 ' Grad Zeichen Cls Lcd "IP 192.168.0.200" ' Eigene IP beim Einschalten Wait 1 ' für 1s zeigen Cls ' Pin für 1wire Port festlegen (abhängig von der Hardware) Config 1wire = Portb.4 Config Watchdog = 2048 ' Reset nach 2 Sekunden Start Watchdog Dim Sc(9) As Byte 'Scratchpad DS18b20 ' Benötigte Variablen Dim S As String * 255 Dim Tempw As Word , Sheader As String * 30 Dim I As Byte , Bcmd As Byte Dim Wsize As Word Dim Ipcon As Long Dim Rms As Byte , Rs As Byte , Rm As Byte , Rh As Byte , Rd As Word Rms = 0 : Rs = 0 : Rm = 0 : Rh = 0 : Rd = 0 Dim Ta As Integer Ta = 0 Dim Tstr As String * 10 Tstr = "" Dim Flag As Bit Dim Wechsel As Bit I = 0 Do Reset Watchdog If Flag <> 0 Then Flag = 0 Call Allesekunde ' Alle eine Sekunde ausführen End If Tempw = Socketstat(i , 0) Reset Watchdog Select Case Tempw Case Sock_established ' Verbindung besteht Tempw = Socketstat(i , Sel_recv) ' Anzahl der Bytes im Empfangspuffer Ipcon = Getdstip(i) ' IP-Adresse des Clients Locate 2 , 1 : Lcd Ip2str(ipcon) ; " " ' Clientadresse auf LCD ausgeben If Tempw > 0 Then ' Wenn Bytes empfangen wurden Bcmd = 0 ' Flag löschen Locate 2 , 16 : Lcd "0" Do Tempw = Tcpread(i , S) ' einlesen einer Zeile in die Stringvariable S If Left(s , 3) = "GET" Then ' wenn die Zeile mit GET beginnt Bcmd = 1 ' Flag setzen für Seite senden, keine Auswertung welche Locate 2 , 16 : Lcd "1" End If Loop Until S = "" ' solange fortestzen bis alles gelesen wurde If Bcmd = 1 Then ' ist Flag gesetzt Seite senden S="<html><head></head><body style='border:0px solid #000000;background-color:#C0C0C0;'>"_ +"<p><b>MCS EasyTWI Webserver<br></b>Temperatur in 01796 "_ +"Pirna : " + Tstr + " °C</p><br><!--" + Tstr + "--></body></html>" Wsize = Len(s) ' S2 = "HTTP/1.0 200 OK{013}{010}" ' Tempw = Tcpwritestr(i , S2 , 255) Sheader = "Content-Length: " + Str(wsize) + "{013}{010}" Tempw = Tcpwrite(i , "HTTP/1.0 200 OK{013}{010}") Tempw = Tcpwritestr(i , Sheader , 255) Locate 2 , 16 : Lcd "2" Tempw = Tcpwrite(i , S , Wsize) End If Closesocket I ' Socket schließen End If Closesocket I Case Sock_close_wait ' warten auf schließen der Verbindung Closesocket I Case Sock_closed ' Verbindung ist geschlossen (keine Verbindung mehr) ' Erstellen eines Sockets mit Port 80 I = Getsocket(0 , Sock_stream , 80 , 0) ' Öffnet den Socket im server listen mode (wartet auf eine Anfrage an Port 80) Socketlisten I End Select Loop End Sub Allesekunde ' Temperatur messen 1wreset 1wwrite &HCC ' alle angeschlossenen DS1820 1wwrite &H44 ' messen Waitus 200 : Waitus 200 : Waitus 200 : Waitus 200 ' warten bis Messung fertig 1wreset ' alle DS1820 !!! Hier muss selectiert werden falls mehr als ein Sensor angeschlossen ist 1wwrite &HCC 1wwrite &HBE ' Scratchpad lesen Sc(1) = 1wread(9) ' auslesen If Sc(9) = Crc8(sc(1) , 8) Then ' wenn Werte korrekt Ta = Temperatur(sc(1)) ' Temperatur berechnen Tstr = Format(str(ta) , "+00.0") ' für Ausgabe formatieren End If S = Format(str(rd) , "000") + "d" + Format(str(rh) , "00") Wechsel = Not Wechsel ' Doppelpunkt im Display blinken lassen If Wechsel = 0 Then S = S + ":" Else S = S + " " S = S + Format(str(rm) , "00") + Tstr + Chr(1) + "C " Locate 1 , 1 ' Ausgabe auf LCD Display Laufzeit und Temperatur Lcd S End Sub Function Temperatur(byval Sc(9) As Byte) ' Übergabe Scratchpad des DS1820, DS18S20 Dim Tmp As Byte, T As Integer, T1 As Integer ' Rückgabe (integer) = Temperatur * 10 Tmp = Sc(1) And 1 ' Auflösung 0.1C If Tmp = 1 Then Decr Sc(1) T = Makeint(sc(1) , Sc(2)) T = T * 50 T = T - 25 T1 = Sc(8) - Sc(7) T1 = T1 * 100 T1 = T1 / Sc(8) T = T + T1 Temperatur = T / 10 End Function ' Uhr Rs=Sekunden, Rm=Minuten, Rh=Stunden, Rd=Tage ' Der Sinn ist nur um zu erkennen wie lange der Server durchläuft ' und wenn eventuell ein (Watchdog)Reset erfolgt ist Timer2_isr: Incr Rms If Rms > 55 Then Rms = 0 Flag = 1 Incr Rs If Rs > 59 Then Rs = 0 Incr Rm If Rm > 59 Then Rm = 0 Incr Rh If Rh > 23 Then Rh = 0 Incr Rd End If End If End If End If Return Den EasyTWI Webserver frage ich dann von meinem "normalen Webspace" mit PHP ab und das sieht dann so aus:
...
$html=implode('',file('http://meinname.selfip.com/'));
if(preg_match('|\<!\-\-([\+\-]*[0-9\.]*)\-\-\>|',$html,$ergebnis)){
$temperatur=$ergebnis[1];
}
...
Es wird also nach einer Zahl, die in einem HTML Kommentar eingeschlossen ist, gesucht. Ich habe das so gemacht damit ich die Seite im HTML frei gestalten kann ohne etwas an der Übergabe der Temperaturwerte ändern zu müssen.
© 04.12.2007 Hans-Jürgen Jacob (Pirna)
[www.jacob-pirna.de] [www.familiejacob.de] [www.jacobpirna.de] [www.pirnaer.de] [www.derkleinegarten.de] [www.meinsachsen.net] |
|