(20 głosujących) Opisywane urządzenie jest prostym sterownikiem domowym, urządzeniem pełniącym wiele pożytecznych funkcji, do których między innymi należą: dwupunktowy pomiar temperatury (w domu i na dworze) i zegar pracujący w trybie 24-godzinnym, wzbogacony o dwukanałowy sterownik czasowy. Dodatkowo w programie zaimplementowano prosty termostat z histerezą oraz prosty system alarmowy z dwoma obwodami ochronnymi. Funkcja cichego alarmu umożliwia podgląd o której godzinie obwód ochronny został naruszony, bez włączania syreny. Układ sterownika został zbudowany na mikrokontrolerze ATMEGA16 a wszystkie ustawienia dokunuje się poprzez bardzo prosty interfejs z wyświetlaczem LCD i 6-przyciskową klawiaturą. Do odmierzania czasu wykorzystano układ RTC przez co sterownik może długo chodzić podtrzymując czas na zasilaniu bateryjnym. Wyjścia układu zbudowane na triakach posiadają optoizolację od napięcia sieciowego.
Działanie:Schemat ideowy układu znajduje się na rysunku poniżej: Sercem układu jest mikrokontroler U1 (ATMega16) wraz z rezonatorem kwarcowym X1 (16MHz) i kondensatorami C1 (22pF) i C2 (22pF). Do odmierzania czasu wykorzystywany jest układ RTC U2 (PCF8583). Do jego poprawnej pracy wymagany jest rezonator kwarcowy (tak zwany zegarkowy) X2 (32,768kHz) oraz kondensator C5 (33pF). Kondensatory C6 (100nF) i C7 (47uF) filtrują napięcie zasilania samego układu RTC, które podawane jest poprzez prosty układ bezprzerwowego zasilania z diodami D1 (1N4148), D2 (1N4148) i baterią BAT1 (3V). Rezystory R15 (3,3k) i R16 (3,3k) podciągają linie magistrali I2C do plusa zasilania, umożliwiając jej poprawną pracę. Obwody zasilania całej płytki zbudowane są na stabilizatorze U5 (7805) i kondensatorach filtrujących C3 (220uF), C4 (47uF) i C8 (100nF). Potencjometr P1 (10k) umożliwia regulację kontrastu wyświetlacza W1 (LCD 16x2). Podświetlanie wyświetlacza uruchamiane jest z poziomu programu sterownika za pomocą tranzystora T1 (BC556) i rezystora R2 (3,3k). Prąd podświetlania wyświetlacza ograniczany jest przez rezystor R1 (47R). W roli sygnalizacji alarmu pracuje buzzer z generatorem BUZ1 (5V), włączany poprzez tranzystor T2 (BC556) i rezystory R3 (3,3k) i R4 (3,3k). Złącze Prog (goldpin) umożliwia programowanie mikrokontrolera U1 w układzie, do tego został tez wyprowadzony pin resetu Res. Złącze RS (goldpin) umożliwia podpięcie komunikacji Rs232 a właściwie odpowiedniego konwertera, w przypadku klasycznego Rs232 będzie to MAX232 a przypadku konwertera USB-RS232, odpowiednia przejściówka. Klawiaturę urządzenia stanowią przyciski S1-S6 (uSwitch). Złącze ALARM (ARK) stanowi wejścia czujników alarmowych, jedno wejście jest typu N.O. a drugie typu N.C. Rezystor R14 (4,7k) umożliwia poprawną pracę magistrali 1-Wire z czujnikami U3-U5 (DS18B20). Budowa:Układ z powodzeniem można zbudować w oparciu o płytkę drukowaną dostępną tutaj. Rysunek w odbiciu lustrzanym dostępny jest tutaj. Montaż płytki nie jest skomplikowany i wykonujemy go w sposób klasyczny. Rozpoczynamy od wlutowania dwóch zworek pod wyświetlaczem W1, następne w kolejności powinny być rezystory a potem kondensatory. Kolejność pozostałych elementów nie jest krytyczna. Pod mikrokontroler U1 i układ RTC U2 dobrze jest zastosować podstawki. Złacza na czujniki U3 i U4 są w takiej odległości że można wlutować w ich miejsce podstawkę DIL6, tak jak można to zobaczyć na zdjęciach. Złącza te przydadzą się w momencie rejestracji czujników DS18B20 i podczas testów całego systemu. Potem można wykorzystać złącze U5 do podłączenia wszystkich czujników temperatury równolegle. Zamiast BUZ1 można podłączyć układ sterujący większą syreną alarmową. Do zasilania całego układu najwygodniej jest użyć ładowarki od komórki (np. NOKIA 6610) gdyż daje ona przy takiej pracy napięcie ponad 5V. Szczególną ostrożność należy zachować przy podłączaniu odbiorników 230V gdyż triaki znajdują się na tej samej płytce co sterownik i istnieje ryzyko porażenia. Układ został zbudowany głównie do celów pokazowych (stąd układy wykonawcze na tej samej płytce) ale jest w pełni funkcjonalnym urządzeniem. Pomocą w konstrukcji może okazać się schemat montażowy dostępny tutaj. Podłączenie sterownika przedstawione jest na rysunku poniżej: Wykaz Elementów:5x Złącze Śrubowe ARK2(podwójne) 5x 3,3k 2x 22pF 1x Rezonator Kwarcowy 16MHz Programowanie:Kod Źródłowy do sterownika został napisany w BASCOM AVR firmy MCS Electronics (http://www.mcselec.com/). Program przedstawiony jest poniżej: '************* Konfiguracja uC ***************** '*********************************************** $regfile = "m16def.dat" $crystal = 16000000 Config Porta = &B11110011 : Porta = &B11111111 Config Portb = &B11111111 : Portb = &B11111111 Config Portc = &B11111111 : Portc = &B11111111 Config Portd = &B00000011 : Portd = &B11111111 Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.1 , Rs = Porta.0 Config Lcd = 16 * 2 Cls Cursor Off Noblink Config 1wire = Pinc.7 Config Scl = Portb.0 Config Sda = Portb.1 I2cinit Lcd_light Alias Portc.6 Sw_port Alias Pind 'nazwa portu Tr1 Alias Portc.2 Tr2 Alias Portc.1 Tr_term Alias Portc.0 Buzz Alias Portc.5 Linia_no Alias Pina.2 Linia_nc Alias Pina.3 Config Timer0 = Timer , Prescale = 256 Enable Timer0 : On Timer0 Prztimer0 Enable Interrupts '********** Konfiguracja uC Koniec ************ '****************** Zmienne ******************* '*********************************************** Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte 'sw Dim Wyswietlanie As Byte , Poz_wysw As Byte , Wyswietlono As Bit 'Lcd Dim Mig As Bit , Poz_ust As Byte Dim Autosave As Byte , Autolight As Byte Dim Ds1(8) As Byte , Ds2(8) As Byte , Ds3(8) As Byte , Ds(8) As Byte , Ds_adr As Byte , Ds_ok As Bit 'DS18B20 Dim Ktory_ds As Byte , Lsb As Byte , Msb As Byte , Minusy As Byte Dim T(3) As Word Dim T_ust As Word , T_his As Byte , Term_ena As Bit 'termostat Dim Dzielnik(2) As Byte 'dzielniki timera Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit 'flagi przerwa? Dim Hbyte(2) As Byte , Hword(3) As Word , N As Byte , Hbit As Bit Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte Dim Zapisz_czas As Bit Dim G(4) As Byte , M(4) As Byte , Ar_tr1 As Bit , Ar_tr2 As Bit 'programtot czas Dim Alarm As Byte , Salarm As Byte , A_g As Byte , A_m As Byte 'alarmy 0-wyl, 1-czuwa, 2-czas wtargniecia Dim Alarm_licz As Byte '************* Zmienne Koniec **************** '************ Warunki Poczatkowe *************** '*********************************************** Lcd_light = 0 Autolight = 20 Lcd "Sterownik Domowy" Lowerline Lcd " Wersja 1.05" Wait 1 If Sw_port = &B01001111 Then Ds_adr = 30 Gosub Ds_reg Cls Lcd "Ds1" End If If Sw_port = &B01010111 Then Ds_adr = 40 Gosub Ds_reg Cls Lcd "Ds2" End If If Sw_port = &B01011011 Then Ds_adr = 50 Gosub Ds_reg Cls Lcd "Ds term" End If For N = 1 To 8 Hbyte(1) = 30 + N Readeeprom Ds1(n) , Hbyte(1) Hbyte(1) = 40 + N Readeeprom Ds2(n) , Hbyte(1) Hbyte(1) = 50 + N Readeeprom Ds3(n) , Hbyte(1) Next N For N = 10 To 13 Readeeprom G(n -9) , N If G(n -9) > 23 Then G(n -9) = 0 Next N For N = 14 To 17 Readeeprom M(n -13) , N If M(n -13) > 59 Then M(n -13) = 0 Next N Readeeprom Hbyte(1) , 18 Ar_tr1 = Hbyte(1).0 Ar_tr2 = Hbyte(1).1 Term_ena = Hbyte(1).2 Readeeprom T_ust , 19 Readeeprom T_his , 21 If T_ust > 1000 Or T_ust < 100 Then T_ust = 450 If T_his > 100 Or T_his < 5 Then T_his = 20 Readeeprom Alarm , 22 Readeeprom Salarm , 23 Readeeprom A_g , 24 Readeeprom A_m , 25 If Alarm > 2 Then Alarm = 0 If Salarm > 2 Then Salarm = 0 If A_g > 23 Then A_g = 0 If A_m > 59 Then A_m = 0 Wait 1 Wyswietlono = 1 Wyswietlanie = 1 Autosave = 5 '******* Warunki Poczatkowe Koniec *********** '************** Petla glowna ****************** '*********************************************** Do '*********************************************** co 4ms If Flaga_4ms = 1 Then Flaga_4ms = 0 If Alarm = 1 Then If Linia_no = 0 Or Linia_nc = 1 Then Alarm = 2 A_g = Godziny A_m = Minuty End If Else If Alarm = 2 Then Buzz = Mig Else Buzz = 1 End If End If If Salarm = 1 Then If Linia_no = 0 Or Linia_nc = 1 Then Salarm = 2 A_g = Godziny A_m = Minuty End If End If Gosub Przyciski If Wyswietlono = 1 Then Gosub Wysw_lcd End If '*********************************************** '*********************************************** co 500ms If Flaga_500ms = 1 Then Flaga_500ms = 0 If Autolight > 0 Then Decr Autolight Lcd_light = 0 Else Lcd_light = 1 End If Mig = Not Mig If Poz_wysw <> 1 Or Poz_ust = 0 Then If Zapisz_czas = 1 Then Gosub Zapis_rtc 'jednorazowo zapisuje po wyj?ciu z ustawie? Zapisz_czas = 0 Else Gosub Odczyt_rtc 'odczytuje czas End If Else Zapisz_czas = 1 End If If Poz_wysw = 1 Then Wyswietlanie = 1 'uaktualniaj czas je?li jest pokazywany na LCD If Poz_wysw = 2 Then Wyswietlanie = 2 If Poz_wysw = 4 Then Wyswietlanie = 4 'je?li wyswietlony termostat to uaktualnij. If Poz_wysw = 5 Then Wyswietlanie = 5 End If '*********************************************** '*********************************************** co 1s If Flaga_1s = 1 Then Flaga_1s = 0 If Autosave < 5 Then Incr Autosave If Autosave = 5 Then For N = 10 To 13 Writeeeprom G(n -9) , N Next N For N = 14 To 17 Writeeeprom M(n -13) , N Next N Hbyte(1) = 0 Hbyte(1).0 = Ar_tr1 Hbyte(1).1 = Ar_tr2 Hbyte(1).2 = Term_ena Writeeeprom Hbyte(1) , 18 Writeeeprom T_ust , 19 Writeeeprom T_his , 21 Writeeeprom Alarm , 22 Writeeeprom Salarm , 23 Writeeeprom A_g , 24 Writeeeprom A_m , 25 Poz_ust = 0 End If End If Gosub Temperatura If Poz_wysw = 3 Then Wyswietlanie = 3 'jesli wysw temperatura to uaktualnij Gosub Sterowanie End If '*********************************************** Loop End '************ Petla glowna Koniec ************** '************ Przerwanie timer 0 *************** '*********************************************** Prztimer0: Timer0 = 5 Set Flaga_4ms Incr Dzielnik(1) If Dzielnik(1) = 125 Then Dzielnik(1) = 0 Set Flaga_500ms Incr Dzielnik(2) If Dzielnik(2) = 2 Then Dzielnik(2) = 0 Set Flaga_1s End If End If Return '******** Przerwanie timer 0 Koniec ************ '*********************************************** '***************** Przyciski ************** Przyciski: Sw = Sw_port And &B11111100 'And &B00001111 'maska na piny nieu?ywane jako sw If Sw <> &B11111100 And Stan_sw = Sw Then Incr Licznik_sw If Licznik_sw = 68 Then Licznik_sw = 0 Autolight = 20 Select Case Stan_sw Case &B11101100: 'incr '*********************************************************** Select Case Poz_wysw Case 1: Select Case Poz_ust Case 0: 'podczas wyswietania czasu If Alarm = 2 Then Alarm = 0 'If Salarm = 2 Then Salarm = 0 Case 1: Incr Godziny If Godziny = 24 Then Godziny = 0 Case 2: Incr Minuty If Minuty = 60 Then Minuty = 0 Case 3: Incr Sekundy If Sekundy = 60 Then Sekundy = 0 End Select Case 2: Select Case Poz_ust Case 0: Ar_tr1 = Not Ar_tr1 Case 1: Incr G(1) If G(1) = 24 Then G(1) = 0 Case 2: Incr M(1) If M(1) = 60 Then M(1) = 0 Case 3: Incr G(2) If G(2) = 24 Then G(2) = 0 Case 4: Incr M(2) If M(2) = 60 Then M(2) = 0 Case 5: Incr G(3) If G(3) = 24 Then G(3) = 0 Case 6: Incr M(3) If M(3) = 60 Then M(3) = 0 Case 7: Incr G(4) If G(4) = 24 Then G(4) = 0 Case 8: Incr M(4) If M(4) = 60 Then M(4) = 0 End Select Autosave = 0 Case 4: Select Case Poz_ust Case 0: Term_ena = Not Term_ena If Term_ena = 0 Then Tr_term = 1 Case 1: If T_ust < 1000 Then T_ust = T_ust + 10 Case 2: If T_his < 100 Then Incr T_his End Select Autosave = 0 Case 5: Select Case Poz_ust Case 0: ' podczas wysw alarmow Case 1: If Alarm <> 0 Then Alarm = 0 Else Alarm = 1 Buzz = 1 Case 2: If Salarm <> 0 Then Salarm = 0 Else Salarm = 1 End Select Autosave = 0 End Select Case &B11111000: 'ustaw next '*********************************************************** Select Case Poz_wysw Case 1: Incr Poz_ust If Poz_ust = 4 Then Poz_ust = 0 Case 2: Incr Poz_ust If Poz_ust = 9 Then Poz_ust = 0 Case 4: Incr Poz_ust If Poz_ust = 3 Then Poz_ust = 0 Case 5: Incr Poz_ust If Poz_ust = 3 Then Poz_ust = 0 End Select Case &B11110100: 'decr '*********************************************************** Select Case Poz_wysw Case 1: Select Case Poz_ust Case 0: 'podczas wyswietania czasu If Alarm = 2 Then Alarm = 0 Case 1: Decr Godziny If Godziny = 255 Then Godziny = 23 Case 2: Decr Minuty If Minuty = 255 Then Minuty = 59 Case 3: Decr Sekundy If Sekundy = 255 Then Sekundy = 59 End Select Case 2: Select Case Poz_ust Case 0: Ar_tr2 = Not Ar_tr2 Case 1: Decr G(1) If G(1) = 255 Then G(1) = 23 Case 2: Decr M(1) If M(1) = 255 Then M(1) = 59 Case 3: Decr G(2) If G(2) = 255 Then G(2) = 23 Case 4: Decr M(2) If M(2) = 255 Then M(2) = 59 Case 5: Decr G(3) If G(3) = 255 Then G(3) = 23 Case 6: Decr M(3) If M(3) = 255 Then M(3) = 59 Case 7: Decr G(4) If G(4) = 255 Then G(4) = 23 Case 8: Decr M(4) If M(4) = 255 Then M(4) = 59 End Select Autosave = 0 Case 4: Select Case Poz_ust Case 0: Term_ena = Not Term_ena If Term_ena = 0 Then Tr_term = 1 Case 1: If T_ust > 100 Then T_ust = T_ust - 10 Case 2: If T_his > 5 Then Decr T_his End Select Autosave = 0 Case 5: Select Case Poz_ust Case 0: ' podczas wysw alarmow Case 1: If Alarm <> 0 Then Alarm = 0 Else Alarm = 1 Buzz = 1 Case 2: If Salarm <> 0 Then Salarm = 0 Else Salarm = 1 End Select Autosave = 0 End Select Case &B11011100: 'next menu '*********************************************************** Poz_ust = 0 Wyswietlanie = Poz_wysw + 1 If Wyswietlanie = 6 Then Wyswietlanie = 1 Case &B10111100: 'triak 1 '*********************************************************** Select Case Poz_wysw Case 2: Ar_tr1 = 0 Tr1 = Not Tr1 Case 4: Term_ena = 0 Tr_term = Not Tr_term Case 5: If Alarm = 2 Then Alarm = 0 'If Salarm = 2 Then Salarm = 0 End Select Autosave = 0 Case &B01111100: 'triak 2 '*********************************************************** Select Case Poz_wysw Case 2: Ar_tr2 = 0 Tr2 = Not Tr2 Autosave = 0 Case 4: Term_ena = 0 Tr_term = Not Tr_term Case 5: If Alarm = 2 Then Alarm = 0 If Salarm = 2 Then Salarm = 0 End Select Autosave = 0 End Select End If Else Stan_sw = Sw Licznik_sw = 60 End If Return '*********************************************** '*********************************************** '************** LCD *********** Wysw_lcd: If Wyswietlanie <> 0 Then Wyswietlono = 0 Select Case Wyswietlanie Case 1: 'aktualny czas '************************************************************** If Poz_wysw <> 1 Then Cls Lcd " Aktualny Czas " End If Locate 2 , 5 If Poz_ust = 1 And Mig = 1 Then Lcd " " Else If Godziny < 10 Then Lcd "0" Lcd Godziny End If If Poz_ust = 0 And Mig = 1 Then Lcd " " Else Lcd ":" If Poz_ust = 2 And Mig = 1 Then Lcd " " Else If Minuty < 10 Then Lcd "0" Lcd Minuty End If If Poz_ust = 0 And Mig = 1 Then Lcd " " Else Lcd ":" If Poz_ust = 3 And Mig = 1 Then Lcd " " Else If Sekundy < 10 Then Lcd "0" Lcd Sekundy End If Case 2: 'programator czasowy '************************************************************** If Poz_wysw <> 2 Then Cls End If Locate 1 , 1 If Poz_ust = 1 And Mig = 1 Then Lcd " " Else If G(1) < 10 Then Lcd "0" Lcd G(1) End If Lcd ":" If Poz_ust = 2 And Mig = 1 Then Lcd " " Else If M(1) < 10 Then Lcd "0" Lcd M(1) End If Lcd " - " If Poz_ust = 3 And Mig = 1 Then Lcd " " Else If G(2) < 10 Then Lcd "0" Lcd G(2) End If Lcd ":" If Poz_ust = 4 And Mig = 1 Then Lcd " " Else If M(2) < 10 Then Lcd "0" Lcd M(2) End If Lcd " " If Ar_tr1 = 1 Then Lcd "A" Else Lcd "R" Locate 2 , 1 If Poz_ust = 5 And Mig = 1 Then Lcd " " Else If G(3) < 10 Then Lcd "0" Lcd G(3) End If Lcd ":" If Poz_ust = 6 And Mig = 1 Then Lcd " " Else If M(3) < 10 Then Lcd "0" Lcd M(3) End If Lcd " - " If Poz_ust = 7 And Mig = 1 Then Lcd " " Else If G(4) < 10 Then Lcd "0" Lcd G(4) End If Lcd ":" If Poz_ust = 8 And Mig = 1 Then Lcd " " Else If M(4) < 10 Then Lcd "0" Lcd M(4) End If Lcd " " If Ar_tr2 = 1 Then Lcd "A" Else Lcd "R" Case 3: '************************************************************** If Poz_wysw <> 3 Then Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32 'stopien Deflcdchar 1 , 4 , 32 , 14 , 17 , 17 , 17 , 14 , 32 ' o kreskowane Cls Lcd "Dw" ; Chr(1) ; "r:" Lowerline Lcd "Dom:" End If For N = 1 To 2 Hword(1) = T(n) / 10 Hword(2) = 11 If Hword(1) >= 10 Then Decr Hword(2) If Hword(1) >= 100 Then Decr Hword(2) If Minusy.n = 1 Then Decr Hword(2) Locate N , Hword(2) Hword(2) = T(n) Mod 10 Lcd " " If Minusy.n = 1 Then Lcd "-" Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C" Next N Case 4: '************************************************************** If Poz_wysw <> 4 Then Deflcdchar 2 , 4 , 4 , 31 , 4 , 4 , 32 , 31 , 32 '+- Cls Lcd "Term:" End If Hword(1) = T(3) / 10 Hword(2) = 8 If Hword(1) >= 10 Then Decr Hword(2) If Hword(1) >= 100 Then Decr Hword(2) If Minusy.3 = 1 Then Decr Hword(2) Locate 1 , Hword(2) Hword(2) = T(3) Mod 10 Lcd " " If Minusy.3 = 1 Then Lcd "-" Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C " If Term_ena = 1 Then Lcd "A" Else Lcd "R" If Poz_ust = 1 And Mig = 1 Then Locate 2 , 1 Lcd " " Else 'tust Hword(1) = T_ust / 10 Hword(2) = 3 If Hword(1) >= 10 Then Decr Hword(2) If Hword(1) >= 100 Then Decr Hword(2) Locate 2 , Hword(2) Hword(2) = T_ust Mod 10 Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C " ; Chr(2) End If If Poz_ust = 2 And Mig = 1 Then Locate 2 , 11 Lcd " " Else 'thist Hbyte(1) = T_his / 10 Hbyte(2) = 12 If Hbyte(1) >= 10 Then Decr Hbyte(2) If Hbyte(1) >= 100 Then Decr Hbyte(2) Locate 2 , Hbyte(2) Hbyte(2) = T_his Mod 10 Lcd Hbyte(1) ; "." ; Hbyte(2) ; Chr(0) ; "C" End If Case 5: '************************************************************** If Poz_wysw <> 5 Then Cls Lcd "Alarm: " Lowerline Lcd "C. Alarm: " End If Locate 1 , 8 If Poz_ust = 1 And Mig = 1 Then Lcd " " Else If Alarm = 0 Then Lcd "Wyl. " If Alarm = 1 Then Lcd "Czuwa" If Alarm = 2 Then If A_g < 10 Then Lcd "0" Lcd A_g ; ":" If A_m < 10 Then Lcd "0" Lcd A_m End If End If Locate 2 , 11 If Poz_ust = 2 And Mig = 1 Then Lcd " " Else If Salarm = 0 Then Lcd "Wyl. " If Salarm = 1 Then Lcd "Czuwa" If Salarm = 2 Then If A_g < 10 Then Lcd "0" Lcd A_g ; ":" If A_m < 10 Then Lcd "0" Lcd A_m End If End If End Select Poz_wysw = Wyswietlanie Wyswietlanie = 0 Wyswietlono = 1 End If Return '************** LCD Koniec *********** '********** rejestracja DS ********* Ds_reg: Disable Interrupts 1wreset 1wwrite &H33 Ds(1) = 1wread(8): Enable Interrupts If Ds(1) <> 255 Or Ds(2) <> 255 Or Ds(3) <> 255 Or Ds(4) <> 255 Or Ds(5) <> 255 Or Ds(6) <> 255 Or Ds(7) <> 255 Or Ds(8) <> 255 Then Ds_ok = 1 For N = 1 To 8 Hbyte(1) = Ds_adr + N Writeeeprom Ds(n) , Hbyte(1) Next N Else Ds_ok = 0 End If Return '****** rejestracja DS Koniec ****** '************* Temperatura *********** Temperatura: Disable Interrupts 1wreset Select Case Ktory_ds Case 0: 1wwrite &HCC 1wwrite &H44 Case 1: 1wwrite &H55 1wwrite Ds1(1) , 8 1wwrite &HBE Lsb = 1wread(): Msb = 1wread(): Case 2: 1wwrite &H55 1wwrite Ds2(1) , 8 1wwrite &HBE Lsb = 1wread(): Msb = 1wread(): Case 3: 1wwrite &H55 1wwrite Ds3(1) , 8 1wwrite &HBE Lsb = 1wread(): Msb = 1wread(): End Select Enable Interrupts If Ktory_ds > 0 Then T(ktory_ds) = Msb * 256 T(ktory_ds) = T(ktory_ds) + Lsb Minusy.ktory_ds = Msb.7 If Minusy.ktory_ds = 1 Then T(ktory_ds) = Not T(ktory_ds) T(ktory_ds) = T(ktory_ds) + 1 End If T(ktory_ds) = T(ktory_ds) * 10 T(ktory_ds) = T(ktory_ds) / 16 Else If Poz_wysw = 1 And Wyswietlono = 1 Then Wyswietlanie = 1 End If Incr Ktory_ds If Ktory_ds = 4 Then Ktory_ds = 0 Return '********** Temperatura Koniec ********* '****************** Zapis RTC ******************** Zapis_rtc: 'zapisuje czas g,m i s do uk?adu RTC Godziny_bcd = Makebcd(godziny) Minuty_bcd = Makebcd(minuty) Sekundy_bcd = Makebcd(sekundy) I2cstart I2cwbyte 162 I2cwbyte 0 'rejestr kontrolny I2cwbyte 8 'ustawienie rejestru zapisu daty I2cstop I2cstart I2cwbyte 162 I2cwbyte 2 I2cwbyte Sekundy_bcd I2cwbyte Minuty_bcd I2cwbyte Godziny_bcd I2cstop Return '************* Zapis RTC Koniec ***************** '****************** Odczyt RTC ******************** Odczyt_rtc: 'odczytuje czas z RTC do zmiennych I2cstart I2cwbyte 162 'adres zapisu I2cwbyte 2 'rejestr sekund I2cstart I2cwbyte 163 'adres odczytu I2crbyte Sekundy_bcd , Ack I2crbyte Minuty_bcd , Ack I2crbyte Godziny_bcd , Nack I2cstop Sekundy = Makedec(sekundy_bcd) Minuty = Makedec(minuty_bcd) Godziny = Makedec(godziny_bcd) Return '************** Odczyt RTC Koniec ***************** '************ Sterowanie *************** '*********************************************** Sterowanie: Hword(1) = Godziny * 60 Hword(1) = Hword(1) + Minuty 'czas w minutach 'prog czasowy For N = 1 To 3 Step 2 Hword(2) = G(n) * 60 Hword(2) = Hword(2) + M(n) 'czas w minutach Hword(3) = G(1 + N) * 60 Hword(3) = Hword(3) + M(1 + N) 'czas w minutach Hbit = 1 If Hword(3) >= Hword(2) Then If Hword(1) >= Hword(2) Then If Hword(1) < Hword(3) Then Hbit = 0 Else If Hword(1) >= Hword(2) Then Hbit = 0 If Hword(1) < Hword(3) Then Hbit = 0 End If If N = 1 Then If Ar_tr1 = 1 Then Tr1 = Hbit Else If Ar_tr2 = 1 Then Tr2 = Hbit End If Next N 'termostat If Term_ena = 1 Then Hword(1) = T_ust + T_his Hword(2) = T_ust - T_his If T(3) >= Hword(1) Then Tr_term = 1 If T(3) <= Hword(2) Then Tr_term = 0 End If Return '******** Sterowanie Koniec ************ Ustawienia fusebitów przedstawione są na rysunku poniżej: Zdjęcia Projektu:
|
|||||||||||||||||||||||||||||||
Pomocy
Witam
Długo szukałem aż wpadłem na ten projekt, właściwie ma on wszystko czego potrzebuję do swojego sterownika, bo myślę, że na linii 1-wire nie będzie problemu podpiąć czujnika wilgotności oraz kostki DS wej/wyj.
Jednak mój problem polega na tym, że nie mam możliwości zrobienia sobie płytki.
I tu moja prośba czy ktoś mógłby mi w tym pomóc ???
Czy można ją gdzieś kupić czy może mi ją ktoś wykonać ??
z góry dziękuję
Yozue - PCB
Napisz do mnie - mam wolna PCB wersje na 5 triaków -
Grzesiek - miasto Ostróda
GG 12372371 dom
tel 502812675 SMS
Pytanie
Hej, z góry chciałem powiedzieć, że strona i projekty zamieszczane na niej są świetne. W szczególności ten projekt przypadł mi do gustu i planuje sobie go wykonać. Mam jedno pytanie tylko odnośnie podłączania urządzeń do sterownika czasowego. Mam np lampki na choinkę, podłączam je do ARK TR01, a zasilanie sieciowe kablem do ARK 230V?
Re: Pytanie
Podłączasz dokładnie tak jak piszesz.
Hej, wiecie może czemu mi
Hej,
wiecie może czemu mi triaki dzialaja w dziwny sposób. Jeżeli ustawie na jakimś prace np od 1:30 do 1:40, a kolejny bedzie wylaczony to i tak ten jeden nie działa mi. Musze ustawić na obydwu przedziały czasowe np na 1 od 12:15 do 12:30, a na 2 od 12:20 do 12:30 to triaki będą obydwa działy od 12:20 do 12:30. Nie jest to chyba wina, że używam BT138-600 zamiast BT138-600E
Przepraszam za post pod
Przepraszam za post pod postem, komentarze mi sie nie odświeżały. Projekt juz działa, miałem bardzo małe zwarcie, którego nie zauważyłem. Wszystko działa.
termostat do - 30 st.
Witam, mam wykonany i ładnie pracujące urządzenie jeszcze wersja z jednym termostatem. Obecnie pilnie potrzebuję monitorować stan zamrażarki, sam sobie z zmianami kodu jeszcze poradzę :(
Pozdrawiam.
komunikacja ds18
ktoś może mi wytłumaczyć w jaki sposób działają termometry? chodzi mi o ich połączenie
Zapraszam na gl-art.pl
obelix
poczytaj zanim zadasz takie pytanie
Grzesiek - miasto Ostróda
GG 12372371 dom
tel 502812675 SMS
Witam mam takie małe
Witam
mam takie małe pytanie czy mogę uruchomić sterownik bez układu pcf 8583 ??
Re: małe pytanie
Uruchomić możesz tylko najpewniej procesor przy pierwszej próbie komunikacji z pcf'em wywali krzaki na lcd i program się rozłoży.
Moja strona w powijakach
no wiec uruchomiłem i cały
no wiec uruchomiłem i cały czasz wyświetla się początkowy napis "sterownik domowy wersja 1.05" i dalej nic nie reaguje i nic się nie wyświetla
Re: małe pytanie
Wcześniej nie chciało mi się zaglądać do kodu. Ale zdaje się że po wyświetlaniu napisu powitalnego jest za niedługo komunikacja z pcf'em.
Bdajże tu jest pierwsza rozmowa:
Moja strona w powijakach
Dzieki za odpowiedz
Dzieki za odpowiedz
Witam, czy muszą być 3
Witam, czy muszą być 3 czujniki podłączone aby pokazywało temp? Zarejestrowałem na kazdym wejsciu DS`a lecz dalej na wyświetlaczu mam -0.00
Witam, złożyłem sobie ten
Witam, złożyłem sobie ten sterownik i mam problem. Chce zarejestrować czujniki temp. wciskam odpowiednią kombinacje przycisków pojawia się napis dla danego czujnika ale nie wyświetla się temperatura. Co może być przyczyną że tak się dzieje?? Dodam że czujniki temp są sprawne bo sprawdziłem je w innym układzie.
Zarejestrowałeś je
Zarejestrowałeś je pojedynczo? Przy rejestracji moze być tylko 1 czujnik wsadzony. I sprawdz jeszcze czy nie pomyliłeś rezystorów R1 z R14 lub czy R14 dałeś dobrą wartość. Ja niestety miałem taka pomyłke i mialem ten sam problem bo z opisu montowania elementów można sobie pomylić te rezystory.
Jasność LCD
Czy istniej możliwość sterowania wyświetlaczem tak aby w stanie "uśpienia" też był podświetlony na 20-30% mocy?
Krzysiek
ja podświetliłem swój LCD
ja podświetliłem swój LCD przez osobny rezystor, podłączyłem rezystor nastawny i nim zasiliłem podświetlenie w stanie uśpienia, przy zadowalającym poziomie podświetlenia zmierzyłem jego oporność i od strony druku podłączyłem malutki rezystorek i jest ok.ze dwa lata :)
Pozdrawiam.
ja podświetliłem swój LCD
ja podświetliłem swój LCD przez osobny rezystor, podłączyłem rezystor nastawny i nim zasiliłem podświetlenie w stanie uśpienia, przy zadowalającym poziomie podświetlenia zmierzyłem jego oporność i od strony druku podłączyłem malutki rezystorek i jest ok.ze dwa lata :)
Pozdrawiam
Re: LCD
Dziękuję Ci bardzo. Działa!
Krzysiek
Podświetlanie LCD
Panowie trzeba zaprzęgnąć PWM-a do podświetlania i zmienic w kodzie zamiast 0 i 1 wstawić odpowiedni parametr dla PWM-a a dla zaawansowanych i wielkość podswietlania w menu
Grzesiek - miasto Ostróda
GG 12372371 dom
tel 502812675 SMS
Czy mógłby Pan udostępnić
Czy mógłby Pan udostępnić schemat ale w pliku brd ??
Imex2 jak byś mógł to wrzuć
Imex2 jak byś mógł to wrzuć swój schemat w pliku brd i sch poniewarz potrzebuje obsługi szamba i chciałbym się zawzorowac troszkę :)
Udostępni pan ten plik brd i
Udostępni pan ten plik brd i sch???
Witam. Czy ma znaczenie gdzie
Witam. Czy ma znaczenie gdzie podepnę fazę a gdzie masę przy wejściu zasilania 230V ?
Re: Sterownik
Nie ma znaczenia z punktu widzenia działania ale zawsze podpina się tak żeby zero było na stałe podpięte do odbiornika a faza była podłączona do triaków
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.
przerobka na mega8
Witam!
Mam pytanko bo chcialbym zrobić ten sterownik ale na atmege8, wiem, że w tej formie sie nie zmieści ale gdyby zostawic tylko 1 Ds-a i wywalic alarmy to pewnie by sie udalo.
Próbowałem sił w tym temacie ale bascom ciągle mi wywala błedy jak pousuwam kawalki kodu odpowiedzialne za dsy i alarmy.domyślam się, że tez trzeba by zmienić częśc odpowiedzialną za odczyt zapis czujnikow.Niestety nadal raczkuje bo czasu mało na naukę.
p.s.
Mirku podpowiesz jak bezboleśnie odchudzić kod :)
pozdrowienia dla Wszystkich użytkowników
Tu można się wiecej dowiedzieć niż na elektrodzie
Piotrek
Re: Sterownik
Próbowałem usunąć cześć kodu ale nie jest to takie proste, szczególnie po takim okresie czasu od jego napisania.... po wywaleniu alarmów i tak się to nie zmieści w M8... brakuje jeszcze 0.5kB..... Polecam zastosowac M16, chyba że są jakieś inne przesłanki za M8 poza kosztem procesora
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.
Dzieki Mirley za odzew
Dzieki Mirley za odzew :)
Musze to koniecznie upchnąc na m8, myślałem aby usunąc Buzz Linia_no,Linia_nc oraz pozostawić tylko 1-ego DS-a to powinno wystaczyc aby upchnać na mniejszego procka.
Jak narazie ciagle sie ucze i jak widze jeszcze daleka droga do pisania dobrych programów jak ten.
Pozdrawiam
Piotrek
p.s.
jesli bedziesz miał chwilke to prosze pomóż
zmiana - dodanie flagi
Cześć
Jak pozmieniać żeby flaga była 1ms
pomijam ze potrzebne zmienne początkowe
$crystal = 16000000
Prescale = 256
dziękuję
Jeśli nie będzie problemu to może info jak uzyskać drobniej - mikrosekundy - np 100 (10 lub 1 ) us
wiem ze wtedy dla kwarcu 16MHz będzie inny preskaler
Grzesiek - miasto Ostróda
GG 12372371 dom
tel 502812675 SMS
Timer
Wykonanie dzielnika tak aby timer miał przerwanie co 1ms jest niemożliwe przy podzielniku 256 i kwarcu 16MHz. Przerwanie musiało by dzielić co 62,5 co jest niemożliwe. Można natomiast zrobić 400us wstawiając Timer0=231.
Ogólnie wzór jest prosty: Częstotliwość przerwania = Kwarc/preskaler/(256-X), gdzie X to wartość ładowana do timera (Timer0=X)
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.
Cześć MIrek
Zgodnie ze wzorem dlaczego wstawiasz 5 a nie 6 dla Timer0 ?? (4ms)
Grzesiek - miasto Ostróda
GG 12372371 dom
tel 502812675 SMS
Re: Timer
To jest błąd, powinno być 6... w wiekszoći przypadków nie ma to znaczenia ale jak zalezy nam na liczeniu dokładnym czasu to trzeba o to dbać
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.
Kalendarz
Sterownik zbudowany na podstawie tego opisu działa poprawnie już od ponad roku.
Ostatnio postanowiłem go rozszerzyć o kalendarz. Zgodnie z Twoim opisem PCF-a dorobiłem brakujące zmienne, ale niestety to nie działa.
Zapisywane poprawnie są dzień i miesiąc na swoich miejscach w "Dzien" i "Miesiac" ale rok i dzień tygodnia mają zawsze wartość "0".
Nawet próba zapisu na sztywno 31 grudnia 1 cz(3)
Dzien = &B01110001
Miesiac = &B01110010
prawidłowo ustawia 31 grudnia ale pozostałe rok i dzień tygodnia mają po zapisie wartość 0.
Czy jakaś inna część programu powinna jeszcze być zmodyfikowana? A może ktoś dorobił sobie taki działający kalendarz?
Krzysiek
Kalendarz
Ta..ak. Doczytałem w nocie katalogowej - należało wyłączyć maskowanie roku i dnia.
Krzysiek
centralka alarmowa
Witam, przepraszam ze tutaj, ale nie wiem gdzie skierować swoją proźbę.
Bardzo fajny i rozbudowany sterownik domu :).
poszukuję sterownika do czujnika ruchu cyfrowego NC i syreny arkustyczniej (zewnętrznej ).
I moja prośba do autora tego projektu kierowana czy znalazł by Pan troszkę czasu by zaprojektować lub nawet tylko napisać program do atmegi8 by działała jako centralka alarmowa program skromny by obsłużył czujnik ruchu NC po wykryciu ruchu uruchomił syrenę np. na 15min do tego dwa przyciski jeden do wyłączenia/ włączenia centralki a drugi do wcześniejszego wyłączenia alarmu przed upływem 15 min. ja próbowałem coś w tym kierunku pisać ale nic z tego nie wyszło :( a niechciał bym poprostu obciążać kogoś z tłumaczeniem co jest dobrze a co zle ze nie działa dlatego wolę poprosić o napisanie programu w ramach rozrywki do wieczornego piwka :) bardzo był bym wdzięczny . próbowałem coś wyciągnąc z tego listingu polecenia sterowania syreną i portem NC ale program za bogaty i sie gubię :) a praca mi nie pozwala na studiowanie książki bascom od podstaw . a podejrzewam ze taki program to Pan pisze z głowy jak listy miłosne :). Bardzo proszę.
przemcio18-19@o2.pl
gg 9800166
termostat
Mam zrobiony termostat, który po osiągnięciu pewnej temperatury wyłącza wentylatory. Musiałbym do tego dodać osobny tryb - praca czasowa. Wł wentylatorów na np 3min i później przez godzine przerwa i tak w kółko. Oczywiście czas ten musi być do zmiany. Dużo jest pracy aby do mojego kodu dodać to? I tak naprawdę od czego mam zacząć. Z góry dziękuję za pomoc ;)
czujniki temperatury + dlugi przewod
Witaj. Mam problem odnosnie czujnikow temperatury, na dlugosci kabla okolo 25m uklad nie wykrywa czujnikow, przewod jaki zastosowalem to skretka nie ekranowana, na mniejszych odleglosciach wszystko dziala dobrze.
Co zrobic by dzialalo na takiej odleglosci?
Z gory dziekuje za pomoc.
Odp. czujniki temperatury + długi przewód
Spróbuj dołożyć kondensator elektrolityczny przy czujniku. Ja telefonicznym kablem czterożyłowym to robiłem i wolnym przewodem steruje jeszcze jednym silnikiem na 12V (a masa wspólna z czujnikami). W momencie włączania silnika zrywało odczyty temperatury. Po wstawieniu kondensatora przy czujniku ustąpiło. To jak z tymi 100nF przy zasilaniu procesora i reszty...są tam nie bez powodu.
Miłego dnia :D
BARTek
Moja strona
Sprobuje... a co zmniejszenie
Sprobuje... a co zmniejszenie r14 pomoglo by cos?
A zmniejszenie R14 pomoglo by
A zmniejszenie R14 pomoglo by cos?
czujniki temperatury + dlugi przewod
A co dalo by zmniejszenie R14?
1WIRE - czujnik
Z ciekawości poczytałem. Dallas pisze że najmniejszy może być 1,5kOhm Szyna robi się przez to bardziej prądożerna ale odporniejsza na zakłócenia ale... Bezproblemowo powinna działać na jakimkolwiek kablu do 30metrów, dopiero powyżej rekomenduja użyć skrętki. Smigają dallasy nawet na 100 metrowych.
Druga rzecz która rzuciła się w oczy to konfiguracja 1WIRE w programie. We wszystkich przykładach jest "Config 1Wire = PORTD.7" a nie "PIND.7" (numer nieważny, chodzi o różnice PORT-PIN) Może kompilator to sobie przetwarza i działaja obydwie formy, niemniej w Helpie Bascoma jest PORT.
[edit]
Zapytałem u źródła i obydwie formy konfiguracji sa poprawne. Config PORT jest wersją oficjalną.
BARTek
Moja strona
zmiany w Alarmach
Witam !!
Panie Mirku miałbym taką prośbę proszę mnie oświecić co zmienić w Pana programie aby uzyskać w menu alarmów dodatkową opcję "uzbrajam alarm" i dopiero po określonym czasie alarm został uzbrojony na czuwanie.
Mam nadzieję że opisałem to zrozumiale.
Pozdrawiam i czekam na odpowiedź.
Odp. zmiany w Alarmach
Proszę kolego. Pod tym linkiem jest zmodyfikowany program. W programie była niewykorzystana do niczego zmienna Alarm_licz. W Bascom można po skompilowaniu programu nacisnąć taką ikonkę "kalkulatora" i to wyświetla takie podsumowanie. Na jego samym dole wyświetają się zadeklarowane, a nieużywane zmienne. Przydatne gdy szukamy oszczędności ;)
Wykorzystałem więc tą zmienną (która pewnie miała służyć za licznik alarmów) do odmierzania czasu do uzbrojenia.
Do testów czas został ustalony na 10 sekund. Żeby go zmienić znajdź na początku listingu zapis:
Nie masz tam czasu na wyłączenie alarmu...ale może dasz rade jak porównasz kody :D
Miłego dnia.
BARTek
Moja strona
Odp. zmiany w Alarmach
Witam !!
Do kolegi "EDC" Bartek
Wielkie dzięki Kolego , nawet nie wiesz jak mi pomogłeś !!
resztę programu miałem napisaną wraz z czesem na wejście (czas na wyłączenie Alarmu) i rozgraniczeniem lini opóźnionej i natychmiastowej, brakowało mi tylko "uzbrajania Alarmu."
Jestem Ci bardzo wdzięczny , wreszcie mogę ten projekt zamknąć.
Mam dług wdzieczności.
Pozdrawiam serdecznie , Miłego dnia.
Marek
Brak reakcji
Witam.
Na moim sterowniku po podłączeniu wyświetla tylko "Sterownik Domowy Wersja 1.05" i jest brak jakiejkolwiek reakcji na przyciski.
Czujniki temp można poprawnie zalogować i nic więcej.
Zwarcia i połączenia sprawdzałem.
Problem rozwiązałem wgrywając program z jednym termostatem.
Wykonanie płytki
Witam
Czy mógłby ktoś odpłatnie wykonać taką płytkę?
Pozdrawiam wszystkich
Mirku ... czy masz czas i
Mirku ... czy masz czas i jesteś w stanie powiedzieć co w jakich sekcjach trzeba zmienić/dodać by "dobudować" do sterownika dodatkowe sterowanie triaków Tr4 i Tr5 na takiej samej zasadzie jak Tr2 i Tr3??
Pozdrawiam
Robert