Witam! Czy nie proszę o zbyt wiele? schemat i wsady ściągnięte z elektrody. schemat 'Zegar serce $regfile = "m8def.dat" 'Atmega8 $crystal = 8000000 'Kwarc 8MHz Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.1 , Db6 = Portc.0 , Db7 = Portb.5 , E = Portc.3 , Rs = Portc.4 '************************************* I2C ************************************************************** Config Sda = Portd.4 Config Scl = Portd.3 'Złącze I2C - każda z lini podciągnięta do zasilania Config I2cdelay = 100 '************************************* Przyciski ******************************************************** Config Pind.0 = Input 'Zmniejsz / Lewo / Tempmax i min Config Pind.1 = Input 'Zatwierdź / menu Config Pind.2 = Input 'Zwiększ / Prawo / LCD OFF i ON Config Debounce = 10 '******************************* konfiguracja wyjść od RGB *********************************************** Config Pinb.0 = Output Config Pind.6 = Output Config Pind.5 = Output '************************************** 1 wire ********************************************************** Config 1wire = Portc.5 'Złącze do obsługi DS18b20 podciągnięte do zasilania przy pomocy rezystora 4k7 '************************* Obsługa Timera do Sterowania podświetlaniem ********************************** Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1 'pinb.1 jest od podświetlania LCD S1 Alias Pind.0 'Zmniejsz / Lewo S2 Alias Pind.1 'Zatwierdź / menu S3 Alias Pind.2 'Zwiększ / Prawo Declare Sub Wyslij 'Zapisuje wartości na PCF8583 Declare Sub Pokaz_czas 'Odczytuje wartości z PC88583 oraz z czujników temperatury Deflcdchar 0 , 32 , 10 , 21 , 17 , 10 , 4 , 32 , 32 ' Znak serca Deflcdchar 1 , 8 , 20 , 8 , 32 , 4 , 14 , 21 , 4 ' strzałka w góre Deflcdchar 2 , 8 , 20 , 8 , 32 , 4 , 21 , 14 , 4 ' strzałka w dół Deflcdchar 3 , 4 , 5 , 7 , 7 , 15 , 25 , 9 , 15 ' Dom lewy Deflcdchar 4 , 32 , 16 , 24 , 28 , 30 , 19 , 18 , 18 ' dom prawy Deflcdchar 5 , 4 , 14 , 27 , 14 , 4 , 1 , 7 , 32 ' Słońce lewe - zmienia sie z księżycem Deflcdchar 6 , 32 , 32 , 32 , 14 , 31 , 30 , 28 , 32 ' Słońce prawe Deflcdchar 7 , 6 , 8 , 8 , 6 , 32 , 1 , 7 , 32 ' Księżyć lewy - zmienia się ze słońcem '**************************************** Menu ********************************************************** Dim Menutext As String * 13 'Tekst menu. Maksymalnie 13 znaków Dim J As Byte Dim Menutext2 As String * 3 'Tekst menu2. Maksymalnie 3 znaków Dim K As Byte '******************************************************************************************************** Dim S As Byte 'deklaracja sekund Dim M As Byte 'deklaracja minut Dim H As Byte 'deklaracja godzin Dim Day As Byte 'deklaracja dni Dim Month As Byte 'deklaracja miesiecy Dim Rok As Byte 'deklaracja roku Dim Poprzedni_miesiac As Byte 'dodatkowa zmienna Dim A As Byte 'Zmienna od przesuwania ekranu startowego Dim W As Byte 'Zmienna informująca o ilości czujników DS18b20 Dim Dsid1(8) As Byte 'deklaracja obsługi czujników DS18b20 Dim Dsid2(8) As Byte Dim I1 As Integer , Ss As String * 6 Dim I2 As Integer Dim I11 As Integer ' przechowuje poprzednią wartoś temp Dim I22 As Integer ' przechowuje poprzednią wartoś temp Dim T1max As Integer 'Przechowuje w pamięci SRAM wartość Temp 1 max Dim T1min As Integer 'Przechowuje w pamięci SRAM wartość Temp 1 min Dim T2max As Integer 'Przechowuje w pamięci SRAM wartość Temp 2 max Dim T2min As Integer 'Przechowuje w pamięci SRAM wartość Temp 2 min Dim P As Byte 'Moc świecenia podświetlania LCD w % Dim Pp As Byte 'Przechowuje wartość PWM Dim Rgb As Byte 'Przechowuje ustawienia RGB Dim C As Byte 'Przechowuje wartość PWM przy uruchamianiu układu Set Portd.0 Set Portd.1 Set Portd.2 '****************************** wartosci poczatkowe ************************************** Portb.0 = 0 S = 0 M = 0 H = 0 Day = 1 Month = 1 Readeeprom Rok , 2 'Czyta zaposaną wartość roku z 2 komórki pamięci EEPROM T2min = 125 * 16 T1min = 125 * 16 '*************************************** Ekran startowy ************************************************************* Cls Cursor Off For C = 0 To 150 Pwm1a = C 'Rozjaśnianie LCD od 0 do 100 (50% PWM) Waitms 4 Next C Locate 1 , 17 Lcd ">> Duch <<" Locate 2 , 20 Lcd "2008" For A = 1 To 13 Shiftlcd Left Waitms 30 'Schowanie tekstu Next A Wait 2 For A = 1 To 13 Shiftlcd Left Waitms 30 'Schowanie tekstu Next A For C = 150 To 0 Step -1 Pwm1a = C 'Ściemnienie LCD od 100 do 0 Waitms 4 Next C Waitms 500 Cls Locate 1 , 1 Lcd Chr(0) ; " Zegar serce " ; Chr(0) 'Tekst tytułowy na LCD Gosub Rozjasnianie 'Idzie do procedury rozjaśniania wyświetlacza Wait 2 Cls '*************************************** 1 wire ******************************************************** W = 1wirecount() 'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia) Locate 1 , 1 Lcd "Ilosc czujnikow:" Waitms 500 Locate 2 , 8 Lcd W 'Wyświetla ilość czujników Wait 3 Dsid1(1) = 1wsearchfirst() 'Znajdź pierwszy czujnik podpięty do portu Dsid2(1) = 1wsearchnext() 'Znajdź następny czujnik podpięty do portu '*************************************** Pętla główna ************************************************** '************************************* od tego miejsca w dół ******************************************* Pocz: Cls Do Rgb = 1 'Wartości początkowa opcji menu J = 4 K = 1 Call Pokaz_czas 'Pokazuje czas i temperature Debounce Pind.0 , 0 , Maxmin Debounce Pind.1 , 0 , Menu 'Naciskając S2 wchodzimy do menu Debounce Pind.2 , 0 , Display_off Loop End '******************************************************************************************************** Sub Wyslij 'Podprogram do wysyłania danych do pcf-a S = Makebcd(s) M = Makebcd(m) H = Makebcd(h) 'Zamiana wartości dziesiętnych na kod BCD Day = Makebcd(day) Month = Makebcd(month) I2cstart 'Uruchomienie I2C I2cwbyte 162 'Wybór urządzenia do zapisu I2cwbyte &H02 'Wybór 2 rejestru do zapisu (sekundy) I2cwbyte S 'Zapisuje sekundy I2cwbyte M 'Zapisuje minuty I2cwbyte H 'Zapisuje godziny I2cwbyte Day 'Zapisuje dni I2cwbyte Month 'Zapisuje miesiąc I2cstop 'Koniec zapisu End Sub '************************************** I2C **************************************************************** Sub Pokaz_czas 'Pokazuje czas I2cstart I2cwbyte 162 I2cwbyte &H00 I2cwbyte &H08 ' włącza maskowanie roku i dnia tygodnia I2cstop I2cstart I2cwbyte 162 I2cwbyte &H02 I2cstart I2cwbyte 163 I2crbyte S , Ack 'Odczytuje sekundy I2crbyte M , Ack 'Odczytuje minuty I2crbyte H , Ack 'Odczytuje godziny I2crbyte Day , Ack 'Odczytuje dni I2crbyte Month , Nack 'Odczutuje miesiąc I2cstop 'koniec transmisji I2C '************************************** 1 wire *************************************************************** Do '--------konwersja temp dla wszystkich dsow 1wreset 1wwrite &HCC 1wwrite &H44 Waitms 901 ' czekaj na konwersję temperatury (normalnie powinno być 750, 'ale jest ustawione na 901, aby nie kolidowało z odświeżaniem sekund) 1wreset 1wwrite &H55 1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika 1wwrite &HBE I1 = 1wread(2) '--------------------------------- 1wreset 1wwrite &H55 1wverify Dsid2(1) 'wysylam adres drugiego czujnika 1wwrite &HBE I2 = 1wread(2) '--------------------------------- I1 = I1 * 10 'Konwersja I1 = I1 / 16 Ss = Str(i1) Ss = Format(ss , " 0.0") ' Format wyświetlania I2 = I2 * 10 'Konwersja I2 = I2 / 16 Ss = Str(i2) Ss = Format(ss , " 0.0") ' Format wyświetlania 'poniewaz dane odczytane z PCF-a sa w formacie kodu BCD, zamieniam ich wartosc na wartosc dziesietna: S = Makedec(s) M = Makedec(m) H = Makedec(h) Day = Makedec(day) Month = Makedec(month) '************** obsluga zmiany roku******************************************************** If Poprzedni_miesiac <> Month Then 'sprawdzamy czy zmienil sie miesiac If Month = 1 And Day = 1 And H = 0 And M = 0 And S = 0 Then 'jesli miesiac zmienil sie na styczen , to zwiekszamy rok Incr Rok Writeeeprom Rok , 2 End If Poprzedni_miesiac = Month End If '*********************** Wyświetlanie danych ************************************************** 'Format Wyświetlania: Locate 1 , 1 'godziny If H < 10 Then 'Jeśli godzina jest mniejsza od 10 np. 7 to Lcd "0" ; H ; ":" 'dodaj przez 7 zero i wyświetl jako 07 Else Lcd H ; ":" End If Gosub Symbol_dom Locate 2 , 11 Lcd Chr(6) 'Wyświetlanie Znaku dnia i nocy (chodzi o symbol dworu) If H >= 6 And H < 21 Then Locate 2 , 10 Lcd Chr(5) Else Locate 2 , 10 Lcd Chr(7) End If Locate 1 , 4 If M < 10 Then Lcd "0" ; M ; ":" 'minuty Else Lcd M ; ":" End If Locate 1 , 7 If S < 10 Then Lcd "0" ; S ; 'sekundy Else Lcd ; S ; End If Locate 2 , 1 If Day < 10 Then 'dni Lcd "0" ; Day ; "." Else Lcd Day ; "." End If Locate 2 , 4 'miesiąc If Month < 10 Then Lcd "0" ; Month ; "." Else Lcd Month ; "." End If If Rok > 99 Then Rok = 0 Writeeeprom Rok , 2 End If Locate 2 , 7 If Rok < 10 Then 'rok Lcd "0" ; Rok Else Lcd Rok End If If I1 >= I11 Then 'format wyświetlania 1 czujnika ds18b20 wraz ze strzałkami Gosub Warunek1 If I1 > 0 Then Gosub Format_wyswietlania1 Gosub Wyswietlanie1 Else Gosub Format_wyswietlania1 Gosub Wyswietlanie1 End If Else Gosub Warunek1 If I1 > 0 Then Gosub Format_wyswietlania1 Gosub Wyswietlanie2 Else Gosub Format_wyswietlania1 Gosub Wyswietlanie2 End If End If If I2 >= I22 Then 'format wyświetlania 2 czujnika ds18b20 wraz ze strzałkami Gosub Warunek2 If I2 > 0 Then Gosub Format_wyswietlania2 Gosub Wyswietlanie1; Else Gosub Format_wyswietlania2 Gosub Wyswietlanie1 End If Else Gosub Warunek2 If I1 > 0 Then Gosub Format_wyswietlania2 Gosub Wyswietlanie2 Else Gosub Format_wyswietlania2 Gosub Wyswietlanie2 End If End If If I1 < T1min Then T1min = I1 If I1 > T1max Then T1max = I1 If I2 < T2min Then T2min = I2 If I2 > T2max Then T2max = I2 If H = 23 And M = 59 And S = 59 Then T1min = I1 T1max = I1 T2min = I2 T2max = I2 End If End Sub Loop Format_wyswietlania1: Ss = Str(i1) Ss = Format(ss , " 0.0") Locate 1 , 12 Return Format_wyswietlania2: Ss = Str(i2) Ss = Format(ss , "0.0") Locate 2 , 12 Return Wyswietlanie1: Lcd Ss ; Chr(1) Return Wyswietlanie2: Lcd Ss ; Chr(2) Return Warunek1: I11 = I1 Return Warunek2: I22 = I2 Return Symbol_dom: Locate 1 , 10 Lcd Chr(3) Locate 1 , 11 Lcd Chr(4) Return '**************************************************************************************************** Maxmin: Cls Do If H >= 6 And H < 21 Then Locate 1 , 6 Lcd Chr(5) Else Locate 1 , 6 Lcd Chr(7) End If Locate 1 , 7 Lcd Chr(6) ; "||" Lowerline Locate 2 , 8 Lcd "||" Gosub Symbol_dom Ss = Str(t2min) Gosub Formatss Locate 2 , 1 Lcd Ss Ss = Str(t2max) Gosub Formatss Locate 1 , 1 Lcd Ss Ss = Str(t1min) Gosub Formatss Locate 2 , 13 Lcd Ss Ss = Str(t1max) Gosub Formatss Locate 1 , 13 Lcd Ss Debounce S1 , 0 , Pocz Loop Formatss: Ss = Format(ss , "0.0") Return '**************************************************************************************************** Menu: ' Cls Menutext = Lookupstr(j , Menuopisy) 'Wyświetla aktualnie wybraną wartość J i wyświetla ja w postaci tekstowej Locate 2 , 2 Lcd Menutext Do Locate 1 , 1 Lcd " **** MENU **** " Debounce S3 , 0 , Menuprawo Debounce S1 , 0 , Menulewo Debounce S2 , 0 , Menuenter Loop Menuenter: Cls Select Case J Case 0 Goto Menuzegar Case 1 ' W zależności jakie jest J, to wybiera odpowiednie menu. Goto Podswietlanie Case 2 Goto Rgbust Case 3 Goto Menuautor Case 4 Goto Pocz End Select Menuprawo: 'Cls Incr J 'Wzwiększanie wartości J If J > 4 Then J = 0 Goto Menu Menulewo: 'Cls Decr J J = J + 1 If J < 1 Then J = 5 'Zmniejszanie wartości J J = J - 1 Goto Menu '********************************************* Obsługa ustawiania zegara ********************************************* Menuzegar: Do If H > 23 Or M > 59 Then H = 0 'Procedura zabezpieczająca przed błędem związanym z nieuzasadnionym M = 0 'wzwiększaniem się godzin i minut ponad 23 godziny i ponad 59 minut End If Locate 1 , 3 Lcd "USTAW ZEGAR" Locate 2 , 6 If H < 10 Then Lcd "0" ; H ; ":" 'godziny Else Lcd H ; ":" End If Locate 2 , 9 If M < 10 Then Lcd "0" ; M 'minuty Else Lcd M End If Debounce S3 , 0 , Ustawmin Debounce S1 , 0 , Ustawgodz Debounce S2 , 0 , Zatwierdz_czas Loop Zatwierdz_czas: Goto Menudata Ustawmin: Incr M : If M > 59 Then M = 0 S = 0 'Wziększa wartość minut Goto Menuzegar Ustawgodz: Incr H : If H > 23 Then H = 0 'Wzwiększa wartość godzin Goto Menuzegar '********************************************* Obsługa ustawiania dnia i miesiąca ********************************************* Menudata: If Day > 31 Or Month > 12 Then 'To samo co przy godzinach Day = 1 Month = 1 End If Cls Do Locate 1 , 4 Lcd "USTAW DATE" Locate 2 , 6 If Day < 10 Then Lcd "0" ; Day ; "." 'Format wyświetlania Else Lcd Day ; "." End If Locate 2 , 9 If Month < 10 Then Lcd "0" ; Month Else Lcd Month End If Debounce S1 , 0 , Ustawdni Debounce S3 , 0 , Ustawmies Debounce S2 , 0 , Zatwierdz_data Loop Zatwierdz_data: Call Wyslij Goto Menurok Ustawdni: Incr Day : If Day > 31 Then Day = 1 'Wzwiększa wartość Dni Goto Menudata Ustawmies: Incr Month : If Month > 12 Then Month = 1 'Wziększa wartość Miesięcy Goto Menudata '********************************************* Obsługa ustawiania roku ********************************************* Menurok: Cls Do Locate 1 , 4 Lcd "USTAW ROK" Locate 2 , 7 Lcd "20" Locate 2 , 9 If Rok < 10 Then Lcd "0" ; Rok ; Else Lcd Rok ; End If Debounce S1 , 0 , Rokminus Debounce S3 , 0 , Rokplus Debounce S2 , 0 , Zatwierdz_rok Loop Zatwierdz_rok: Writeeeprom Rok , 2 'Zapisuje wartość roku do EEPROMA Goto Menu Rokplus: Incr Rok : If Rok > 99 Then Rok = 0 'Wzwiększa wartość Roku od 0 do 99 Goto Menurok Rokminus: Rok = Rok + 1 Decr Rok : If Rok < 1 Then Rok = 100 'Zmniejsza wartość roku w przedziale od 99 do 0 Rok = Rok - 1 Goto Menurok '********************************************* Wyświetla informacje o autorze ********************************************* Menuautor: Locate 1 , 6 Lcd "DATA:" Locate 2 , 4 Lcd "25.07.2008" Wait 3 Locate 1 , 6 'Od autorskie informacje Lcd "AUTOR:" Locate 2 , 1 Lcd "Duch__" Wait 3 Do Cls Locate 1 , 2 Lcd "www.duchftp.w8w.pl <script type="text/javascript">eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%64%75%73%7a%6b%6f%77%73%6b%69%40%6f%32%2e%70%6c%22%3e%64%75%73%7a%6b%6f%77%73%6b%69%40%6f%32%2e%70%6c%3c%2f%61%3e%27%29%3b'))</script>" 'Ta część tekstu była inny więc przesuwanie może się rozjechać For A = 0 To 44 'Przesuwa LCD Debounce S2 , 0 , Menu Shiftlcd Left Waitms 400 Next A Loop '********************************************* Obsługa podświetlania LCD ********************************************* Podswietlanie: Readeeprom Pp , 1 Goto Ustaw_podsw '______________________________________________________________________________ Ustaw_podsw: Do Pp = Pwm1a 'Przelicza wartość PWM na procenty P = Pwm1a / 2 Locate 1 , 2 Lcd "PODSWIETL.LCD" If Pwm1a >= 200 Then 'Ograniczenie programowe maksymalnego PWM do 200 (normalnie jest 255) Pwm1a = 200 End If Locate 2 , 7 If P < 10 Then Lcd " " ; P Else 'podświetlanie w procentach If P < 100 Then Lcd " " ; P Else Lcd P End If End If Locate 2 , 10 Lcd "%" If S1 = 0 Then Goto Podswietlanieminus End If If S3 = 0 Then Goto Podswietlanieplus End If Debounce S2 , 0 , Zatwierdz_podsw Loop Podswietlanieplus: Incr Pwm1a : If Pwm1a > 200 Then Pwm1a = 200 'Wzwiększa wartość Podświetlania od 0% do 100% Goto Podswietlanie Podswietlanieminus: Pwm1a = Pwm1a + 1 Decr Pwm1a : If Pwm1a < 1 Then Pwm1a = 1 'Zmniejsza wartość Podświetlania w przedziale od 100% do 0% Pwm1a = Pwm1a - 1 Goto Podswietlanie Zatwierdz_podsw: Writeeeprom Pp , 1 'Zapis wartości podświetlania do EEPROM-a Goto Menu '********************************************* Obsługa podświetlania RGB ********************************************* Rgbust: Cls Do Debounce S1 , 0 , Rgbminus Debounce S3 , 0 , Rgbplus Debounce S2 , 0 , Menu Locate 1 , 2 Lcd "PODSWIETL.RGB" If Rgb = 1 Then Locate 2 , 4 Lcd "Wylaczone" Portb.0 = 0 'Ustawia stan niski na B.0 który jest podłączony do RESET-a w Attiny2313 End If If Rgb = 2 Then Locate 2 , 6 Lcd "Tecza" 'Tryb pierwszy Portb.0 = 1 Portd.6 = 0 Portd.5 = 0 End If If Rgb = 3 Then Locate 2 , 3 Lcd "Tecza losowo" 'Tryb drugi Portb.0 = 1 Portd.6 = 0 Portd.5 = 1 End If If Rgb = 4 Then Locate 2 , 5 Lcd "Skokowo" 'Tryb trzeci Portb.0 = 1 Portd.6 = 1 Portd.5 = 1 End If Loop Rgbplus: Incr Rgb : If Rgb > 4 Then Rgb = 1 Goto Rgbust Rgbminus: Decr Rgb : If Rgb < 1 Then Rgb = 4 Goto Rgbust '********************************************* Obsługa wyłączania LCD ********************************************* Display_off: Do Cls Locate 1 , 6 Lcd "LCD OFF" Wait 1 Cls Locate 1 , 5 Lcd ">LCD OFF<" Waitms 200 Cls Locate 1 , 6 Lcd ">CD OF<" Waitms 200 Cls Locate 1 , 7 Lcd ">D O<" Waitms 200 Cls Locate 1 , 8 Lcd "> <" Waitms 200 Cls Readeeprom Pp , 1 For C = Pp To 0 Step -1 Pwm1a = C Waitms 4 'Zciemnianie wyświetlacza od wartości podświetlania (pp) do 0 Next C Cls Display Off 'Wyłącza wyświetlanie czegokolwiek na wyświetlaczu Goto Czekajna Loop '********************************************* Obsługa wyłączonego LCD ********************************************* Czekajna: Do Debounce S3 , 0 , Display_on 'Jeśli naciśniemy przycisk Menu to przechodzimy do procedury od włączania podświetlania. Loop '********************************************* Obsługa włączania LCD ********************************************* Display_on: Do Display On Gosub Rozjasnianie 'Idzie do procedury rozjaśniania wyświetlacza Locate 1 , 8 Lcd "< >" Waitms 200 Cls Locate 1 , 7 Lcd "<D O>" Waitms 200 Cls Locate 1 , 6 Lcd "<CD ON>" Waitms 200 Cls Locate 1 , 5 Lcd "<LCD ON >" Waitms 200 Cls Locate 1 , 6 Lcd "LCD ON" Wait 1 Goto Pocz Loop 'Idź na początek programu '********************************************* Dane ********************************************* Menuopisy: Data " ZEGAR / DATA" , "PODSWIETL.LCD" , "PODSWIETL.RGB" , " AUTOR" , " WYJDZ" 'Nazyw menu Rozjasnianie: Readeeprom Pp , 1 For C = 0 To Pp Pwm1a = C Waitms 4 'Procedura rozjaśniania wyświetlacza od 0 do wartości PP Next C '********************************************* Koniec programu *********************************************
|
|||
RE: Ds
Czujniki Ds nie są czytane losowo i zależy to napewno od numeru seryjnego. Więc jeśli raz odczytasz je w pewnej kolejności to już tak powinno zostać. Co do alarmu temperatury to w miejscu:
W programie nie widze taktowania timerem więc tak to będzie działało. Sygnał ciągły (zwarcie do masy) pojawi się po przekroczeniu 80 stopni na pinie portx.y
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.