Termostat - problem


Witam
Chcę zrobić sobie termostat :) ale jak na razie udało mi się tylko napisać termometr, a termostatu nie umiem ;(

Chcę zrobić tak, że jak naciśnie się trzeci przycisk to wtedy wchodzi się w ustawienia temperatury i jak już się jest w ustawieniach to reguluje się temperaturę 2 pierwszymi przyciskami +/- a potem jak naciśnie się trzeci przycisk to temperatura, którą ustawiliśmy się zapisuje i wyświetla się aktualna temperatura pomieszczenia. Jak temperatura pomieszczenia będzie większa niż temperatura ustawiona to wtedy ma się świecić środkowa dioda.

Proszę o pomoc bo nie mam pojęcia jak się za to zabrać :)

'****************************
           'Konfiguracja
'****************************
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output
Config Portd = Output
Config Portd = &B11111111
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Input
Portc.3 = 1
S1 Alias Pinc.3
Config Portc.4 = Input
Portc.4 = 1
S2 Alias Pinc.4
Config Portc.5 = Input
Portc.5 = 1
S3 Alias Pinc.5
Config 1wire = Portb.1
 
Led1 Alias Portb.6
Led2 Alias Portb.7
Led3 Alias Portb.0
 
Q Alias Portb.5
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
Anoda1 Alias Portc.2
Anoda2 Alias Portc.1
Anoda3 Alias Portc.0
 
Dim T As Integer                                            ' temperatura
Dim I1 As Integer                                           ' bierze udzial w konwersji temperatury
Dim Dsid1(8) As Byte                                        ' adres czujnika temperatury
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(3) As Byte
Dim Wysw As Word , Wysw2 As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim Mux As Byte , I As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
'****************************
      'Petla glowna
'****************************
 
Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
  Gosub Wyswietl_first
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  'tu można wykonywac coś co 100ms, np klawiatura albo jakieś obliczenia
 
 
End If
 
If F1s = 1 Then
Reset F1s
' co 1 sekund
  Gosub Temperatura
End If
 
Loop
End
 
 
Temperatura:
Disable Interrupts
'wyślij komendę skip rom i convert t: to te komendy = tu jest na nie dedykowane miejsce
1wreset
1wwrite &HCC
1wwrite &H44
Enable Interrupts
 
 
 
Disable Interrupts
'tu dokonaj odczytu temperatury z termometru
1wreset
1wwrite &HCC
1wwrite &HBE
I1 = 1wread(2)
Enable Interrupts
'i przepisania jej na zmienne odpowiadające za wyświetlanie tego na LCD - nie w przerwaniu!
I1 = I1 * 10
I1 = I1 / 16
 
T = I1
T = I1 / 10
Wysw2 = T
Return
 
Wyswietl_first:
Wysw = Wysw2
Gosub Wyswietl
Return
 
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
   End If
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
     End If
       Set F1s
       Incr Dziel(3)
   If Dziel(3) = 1 Then
     Dziel(3) = 0
     End If
   'End If
 
Return
'****************************
      'wyswietlanie
'****************************
Wyswietl:
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  Select Case Mux
    Case 0:
      Set Anoda1
     Portd = W(3)
      Reset Anoda3
 
    Case 1:
     Set Anoda2
     Portd = W(2)
     Reset Anoda1
 
    Case 2:
     Set Anoda3
     Portd = W(1)
     Reset Anoda2
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
Data 215 , 192 , 167 , 227 , 240 , 115 , 119 , 193 , 247 , 243




Portret użytkownika mirley

Re: Termostat

Zamiast odkrywać na nowo pewne rzeczy sprawdź moje programy termometru uniwersalnego i minitermometru. Oba mają w załacznikach wersję kodu z termoststem

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika shoter09

sprawdzałem i nic nie

sprawdzałem i nic nie ogarniam

Portret użytkownika mirley

Re; Termostat

Jest wiele możliwości sterowania... popatrz na to:

Sterowanie:
 If Portd.6 = 0 Then                                        'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Portd.6 = 1                       'jezeli tempa dochodzi do ustawionej to wyl przekaznik
 Else                                                       'jezeli wylaczony przekaznik to
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Portd.6 = 0                        'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
 End If
Return

Można też tak zrobić żeby temp włączenia była tempu + histereza/2 i wyłaczenie tempu - histereza/2 to wszystko zależy czym sterujesz

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika marekszy

tutaj masz gotowy

tutaj masz gotowy MINITERMOMETR UNIWERSALNY z zapisem ustawień do eeprom,sprawdzony i działający.

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
Config Porta = &B00000000 : Porta = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(2) As Byte
Dim Wysw As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim T As Integer , Tu As Integer
Dim H As Integer , L As Integer
Dim Mux As Byte , I As Byte
Dim Ust As Bit
Dim Autoret As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
Dim Minus As Bit
Dim Kanal As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
Kanal = 1
Readeeprom Tu , 35                                          'odczyt z pamieci
 
 
'****************************
      'Petla glowna
'****************************
Do
 
If F4ms = 1 Then
  Reset F4ms
  If Ust = 0 Then Wysw = T Else Wysw = Tu
  Gosub Wyswietl_zmierz
End If
 
If F100ms = 1 Then
  Reset F100ms
  If Pind.2 = 0 Then
    Incr Tu
    Autoret = 20
  End If
  If Pina.0 = 0 Then
    Decr Tu
    Autoret = 20
  End If
 
  If Autoret > 0 Then
    Ust = 1
    Decr Autoret
    If Autoret = 0 Then
  Writeeeprom Tu , 35                                       'zapis do eeprom
    End If
  Else
    Ust = 0
  End If
  H = Tu + 10                                                   'histereza na + 10=1stopien
  L = Tu - 5                                                'histereza na - np.5=0,5stopnia
 
  If T > H Then Set Portd.3
  If T < L Then Reset Portd.3
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return
'****************************
      'pomiar temp
'****************************
Temp:
 If F1s = 1 Then
   Reset F1s
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T = 1wread(2 , Pind , Kanal):
   Minus = T.15
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
  End If
Return
 
 
 
'****************************
      'wyswietlanie i wywolywanie pomiaru
'****************************
Wyswietl_zmierz:
  Incr Mux
  If Mux = 5 Then Mux = 0
 
  'Portd.3 = Not Minus
 
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
  If W(3) = 40 Then W(3) = 255                              'wygaszenie zera wiodącego
 
  Select Case Mux
    Case 0:
      Portb = W(3)
      Reset Portd.6
 
    Case 1:
     Set Portd.6
     Portb = W(2) And &B11011111
     Reset Portd.5
 
    Case 2:
     Set Portd.5
     Portb = W(1)
     Reset Portd.4
 
    Case 3:
     Set Portd.4
     Portb = 255
     Gosub Temp
 
    'Case 4:                                                 'opoznienie na odczyt temp, jeśli nie ma to miga wyswietlacz
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
'znak:    0     1     2     3     4     5     6     7     8     9

masz 2 przyciski +/- ,po ustawieniu temp.następuje automatyczny zapis i powrót do wyświetlania aktualnej temperatury.Resztę doczytaj na stronie projektu.

Portret użytkownika shoter09

bardziej nie wiem jak zrobić

bardziej nie wiem jak zrobić "menu", żeby wejść w ustawienia

bo jak zrobię tak to działa

If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  'tu można wykonywac coś co 100ms, np klawiatura albo jakieś obliczenia
 
  If S3 = 0 Then
 
  Tryb = 1
 
 
  End If
 
 
 
End If

a jak tak to nie

If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  'tu można wykonywac coś co 100ms, np klawiatura albo jakieś obliczenia
 
  If S3 = 0 Then
 
if tryb=0 then
  Tryb = 1
endif
 
if tryb=1 then
  Tryb = 0
endif
 
  End If
 
 
 
End If

Portret użytkownika mirley

Re: Menu

to raczej tak:

 If S3 = 0 Then
   incr Tryb
   if Tryb = 2 then tryb = 0 'to zalezy ile jest pozycji menu
 End If

potem w następnym przycisku wszystko musisz uzaleznić od zmiennej tryb...np:

 If S2 = 0 Then
   select case Tryb
     case 0:
       incr histereza
     case 1:
       incr tempu
   end select
 End If

tak samo wyświetlanie musi zależeć od tryb

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika shoter09

no to teraz mam następny

no to teraz mam następny problem :P
Jak trzymam przycisk np S3 to jest tak jakbym ciągle go naciskał co 100ms bo tak jest w programie. Co zrobić, żeby jedne naciśnięcie to było prawdziwe 1 naciśnięcie nie zależnie od tego jak długo trzymam przycisk ?

Portret użytkownika mirley

Re; Termostat

np tak:

 If S3 = 0 and aktywny = 0 Then
   aktywny = 1 
   incr Tryb
   if Tryb = 2 then tryb = 0 'to zalezy ile jest pozycji menu
 else 
   aktywny = 0
 End If

zmienna aktywny ma być typu bit

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika shoter09

teraz to przycisk nie

teraz to przycisk nie reaguje

'****************************
           'Konfiguracja
'****************************
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output
Config Portd = Output
Config Portd = &B11111111
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Input
Portc.3 = 1
S1 Alias Pinc.3
Config Portc.4 = Input
Portc.4 = 1
S2 Alias Pinc.4
Config Portc.5 = Input
Portc.5 = 1
S3 Alias Pinc.5
Config 1wire = Portb.1
 
Led1 Alias Portb.6
Led2 Alias Portb.7
Led3 Alias Portb.0
 
Q Alias Portb.5
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
Anoda1 Alias Portc.2
Anoda2 Alias Portc.1
Anoda3 Alias Portc.0
 
Dim T As Integer                                            ' temperatura
Dim I1 As Integer                                           ' bierze udzial w konwersji temperatury
Dim Dsid1(8) As Byte                                        ' adres czujnika temperatury
 
Dim T_ustaw As Integer
Dim Aktywny As Bit
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(3) As Byte
Dim Wysw As Word , Wysw2 As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim Mux As Byte , I As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
 
Dim Tryb As Byte
'****************************
      'Petla glowna
'****************************
Tryb = 0
Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
  Gosub Wyswietl_first
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  'tu można wykonywac coś co 100ms, np klawiatura albo jakieś obliczenia
 
 If S3 = 0 And Aktywny = 0 Then
   aktywny = 1
   incr Tryb
   If Tryb = 0 Then Tryb = 1                                'to zalezy ile jest pozycji menu
   If Tryb = 1 Then Tryb = 0                                'to zalezy ile jest pozycji menu
 else
   aktywny = 0
 End If
 
 
 
 
End If
 
If F1s = 1 Then
Reset F1s
' co 1 sekund
 
 
If Tryb = 1 Then
Wysw2 = T_ustaw
End If
 
 If Tryb = 0 Then
 Disable Interrupts
'wyślij komendę skip rom i convert t: to te komendy = tu jest na nie dedykowane miejsce
1wreset
1wwrite &HCC
1wwrite &H44
Enable Interrupts
 
 
 
Disable Interrupts
'tu dokonaj odczytu temperatury z termometru
1wreset
1wwrite &HCC
1wwrite &HBE
I1 = 1wread(2)
Enable Interrupts
'i przepisania jej na zmienne odpowiadające za wyświetlanie tego na LCD - nie w przerwaniu!
I1 = I1 * 10
I1 = I1 / 16
 
T = I1
T = I1 / 10
Wysw2 = T
End If
 
 
End If
 
Loop
End
 
 
 
Wyswietl_first:
Wysw = Wysw2
Gosub Wyswietl
Return
 
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
   End If
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
     End If
       Set F1s
       Incr Dziel(3)
   If Dziel(3) = 1 Then
     Dziel(3) = 0
     End If
   'End If
 
Return
'****************************
      'wyswietlanie
'****************************
Wyswietl:
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  Select Case Mux
    Case 0:
      Set Anoda1
     Portd = W(3)
      Reset Anoda3
 
    Case 1:
     Set Anoda2
     Portd = W(2)
     Reset Anoda1
 
    Case 2:
     Set Anoda3
     Portd = W(1)
     Reset Anoda2
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
Data 215 , 192 , 167 , 227 , 240 , 115 , 119 , 193 , 247 , 243

Portret użytkownika mirley

Re: menu

Czemu zmieniłeś linijki:

   If Tryb = 0 Then Tryb = 1                                'to zalezy ile jest pozycji menu
   If Tryb = 1 Then Tryb = 0                                'to zalezy ile jest pozycji menu

Ma być tak jak napisałem:

   incr Tryb
   If Tryb = 2 Then Tryb = 0                                'to zalezy ile jest pozycji menu, jak są 2 pozycje do wyświetlenia to ma być if Tryb = 2 .... itd.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika shoter09

teraz przyciski działają ale

teraz przyciski działają ale dalej cały czas jak trzymam przycisk to sie zmienia tak szybko tryb co 100ms

'****************************
           'Konfiguracja
'****************************
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output
Config Portd = Output
Config Portd = &B11111111
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Input
Portc.3 = 1
S1 Alias Pinc.3
Config Portc.4 = Input
Portc.4 = 1
S2 Alias Pinc.4
Config Portc.5 = Input
Portc.5 = 1
S3 Alias Pinc.5
Config 1wire = Portb.1
 
Led1 Alias Portb.6
Led2 Alias Portb.7
Led3 Alias Portb.0
 
Q Alias Portb.5
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
Anoda1 Alias Portc.2
Anoda2 Alias Portc.1
Anoda3 Alias Portc.0
 
Dim T As Integer                                            ' temperatura
Dim I1 As Integer                                           ' bierze udzial w konwersji temperatury
Dim Dsid1(8) As Byte                                        ' adres czujnika temperatury
 
Dim T_ustaw As Integer
Dim Aktywny As Bit
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(3) As Byte
Dim Wysw As Word , Wysw2 As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim Mux As Byte , I As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
 
Dim Tryb As Byte
'****************************
      'Petla glowna
'****************************
Tryb = 0
Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
  Gosub Wyswietl_first
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  'tu można wykonywac coś co 100ms, np klawiatura albo jakieś obliczenia
 
 If S3 = 0 And Aktywny = 0 Then
   Aktywny = 1
   Incr Tryb
   If Tryb = 2 Then Tryb = 0                                'to zalezy ile jest pozycji menu, jak są 2 pozycje do wyświetlenia to ma być if Tryb = 2 .... itd.
 Else
   Aktywny = 0
 End If
 
 
 
 
End If
 
If F1s = 1 Then
Reset F1s
' co 1 sekund
 
 
If Tryb = 1 Then
Wysw2 = T_ustaw
End If
 
 If Tryb = 0 Then
 
 Disable Interrupts
'wyślij komendę skip rom i convert t: to te komendy = tu jest na nie dedykowane miejsce
1wreset
1wwrite &HCC
1wwrite &H44
Enable Interrupts
 
 
 
Disable Interrupts
'tu dokonaj odczytu temperatury z termometru
1wreset
1wwrite &HCC
1wwrite &HBE
I1 = 1wread(2)
Enable Interrupts
'i przepisania jej na zmienne odpowiadające za wyświetlanie tego na LCD - nie w przerwaniu!
I1 = I1 * 10
I1 = I1 / 16
 
T = I1
T = I1 / 10
Wysw2 = T
 
End If
 
 
End If
 
Loop
End
 
 
 
Wyswietl_first:
Wysw = Wysw2
Gosub Wyswietl
Return
 
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
   End If
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
     End If
       Set F1s
       Incr Dziel(3)
   If Dziel(3) = 1 Then
     Dziel(3) = 0
     End If
   'End If
 
Return
'****************************
      'wyswietlanie
'****************************
Wyswietl:
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  Select Case Mux
    Case 0:
      Set Anoda1
     Portd = W(3)
      Reset Anoda3
 
    Case 1:
     Set Anoda2
     Portd = W(2)
     Reset Anoda1
 
    Case 2:
     Set Anoda3
     Portd = W(1)
     Reset Anoda2
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
Data 215 , 192 , 167 , 227 , 240 , 115 , 119 , 193 , 247 , 243

Portret użytkownika mirley

Re: Przyciski

Już wiem co jest źle. moje niedopatrzenie. Przycisk powinien wyglądac tak:

 If S3 = 0 Then
   if Aktywny = 0 Then
     Aktywny = 1
     Incr Tryb
     If Tryb = 2 Then Tryb = 0                                'to zalezy ile jest pozycji menu, jak są 2 pozycje do wyświetlenia to ma być if Tryb = 2 .... itd.
   end if
 Else
   Aktywny = 0
 End If

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika shoter09

dzięki :) już działa

dzięki :) już działa