Zegar z NTP i budzikiem
: 23 paź 2020, 22:44
Hej,
Potrzebuję Wszej pomocy z zegarkiem
Wrzuciłem kilka kodów z forum do miksera, zmiksowałem i wyszedł mi zegar: Wszytko jest prawie OK, ale nie mogę sobie poradzić z kilkoma funkcjami, ale może od początku....
To jest mój teraźniejszy kod:
Założenia:
1. sprzęt
a) uC ATmega328 + rezonator kwarcowy 16MHz - chwilowo jest 11.0592MHz
b) ESP8266-01 - w końcu do czegoś je wykorzystam
c) LCD 20x4
d) RTC DS3231
e) buzzer
f) jeden przycisk
2. wymagania
a) zegar
b) data
c) dzień tygodnia
d) budzik
e) czas pobierany z Internetu
f) temperatura
g) ciśnienie atmosferyczne
h) zapis ustawień do eeprom
3. działanie
a) czas i data synchronizowane z NTP
b) obsługa wszystkiego jednym guzikiem:
- gdy zegar jest w trybie "normalnym" to guzikiem gdy jest alarm można go wyłączyć
- gdy zegar jest w trybie "normalnym" to przytrzymaniu guzika przechodzimy do ustawień alarmu, a tam ustawiamy czy włączyć alarm, godzinę alarmu i dzień tygodnia w których alarm ma wystąpić
- gdy zegar jest w trybie konfiguracji to każde dłuższe przytrzymanie guzika przełącza na kolejną pozycję do ustawień
- gdy zegar jest w trybie konfiguracji to krótkie naciśnięcia zwiększają lub przełączają ustawianą pozycję
- gdy zegar jest w trybie konfiguracji i długimi naciśnięciami przejdziemy wszystkie ustawienia to następuje zapis ustawień i powrót do głównego ekranu
- gdy przejdziemy do trybu konfiguracji, a nie zostanie naciśnięty przycisk przez ustalony czas to nastąpi powrót do głównego ekranu
No i teraz problemy:
1. w jaki sposób zapisać dni tygodnie kiedy działać ma alarm?
2. jak sobie poradzić z temperaturą i ciśnieniem atmosferycznym - dokładnie to chciałbym to zrobić tak, że za pomocą ESP przesyłam dane do zegara lub zegar pyta o dane. W domu mam serwer gdzie gromadzę dane z zewnętrznej stacji meteo, a teraz chciałbym te dane zobaczyć na LCD
3. jak sterować podświetleniem aby w nocy nie waliło po gałach, a i w dzień można było coś zobaczyć
- fotorezystor pod LED LCD
- fotorezystor pod ADC i LED LCD sterować PWM
*z kontrastem myślę, że nie ma co kombinować i będzie potencjometr
4. Jest jeszcze jedna opcja o której sobie myślałem - skoro będzie ESP to może ustawiać jakoś budzik ze smartfona?
Miałem trochę problem z wyborem wyświetlacza, ale postawiłem na sprawdzoną konstrukcję. Najpierw chciałem dać małego OLEDa, ale to jednak trochę małe jest. Wyświetlacze graficzne czy graficzne kolorowe są fajne, ale to strasznie dużo pisania kodu,a ja nie czuję się na siłach.
Z góry dziękuję za pomoc.
Piotrek
PS
Mam nadzieję, że wyrobię się z kodem, PCB i obudową do kwietnia bo to ma być prezent dla syna
Potrzebuję Wszej pomocy z zegarkiem
Wrzuciłem kilka kodów z forum do miksera, zmiksowałem i wyszedł mi zegar: Wszytko jest prawie OK, ale nie mogę sobie poradzić z kilkoma funkcjami, ale może od początku....
To jest mój teraźniejszy kod:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Const Firmware = "0.1 2020"
- $regfile = "m328pdef.dat"
- $crystal = 11059200
- $swstack = 64
- $hwstack = 64
- $framesize = 200
- '--- deklaracja podprogramów
- Config Submode = New
- '--- TIMER
- Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
- Compare2a = 107 '10ms@11MHz/1024
- '--- UART ESP8266
- $baud = 115200
- Config Serialin = Buffered , Size = 100 ' from ESP8266
- 'Config Serialout0 = Buffered , Size = 100 ' to ESP8266
- 'Open "COM1:" For Binary As #1
- Echo Off
- $timeout = 3000
- '--- przycisk
- Config Portc.3 = Input : Set Portc.3 : Sw Alias Pinc.3
- '--- głośnik
- Buzz Alias Portc.2 : Config Buzz = Output 'buzzer
- '--- konfiguracja sprzętowego TWI (I2C)
- $lib "i2c_twi.lbx"
- Config Sda = Portc.4
- Config Scl = Portc.5
- I2cinit
- Config Twi = 400000
- '--- konfiguracja LCD
- Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
- Config Lcd = 20x4
- Cursor Off , Noblink
- Cls
- '--- deklaracja znakow LCD
- Deflcdchar 0 , 32 , 32 , 4 , 14 , 14 , 4 , 32 , 32 ' dwukropek
- Deflcdchar 1 , 28 , 24 , 32 , 32 , 32 , 32 , 24 , 28 ' prawy naroznik
- Deflcdchar 2 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32 ' gorna kreseczka
- Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31 ' dolna kreseczka
- Deflcdchar 4 , 31 , 31 , 32 , 32 , 32 , 32 , 31 , 31 ' dwie kreseczki
- Deflcdchar 5 , 28 , 30 , 30 , 30 , 30 , 30 , 30 , 28 ' prawa belka
- Deflcdchar 6 , 7 , 15 , 15 , 15 , 15 , 15 , 15 , 7 ' lewa belka
- Deflcdchar 7 , 7 , 3 , 32 , 32 , 32 , 32 , 3 , 7 ' lewy naroznik
- '--- konfiguracja DS3231
- Config Clock = User
- Config Date = Dmy , Separator = /
- Const Ds3231w = &HD0
- Const Ds3231r = &HD1
- 'wpisuje do DS-a "pierdoły" żeby było widać pierwszą synchronizację
- 'Time$ = "00:00:00"
- 'Date$ = "01-01-20"
- '--- zegar
- Dim Date_str As String * 15
- Dim Pierwsza , Druga , Trzecia , Czwarta As Byte
- Dim Linia_g(10) , Linia_d(10) As String * 3
- Dim Mig As Bit
- '--- budzik
- Dim Budzik_alarm As Byte
- Dim Budzik_godzina As Byte , Budzik_godzina_ee As Eram Byte
- Dim Budzik_minuta As Byte , Budzik_minuta_ee As Eram Byte
- Dim Budzik As Byte , Budzik_ee As Eram Byte
- '--- czas
- Dim 100ms , 500ms , 1s As Byte ', 1m As Byte
- '--- NTP
- Const Nastepny_odczyt_ntp = 3600 'synchronizacja czasu co godzinę
- Const Letni = "AT+GMT=1"
- Const Zimowy = "AT+GMT=0"
- Okay Alias 1
- Error Alias 2
- Dim Timeout As Byte ,
- Dim Sys_sec As Long , No_ntp , Ntp_progress As Byte
- Dim Wait_start As Byte ,
- Dim Got_time , Net_status , Wait_answear As Byte
- Dim Got_match As Byte , Inp_str1 As String * 100 , Char , Idx As Byte ', Helpb As Byte
- Dim Answear , Insp As Byte
- Dim Weekday , Old_day As Byte , Weekday_str As String * 10
- Dim Timestr As String * 10
- Dim Tt(4) As String * 1
- Dim Ss(4) As Byte
- Dim L1 As Long At Ss Overlay 'Nałóż długą zmienną na otrzymany ciąg
- Dim L2 As Long 'z nakładką nie musisz przenosić z tablicy bajtów do długiej zmiennej
- Dim Odczekaj_czas As Word
- Dim Info_timeout As Byte
- Dim Daylight_saving As String * 10
- '--- MENU
- Dim Menu As Byte
- Dim Tryb As Byte
- Dim Czas_menu As Byte
- '--- przycisk
- Const Sw_dlugi = 1
- Const Sw_krotki = 2
- Dim Licz As Byte
- Dim Key As Byte
- '--- EEPROM
- Dim Helpx As Byte
- Dim Ee_check As Eram Byte
- '--- tablica na duże cyfry
- 'Cyfra 0
- Linia_g(10) = "{006}{002}{005}"
- Linia_d(10) = "{006}{003}{005}"
- 'Cyfra 1
- Linia_g(1) = "{032}{005}{032}"
- Linia_d(1) = "{032}{005}{032}"
- 'Cyfra 2
- Linia_g(2) = "{007}{004}{005}"
- Linia_d(2) = "{006}{003}{003}"
- 'Cyfra 3
- Linia_g(3) = "{002}{004}{005}"
- Linia_d(3) = "{003}{003}{005}"
- 'Cyfra 4
- Linia_g(4) = "{006}{003}{005}"
- Linia_d(4) = "{032}{032}{005}"
- 'Cyfra 5
- Linia_g(5) = "{006}{004}{001}"
- Linia_d(5) = "{003}{003}{005}"
- 'Cyfra 6
- Linia_g(6) = "{006}{004}{001}"
- Linia_d(6) = "{006}{003}{005}"
- 'Cyfra 7
- Linia_g(7) = "{006}{002}{005}"
- Linia_d(7) = "{032}{032}{005}"
- 'Cyfra 8
- Linia_g(8) = "{006}{004}{005}"
- Linia_d(8) = "{006}{003}{005}"
- 'Cyfra 9
- Linia_g(9) = "{006}{004}{005}"
- Linia_d(9) = "{003}{003}{005}"
- Sub Ntp_dst_correction
- 'Dont change order of time and date variables !!! This order is required for Date/Time functions used.
- 'this routine is orginated by framuel
- Local Second As Byte
- Local Minute As Byte
- Local Hour As Byte
- Local Day As Byte
- Local Month As Byte
- Local Year As Byte
- Local Dow As Byte 'Day of week
- Day = Date(l2) 'set 3 variables: Day, Month, Year, so Year contains now current year
- 'DST starts at the last sunday of March, so let's see what weekday the 1st of April is
- Month = 4
- Day = 1
- Hour = 2
- Minute = 0
- Second = 0
- Dow = Dayofweek(day) '0 = Monday to 6 = Sunday
- Day = 31 - Dow 'Now count back the days until last sunday
- Month = 3 'and set month to March
- If L2 >= Syssec(second) Then
- 'DST ends at the last sunday of October, so let's see what weekday the 1st of November is
- Day = 1
- Month = 11
- Dow = Dayofweek(day) '0 = Monday to 6 = Sunday
- Day = 31 - Dow 'Now count back the days until last sunday
- Month = 10 'and set month to October
- Locate 3 , 1
- If L2 < Syssec(second) Then 'jeśli data w sysec mniejsza od aktulnej to jest lato
- L2 = L2 + 3600 '7200
- 'Lcd "Sumer Time"
- Else
- L2 = L2 + 0 '3600
- 'Lcd "Winter Time"
- End If
- End If
- End Sub
- '--- pierwsze programowanie eeprom
- Helpx = Ee_check
- If Helpx <> 0 Then 'jezeli eeprom nie była programowana
- Ee_check = 0 'ustaw, że już programowana
- 'wartości domyślne
- Budzik_godzina_ee = 7
- Budzik_minuta_ee = 0
- Budzik_ee = 0
- End If
- '--- wczytaj dane
- Budzik_godzina = Budzik_godzina_ee
- Budzik_minuta = Budzik_minuta_ee
- Budzik = Budzik_ee
- Tryb = 0
- '--- powitanie
- Gosub Powitanie 'wyswietl powitanie
- Waitms 500
- For Helpx = 1 To 20 'licz kroki włączenia buzzera
- Locate 2 , Helpx : Lcd Chr(161)
- Waitms 120 'odczekaj
- Next
- Waitms 500
- Set Buzz 'wydaj dzwiek
- Waitms 20
- Reset Buzz 'wyłącz buzzer
- Cls 'wyczyść ekran
- Gosub Ekran_glowny 'wczytaj ekran główny
- Enable Interrupts 'włącz golobalne przerwania
- Print "AT+RST" 'restart ESP8266
- Do
- If Tifr2.ocf2a = 1 Then 'minęło 10ms - flagę ustawia Timer
- Tifr2.ocf2a = 1 'kasuj flagę
- Gosub Sprawdz_przycisk 'sprawdz czy przycisk został wciśnięty
- If 100ms < 9 Then 'odlicz 100ms
- Incr 100ms
- Else 'minęło 100ms
- 100ms = 0 'kasuj licznik 100ms
- Reset Buzz 'wyłącz buzzer
- If Net_status = 1 Then
- If No_ntp = 1 Then
- Select Case Ntp_progress
- Case 1
- Print "AT+CIPMUX=1"
- Incr Ntp_progress
- Case 2
- Select Case Answear
- Case Okay
- 'Waitms 200
- Print "AT+CIPSTART=1," ; Chr(34) ; "UDP" ; Chr(34) ; "," ; Chr(34) ; "193.67.79.202" ; Chr(34) ; ",37"
- Incr Ntp_progress
- Case Error
- End Select
- Case 3
- Select Case Answear
- Case Okay
- Print "AT+CIPSEND=1,3"
- Incr Ntp_progress
- Case Error
- End Select
- Case 4
- Select Case Answear
- Case Okay
- Print "X"
- Incr Ntp_progress
- Wait_answear = 5
- Case Error
- End Select
- Case 5
- If Answear > 0 Then
- Incr Ntp_progress
- End If
- Case 6
- If Wait_answear > 0 Then
- Decr Wait_answear
- If Got_time = 1 Then
- No_ntp = 0
- Print "AT+CIPCLOSE=1"
- Incr Ntp_progress
- End If
- Else
- Print "AT+CIPCLOSE=1"
- Incr Ntp_progress
- End If
- End Select
- End If
- End If
- Answear = 0
- If 500ms < 5 Then
- Incr 500ms
- Else
- 500ms = 0
- If Budzik_alarm = 1 Then Set Buzz
- End If
- If 1s < 9 Then
- Incr 1s
- Else
- 1s = 0
- Gosub Sprawdz_budzik
- If Tryb = 0 Then
- Gosub Getdatetime
- Gosub Dwukropek
- Else
- If Czas_menu > 0 Then
- Decr Czas_menu
- If Czas_menu = 0 Then
- Tryb = 0
- Gosub Ekran_glowny
- Locate 4 , 2 : Lcd Weekday_str
- End If
- End If
- End If
- If Info_timeout > 0 Then
- Decr Info_timeout
- If Info_timeout = 0 Then Old_day = 0
- End If
- If Old_day <> _day Then
- Old_day = _day
- Weekday = Dayofweek()
- Weekday_str = Lookupstr(weekday , Weekdays)
- If Tryb = 0 Then Locate 4 , 2 : Lcd Weekday_str
- End If
- If Odczekaj_czas > 0 Then Decr Odczekaj_czas
- If Odczekaj_czas = 0 Then
- No_ntp = 1
- Ntp_progress = 1
- Odczekaj_czas = 20
- End If
- End If
- End If
- End If
- If Key <> 0 Then
- Czas_menu = 5
- Select Case Tryb
- Case 0:
- If Key = Sw_dlugi Then
- Tryb = 1
- Menu = 0
- Gosub Ekran_menu
- End If
- Case 1
- If Key = Sw_dlugi Then
- Incr Menu
- If Menu > 10 Then
- Budzik_godzina_ee = Budzik_godzina
- Budzik_minuta_ee = Budzik_minuta
- Budzik_ee = Budzik
- Tryb = 0
- Gosub Ekran_glowny
- Locate 4 , 2 : Lcd Weekday_str
- End If
- End If
- Select Case Menu
- Case 0
- If Key = Sw_krotki Then
- Tryb = 0
- Gosub Ekran_glowny
- Locate 4 , 2 : Lcd Weekday_str
- End If
- Case 1
- If Key = Sw_krotki Then
- If Budzik = 0 Then
- Budzik = 1
- Else
- Budzik = 0
- End If
- End If
- Locate 2 , 2
- If Budzik = 1 Then
- Locate 2 , 2 : Lcd "Budzik" ; Chr(126) ; "TAK" ; Chr(127)
- Else
- Locate 2 , 2 : Lcd "Budzik" ; Chr(126) ; "NIE" ; Chr(127)
- End If
- Case 2
- Locate 2 , 8 : Lcd " "
- Locate 2 , 12 : Lcd " "
- If Key = Sw_krotki Then
- Incr Budzik_godzina
- If Budzik_godzina > 23 Then Budzik_godzina = 0
- End If
- If Budzik_godzina < 10 Then
- Locate 2 , 14 : Lcd Chr(126) ; "0" ; Budzik_godzina
- Else
- Locate 2 , 14 : Lcd Chr(126) ; Budzik_godzina
- End If
- Case 3
- Locate 2 , 14 : Lcd " "
- If Key = Sw_krotki Then
- Incr Budzik_minuta
- If Budzik_minuta > 59 Then Budzik_minuta = 0
- End If
- If Budzik_minuta < 10 Then
- Locate 2 , 18 : Lcd "0" ; Budzik_minuta ; Chr(127)
- Else
- Locate 2 , 18 : Lcd Budzik_minuta ; Chr(127)
- End If
- Case 4
- Locate 2 , 20 : Lcd " "
- Locate 4 , 1 : Lcd "^"
- Case 5
- Locate 4 , 1 : Lcd " "
- Locate 4 , 4 : Lcd "^"
- Case 6
- Locate 4 , 4 : Lcd " "
- Locate 4 , 7 : Lcd "^"
- Case 7
- Locate 4 , 7 : Lcd " "
- Locate 4 , 10 : Lcd "^"
- Case 8
- Locate 4 , 10 : Lcd " "
- Locate 4 , 13 : Lcd "^"
- Case 9
- Locate 4 , 13 : Lcd " "
- Locate 4 , 16 : Lcd "^"
- Case 10
- Locate 4 , 16 : Lcd " "
- Locate 4 , 19 : Lcd "^"
- End Select
- End Select
- Key = 0
- End If
- If Ischarwaiting() > 0 Then
- Char = Inkey()
- Select Case Char
- Case 10
- Case 13 : Got_match = 1
- Case Else
- Inp_str1 = Inp_str1 + Chr(char)
- Incr Idx
- If Idx > 99 Then Got_match = 1
- End Select
- End If
- If Got_match = 1 Then
- Got_match = 0
- If Inp_str1 <> "" Then
- Select Case Inp_str1
- Case "SEND OK"
- Answear = Okay
- Case "OK"
- Answear = Okay
- Case "ERROR"
- Answear = Error
- Case "WIFI GOT IP"
- Net_status = 1
- Case "WIFI CONNECTED"
- Case "WIFI DISCONNECT"
- Net_status = 0
- Case Else
- Insp = Instr(inp_str1 , ",CONNECT")
- If Insp > 0 Then Answear = Okay
- Insp = Instr(inp_str1 , "+IPD,1,4:")
- If Insp > 0 Then
- Timestr = Mid(inp_str1 , 10 , 4)
- Tt(1) = Mid(timestr , 4 , 1) 'from big endian to little endian
- Tt(2) = Mid(timestr , 3 , 1) 'swap the bytes
- Tt(3) = Mid(timestr , 2 , 1)
- Tt(4) = Mid(timestr , 1 , 1)
- Ss(1) = Asc(tt(1)) 'this is L1 split in 4s by overlay
- Ss(2) = Asc(tt(2))
- Ss(3) = Asc(tt(3))
- Ss(4) = Asc(tt(4))
- L2 = L1 + 1139297296
- Call Ntp_dst_correction
- Time$ = Time(l2) 'set the time
- Date$ = Date(l2) 'set the date
- Sys_sec = Syssec(time$ , Date$)
- Got_time = 1
- Odczekaj_czas = Nastepny_odczyt_ntp
- End If
- End Select
- End If
- Inp_str1 = ""
- Idx = 0
- End If
- Loop
- End
- '--- obsługa przycisku
- Sprawdz_przycisk:
- If Sw = 0 Then
- If Licz < 255 Then Incr Licz
- If Licz = 50 Then
- Key = Sw_dlugi
- End If
- Else
- If Licz > 1 Then
- If Licz < 50 Then
- Key = Sw_krotki
- If Budzik_alarm = 1 Then Budzik_alarm = 0
- End If
- End If
- Licz = 0
- End If
- Return
- '---
- Powitanie:
- Locate 1 , 1 : Lcd " ZEGAR NTP "
- Locate 3 , 1 : Lcd " firmware v" ; Firmware
- Locate 4 , 1 : Lcd " pimowo@gmail.com "
- Return
- '---
- Ekran_glowny:
- Cls
- Locate 1 , 14 : Lcd " Budzik"
- Locate 2 , 14 : Lcd " " ; Budzik
- Locate 3 , 14 : Lcd "-12.3" ; Chr(223) ; "C"
- Locate 4 , 14 : Lcd "1000hPa"
- Return
- '---
- Ekran_menu:
- Cls
- Locate 1 , 2 : Lcd "Ustawienia budzika"
- If Budzik = 1 Then
- Locate 2 , 2 : Lcd "Budzik TAK"
- Else
- Locate 2 , 2 : Lcd "Budzik NIE"
- End If
- If Budzik_godzina < 10 Then
- Locate 2 , 15 : Lcd "0" ; Budzik_godzina
- Else
- Locate 2 , 15 : Lcd Budzik_godzina
- End If
- Locate 2 , 17 : Lcd ":"
- If Budzik_minuta < 10 Then
- Locate 2 , 18 : Lcd "0" ; Budzik_minuta
- Else
- Locate 2 , 18 : Lcd Budzik_minuta
- End If
- Locate 3 , 1 : Lcd "Pn Wt Sr Cz Pt So Nd"
- Locate 4 , 1 : Lcd " * o * o * o *"
- Return
- '---
- Sprawdz_budzik:
- If Tryb = 0 Then
- If Budzik = 1 Then
- Locate 2 , 16 : Lcd "TAK"
- Else
- Locate 2 , 16 : Lcd "NIE"
- End If
- End If
- If Budzik_godzina = _hour Then
- If Budzik_minuta = _min Then
- If _sec = 0 Then
- If Budzik = 1 Then Budzik_alarm = 1
- End If
- End If
- End If
- Return
- '--- dwukropek zegara
- Dwukropek:
- Mig = Not Mig
- If Mig = 1 Then
- Locate 1 , 7 : Lcd Chr(0)
- Locate 2 , 7 : Lcd Chr(0)
- Else
- Locate 1 , 7 : Lcd " "
- Locate 2 , 7 : Lcd " "
- End If
- Return
- '--- czytaj datę i czas
- Getdatetime:
- I2cstart ' Generate start code
- I2cwbyte Ds3231w ' send address
- I2cwbyte 0 ' start address in 1307
- I2cstart ' Generate start code
- I2cwbyte Ds3231r ' send address
- I2crbyte _sec , Ack
- I2crbyte _min , Ack ' MINUTES
- I2crbyte _hour , Ack ' Hours
- I2crbyte Weekday , Ack ' Day of Week
- I2crbyte _day , Ack ' Day of Month
- I2crbyte _month , Ack ' Month of Year
- I2crbyte _year , Nack ' Year
- I2cstop
- _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
- _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
- Pierwsza = _hour / 10 : If Pierwsza = 0 Then Pierwsza = 10
- Druga = _hour Mod 10 : If Druga = 0 Then Druga = 10
- Trzecia = _min / 10 : If Trzecia = 0 Then Trzecia = 10
- Czwarta = _min Mod 10 : If Czwarta = 0 Then Czwarta = 10
- Locate 1 , 1 : Lcd Linia_g(pierwsza) ; Linia_g(druga)
- Locate 1 , 8 : Lcd Linia_g(trzecia) ; Linia_g(czwarta)
- Locate 2 , 1 : Lcd Linia_d(pierwsza) ; Linia_d(druga)
- Locate 2 , 8 : Lcd Linia_d(trzecia) ; Linia_d(czwarta)
- Date_str = Date(_day)
- Date_str = Mid(date_str , 1 , 6) + "20"
- If _year < 10 Then Date_str = Date_str + "0"
- Date_str = Date_str + Str(_year)
- Locate 3 , 3 : Lcd Date_str
- Return
- '--- zapisz datę
- Setdate:
- _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
- I2cstart ' Generate start code
- I2cwbyte Ds3231w ' send address
- I2cwbyte 4 ' starting address in 1307
- I2cwbyte _day ' Send Data to SECONDS
- I2cwbyte _month ' MINUTES
- I2cwbyte _year ' Hours
- I2cstop
- Return
- '--- zapisz czas
- Settime:
- _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
- I2cstart ' Generate start code
- I2cwbyte Ds3231w ' send address
- I2cwbyte 0 ' starting address in 1307
- I2cwbyte _sec 'sekunda
- I2cwbyte _min 'minuta
- I2cwbyte _hour 'godzina
- I2cstop
- Return
- '--- dzień tygodnia
- Weekdays:
- Data "Poniedzialek" , " Wtorek " , " Sroda " , " Czwartek " , " Piatek " , " Sobota " , " Niedziela "
1. sprzęt
a) uC ATmega328 + rezonator kwarcowy 16MHz - chwilowo jest 11.0592MHz
b) ESP8266-01 - w końcu do czegoś je wykorzystam
c) LCD 20x4
d) RTC DS3231
e) buzzer
f) jeden przycisk
2. wymagania
a) zegar
b) data
c) dzień tygodnia
d) budzik
e) czas pobierany z Internetu
f) temperatura
g) ciśnienie atmosferyczne
h) zapis ustawień do eeprom
3. działanie
a) czas i data synchronizowane z NTP
b) obsługa wszystkiego jednym guzikiem:
- gdy zegar jest w trybie "normalnym" to guzikiem gdy jest alarm można go wyłączyć
- gdy zegar jest w trybie "normalnym" to przytrzymaniu guzika przechodzimy do ustawień alarmu, a tam ustawiamy czy włączyć alarm, godzinę alarmu i dzień tygodnia w których alarm ma wystąpić
- gdy zegar jest w trybie konfiguracji to każde dłuższe przytrzymanie guzika przełącza na kolejną pozycję do ustawień
- gdy zegar jest w trybie konfiguracji to krótkie naciśnięcia zwiększają lub przełączają ustawianą pozycję
- gdy zegar jest w trybie konfiguracji i długimi naciśnięciami przejdziemy wszystkie ustawienia to następuje zapis ustawień i powrót do głównego ekranu
- gdy przejdziemy do trybu konfiguracji, a nie zostanie naciśnięty przycisk przez ustalony czas to nastąpi powrót do głównego ekranu
No i teraz problemy:
1. w jaki sposób zapisać dni tygodnie kiedy działać ma alarm?
2. jak sobie poradzić z temperaturą i ciśnieniem atmosferycznym - dokładnie to chciałbym to zrobić tak, że za pomocą ESP przesyłam dane do zegara lub zegar pyta o dane. W domu mam serwer gdzie gromadzę dane z zewnętrznej stacji meteo, a teraz chciałbym te dane zobaczyć na LCD
3. jak sterować podświetleniem aby w nocy nie waliło po gałach, a i w dzień można było coś zobaczyć
- fotorezystor pod LED LCD
- fotorezystor pod ADC i LED LCD sterować PWM
*z kontrastem myślę, że nie ma co kombinować i będzie potencjometr
4. Jest jeszcze jedna opcja o której sobie myślałem - skoro będzie ESP to może ustawiać jakoś budzik ze smartfona?
Miałem trochę problem z wyborem wyświetlacza, ale postawiłem na sprawdzoną konstrukcję. Najpierw chciałem dać małego OLEDa, ale to jednak trochę małe jest. Wyświetlacze graficzne czy graficzne kolorowe są fajne, ale to strasznie dużo pisania kodu,a ja nie czuję się na siłach.
Z góry dziękuję za pomoc.
Piotrek
PS
Mam nadzieję, że wyrobię się z kodem, PCB i obudową do kwietnia bo to ma być prezent dla syna