Temperaturüberwachung

Hallo Zusammen,
habe mir eine Temperaturüberwachung für meine CNC gemacht, basis ist ein Atmel Atmega 16.
Es gibt eine Schwellwert der je einen Lüfter für jeden Kanal xyz Schaltet zudem gibt es noch eine Übertempersschutz.
Und ein Life BIT. Ausgegen wird es auf ein 20 x 4 LCD.
Die Temp Sensoren sind 1 wire DS18B20 mit Drahtbrucherkennung.
Bin gerade noch am Layout dran.
Falls jemand Lust hat es nachzubauen,gerne hatte ja ach viel Hilfe beim Programmieren , da ich nicht der Programmierer Profi bin.

Anbei mal das Video

Und der Quellcode mit bascom geschrieben
Code:
 $regfile = "m16adef.dat"
$crystal = 4000000
$hwstack = 128
$framesize = 128
$swstack = 128

Config Lcd = 20 * 4
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5


Config Portd.6 = Output                                     'LED Kabelbruch verknüpft mit Variable W
Config Portc.0 = Output                                     ' Lüfter controller X
Config Portc.1 = Output                                     ' Lüfter controller Y
Config Portc.2 = Output                                     ' Lüfter controller Z
Config Porta.0 = Output                                     ' Variable W
Config Porta.1 = Output                                     ' Overheat

Config Timer1 = Timer , Prescale = 256
On Timer1 Timer1_isr

Enable Timer1
Enable Interrupts
Const Timerstartwert = 49911                                '1/4s
Timer1 = Timerstartwert

Config 1wire = Portd.7                                      '1 -wire Definieren

Dim Blinken As Byte
Dim Bly As Bit
Dim Dsid1(8) As Byte                                        'Arry für 1-Wire SN Messwerte Sensor 1  Wert 40 (Family-Code &28)
Dim Dsid2(8) As Byte                                        'Arry für 1-Wire SN Messwerte Sensor 2  Wert 40 (Family-Code &28)
Dim Dsid3(8) As Byte                                        'Arry für 1-Wire SN Messwerte Sensor 3  Wert 40 (Family-Code &28)
Dim Sc(9) As Byte                                           'scratchedpad (daten)
Dim I As Byte                                               'Variablen zur Messung
Dim Z As Byte
Dim W As Word                                               'Variable für Erkennung der Sensor die am Bus hängen
Dim Tl As Integer                                           'Umrechnungsvariablen
Dim Tm As Integer
Dim T(3) As Integer
Dim Tmil(3) As Integer
Dim Anzeigen As Bit

Dim Maxtemp As Integer                                      ' Einstellen des Schwellwert ( für alle 3 Controller)
Maxtemp = 21                                                ' Einstellen des Gewünschten Wertes


Dim Uebertemp As Integer                                    ' Abschaltung der Controller wegen Störung Übertemperatur
Uebertemp = 35                                               ' Einstellen des Gewünschten Wertes


Declare Sub Temper                                          'Unterprogramme deklarieren
Declare Sub Bdaten
Declare Sub Initial



Initlcd
Cursor Off
Deflcdchar 0 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32           ' Lüfterzeichen im lCD Display
Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32        ' Fakezeichen ohne Inhalt
Deflcdchar 2 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32           ' Lüfterzeichen im lCD Display
Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32        ' Fakezeichen ohne Inhalt
Cls
'_______________________________________________________________________________
'Programmstart


Initial                                                     ' Starte Unterprogramm Initial

Do                                                          'beginn Hauptschleife
   If Anzeigen = 1 Then
      Anzeigen = 0


   '____________________________________________________________________________
   'Schwellwert Einschalten Controller X
      If T(1) > Maxtemp Then
         Portc.0 = 1
      Else
         Portc.0 = 0
      End If
   '____________________________________________________________________________
   'Schwellwert Einschalten Controller  Y
      If T(2) > Maxtemp Then
         Portc.1 = 1
      Else
         Portc.1 = 0
      End If
   '____________________________________________________________________________
   'Schwellwert Einschalten Controller  Z
      If T(3) > Maxtemp Then
         Portc.2 = 1
      Else
         Portc.2 = 0
      End If
   '____________________________________________________________________________
    'Anzeige Symbol iM LCD Controller X
      Locate 2 , 20
      If T(1) > Maxtemp Then
         Lcd Chr(blinken)
      Else
          Lcd " "

      End If
   '____________________________________________________________________________
   'Anzeige Symbol iM LCD Controller Y
      Locate 3 , 20
      If T(2) > Maxtemp Then
         Lcd Chr(blinken)
      Else
          Lcd " "
      End If
   '____________________________________________________________________________
   'Anzeige Symbol iM LCD Controller Z
      Locate 4 , 20
      If T(3) > Maxtemp Then
         Lcd Chr(blinken)
      Else
          Lcd " "
      End If


   Incr Blinken
      If Blinken = 2 Then
         Blinken = 0                                        '2 * 1/4s, also 0,5s
         Temper
      End If


 Gosub Overheat
  '____________________________________________________________________________

End If
Loop



'###################################################################################################  #######
 'SUB OVERHEAT SUB OVERHEAT SUB OVERHEAT SUB OVERHEAT SUB OVERHEAT SUB OVERHEAT

Overheat:

   If T(1) > Uebertemp Or T(2) > Uebertemp Or T(3) > Uebertemp Then
   Porta.1 = 1
   End If
   If T(1) > Uebertemp Or T(2) > Uebertemp Or T(3) > Uebertemp Then


   Cls

   Locate 1 , 4
   Lcd " OVERHEAT !!"

   Locate 2 , 1
   Lcd " CHECK AND RESET!!"

    Stop
   End If                                                   'end program


 Return
' Ende SUB OVERHEAT Ende SUB OVERHEAT Ende SUB OVERHEAT Ende SUB OVERHEAT Ede SUB OVERHEAT
'###################################################################################################  #######

Timer1_isr:                                                 'Blinken

   Timer1 = Timerstartwert
   Set Anzeigen
   Toggle Portd.6


Return

'###################################################################################################  #######
'                                 Beginn Unterprogramm Temper
Sub Temper
   1wverify Dsid1(1)                                        'sensor auswählen
   If Dsid1(1) = 40 Then
      Call Bdaten                                           'Daten holen und umsetzen
   End If
   T(1) = T(z)
   Tmil(1) = Tmil(z)
   If W > 1 Then                                            '2ten temp rein
      1wverify Dsid2(1)                                     'Sensor auswählen
      If Dsid2(1) = 40 Then                                 'Daten holen und umsetzen
         Call Bdaten
      End If
      T(2) = T(z)
      Tmil(2) = Tmil(z)
      If W > 2 Then                                         '3ten temp rein
         1wverify Dsid3(1)                                  'Sensor auswählen
         If Dsid3(1) = 40 Then                              'Daten holen und umsetzen
            Call Bdaten
         End If
         T(3) = T(z)
         Tmil(3) = Tmil(z)
      End If
   End If
   1wreset                                                  'skip rom  &HCC
   1wwrite &HCC
   1wwrite &H44
   Cursor Off
   Locate 1 , 1
   Lcd "Controller XYZ Temp."                               'Ausgabe der Messwerte
   Locate 2 , 1                                             'Controller Achse X
   Lcd "Controller X"
   Locate 2 , 14
   Lcd T(1)
   Locate 2 , 16
   Lcd ","
   Locate 2 , 17
   Lcd Tmil(1)
   Locate 2 , 18
   Lcd "C"
   Locate 3 , 1                                             'Controller Achse Y
   Lcd "Controller Y"
   Locate 3 , 14
   Lcd T(2)
   Locate 3 , 16
   Lcd ","
   Locate 3 , 17
   Lcd Tmil(2)
   Locate 3 , 18
   Lcd "C"
   Locate 4 , 1                                             'Controller Achse Z
   Lcd "Controller Z"
   Locate 4 , 14
   Lcd T(3)
   Locate 4 , 16
   Lcd ","
   Locate 4 , 17
   Lcd Tmil(3)
   Locate 4 , 18
   Lcd "C"
End Sub
                                  ' Ende Unterprogramm Temper
'###################################################################################################  #######
                                  ' Starte Unterprogramm Bdaten

Sub Bdaten                                                  ' Auflösung 0,5°
   1wwrite &HBE
   Sc(1) = 1wread(9)
   If Sc(9) = Crc8(sc(1) , 8) Then
      Tl = Sc(1) And &B11110000                             '&B11110000
      Tm = Sc(2)
      T(z) = Makeint(tl , Tm)
      T(z) = T(z) / 16                                      ' T(z) = T(z) / 2
      Tmil(z) = Sc(1) And &B00001111                        '&B00001111
      Tmil(z) = Tmil(z) * 100                               'Tmil(z) = Tmil(z) * 5
      Tmil(z) = Tmil(z) / 160
   End If
End Sub
                              ' Ende Unterprogramm Bdaten
'###################################################################################################  #######
                              ' Starte Unterprogramm INITIAL
Sub Initial
   W = 1wirecount()
   Locate 1 , 1
   Lcd "Sensoren"
   Cls
   Dsid1(1) = 1wsearchfirst()
   Locate 1 , 1
   Lcd Dsid1(1)
   Waitms 500
   If W > 1 Then
      Dsid2(1) = 1wsearchnext()
      Locate 2 , 1
      Lcd Dsid2(1)
      Wait 1
   End If
   If W > 2 Then
      Dsid3(1) = 1wsearchnext()
      Locate 3 , 1
      Lcd Dsid3(1)
      Wait 1
   End If
   If W < 3 Then
      Cls
      Locate 1 , 5
      Lcd "Sensoren"
      Locate 2 , 5
      Lcd "pruefen"
      Wait 1
      If W < 3 Then
      Porta.0 = 1
      End If
      Stop
   End If
End Sub
                               ' Ende Unterprogramm INITIAL
'###################################################################################################  ###
 
Hi,

warum machst sowas nicht einfach in der Arduino-Welt?
Ist doch viel "einfacher", ohne Deine Leistung jetzt damit herabwürdigen zu wollen...

Was willst Du damit genau überwachen?

Grüße

Andreas
 
Mahlzeit Thomas!

Du scheinst Gedanken lesen zu können...! Genau das (oder so ähnlich) möchte ich an meinem aktuellen CNC-Eigenbau verwirklichen... :p
Bitte weiter Infos bereitstellen, bzw. näher erläutern...

@Andreas: Passt schon, oder weißt Du mittlerweile worum es geht...!

Gerhard
 
Hi,

warum machst sowas nicht einfach in der Arduino-Welt?
Ist doch viel "einfacher", ohne Deine Leistung jetzt damit herabwürdigen zu wollen...

Was willst Du damit genau überwachen?

Grüße

Andreas

Hallo Andreas,
ganz einfach weil Arduino in C geschrieben wird , und ich nicht eine weitere Hochsprache mir nicht antun möchte.
Ich finde bascom für den einstieg einfacher ,wenn mann hier überhaupt leicht sprechen kann, ich mal nicht.
Ich habe controller von mechapro diese haben einen großen Kühlkörper, darauf wird mein Sensor montiert,
zur Überwachung und ich kann bei einen Schwellwert einen Lüfter dazu schalten und bei Über Temperatur die Freigabe von den Controller nehmen
dazu habe ich mir diese Steuerung gemacht, zur Zeit bin noch am Layout dran.
Das schöne ist das mit den 1 Wire Sensoren die ich noch überwachen kann ( Drahtbruch) die Sensoren sind recht günstig ca. 2€ zudem das Display
ca. 10€ Atmel ca. 5-6 € und ein wenig Hühnerfutter.
Von den kosten recht überschaubar.

@gertilein was willst du noch wissen ???

Gruß Thomas
 
Naabend Thomas...

...würde gerne das Layout, bzw. Schaltplan übernehmen - muß das Rad ja nicht neu erfinden :D! Bin eigendlich mehr mit dem Arduino vertraut, wie programmiert du das Teil?

Gerhard
 
Naabend Thomas...

...würde gerne das Layout, bzw. Schaltplan übernehmen - muß das Rad ja nicht neu erfinden :D! Bin eigendlich mehr mit dem Arduino vertraut, wie programmiert du das Teil?

Gerhard

Hallo Gerhard,
ganz einfach lade dir Bascom die Demoversion runter geht glaube bis 4 KB Quellcode

http://mcselec.com/index.php?option=com_docman&task=cat_view&gid=73&Itemid=54

Datei neu Quellcode reinkopieren
aber schau mal hier mal
http://www.myavr.info/download/software/bascom/pjb_leichter-start-bascom_de.pdf

Am besten über ISP Programmieren.
ISP Programmer gibt es hier
http://www.ebay.de/itm/USBASP-USBIS...92?pt=LH_DefaultDomain_77&hash=item5b09afa160
oder ähnlich

Gruß Thomas

P.S Layout dauert noch ein wenig !!
Gruß Thomas
 
Da ich sowas in der Art auch noch irgendwann machen "muss", allerdings auf Arduino-basis, ein paar Ideen/Anregungen:

- Bei Übertemperatur akustisch/optisch Alarm auslösen und nach "Countdown" Maschine abschalten (Notaus)
- Lüfterüberwachung anhand der Drehzahl => Alarm wenn Lüfter ausfällt. ggf PWM-Regelung der Lüfter

Zu Deinen Programm noch ein paar Tipps, falls Du die nicht eh schon auf dem Zettel hast ;) :

-Baue ein Plausibilitätsprüfung der Messwerte ein. Nicht, dass ein Sensor verrückt spielt und deswegen die Maschinen stehenbleibt. Z.B. könntest Du über 10 Messungen mitteln und diesen Wert auswerten.

- Bei erreichen der Übertemperatur / Schwellwerte noch eine Art "Totband" einbauen, damit bei leicht schwankenden Temperaturen die Lüfter/der Alarm nicht ständig "an" und "aus" geht. Z.b. Alarm erst auslösen, wenn der Alarmwert 3 Sekunden überschritten wird. Bei den Lüftern eine Mindestlaufzeit von 30 Sekunden vorsehen...

- Taster für Manuell Lüfter an / Alarm-Reset

Welche Sensoren nimmst Du?

Grüße

Andreas
 
Hi,

die DS18B20 sind super Sensoren. Die nehme ich auch.:cool:
Vielleicht wäre es dann doch an der Zeit auf Arduino und C zu wechseln? ;) So schwer ist das wirklich nicht.

Ein kleines (gekürztes und vereinfachtes) Beispiel:
Code:
OneWire oneWire(2); // PIN definieren an dem der DS18B20 angeschlossen ist
DallasTemperature sensors(&oneWire); // Sensorobjekt erstellen

void setup(void)
{
  sensors.begin(); //Sensor "starten"
}

void loop(void)
{ 
  sensors.requestTemperatures(); //Temperaturmessung starten
  delay(1000); //Sekunde warten bis Messung im DS18B20 fertig
  float temp = sensors.getTempCByIndex(0); //Temperatur auslesen
}
 
Ansicht hell / dunkel umschalten
Oben Unten