Zegar z NTP i budzikiem

Pytania, kody i porady dotyczące nie tylko Bascom.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Zegar z NTP i budzikiem

Post autor: pimowo » 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:
zegar.jpg
budzik.jpg
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:
  1.  
  2. Const Firmware = "0.1 2020"
  3.  
  4. $regfile = "m328pdef.dat"
  5. $crystal = 11059200
  6.  
  7. $swstack = 64
  8. $hwstack = 64
  9. $framesize = 200
  10.  
  11. '--- deklaracja podprogramów
  12.  
  13. Config Submode = New
  14.  
  15. '--- TIMER
  16.  
  17. Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
  18.    Compare2a = 107                                          '10ms@11MHz/1024
  19.  
  20. '--- UART ESP8266
  21.  
  22. $baud = 115200
  23. Config Serialin = Buffered , Size = 100                     ' from ESP8266
  24. 'Config Serialout0 = Buffered , Size = 100                   ' to ESP8266
  25. 'Open "COM1:" For Binary As #1
  26. Echo Off
  27. $timeout = 3000
  28.  
  29. '--- przycisk
  30.  
  31. Config Portc.3 = Input : Set Portc.3 : Sw Alias Pinc.3
  32.  
  33. '--- głośnik
  34.  
  35. Buzz Alias Portc.2 : Config Buzz = Output                   'buzzer
  36.  
  37. '--- konfiguracja sprzętowego TWI (I2C)
  38.  
  39. $lib "i2c_twi.lbx"
  40.  
  41. Config Sda = Portc.4
  42. Config Scl = Portc.5
  43. I2cinit
  44. Config Twi = 400000
  45.  
  46. '--- konfiguracja LCD
  47.  
  48. Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
  49. Config Lcd = 20x4
  50. Cursor Off , Noblink
  51. Cls
  52.  
  53. '--- deklaracja znakow LCD
  54.  
  55. Deflcdchar 0 , 32 , 32 , 4 , 14 , 14 , 4 , 32 , 32          ' dwukropek
  56. Deflcdchar 1 , 28 , 24 , 32 , 32 , 32 , 32 , 24 , 28        ' prawy naroznik
  57. Deflcdchar 2 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32        ' gorna kreseczka
  58. Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31        ' dolna kreseczka
  59. Deflcdchar 4 , 31 , 31 , 32 , 32 , 32 , 32 , 31 , 31        ' dwie kreseczki
  60. Deflcdchar 5 , 28 , 30 , 30 , 30 , 30 , 30 , 30 , 28        ' prawa belka
  61. Deflcdchar 6 , 7 , 15 , 15 , 15 , 15 , 15 , 15 , 7          ' lewa belka
  62. Deflcdchar 7 , 7 , 3 , 32 , 32 , 32 , 32 , 3 , 7            ' lewy naroznik
  63.  
  64. '--- konfiguracja DS3231
  65.  
  66. Config Clock = User
  67. Config Date = Dmy , Separator = /
  68.  
  69. Const Ds3231w = &HD0
  70. Const Ds3231r = &HD1
  71.  
  72. 'wpisuje do DS-a "pierdoły" żeby było widać pierwszą synchronizację
  73. 'Time$ = "00:00:00"
  74. 'Date$ = "01-01-20"
  75.  
  76. '--- zegar
  77.  
  78. Dim Date_str As String * 15
  79. Dim Pierwsza , Druga , Trzecia , Czwarta As Byte
  80. Dim Linia_g(10) , Linia_d(10) As String * 3
  81. Dim Mig As Bit
  82.  
  83. '--- budzik
  84.  
  85. Dim Budzik_alarm As Byte
  86. Dim Budzik_godzina As Byte , Budzik_godzina_ee As Eram Byte
  87. Dim Budzik_minuta As Byte , Budzik_minuta_ee As Eram Byte
  88. Dim Budzik As Byte , Budzik_ee As Eram Byte
  89.  
  90. '--- czas
  91.  
  92. Dim 100ms , 500ms , 1s As Byte                              ', 1m As Byte
  93.  
  94. '--- NTP
  95.  
  96. Const Nastepny_odczyt_ntp = 3600                            'synchronizacja czasu co godzinę
  97. Const Letni = "AT+GMT=1"
  98. Const Zimowy = "AT+GMT=0"
  99.  
  100. Okay Alias 1
  101. Error Alias 2
  102.  
  103. Dim Timeout As Byte ,
  104. Dim Sys_sec As Long , No_ntp , Ntp_progress As Byte
  105. Dim Wait_start As Byte ,
  106. Dim Got_time , Net_status , Wait_answear As Byte
  107. Dim Got_match As Byte , Inp_str1 As String * 100 , Char , Idx As Byte       ', Helpb As Byte
  108. Dim Answear , Insp As Byte
  109. Dim Weekday , Old_day As Byte , Weekday_str As String * 10
  110.  
  111. Dim Timestr As String * 10
  112. Dim Tt(4) As String * 1
  113. Dim Ss(4) As Byte
  114. Dim L1 As Long At Ss Overlay                                'Nałóż długą zmienną na otrzymany ciąg
  115. Dim L2 As Long                                              'z nakładką nie musisz przenosić z tablicy bajtów do długiej zmiennej
  116. Dim Odczekaj_czas As Word
  117. Dim Info_timeout As Byte
  118. Dim Daylight_saving As String * 10
  119.  
  120. '--- MENU
  121.  
  122. Dim Menu As Byte
  123. Dim Tryb As Byte
  124. Dim Czas_menu As Byte
  125.  
  126. '--- przycisk
  127.  
  128. Const Sw_dlugi = 1
  129. Const Sw_krotki = 2
  130.  
  131. Dim Licz As Byte
  132. Dim Key As Byte
  133.  
  134. '--- EEPROM
  135.  
  136. Dim Helpx As Byte
  137. Dim Ee_check As Eram Byte
  138.  
  139. '--- tablica na duże cyfry
  140.  
  141. 'Cyfra 0
  142. Linia_g(10) = "{006}{002}{005}"
  143. Linia_d(10) = "{006}{003}{005}"
  144.  
  145. 'Cyfra 1
  146. Linia_g(1) = "{032}{005}{032}"
  147. Linia_d(1) = "{032}{005}{032}"
  148.  
  149. 'Cyfra 2
  150. Linia_g(2) = "{007}{004}{005}"
  151. Linia_d(2) = "{006}{003}{003}"
  152.  
  153. 'Cyfra 3
  154. Linia_g(3) = "{002}{004}{005}"
  155. Linia_d(3) = "{003}{003}{005}"
  156.  
  157. 'Cyfra 4
  158. Linia_g(4) = "{006}{003}{005}"
  159. Linia_d(4) = "{032}{032}{005}"
  160.  
  161. 'Cyfra 5
  162. Linia_g(5) = "{006}{004}{001}"
  163. Linia_d(5) = "{003}{003}{005}"
  164.  
  165. 'Cyfra 6
  166. Linia_g(6) = "{006}{004}{001}"
  167. Linia_d(6) = "{006}{003}{005}"
  168.  
  169. 'Cyfra 7
  170. Linia_g(7) = "{006}{002}{005}"
  171. Linia_d(7) = "{032}{032}{005}"
  172.  
  173. 'Cyfra 8
  174. Linia_g(8) = "{006}{004}{005}"
  175. Linia_d(8) = "{006}{003}{005}"
  176.  
  177. 'Cyfra 9
  178. Linia_g(9) = "{006}{004}{005}"
  179. Linia_d(9) = "{003}{003}{005}"
  180.  
  181. Sub Ntp_dst_correction
  182.  
  183.    'Dont change order of time and date variables !!! This order is required for Date/Time functions used.
  184.    'this routine is orginated by framuel
  185.    Local Second As Byte
  186.    Local Minute As Byte
  187.    Local Hour As Byte
  188.    Local Day As Byte
  189.    Local Month As Byte
  190.    Local Year As Byte
  191.    Local Dow As Byte                                        'Day of week
  192.  
  193.    Day = Date(l2)                                           'set 3 variables: Day, Month, Year, so Year contains now current year
  194.  
  195.    'DST starts at the last sunday of March, so let's see what weekday the 1st of April is
  196.    Month = 4
  197.    Day = 1
  198.    Hour = 2
  199.    Minute = 0
  200.    Second = 0
  201.    Dow = Dayofweek(day)                                     '0 = Monday to 6 = Sunday
  202.    Day = 31 - Dow                                           'Now count back the days until last sunday
  203.    Month = 3                                                'and set month to March
  204.  
  205.    If L2 >= Syssec(second) Then
  206.  
  207.       'DST ends at the last sunday of October, so let's see what weekday the 1st of November is
  208.       Day = 1
  209.       Month = 11
  210.       Dow = Dayofweek(day)                                  '0 = Monday to 6 = Sunday
  211.       Day = 31 - Dow                                        'Now count back the days until last sunday
  212.       Month = 10                                            'and set month to October
  213.  
  214.       Locate 3 , 1
  215.  
  216.       If L2 < Syssec(second) Then                           'jeśli data w sysec mniejsza od aktulnej to jest lato
  217.  
  218.          L2 = L2 + 3600                                     '7200
  219.          'Lcd "Sumer Time"
  220.  
  221.       Else
  222.  
  223.          L2 = L2 + 0                                        '3600
  224.          'Lcd "Winter Time"
  225.  
  226.       End If
  227.  
  228.    End If
  229.  
  230. End Sub
  231.  
  232. '--- pierwsze programowanie eeprom
  233.  
  234. Helpx = Ee_check
  235.  
  236. If Helpx <> 0 Then                                          'jezeli eeprom nie była programowana
  237.  
  238.    Ee_check = 0                                             'ustaw, że już programowana
  239.  
  240. 'wartości domyślne
  241.  
  242.    Budzik_godzina_ee = 7
  243.    Budzik_minuta_ee = 0
  244.    Budzik_ee = 0
  245.  
  246. End If
  247.  
  248. '--- wczytaj dane
  249.  
  250. Budzik_godzina = Budzik_godzina_ee
  251. Budzik_minuta = Budzik_minuta_ee
  252. Budzik = Budzik_ee
  253. Tryb = 0
  254.  
  255. '--- powitanie
  256.  
  257. Gosub Powitanie                                             'wyswietl powitanie
  258.  
  259. Waitms 500
  260.  
  261. For Helpx = 1 To 20                                         'licz kroki włączenia buzzera
  262.  
  263.    Locate 2 , Helpx : Lcd Chr(161)
  264.  
  265.    Waitms 120                                               'odczekaj
  266.  
  267. Next
  268.  
  269. Waitms 500
  270.  
  271. Set Buzz                                                    'wydaj dzwiek
  272. Waitms 20
  273. Reset Buzz                                                  'wyłącz buzzer
  274. Cls                                                         'wyczyść ekran
  275.  
  276. Gosub Ekran_glowny                                          'wczytaj ekran główny
  277.  
  278. Enable Interrupts                                           'włącz golobalne przerwania
  279.  
  280. Print "AT+RST"                                              'restart ESP8266
  281.  
  282. Do
  283.  
  284.    If Tifr2.ocf2a = 1 Then                                  'minęło 10ms - flagę ustawia Timer
  285.  
  286.       Tifr2.ocf2a = 1                                       'kasuj flagę
  287.  
  288.       Gosub Sprawdz_przycisk                                'sprawdz czy przycisk został wciśnięty
  289.  
  290.       If 100ms < 9 Then                                     'odlicz 100ms
  291.  
  292.          Incr 100ms
  293.  
  294.       Else                                                  'minęło 100ms
  295.  
  296.          100ms = 0                                          'kasuj licznik 100ms
  297.  
  298.          Reset Buzz                                         'wyłącz buzzer
  299.  
  300.          If Net_status = 1 Then
  301.  
  302.             If No_ntp = 1 Then
  303.  
  304.                Select Case Ntp_progress
  305.  
  306.                   Case 1
  307.  
  308.                      Print "AT+CIPMUX=1"
  309.                      Incr Ntp_progress
  310.  
  311.                   Case 2
  312.  
  313.                      Select Case Answear
  314.  
  315.                         Case Okay
  316.  
  317.                            'Waitms 200
  318.                            Print "AT+CIPSTART=1," ; Chr(34) ; "UDP" ; Chr(34) ; "," ; Chr(34) ; "193.67.79.202" ; Chr(34) ; ",37"
  319.  
  320.                            Incr Ntp_progress
  321.  
  322.                         Case Error
  323.  
  324.                      End Select
  325.  
  326.                   Case 3
  327.  
  328.                      Select Case Answear
  329.  
  330.                         Case Okay
  331.  
  332.                            Print "AT+CIPSEND=1,3"
  333.                            Incr Ntp_progress
  334.  
  335.                         Case Error
  336.  
  337.                      End Select
  338.  
  339.                   Case 4
  340.  
  341.                      Select Case Answear
  342.  
  343.                         Case Okay
  344.  
  345.                            Print "X"
  346.                            Incr Ntp_progress
  347.                            Wait_answear = 5
  348.  
  349.                         Case Error
  350.  
  351.                      End Select
  352.  
  353.                   Case 5
  354.  
  355.                      If Answear > 0 Then
  356.  
  357.                         Incr Ntp_progress
  358.  
  359.                      End If
  360.  
  361.                   Case 6
  362.  
  363.                      If Wait_answear > 0 Then
  364.  
  365.                         Decr Wait_answear
  366.  
  367.                         If Got_time = 1 Then
  368.  
  369.                            No_ntp = 0
  370.                            Print "AT+CIPCLOSE=1"
  371.                            Incr Ntp_progress
  372.  
  373.                         End If
  374.  
  375.                      Else
  376.  
  377.                         Print "AT+CIPCLOSE=1"
  378.                         Incr Ntp_progress
  379.  
  380.                      End If
  381.  
  382.                End Select
  383.  
  384.             End If
  385.  
  386.          End If
  387.  
  388.          Answear = 0
  389.  
  390.          If 500ms < 5 Then
  391.  
  392.             Incr 500ms
  393.  
  394.          Else
  395.  
  396.             500ms = 0
  397.  
  398.             If Budzik_alarm = 1 Then Set Buzz
  399.  
  400.          End If
  401.  
  402.          If 1s < 9 Then
  403.  
  404.             Incr 1s
  405.  
  406.          Else
  407.  
  408.             1s = 0
  409.  
  410.             Gosub Sprawdz_budzik
  411.  
  412.             If Tryb = 0 Then
  413.  
  414.                Gosub Getdatetime
  415.                Gosub Dwukropek
  416.  
  417.             Else
  418.  
  419.                If Czas_menu > 0 Then
  420.  
  421.                   Decr Czas_menu
  422.  
  423.                   If Czas_menu = 0 Then
  424.  
  425.                      Tryb = 0
  426.  
  427.                      Gosub Ekran_glowny
  428.                      Locate 4 , 2 : Lcd Weekday_str
  429.  
  430.                   End If
  431.  
  432.                End If
  433.  
  434.             End If
  435.  
  436.             If Info_timeout > 0 Then
  437.  
  438.                Decr Info_timeout
  439.  
  440.                If Info_timeout = 0 Then Old_day = 0
  441.  
  442.             End If
  443.  
  444.             If Old_day <> _day Then
  445.  
  446.                Old_day = _day
  447.                Weekday = Dayofweek()
  448.                Weekday_str = Lookupstr(weekday , Weekdays)
  449.  
  450.                If Tryb = 0 Then Locate 4 , 2 : Lcd Weekday_str
  451.  
  452.             End If
  453.  
  454.             If Odczekaj_czas > 0 Then Decr Odczekaj_czas
  455.  
  456.             If Odczekaj_czas = 0 Then
  457.  
  458.                No_ntp = 1
  459.                Ntp_progress = 1
  460.                Odczekaj_czas = 20
  461.  
  462.             End If
  463.  
  464.          End If
  465.  
  466.       End If
  467.  
  468.    End If
  469.  
  470.    If Key <> 0 Then
  471.  
  472.       Czas_menu = 5
  473.  
  474.       Select Case Tryb
  475.  
  476.          Case 0:
  477.  
  478.             If Key = Sw_dlugi Then
  479.  
  480.                Tryb = 1
  481.                Menu = 0
  482.  
  483.                Gosub Ekran_menu
  484.  
  485.             End If
  486.  
  487.          Case 1
  488.  
  489.             If Key = Sw_dlugi Then
  490.  
  491.                Incr Menu
  492.  
  493.                If Menu > 10 Then
  494.  
  495.                   Budzik_godzina_ee = Budzik_godzina
  496.                   Budzik_minuta_ee = Budzik_minuta
  497.                   Budzik_ee = Budzik
  498.  
  499.                   Tryb = 0
  500.  
  501.                   Gosub Ekran_glowny
  502.                   Locate 4 , 2 : Lcd Weekday_str
  503.  
  504.                End If
  505.  
  506.             End If
  507.  
  508.             Select Case Menu
  509.  
  510.                Case 0
  511.  
  512.                   If Key = Sw_krotki Then
  513.  
  514.                      Tryb = 0
  515.  
  516.                      Gosub Ekran_glowny
  517.                      Locate 4 , 2 : Lcd Weekday_str
  518.  
  519.                   End If
  520.  
  521.                Case 1
  522.  
  523.                   If Key = Sw_krotki Then
  524.  
  525.                      If Budzik = 0 Then
  526.  
  527.                         Budzik = 1
  528.  
  529.                      Else
  530.  
  531.                         Budzik = 0
  532.  
  533.                      End If
  534.  
  535.                   End If
  536.  
  537.                   Locate 2 , 2
  538.  
  539.                   If Budzik = 1 Then
  540.  
  541.                      Locate 2 , 2 : Lcd "Budzik" ; Chr(126) ; "TAK" ; Chr(127)
  542.  
  543.                   Else
  544.  
  545.                      Locate 2 , 2 : Lcd "Budzik" ; Chr(126) ; "NIE" ; Chr(127)
  546.  
  547.                   End If
  548.  
  549.                Case 2
  550.  
  551.                   Locate 2 , 8 : Lcd " "
  552.                   Locate 2 , 12 : Lcd " "
  553.  
  554.                   If Key = Sw_krotki Then
  555.  
  556.                      Incr Budzik_godzina
  557.                      If Budzik_godzina > 23 Then Budzik_godzina = 0
  558.  
  559.                   End If
  560.  
  561.                   If Budzik_godzina < 10 Then
  562.  
  563.                      Locate 2 , 14 : Lcd Chr(126) ; "0" ; Budzik_godzina
  564.  
  565.                   Else
  566.  
  567.                      Locate 2 , 14 : Lcd Chr(126) ; Budzik_godzina
  568.  
  569.                   End If
  570.  
  571.                Case 3
  572.  
  573.                   Locate 2 , 14 : Lcd " "
  574.  
  575.                   If Key = Sw_krotki Then
  576.  
  577.                      Incr Budzik_minuta
  578.                      If Budzik_minuta > 59 Then Budzik_minuta = 0
  579.  
  580.                   End If
  581.  
  582.                   If Budzik_minuta < 10 Then
  583.  
  584.                      Locate 2 , 18 : Lcd "0" ; Budzik_minuta ; Chr(127)
  585.  
  586.                   Else
  587.  
  588.                      Locate 2 , 18 : Lcd Budzik_minuta ; Chr(127)
  589.  
  590.                   End If
  591.  
  592.                Case 4
  593.  
  594.                   Locate 2 , 20 : Lcd " "
  595.  
  596.  
  597.                   Locate 4 , 1 : Lcd "^"
  598.  
  599.                Case 5
  600.  
  601.                   Locate 4 , 1 : Lcd " "
  602.  
  603.                   Locate 4 , 4 : Lcd "^"
  604.  
  605.                Case 6
  606.  
  607.                   Locate 4 , 4 : Lcd " "
  608.  
  609.                   Locate 4 , 7 : Lcd "^"
  610.  
  611.                Case 7
  612.  
  613.                   Locate 4 , 7 : Lcd " "
  614.  
  615.                   Locate 4 , 10 : Lcd "^"
  616.  
  617.                Case 8
  618.  
  619.                   Locate 4 , 10 : Lcd " "
  620.  
  621.                   Locate 4 , 13 : Lcd "^"
  622.  
  623.                Case 9
  624.  
  625.                   Locate 4 , 13 : Lcd " "
  626.  
  627.                   Locate 4 , 16 : Lcd "^"
  628.  
  629.                Case 10
  630.  
  631.                   Locate 4 , 16 : Lcd " "
  632.  
  633.                   Locate 4 , 19 : Lcd "^"
  634.  
  635.             End Select
  636.  
  637.       End Select
  638.  
  639.       Key = 0
  640.  
  641.    End If
  642.  
  643.    If Ischarwaiting() > 0 Then
  644.  
  645.       Char = Inkey()
  646.  
  647.       Select Case Char
  648.  
  649.          Case 10
  650.          Case 13 : Got_match = 1
  651.  
  652.       Case Else
  653.  
  654.          Inp_str1 = Inp_str1 + Chr(char)
  655.          Incr Idx
  656.          If Idx > 99 Then Got_match = 1
  657.  
  658.       End Select
  659.  
  660.    End If
  661.  
  662.    If Got_match = 1 Then
  663.  
  664.       Got_match = 0
  665.  
  666.       If Inp_str1 <> "" Then
  667.  
  668.          Select Case Inp_str1
  669.  
  670.             Case "SEND OK"
  671.  
  672.                Answear = Okay
  673.  
  674.             Case "OK"
  675.  
  676.                Answear = Okay
  677.  
  678.             Case "ERROR"
  679.  
  680.                Answear = Error
  681.  
  682.             Case "WIFI GOT IP"
  683.  
  684.                Net_status = 1
  685.  
  686.             Case "WIFI CONNECTED"
  687.  
  688.             Case "WIFI DISCONNECT"
  689.  
  690.                Net_status = 0
  691.  
  692.          Case Else
  693.  
  694.             Insp = Instr(inp_str1 , ",CONNECT")
  695.  
  696.             If Insp > 0 Then Answear = Okay
  697.  
  698.             Insp = Instr(inp_str1 , "+IPD,1,4:")
  699.  
  700.             If Insp > 0 Then
  701.  
  702.                Timestr = Mid(inp_str1 , 10 , 4)
  703.  
  704.                Tt(1) = Mid(timestr , 4 , 1)                 'from big endian to little endian
  705.                Tt(2) = Mid(timestr , 3 , 1)                 'swap the bytes
  706.                Tt(3) = Mid(timestr , 2 , 1)
  707.                Tt(4) = Mid(timestr , 1 , 1)
  708.                Ss(1) = Asc(tt(1))                           'this is  L1 split in 4s by overlay
  709.                Ss(2) = Asc(tt(2))
  710.                Ss(3) = Asc(tt(3))
  711.                Ss(4) = Asc(tt(4))
  712.                L2 = L1 + 1139297296
  713.  
  714.                Call Ntp_dst_correction
  715.  
  716.                Time$ = Time(l2)                             'set the time
  717.                Date$ = Date(l2)                             'set the date
  718.  
  719.                Sys_sec = Syssec(time$ , Date$)
  720.                Got_time = 1
  721.                Odczekaj_czas = Nastepny_odczyt_ntp
  722.  
  723.             End If
  724.  
  725.          End Select
  726.  
  727.       End If
  728.  
  729.       Inp_str1 = ""
  730.       Idx = 0
  731.  
  732.    End If
  733.  
  734. Loop
  735. End
  736.  
  737.  
  738. '--- obsługa przycisku
  739.  
  740. Sprawdz_przycisk:
  741.  
  742.    If Sw = 0 Then
  743.  
  744.       If Licz < 255 Then Incr Licz
  745.  
  746.       If Licz = 50 Then
  747.  
  748.          Key = Sw_dlugi
  749.  
  750.       End If
  751.  
  752.    Else
  753.  
  754.       If Licz > 1 Then
  755.  
  756.          If Licz < 50 Then
  757.  
  758.             Key = Sw_krotki
  759.  
  760.             If Budzik_alarm = 1 Then Budzik_alarm = 0
  761.  
  762.          End If
  763.  
  764.       End If
  765.  
  766.       Licz = 0
  767.  
  768.    End If
  769.  
  770. Return
  771.  
  772. '---
  773.  
  774. Powitanie:
  775.  
  776.    Locate 1 , 1 : Lcd "     ZEGAR NTP      "
  777.    Locate 3 , 1 : Lcd " firmware v" ; Firmware
  778.    Locate 4 , 1 : Lcd "  pimowo@gmail.com  "
  779.  
  780. Return
  781.  
  782. '---
  783.  
  784. Ekran_glowny:
  785.  
  786.    Cls
  787.  
  788.    Locate 1 , 14 : Lcd " Budzik"
  789.    Locate 2 , 14 : Lcd "  " ; Budzik
  790.    Locate 3 , 14 : Lcd "-12.3" ; Chr(223) ; "C"
  791.    Locate 4 , 14 : Lcd "1000hPa"
  792.  
  793. Return
  794.  
  795. '---
  796.  
  797. Ekran_menu:
  798.  
  799.    Cls
  800.  
  801.    Locate 1 , 2 : Lcd "Ustawienia budzika"
  802.  
  803.    If Budzik = 1 Then
  804.  
  805.       Locate 2 , 2 : Lcd "Budzik TAK"
  806.  
  807.    Else
  808.  
  809.       Locate 2 , 2 : Lcd "Budzik NIE"
  810.  
  811.    End If
  812.  
  813.    If Budzik_godzina < 10 Then
  814.  
  815.       Locate 2 , 15 : Lcd "0" ; Budzik_godzina
  816.  
  817.    Else
  818.  
  819.       Locate 2 , 15 : Lcd Budzik_godzina
  820.  
  821.    End If
  822.  
  823.    Locate 2 , 17 : Lcd ":"
  824.  
  825.    If Budzik_minuta < 10 Then
  826.  
  827.       Locate 2 , 18 : Lcd "0" ; Budzik_minuta
  828.  
  829.    Else
  830.  
  831.       Locate 2 , 18 : Lcd Budzik_minuta
  832.  
  833.    End If
  834.  
  835.    Locate 3 , 1 : Lcd "Pn Wt Sr Cz Pt So Nd"
  836.    Locate 4 , 1 : Lcd " *  o  *  o  *  o  *"
  837.  
  838. Return
  839.  
  840. '---
  841.  
  842. Sprawdz_budzik:
  843.  
  844.    If Tryb = 0 Then
  845.  
  846.       If Budzik = 1 Then
  847.  
  848.          Locate 2 , 16 : Lcd "TAK"
  849.  
  850.       Else
  851.  
  852.          Locate 2 , 16 : Lcd "NIE"
  853.  
  854.       End If
  855.  
  856.    End If
  857.  
  858.    If Budzik_godzina = _hour Then
  859.  
  860.       If Budzik_minuta = _min Then
  861.  
  862.          If _sec = 0 Then
  863.  
  864.             If Budzik = 1 Then Budzik_alarm = 1
  865.  
  866.          End If
  867.  
  868.       End If
  869.  
  870.    End If
  871.  
  872. Return
  873.  
  874. '--- dwukropek zegara
  875.  
  876. Dwukropek:
  877.  
  878.    Mig = Not Mig
  879.  
  880.    If Mig = 1 Then
  881.  
  882.       Locate 1 , 7 : Lcd Chr(0)
  883.       Locate 2 , 7 : Lcd Chr(0)
  884.  
  885.    Else
  886.  
  887.       Locate 1 , 7 : Lcd " "
  888.       Locate 2 , 7 : Lcd " "
  889.  
  890.    End If
  891.  
  892. Return
  893.  
  894. '--- czytaj datę i czas
  895.  
  896. Getdatetime:
  897.  
  898.    I2cstart                                                 ' Generate start code
  899.    I2cwbyte Ds3231w                                         ' send address
  900.    I2cwbyte 0                                               ' start address in 1307
  901.    I2cstart                                                 ' Generate start code
  902.    I2cwbyte Ds3231r                                         ' send address
  903.    I2crbyte _sec , Ack
  904.    I2crbyte _min , Ack                                      ' MINUTES
  905.    I2crbyte _hour , Ack                                     ' Hours
  906.    I2crbyte Weekday , Ack                                   ' Day of Week
  907.    I2crbyte _day , Ack                                      ' Day of Month
  908.    I2crbyte _month , Ack                                    ' Month of Year
  909.    I2crbyte _year , Nack                                    ' Year
  910.    I2cstop
  911.  
  912.    _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  913.    _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
  914.  
  915.    Pierwsza = _hour / 10 : If Pierwsza = 0 Then Pierwsza = 10
  916.    Druga = _hour Mod 10 : If Druga = 0 Then Druga = 10
  917.    Trzecia = _min / 10 : If Trzecia = 0 Then Trzecia = 10
  918.    Czwarta = _min Mod 10 : If Czwarta = 0 Then Czwarta = 10
  919.  
  920.    Locate 1 , 1 : Lcd Linia_g(pierwsza) ; Linia_g(druga)
  921.    Locate 1 , 8 : Lcd Linia_g(trzecia) ; Linia_g(czwarta)
  922.    Locate 2 , 1 : Lcd Linia_d(pierwsza) ; Linia_d(druga)
  923.    Locate 2 , 8 : Lcd Linia_d(trzecia) ; Linia_d(czwarta)
  924.  
  925.    Date_str = Date(_day)
  926.    Date_str = Mid(date_str , 1 , 6) + "20"
  927.    If _year < 10 Then Date_str = Date_str + "0"
  928.    Date_str = Date_str + Str(_year)
  929.  
  930.    Locate 3 , 3 : Lcd Date_str
  931.  
  932. Return
  933.  
  934. '--- zapisz datę
  935.  
  936. Setdate:
  937.  
  938.    _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  939.  
  940.    I2cstart                                                 ' Generate start code
  941.    I2cwbyte Ds3231w                                         ' send address
  942.    I2cwbyte 4                                               ' starting address in 1307
  943.    I2cwbyte _day                                            ' Send Data to SECONDS
  944.    I2cwbyte _month                                          ' MINUTES
  945.    I2cwbyte _year                                           ' Hours
  946.    I2cstop
  947.  
  948. Return
  949.  
  950. '--- zapisz czas
  951.  
  952. Settime:
  953.  
  954.    _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  955.  
  956.    I2cstart                                                 ' Generate start code
  957.    I2cwbyte Ds3231w                                         ' send address
  958.    I2cwbyte 0                                               ' starting address in 1307
  959.    I2cwbyte _sec                                            'sekunda
  960.    I2cwbyte _min                                            'minuta
  961.    I2cwbyte _hour                                           'godzina
  962.    I2cstop
  963.  
  964. Return
  965.  
  966. '--- dzień tygodnia
  967.  
  968. Weekdays:
  969.  
  970.    Data "Poniedzialek" , "   Wtorek   " , "   Sroda    " , "  Czwartek  " , "   Piatek   " , "   Sobota   " , " Niedziela  "
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 ;)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Zegar z NTP i budzikiem

Post autor: Pikczu » 24 paź 2020, 0:33

Aż się prosi o nowy PIXXI od 4D systems:)
https://www.tme.eu/en/details/pixxilcd- ... d-systems/
Obrazek
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Zegar z NTP i budzikiem

Post autor: pimowo » 24 paź 2020, 11:50

@Pikczu, zbyt wysoka półka cenowa jak dla mnie :oops:
To miał być prosty zegar z budzikiem i NTP, ale jakoś tak wyszło, że będzie miał więcej bajerów - właśnie zacząłem rysować schemat i brakło mi już pinów ha ha
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Zegar z NTP i budzikiem

Post autor: pimowo » 24 paź 2020, 15:16

OK, mam już wstępny schemat ;)
Trochę zmian:
- ATmega328PB + rezonator kwarcowy 18.4320MHz - dwa sprzętowe UARTy i kwarc im przyjazny
- LCD 20x4 - nie za duży, nie za mały
- ESP8266-01 - łączność z serwerami NTP
- Bluetooth HC-05 - do połączenia z telefonem
- RTC DS3231 - nawet jak nie będzie WiFi to zegar nadal będzie działał
- BME280 - do odczytu: temperatury, wilgotności i ciśnienia atmosferycznego w pomieszczeniu
- buzzer - coś musi budzić człowieka
- fotorezystor - do sterowania jasnością LCD
- dioda LED RGB 5mm - tu jest plan aby podświetlić obudowę
- zasilanie to zewnętrzny zasilacz 5V + stabilizator 3V3 na PCB - chyba to będzie ładowarka USB

Jeszcze nie wiem jak ja to zmieszczę na PCB o wymiarach 98x60mm, ale trzeba będzie pokombinować ;)
zegar_schemat.jpg
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony 24 paź 2020, 16:47 przez pimowo, łącznie zmieniany 1 raz.
Awatar użytkownika
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Zegar z NTP i budzikiem

Post autor: Pikczu » 24 paź 2020, 15:57

Leda w zasilaniu i RGB masz odwrotnie.
Edit-
Jak byś zmienił ten jeden przycisk na pin z ADC to zmieściła by się klawiatura ADC.
Co do rozmiaru możesz zrobić na 4 warstwach i się zmieści bez problemu albo wszytko na małym smd.
Sprawdziłem cenę do kwietnia zdąży przyjść za 11$
pcb_1.png
Ewentualnie szybciej za 27$
dhl_1.png
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Zegar z NTP i budzikiem

Post autor: pimowo » 24 paź 2020, 16:47

Pikczu pisze:Leda w zasilaniu i RGB masz odwrotnie.
Ale babol hi hi
Poprawione, dzięki
Pikczu pisze:Jak byś zmienił ten jeden przycisk na pin z ADC to zmieściła by się klawiatura ADC.
Ale tu właśnie jest taki zamysł, aby był tylko jeden przycisk do obsługi zegarka ;)
Na schemacie są dodatkowe trzy przyciski, ale one będą ukryte na PCB - reset AVR, reset ESP i programowanie ESP
Pikczu pisze:Co do rozmiaru możesz zrobić na 4 warstwach i się zmieści bez problemu albo wszytko na małym smd.
Myślę, że nie będzie tak źle i zmieszczę się - używam SMD
Nigdy jeszcze nic nie robiłem na czterech warstwach ;)

Jakieś pomysły jak przesłać (lub pobrać) temperaturę poprzez ESP?
Awatar użytkownika
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Zegar z NTP i budzikiem

Post autor: Pikczu » 25 paź 2020, 10:23

pimowo pisze:
24 paź 2020, 16:47
Myślę, że nie będzie tak źle i zmieszczę się - używam SMD
Nigdy jeszcze nic nie robiłem na czterech warstwach ;)
Jest prościej niż na dwóch.
pimowo pisze:
24 paź 2020, 16:47
Jakieś pomysły jak przesłać (lub pobrać) temperaturę poprzez ESP?
Nie mam ani wiedzy ani doświadczenia.
Moje ESP leżą w pudełku od kilku lat, nigdy nie użyte bo jakoś nie było czasu zagłębić się w temat.
Teraz mam wielki stop ze wszystkimi pobocznymi projektami, muszę skończyć jeden duży a porządnie.
Awatar użytkownika
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Zegar z NTP i budzikiem

Post autor: Pikczu » 25 paź 2020, 11:04

A nie boisz się o procesor sterując tymi rgb prosto z nogi?
Ja zwykle daje bufory żeby nie musieć myśleć o maksymalnym prądzie.
https://www.ti.com/product/SN74LVC2G34
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Zegar z NTP i budzikiem

Post autor: pimowo » 25 paź 2020, 11:12

Wczoraj w poszukiwaniach LED RGB w szufladzie (chciałem sprawdzić czy mam wspólną katodę czy anodę) to znalazłem pasek ośmiu LED WS2812B i mnie olśniło, że to właśnie takich diod mogę użyć :)
Awatar użytkownika
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Zegar z NTP i budzikiem

Post autor: Pikczu » 25 paź 2020, 11:38

I zwolnisz dwa piny!
ODPOWIEDZ