Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Mikroprocesorowy dwupunktowy termostat- atmega8

00gtw00 12 Feb 2009 13:04 11558 12
IGE-XAO
  • #1
    00gtw00
    Level 15  
    Idea:
    Urządzenie ma za zadanie sterować przekaźnikami które będą załączać i wyłączać grzałki w zależności od temperatury w obudowie. Temperatura będzie wyświetlana na wyświetlaczu zgodnym z HD44780 2x16. Jeden termometr DS18S20 wew. obudowy drugi na zewnątrz i temperatury wyświetlane na wyświetlaczu. Dwa przekaźniki obsługują dwie grzałki i dwa wentylatory, a jeden urządzenie które nie dostanie prądu jeżeli wnętrze wyziębi się do 0°C lub mniej i zezwoli na uruchomienie dopiero jak temp. wróci do co najmniej 1°C jednak obudowę będzie podgrzewać do osiągnięcia temp. 5°C. W przedziale od 5°C - 40°C grzałki i wentylatory są wyłączone. Od 41°C załączają się wentylatory. Konkretnie ma być wykorzystane w maszynie CNC, która pracuje na nieogrzewanej hali, a jak powszechnie wiadomo elektronika nie lubi temperatur ujemnych, szczególnie dysk twardy. Zastosowania może być wiele, np. do access pointów na strychu, karmika dla ptaków :D a przy grzałce dużej mocy nawet i budy dla psa (nie jestem zwolennikiem trzymania psa na dworze cały rok !!) Kod źródłowy w Bascomie 1.11.8.1. Napisany bardo łopatologicznie, ale taki ma właśnie być, żeby każdy mógł go łatwo dostosować do swoich potrzeb!

    Płyta "główna":
    Mikroprocesorowy dwupunktowy termostat- atmega8
    Mikroprocesorowy dwupunktowy termostat- atmega8

    Płyta z przekaźnikami:
    Mikroprocesorowy dwupunktowy termostat- atmega8
    Mikroprocesorowy dwupunktowy termostat- atmega8

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000
    Config Portc = Output
    Reset Portc.2
    Reset Portc.1
    Reset Portc.0
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.3 , Db6 = Portd.7 , Db7 = Portd.6 , E = Portb.0 , Rs = Portb.1
    Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            ' znak stopnia celcjusza
    Deflcdchar 1 , 12 , 4 , 4 , 6 , 12 , 4 , 14 , 32            ' 'litera "ł"
    Cursor Off Noblink
    Cursor Noblink
    Cls
    Config 1wire = Portd.2


    Dim I As Byte
    Dim T(2) As Byte
    Dim Y(2) As Byte
    Dim Temp1 As Single
    Dim Temp2 As Single
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim L As Bit
    Dim Odczyt As Byte

    '=======================================Bajery na LCD==========================
    Lcd "Uruchamianie ..."
    Locate 2 , 1
    Lcd "["
    Locate 2 , 16
    Lcd "]"
    For I = 2 To 15
    Locate 2 , I
    Waitms 200
    Lcd "="
    Next I
    Waitms 500

    Cls
    Locate 1 , 17
    Lcd "xxxxxxxxxxxxxxxx" 'cos na powitanie, linia 1
    Locate 2 , 19
    Lcd "xxxxxxxxxxxx" ' cos na powitanie, linia 2
    For I = 0 To 31
    Shiftlcd Left
    Waitms 200
    If I = 15 Then Waitms 1800
    Next I
    Cls

    Dsid1(1) = 1wsearchfirst()
    Dsid2(1) = 1wsearchnext()
    '===Główny program==========================
    Do
    Poczatek:
     1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       T(1) = 1wread()
       T(2) = 1wread()

       1wreset
       1wwrite &H55
       1wverify Dsid2(1)
       1wwrite &HBE
       Y(1) = 1wread()
       Y(2) = 1wread()

    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750
    If Odczyt < 7 Then
       Incr Odczyt
       Cls
       Locate 1 , 1
       Lcd "Trwa odczyt temp"
       Locate 2 , 16
       Lcd "]"
       Locate 2 , 1
       Lcd "["
       For I = 1 To Odczyt
           Lcd "=="
       Next I
      Gosub Poczatek
    Else
      Cls
      If T(2) = 0 Then
      Temp1 = T(1) / 2
      Else
      I = 256 - T(1)
      End If

      If T(2) > 0 Then
       Locate 1 , 4
       Lcd "-"
      End If
     '**************************
      If Y(2) = 0 Then
      Temp2 = Y(1) / 2
      Else
      I = 256 - Y(1)
      End If

      If Y(2) > 0 Then
       Locate 2 , 4
       Lcd "-"
      End If

    Cls

    If Temp1 > 4 And Temp1 < 41 Then
       Locate 1 , 1
       Lcd "Komputer: " ; Temp1 ; Chr(0) ; "C"
       Locate 2 , 4
       Lcd "Hala: " ; Temp2 ; Chr(0) ; "C"
       Set Portc.2                                              'Komp włączony
       Reset Portc.0                                            'Grzałki wyłączone
       Reset Portc.1                                           'Wentylatory wyłaczone
    End If

    If Temp1 < 1 Then
       If L = 0 Then
          Locate 1 , 1
          Lcd "Komputer: " ; Temp1 ; Chr(0) ; "C"
          Locate 2 , 2
          Lcd "Za niska temp."
          L = 1
       Else
          Locate 1 , 1
          Lcd "Komputer: " ; Temp1 ; Chr(0) ; "C"
          Locate 2 , 5
          Lcd "Grzanie!"
          L = 0
       End If
    Reset Portc.2                                               'Komp wyłączony
    Set Portc.0                                                 'Grzałki włączone
    Reset Portc.1                                              'Wentylatory wyłaczone
    End If

    If Temp1 < 5 And Temp1 > 0 Then
        If L = 0 Then
          Locate 1 , 1
          Lcd "Komputer: " ; Temp1 ; Chr(0) ; "C"
          Locate 2 , 4
          Lcd "Hala: " ; Temp2 ; Chr(0) ; "C"
          L = 1
        Else
          Locate 1 , 1
          Lcd "Komputer: " ; Temp1 ; Chr(0) ; "C"
          Locate 2 , 5
          Lcd "Grzanie!"
          L = 0
        End If
    Set Portc.2                                                 'Komp włączony
    Set Portc.0                                                 'Grzałki włączone
    Reset Portc.1                                              'Wentylatory wyłaczone
    End If

    If Temp1 > 40 Then
        If L = 0 Then
          Locate 1 , 1
          Lcd "Komputer: " ; Temp1 ; Chr(0) ; "C"
          Locate 2 , 4
          Lcd "Hala: " ; Temp2 ; Chr(0) ; "C"
          L = 1
        Else
          Locate 1 , 1
          Lcd "Komputer: " ; Temp1 ; Chr(0) ; "C"
          Locate 2 , 3
          Lcd "Wych" ; Chr(1) ; "adzanie"
          L = 0
        End If
    Set Portc.2                                                 'Komp włączony
    Reset Portc.0                                               'Grzałki wyłączone
    Set Portc.1                                                 'Wentylatory właczone
    End If
    End If
    Loop
    End



    W załączniku schemat i płytka zaprojektowana w eaglu 4.16. Wyświetlacz LCD powinien być przylutowany do płytki w odpowiedniej odległości, tak aby zmieściły sie elementy znajdujące sie pod nim, między innymi złącze "ISP". Przed wydrukowaniem należy włączyć funkcję "Ratsnet" w celu uwidocznienia całości masy. Podziękowania dla użytkownika "Bonkot" za stworzenie płytki "głównej".
  • IGE-XAO
  • #3
    00gtw00
    Level 15  
    Dzięki za podpowiedź :) Dam 1n4004 do każdego z przekaźników. Jak reszta? Czekam na uwagi.

    Mikroprocesorowy dwupunktowy termostat- atmega8
  • IGE-XAO
  • #4
    lubik00
    Level 15  
    Witam
    Zastanawiam się nad zasilaniem twojego urządzenia wszystko działa na 5v
    schemacie masz LM na 12V i na 5V czy zamierzasz coś dodatkowo podłączyć pod 12V??
  • #5
    00gtw00
    Level 15  
    Mikroprocesor, wyświetlacz, termometry działają na 5V natomiast przekaźniki na 12V i dodatkowo z tego napięcia będzie zasilany Access Point.
  • #6
    User removed account
    User removed account  
  • #7
    paroh
    Level 11  
    Hi 00gtw00,


    Thank for your project. When I build it and the code was converted it doesn' work. I don't know why. I convert the bas file with the Bascom. I'm beginner in this things. When I try convert the bas file I have to configure a few things.
    For example:
    Chip: m8.dat
    Output: Binary file hex file
    Communication: baud: 9600 freq:8000000
    1Wire: PORTD 2
    LCD: 4bit, pin mode, enable, RS7, RS6, RS5, RS4

    Then the code is ready.(bin and hex file)
    But isn't work it. I saw the pin of lcd on the schematic and the code and it isn't same. Is it possibility?

    code:

    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.3 , Db6 = Portd.7 , Db7 = Portd.6 , E = Portb.0 , Rs = Portb.1

    schematic: lcd pin: Db4 = Portd.3 , Db5 = Portd.4 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.0 , Rs = none ? RW=Portb.1

    The project is very good and please convert the file bin and hex.

    Thanks and regards
  • #8
    00gtw00
    Level 15  
    R/W must be short to ground
    RS to PIN B.1
  • #9
    paroh
    Level 11  
    Thanks for your fast answer. I try it again but isn't work.
    Do I have to rewrite the lcd pin in the bas code?

    regards
  • #10
    00gtw00
    Level 15  
    What you see on lcd? Nothing? Check CONTR, good value is near to 3k3.

    lcd pin: Db4 = Portd.3 , Db5 = Portd.4 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.0 , Rs = Portb.1

    Remember change RS with R/W. Mistake on schematic and PCB.
  • #11
    paroh
    Level 11  
    I try it again and again but it doesn't work. I reversed the RS and R/W too. I can see all pixels of the top line so the contrast pot I think correct. I don't know what is problem.
  • #12
    Li[M]aK
    Level 10  
    czy zamiast DS18S20 można by użyć DS18B20 ? i z jaka komplikacja by sie to wiazalo ?
  • #13
    00gtw00
    Level 15  
    Można. Trzeba zmienić tylko fragment programu który wylicza temp., czyli dla czujnika pierwszego musisz zmienić to:

    Code:
    If T(2) = 0 Then
    
      Temp1 = T(1) / 2
      Else
      I = 256 - T(1)
      End If

      If T(2) > 0 Then
       Locate 1 , 4
       Lcd "-"
      End If


    Poszukaj na elektrodzie. Były wersje dla obu czujników. Porównaj i będziesz wiedział czym się różnią.