Mikrocontroller Startseite >> [AVR Webserver] >> [ISA Ctrl] [EasyTWI] [Etherrape] [NGW100] >> Grundlagen Internet zu Hause über DSLDemo Server


Erste Version zur Temperaturmessung

DownloadDownload

Im 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.

Mehr InformationInformationen wie ich meine IP Adresse zuhause erreiche gibt es hier


[Impressum] [Kontakt] [Links] [Home]
© 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]