[Rozwiązany] RTC, działania na podstawie czasu

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

Re: RTC, działania na podstawie czasu

Post autor: pimowo » 27 sty 2020, 4:46

niveasoft pisze:Wydaje mi się, że niektóre rzeczy niepotrzebnie sobie komplikujesz :P
Wiem, ale czasami nie wiem jak coś zrobić i kombinuję jak koń pod górkę.
Czasami zastanawiam się czy nie zmienić hobby bo coś mi programowanie nie idzie :(
niveasoft pisze:Nie znalazłbym się w tych Twoich numerach bajtów za to ja pisze to używając stałych.
Myślałem, że każdy wpis w bazie ma być osobno i stąd wyszła baza, która ma 392 elementów.
niveasoft pisze:Wiem że jeden wpis ma mieć np. osiem bajtów. W pierwszym mogę sobie dać numer porządkowy lub aktywne dni tygodnia a w ostatnim numer wyjścia którym chcę sterować. Wpisów ma być 32 tak? No to piszę Liczba_wpisów = 32 a potem niżej, że Rozmiar_bazy to Liczba_wpisów * 8 i kompilator mi to sam policzy a ja dokładnie wiem ile bajtów muszę zarezerwować (a dokładniej to nie muszę tego wiedzieć :D)
Początkowo chciałem mieć osiem czasówek gdzie każda z nich będzie miała możliwość ustawienia czterech, różnych czasów załączania - stąd 32 wpisy ustawień (8 czasówek x 4 czasy działania dla każdej z nich)
Teraz patrząc na Twoje rozwiązania to chyba będzie lepiej po prostu zrobić 32 czasówki (każda z jednym czasem działania) ponieważ mogę ustawić wyjście do każdego ustawienia.
Nie rozumiem jeszcze jak mam podejść do dni tygodnia:
|NR|SEC_ON|MIN_ON|HOUR_ON|SEC_OFF|MIN_OFF|HOUR_OFF|DAY_WEEK|OUT_NR|

Czy "DAY_WEEK" mam rozbić na siedem elementów czy jakoś da się to zapisać w jednym?
Chodzi mi o to aby była możliwość ustawienia jednego czy kilku różnych dni kiedy ma to działać - przykładowo, czasówka IDX1 ma być włączona od 10:00:00 do 14:00:00 w każdy poniedziałek, wtorek i w sobotę, a w resztę dni ma po prostu nie działać.

Aby już nie kombinować więcej to może by zrobić tak:
|NR| -> |IDX 1-32|
|SEC_ON| -> |sekunda włączenia|
|MIN_ON| -> |minuta włączenia|
|HOUR_ON| -> |godzina włączenia|
|SEC_OFF| -> |sekunda wyłączenia|
|MIN_OFF| -> |minuta wyłączenia|
|HOUR_OFF| -> |godzina wyłączenia|
|DAY_WEEK| -> |dzień tygodnia, w który dzień/dni ma działać|
|OUT_NR| -> |przekaźnik 1-16|
Tym sposobem mógłbym sobie ustawić co tylko zechcę, bez ograniczenia czterech czasów dla jednego wyjścia, ale jak to "poprawnie" zrobić?
niveasoft pisze:Bascomowe funkcje do czasu wymagają tylko jednego. Musisz mieć w kodzie zdefiniowane trzy bajty, jeden za drugim w których będzie sekunda, minuta i godzina.
Na taki buforek nakładam sobie takie fantowowe zmienne poprzez Overlay i już mogę napisać Time_on = Syssec(Sec_on) Wszystko prosto i króciutko.
Jak znajdę taki wpis że akurat coś ma być włączone to sprawdzam ostatni bajt buforka żeby sprawdzić którym wyjściem mamy się zająć...i to pomału wszystko.
Wystarczy teraz dopisać Eeprom. To chyba na razie tylko 256bajtów a masz 1KB
To jak ja mam teraz uzupełniać (poprawnie) bazę danymi?
Czy to jest OK:
Dim Bsec As Byte , Bmin As Byte , Bhour As Byte
Bsec = 00 : Bmin = 15 : Bhour = 12
baza = Syssec(bsec)

A może jest jakiś sprytny sposób, aby wpisać do bazy całą "ramkę" ustawień?
niveasoft pisze:Możesz to sobie sprawdzać nawet co sekundę. Procek i tak będzie ziewał.
Zauważ tylko ile mniej jest myślenia jak tworzysz pętle a masz stałe - piszesz np "For N = 1 To Liczba_wpisów"
W ten sposób możesz sobie kiedyś dodać kilka wpisów i nie martwić się że gdzieś w kodzie masz za małą cyferkę :D
Patrząc na Twój kod to ja przez najbliższe 20 lat nie wpadłbym na takie coś.
niveasoft pisze:Niestety na razie muszę wracać do swoich zadań no i nie chciałem psuć Tobie całej zabawy :D
Bardzo dziękuję za kod :)
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: RTC, działania na podstawie czasu

Post autor: niveasoft » 27 sty 2020, 8:19

Ogólnie to bajt ma osiem bitów a tydzień tylko siedem dni :D
W bascomowej funkcji DayOfWeek niedziela ma chyba numer 0.
Numer porządkowy nie zawsze się przydaje. Możnaby więc w pierwszym bajcie zapisać na pierwszych siedmiu bitach w które dni tygodnia dana czasówka ma działać. Na ostatnim bicie można zapisać "Aktywna/Nieaktywna"
Wtedy funkcja sprawdzająca najpierw brałaby pierwszy bajt. Sprawdza czy bit 7 ustawiony, a jeśli tak to czy ustawiony jest bit tego dnia który akurat mamy. Jeśli tak to dopiero sprawdza godziny włączenia/wyłączenia.

Co do zapisu całej ramki to właśnie jest nieskomplikowane. Piszesz sub któremu podajesz "dni tygodnia, godziny i numer wyjścia"
Z kolei ten sub się przebiega po wszystkich wpisach np 1-32 i sprawdza pierwszy bajt. Jak znajdzie taki który jest nieaktywny (bit 7 = 0) to tam zapisuje całą ramkę i robi Exit Sub :D
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: RTC, działania na podstawie czasu

Post autor: pimowo » 29 sty 2020, 17:46

Wczoraj przesiedziałem nad tym programem cały wieczór i już prawie wszytko działa, ale niestety nie do końca jak bym chciał :(
niveasoft pisze:W bascomowej funkcji DayOfWeek niedziela ma chyba numer 0
W tej funkcji tydzień zaczyna się od poniedziałku i to własnie poniedziałek ma numer "0" - chyba, że coś namieszałem, ale tak mi właśnie działa ;)
niveasoft pisze:Numer porządkowy nie zawsze się przydaje. Można by więc w pierwszym bajcie zapisać na pierwszych siedmiu bitach w które dni tygodnia dana czasówka ma działać. Na ostatnim bicie można zapisać "Aktywna/Nieaktywna"
Wtedy funkcja sprawdzająca najpierw brałaby pierwszy bajt. Sprawdza czy bit 7 ustawiony, a jeśli tak to czy ustawiony jest bit tego dnia który akurat mamy. Jeśli tak to dopiero sprawdza godziny włączenia/wyłączenia.
Zmieniłem sposób zapisywania danych z:
.
  1. | NR |SEC_ON|MIN_ON|HOUR_ON|SEC_OFF|MIN_OFF|HOUR_OFF|OUT_NR|
  2. |1-32| 0-59 | 0-59 | 0-23  | 0-59  | 0-59  |  0-23  | 1-16 |
.
na:
  1. |IDX |ON/OFF|DAY_MON|DAY_TUE|DAY_WED|DAY_THU|DAY_FRI|DAY_SAT|DAY_SUN|SEC_ON|MIN_ON|HOUR_ON|SEC_OFF|MIN_OFF|HOUR_OFF|OUT_NR|
  2. |1-32| 0-1  |  0-1  |  0-1  |  0-1  |  0-1  |  0-1  |  0-1  |  0-1  | 0-59 | 0-59 | 0-23  | 0-59  | 0-59  |  0-23  | 1-16 |
.
Teraz mam wszystkie dane aby sterować w każdym przypadku.
niveasoft pisze:Co do zapisu całej ramki to właśnie jest nieskomplikowane. Piszesz sub któremu podajesz "dni tygodnia, godziny i numer wyjścia"
Z kolei ten sub się przebiega po wszystkich wpisach np 1-32 i sprawdza pierwszy bajt. Jak znajdzie taki który jest nieaktywny (bit 7 = 0) to tam zapisuje całą ramkę i robi Exit Sub :D
Wyszło mi coś takiego:
.
  1.  
  2. '**********************************************************
  3. 'MIKROKONTROLER
  4.  
  5. $regfile = "m32def.dat"                                     'ATmega32
  6. $crystal = 16000000                                         'zewnętrzny rezonator  16MHz
  7.  
  8. '**********************************************************
  9. '
  10.  
  11. $swstack = 64
  12. $hwstack = 64
  13. $framesize = 200
  14.  
  15. '**********************************************************
  16. '
  17.  
  18. Config Submode = New
  19.  
  20. '**********************************************************
  21. 'TIMER
  22.  
  23. Config Timer2 = Timer , Prescale = 1024 , Compare = Disconnect , Clear_timer = 1 : Compare2 = 155       '10ms @16MHz
  24.  
  25. '**********************************************************
  26. 'WYJŚCIA "przekaźniki"
  27.  
  28. Config Porta.0 = Output : Porta.0 = 0 : Pk_1 Alias Porta.0  'wyjście nr1
  29. Config Porta.1 = Output : Porta.1 = 0 : Pk_2 Alias Porta.1  'wyjście nr2
  30. Config Porta.2 = Output : Porta.2 = 0 : Pk_3 Alias Porta.2  'wyjście nr3
  31. Config Porta.3 = Output : Porta.3 = 0 : Pk_4 Alias Porta.3  'wyjście nr4
  32. Config Porta.4 = Output : Porta.4 = 0 : Pk_5 Alias Porta.4  'wyjście nr5
  33. Config Porta.5 = Output : Porta.5 = 0 : Pk_6 Alias Porta.5  'wyjście nr6
  34. Config Porta.6 = Output : Porta.6 = 0 : Pk_7 Alias Porta.6  'wyjście nr7
  35. Config Porta.7 = Output : Porta.7 = 0 : Pk_8 Alias Porta.7  'wyjście nr8
  36. Config Portd.0 = Output : Portd.0 = 0 : Pk_9 Alias Portd.0  'wyjście nr9
  37. Config Portd.1 = Output : Portd.1 = 0 : Pk_10 Alias Portd.1 'wyjście nr19
  38. Config Portd.2 = Output : Portd.2 = 0 : Pk_11 Alias Portd.2 'wyjście nr11
  39. Config Portd.3 = Output : Portd.3 = 0 : Pk_12 Alias Portd.3 'wyjście nr12
  40. Config Portd.4 = Output : Portd.4 = 0 : Pk_13 Alias Portd.4 'wyjście nr13
  41. Config Portd.5 = Output : Portd.5 = 0 : Pk_14 Alias Portd.5 'wyjście nr14
  42. Config Portd.6 = Output : Portd.6 = 0 : Pk_15 Alias Portd.6 'wyjście nr15
  43. Config Portd.7 = Output : Portd.7 = 0 : Pk_16 Alias Portd.7 'wyjście nr16
  44.  
  45. '**********************************************************
  46. 'WYŚWIETLACZ LCD
  47.  
  48. $lib "bl_Lcd_i2c.lib"                                       'biblioteka I2C LCD
  49.  
  50. Config Lcd = 16x2                                           'wyświetlacz 16x2
  51.  
  52. Const Pcf_d4 = 4                                            'pin D4
  53. Const Pcf_d5 = 5                                            'pin D5
  54. Const Pcf_d6 = 6                                            'pin D6
  55. Const Pcf_d7 = 7                                            'pin D7
  56. Const Pcf_rs = 0                                            'pin RS
  57. Const Pcf_rw = 1                                            'pin RW
  58. Const Pcf_e1 = 2                                            'pin E
  59.  
  60. Dim _lcd_e As Byte
  61. Dim Backlight As Byte
  62.  
  63. Backlight_on Alias &H08
  64. Backlight_off Alias &H00
  65. Backlight = Backlight_on                                    'włącz podświetlenie
  66. _lcd_e = 128
  67.  
  68. Const Pcf8574_lcd = &H4E                                    'adres PCF8574
  69.  
  70. Waitms 100 : Cls                                            'odczekaj 100ms i wyczyść ekran
  71.  
  72. '**********************************************************
  73. 'I2C
  74.  
  75. Config Scl = Portc.0                                        'pin SCL
  76. Config Sda = Portc.1                                        'pin SDA
  77. I2cinit
  78. Config Twi = 400000                                         'prędkość I2C
  79.  
  80. '**********************************************************
  81. 'DS3231
  82.  
  83. Config Clock = User
  84. Config Date = Dmy , Separator = /                           'oddziel datę ukośnikiem
  85.  
  86. Const Ds3231w = &HD0                                        'adres DS3231 do zapisu
  87. Const Ds3231r = &HD1                                        'adres DS3231 do odczytu
  88.  
  89. '**********************************************************
  90. 'CZAS
  91.  
  92. Dim 100ms As Byte
  93. Dim 1s As Byte
  94. Dim 1m As Byte
  95.  
  96. '**********************************************************
  97. 'DZIEŃ "START"
  98.  
  99. Dim Co2_dzien As Byte , Co2_miesiac As Byte , Co2_rok As Byte
  100. Dim Co2_dzien_start As Word , Co2_dzien_teraz As Word
  101. Dim Co2_data_start_str As String * 8
  102.  
  103. Co2_dzien = 17                                              'ustaw dzień DNIA "START"
  104. Co2_miesiac = 1                                             'ustaw miesiąc DNIA "START"
  105. Co2_rok = 20                                                'ustaw rok DNIA "START"
  106.  
  107. '**********************************************************
  108. 'ZEGAR
  109.  
  110. Dim Weekday As Byte , Weekdayx As Byte , Weekday_str As String * 2
  111. Dim Date_str As String * 10
  112.  
  113. Dim Old_sec As Byte
  114.  
  115. '_hour = 17                                                  'ustaw godzinę
  116. '_min = 6                                                    'ustaw minutę
  117. '_sec = 0                                                    'ustaw sekundę
  118. 'Gosub Settime                                               'zapisz czas
  119.  
  120. '_day = 29                                                   'ustaw dzień
  121. '_month = 1                                                  'ustaw miesiąc
  122. '_year = 20                                                  'ustaw rok
  123. 'Gosub Setdate                                               'zapisz datę
  124.  
  125. '**********************************************************
  126. 'CZASÓWKA
  127.  
  128. '|   IDX   | ON/OFF | DAY_MON | DAY_TUE | DAY_WED | DAY_THU | DAY_FRI  | DAY_SAT |
  129. '| DAY_SUN | SEC_ON | MIN_ON  | HOUR_ON | SEC_OFF | MIN_OFF | HOUR_OFF | OUT_NR  |
  130.  
  131. Const Liczba_wpisow = 32
  132. Const Rozmiar_bazy = Liczba_wpisow * 16
  133.  
  134. Dim Helpb As Byte , N As Byte , M As Byte , Idx As Word
  135.  
  136. Dim Base(rozmiar_bazy) As Byte                              'zarezerwuj tyle bajtów
  137.  
  138. Dim Mybuff(16) As Byte
  139.  
  140. Dim Day_week As Byte
  141.  
  142. Dim Day_on_off As Byte At Mybuff(2) Overlay
  143.  
  144. Dim Day_mon As Byte At Mybuff(3) Overlay
  145. Dim Day_tue As Byte At Mybuff(4) Overlay
  146. Dim Day_wed As Byte At Mybuff(5) Overlay
  147. Dim Day_thu As Byte At Mybuff(6) Overlay
  148. Dim Day_fri As Byte At Mybuff(7) Overlay
  149. Dim Day_sat As Byte At Mybuff(8) Overlay
  150. Dim Day_sun As Byte At Mybuff(9) Overlay
  151.  
  152. Dim Sec_on_s As Byte At Mybuff(10) Overlay
  153. Dim Sec_on_m As Byte At Mybuff(11) Overlay
  154. Dim Sec_on_h As Byte At Mybuff(12) Overlay
  155.  
  156. Dim Sec_off_s As Byte At Mybuff(13) Overlay
  157. Dim Sec_off_m As Byte At Mybuff(14) Overlay
  158. Dim Sec_off_h As Byte At Mybuff(15) Overlay
  159.  
  160. Dim Time_on_str As String * 8 , Time_on As Long
  161. Dim Time_off_str As String * 8 , Time_off As Long
  162.  
  163. Dim Time_now As Long
  164.  
  165. Dim Outs As Long
  166. Dim _out(16) As Byte At Outs Overlay
  167.  
  168. '**********************************************************
  169. 'HARMONOGRAM DZIAŁANIA CZASÓWEK
  170.  
  171. Sub Sprawdz_harmonogram()
  172.  
  173.    Outs = 0
  174.    Idx = 1
  175.  
  176.    For N = 1 To Liczba_wpisow
  177.  
  178.       M = Memcopy(base(idx) , Mybuff(1) , 16)
  179.  
  180.       Select Case Weekdayx
  181.  
  182.          Case 0 : Day_week = Day_mon
  183.          Case 1 : Day_week = Day_tue
  184.          Case 2 : Day_week = Day_wed
  185.          Case 3 : Day_week = Day_thu
  186.          Case 4 : Day_week = Day_fri
  187.          Case 5 : Day_week = Day_sat
  188.          Case 6 : Day_week = Day_sun
  189.  
  190.       End Select
  191.  
  192.       If Day_on_off = 1 Then                                'jeżeli czasówka jest włączona
  193.  
  194.          If Day_week = 1 Then                               'jeżeli czasówka ma być włączona w danym dniu
  195.  
  196.             Time_now = Syssec(_sec)                         'czas aktualny
  197.  
  198.             '--------------------------
  199.             'CZAS WŁĄCZENIA
  200.  
  201.             If Sec_on_h < 10 Then
  202.                Time_on_str = "0" + Str(sec_on_h)
  203.             Else
  204.                Time_on_str = Str(sec_on_h)
  205.             End If
  206.  
  207.             If Sec_on_m < 10 Then
  208.                Time_on_str = Time_on_str + ":0" + Str(sec_on_m)
  209.             Else
  210.                Time_on_str = Time_on_str + ":" + Str(sec_on_m)
  211.             End If
  212.  
  213.             If Sec_on_s < 10 Then
  214.                Time_on_str = Time_on_str + ":0" + Str(sec_on_s)
  215.             Else
  216.                Time_on_str = Time_on_str + ":" + Str(sec_on_s)
  217.             End If
  218.  
  219.             Time_on = Syssec(time_on_str , Date$)
  220.  
  221.             '--------------------------
  222.             'CZAS WYŁĄCZENIA
  223.  
  224.             If Sec_off_h < 10 Then
  225.                Time_off_str = "0" + Str(sec_off_h)
  226.             Else
  227.                Time_off_str = Str(sec_off_h)
  228.             End If
  229.  
  230.             If Sec_off_m < 10 Then
  231.                Time_off_str = Time_off_str + ":0" + Str(sec_off_m)
  232.             Else
  233.                Time_off_str = Time_off_str + ":" + Str(sec_off_m)
  234.             End If
  235.  
  236.             If Sec_off_s < 10 Then
  237.                Time_off_str = Time_off_str + ":0" + Str(sec_off_s)
  238.             Else
  239.                Time_off_str = Time_off_str + ":" + Str(sec_off_s)
  240.             End If
  241.  
  242.             Time_off = Syssec(time_off_str , Date$)
  243.  
  244.             If Time_on <= Time_now Then
  245.  
  246.                If Time_off >= Time_now Then
  247.  
  248.                   Helpb = Mybuff(16)                        'które wyjście
  249.                   _out(helpb) = 1                           'zapamiętaj że mamy to włączyć
  250.  
  251.                End If
  252.  
  253.             End If
  254.  
  255.          End If
  256.  
  257.       End If
  258.  
  259.       Idx = Idx + 16
  260.  
  261.    Next
  262.  
  263.    '-----------------------------------
  264.    'STEROWANIE WYJŚCIAMI
  265.  
  266.    For N = 1 To 16
  267.  
  268.       If _out(n) = 1 Then
  269.  
  270.          Select Case N
  271.  
  272.             Case 1 : Set Pk_1
  273.             Case 2 : Set Pk_2
  274.             Case 3 : Set Pk_3
  275.             Case 4 : Set Pk_4
  276.             Case 5 : Set Pk_5
  277.             Case 6 : Set Pk_6
  278.             Case 7 : Set Pk_7
  279.             Case 8 : Set Pk_8
  280.             Case 9 : Set Pk_9
  281.             Case 10 : Set Pk_10
  282.             Case 11 : Set Pk_11
  283.             Case 12 : Set Pk_12
  284.             Case 13 : Set Pk_13
  285.             Case 14 : Set Pk_14
  286.             Case 15 : Set Pk_15
  287.             Case 16 : Set Pk_16
  288.  
  289.          End Select
  290.  
  291.       Else
  292.  
  293.          Select Case N
  294.  
  295.             Case 1 : Reset Pk_1
  296.             Case 2 : Reset Pk_2
  297.             Case 3 : Reset Pk_3
  298.             Case 4 : Reset Pk_4
  299.             Case 5 : Reset Pk_5
  300.             Case 6 : Reset Pk_6
  301.             Case 7 : Reset Pk_7
  302.             Case 8 : Reset Pk_8
  303.             Case 9 : Reset Pk_9
  304.             Case 10 : Reset Pk_10
  305.             Case 11 : Reset Pk_11
  306.             Case 12 : Reset Pk_12
  307.             Case 13 : Reset Pk_13
  308.             Case 14 : Reset Pk_14
  309.             Case 15 : Reset Pk_15
  310.             Case 16 : Reset Pk_16
  311.  
  312.          End Select
  313.  
  314.       End If
  315.  
  316.    Next
  317.  
  318. End Sub
  319.  
  320. Gosub Wypelnij_baze                                         'testowo uzupełnij bazę danymi
  321. Call Sprawdz_harmonogram
  322.  
  323. 'Gosub Czytaj_baze
  324. 'Wait 5 : Cls
  325.  
  326. Gosub Dzien_start
  327.  
  328. Enable Interrupts
  329.  
  330. '**********************************************************
  331. '**********************************************************
  332. 'GŁÓWNA PĘTLA PROGRAMU
  333. '**********************************************************
  334. '**********************************************************
  335.  
  336. Do
  337.  
  338.    If Tifr.ocf2 = 1 Then                                    'minęło 10ms, flagę ustawia Timer
  339.  
  340.       Tifr.ocf2 = 1                                         'flagi kasuje się wpisując jeden, nie zero
  341.  
  342.       If 100ms < 9 Then
  343.  
  344.          Incr 100ms
  345.  
  346.       Else
  347.  
  348.          100ms = 0
  349.  
  350.          If 1s < 9 Then
  351.  
  352.             Incr 1s
  353.  
  354.          Else
  355.  
  356.             1s = 0
  357.  
  358.             Call Sprawdz_harmonogram                        'sprawdź harmonogram czasówek co sekundę
  359.  
  360.             If 1m < 59 Then
  361.  
  362.                Incr 1m
  363.  
  364.             Else
  365.  
  366.                1m = 0
  367.  
  368.                Gosub Dzien_start
  369.  
  370.                'Call Sprawdz_harmonogram                     'sprawdź harmonogram czasówek co minutę
  371.  
  372.             End If
  373.  
  374.          End If
  375.  
  376.       End If
  377.  
  378.    End If
  379.  
  380.    '-----------------------------------
  381.    'WYŚWIETL CZAS, DATĘ I DZIEŃ TYGODNIA
  382.  
  383.    If Old_sec <> _sec Then                                  'jeśli zapamiętana sekunda rózni się od aktualnej
  384.  
  385.       Old_sec = _sec                                        'zapamiętaj aktualną
  386.  
  387.       '--------------------------------
  388.       'ZMIANA WYŚWIETLANIA ROKU Z 01/01/20 NA 01/01/2020
  389.  
  390.       Date_str = Date(_day)
  391.       Date_str = Mid(date_str , 1 , 6) + "20"
  392.       Date_str = Date_str + Str(_year)
  393.  
  394.       '--------------------------------
  395.       'WYLICZ DZIEŃ TYGODNIA
  396.  
  397.       Weekdayx = Dayofweek()
  398.       Weekday_str = Lookupstr(weekdayx , Weekdays)
  399.  
  400.       '--------------------------------
  401.       'WYŚWIETLAJ ZEGAR
  402.  
  403.       Locate 1 , 1 : Lcd Time$                              'wyświetl czas
  404.       Locate 2 , 1 : Lcd Date_str ; " " ; Weekday_str       'wyświetl datę i dzień tygodnia
  405.  
  406.    End If
  407.  
  408. Loop
  409. End
  410.  
  411. '**********************************************************
  412. '**********************************************************
  413. 'KONIEC GŁÓWNEJ PĘTLI PROGRAMU
  414. '**********************************************************
  415. '**********************************************************
  416.  
  417. '**********************************************************
  418. 'ODCZYT/ZAPIS ZEGARA
  419.  
  420. Getdatetime:
  421.  
  422.    I2cstart                                                 'wygeneruj kod startowy
  423.    I2cwbyte Ds3231w                                         'wyślij adres
  424.    I2cwbyte 0                                               'adres początkowy DS3231
  425.    I2cstart                                                 'Wygeneruj kod startowy
  426.    I2cwbyte Ds3231r                                         'wyślij adres
  427.    I2crbyte _sec , Ack                                      'sekunda
  428.    I2crbyte _min , Ack                                      'minuta
  429.    I2crbyte _hour , Ack                                     'godzina
  430.    I2crbyte Weekday , Ack                                   'dzień tygodnia
  431.    I2crbyte _day , Ack                                      'dzień
  432.    I2crbyte _month , Ack                                    'miesiąc
  433.    I2crbyte _year , Nack                                    'rok
  434.    I2cstop
  435.  
  436.    _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  437.    _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
  438.  
  439. Return
  440.  
  441. '**********************************************************
  442. 'ZAPIS DATY
  443.  
  444. Setdate:
  445.  
  446.    _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  447.  
  448.    I2cstart                                                 'wygeneruj kod startowy
  449.    I2cwbyte Ds3231w                                         'wyślij adres
  450.    I2cwbyte 4                                               'adres początkowy DS3231
  451.    I2cwbyte _day                                            'dzień
  452.    I2cwbyte _month                                          'miesiąc
  453.    I2cwbyte _year                                           'rok
  454.    I2cwbyte Weekday                                         'dzien tygodnia
  455.    I2cstop
  456.  
  457. Return
  458.  
  459. '**********************************************************
  460. 'ZAPIS CZASU
  461.  
  462. Settime:
  463.  
  464.    _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  465.  
  466.    I2cstart                                                 'wygeneruj kod startowy
  467.    I2cwbyte Ds3231w                                         'wyślij adres
  468.    I2cwbyte 0                                               'adres początkowy DS3231
  469.    I2cwbyte _sec                                            'sekunda
  470.    I2cwbyte _min                                            'minuta
  471.    I2cwbyte _hour                                           'godzina
  472.    I2cstop
  473.  
  474. Return
  475.  
  476. '**********************************************************
  477. '
  478.  
  479. Dzien_start:
  480.  
  481.    If Co2_dzien < 10 Then                                   'jeżeli dzień jest mniejszy niż 10 to dodaj "0"
  482.  
  483.       Co2_data_start_str = "0" + Str(co2_dzien) + "/"
  484.  
  485.    Else
  486.  
  487.       Co2_data_start_str = Str(co2_dzien) + "/"
  488.  
  489.    End If
  490.  
  491.    If Co2_miesiac < 10 Then                                 'jeżeli miesiąc jest mniejszy niż 10 to dodaj "0"
  492.  
  493.       Co2_data_start_str = Co2_data_start_str + "0" + Str(co2_miesiac) + "/"
  494.  
  495.    Else
  496.  
  497.       Co2_data_start_str = Co2_data_start_str + Str(co2_miesiac) + "/"
  498.  
  499.    End If
  500.  
  501.    Co2_data_start_str = Co2_data_start_str + Str(co2_rok)       'utwórz string daty dnia "START"
  502.  
  503.    Co2_dzien_start = Sysday(co2_data_start_str) 'data dnia "START"
  504.    Co2_dzien_teraz = Sysday()                   'teraźniejsza data
  505.    Co2_dzien_teraz = Co2_dzien_teraz - Co2_dzien_start       'odejmij datę dnia "START" od teraźniejszej daty
  506.  
  507.    Locate 2 , 14 : Lcd "|" ; Co2_dzien_teraz ; " "          'wyświetl ile dni minęło od dnia "START"
  508.  
  509. Return
  510.  
  511. '**********************************************************
  512. 'TESTOWO WYPEŁNIJ BAZĘ DANYMI
  513.  
  514. Wypelnij_baze:
  515.  
  516.    '| IDX | ON/OFF | DAY_MON | DAY_TUE | DAY_WED | DAY_THU | DAY_FRI | DAY_SAT |
  517.    '| DAY_SUN | SEC_ON | MIN_ON | HOUR_ON | SEC_OFF | MIN_OFF | HOUR_OFF | OUT_NR |
  518.  
  519.    '-----------------------------------
  520.    'CZASÓWKA NR1
  521.    Base(1) = 1 : Base(2) = 1 : Base(3) = 1 : Base(4) = 1 : Base(5) = 1 : Base(6) = 1 : Base(7) = 1 : Base(8) = 1
  522.    Base(9) = 1 : Base(10) = 0 : Base(11) = 0 : Base(12) = 12 : Base(13) = 0 : Base(14) = 0 : Base(15) = 23 : Base(16) = 1
  523.  
  524.    '-----------------------------------
  525.    'CZASÓWKA NR2
  526.    Base(17) = 2 : Base(18) = 1 : Base(19) = 1 : Base(20) = 1 : Base(21) = 1 : Base(22) = 1 : Base(23) = 1 : Base(24) = 1
  527.    Base(25) = 1 : Base(26) = 0 : Base(27) = 0 : Base(28) = 12 : Base(29) = 0 : Base(30) = 0 : Base(31) = 23 : Base(32) = 2
  528.  
  529.    '-----------------------------------
  530.    'CZASÓWKA NR3
  531.    Base(33) = 3 : Base(34) = 1 : Base(35) = 1 : Base(36) = 1 : Base(37) = 1 : Base(38) = 1 : Base(39) = 1 : Base(40) = 1
  532.    Base(41) = 1 : Base(42) = 0 : Base(43) = 0 : Base(44) = 12 : Base(45) = 0 : Base(46) = 0 : Base(47) = 23 : Base(48) = 3
  533.  
  534.    '-----------------------------------
  535.    'CZASÓWKA NR4
  536.    Base(49) = 4 : Base(50) = 1 : Base(51) = 1 : Base(52) = 1 : Base(53) = 1 : Base(54) = 1 : Base(55) = 1 : Base(56) = 1
  537.    Base(57) = 1 : Base(58) = 0 : Base(59) = 0 : Base(60) = 12 : Base(61) = 0 : Base(62) = 0 : Base(63) = 23 : Base(64) = 4
  538.  
  539.    '-----------------------------------
  540.    'CZASÓWKA NR5
  541.    Base(65) = 5 : Base(66) = 1 : Base(67) = 1 : Base(68) = 1 : Base(69) = 1 : Base(70) = 1 : Base(71) = 1 : Base(72) = 1
  542.    Base(73) = 1 : Base(74) = 0 : Base(75) = 0 : Base(76) = 12 : Base(77) = 0 : Base(78) = 0 : Base(79) = 23 : Base(80) = 5
  543.  
  544.    '-----------------------------------
  545.    'CZASÓWKA NR6
  546.    Base(81) = 6 : Base(82) = 1 : Base(83) = 1 : Base(84) = 1 : Base(85) = 1 : Base(86) = 1 : Base(87) = 1 : Base(88) = 1
  547.    Base(89) = 1 : Base(90) = 0 : Base(91) = 0 : Base(92) = 12 : Base(93) = 0 : Base(94) = 0 : Base(95) = 23 : Base(96) = 6
  548.  
  549.    '-----------------------------------
  550.    'CZASÓWKA NR7
  551.    Base(97) = 7 : Base(98) = 1 : Base(99) = 1 : Base(100) = 1 : Base(101) = 1 : Base(102) = 1 : Base(103) = 1 : Base(104) = 1
  552.    Base(105) = 1 : Base(106) = 0 : Base(107) = 0 : Base(108) = 12 : Base(109) = 0 : Base(110) = 0 : Base(111) = 23 : Base(112) = 7
  553.  
  554.    '-----------------------------------
  555.    'CZASÓWKA NR8
  556.    Base(113) = 8 : Base(114) = 1 : Base(115) = 1 : Base(116) = 1 : Base(117) = 1 : Base(118) = 1 : Base(119) = 1 : Base(120) = 1
  557.    Base(121) = 1 : Base(122) = 0 : Base(123) = 0 : Base(124) = 12 : Base(125) = 0 : Base(126) = 0 : Base(127) = 23 : Base(128) = 8
  558.  
  559.    '-----------------------------------
  560.    'CZASÓWKA NR9
  561.  
  562.    '-----------------------------------
  563.    'CZASÓWKA NR10
  564.  
  565.    '-----------------------------------
  566.    'CZASÓWKA NR11
  567.  
  568.    '-----------------------------------
  569.    'CZASÓWKA NR12
  570.  
  571.    '-----------------------------------
  572.    'CZASÓWKA NR13
  573.  
  574.    '-----------------------------------
  575.    'CZASÓWKA NR14
  576.  
  577.    '-----------------------------------
  578.    'CZASÓWKA NR15
  579.  
  580.    '-----------------------------------
  581.    'CZASÓWKA NR16
  582.  
  583.    '-----------------------------------
  584.    'CZASÓWKA NR17
  585.  
  586.    '-----------------------------------
  587.    'CZASÓWKA NR18
  588.  
  589.    '-----------------------------------
  590.    'CZASÓWKA NR19
  591.  
  592.    '-----------------------------------
  593.    'CZASÓWKA NR20
  594.  
  595.    '-----------------------------------
  596.    'CZASÓWKA NR21
  597.  
  598.    '-----------------------------------
  599.    'CZASÓWKA NR22
  600.  
  601.    '-----------------------------------
  602.    'CZASÓWKA NR23
  603.  
  604.    '-----------------------------------
  605.    'CZASÓWKA NR24
  606.  
  607.    '-----------------------------------
  608.    'CZASÓWKA NR25
  609.  
  610.    '-----------------------------------
  611.    'CZASÓWKA NR26
  612.  
  613.    '-----------------------------------
  614.    'CZASÓWKA NR27
  615.  
  616.    '-----------------------------------
  617.    'CZASÓWKA NR28
  618.  
  619.    '-----------------------------------
  620.    'CZASÓWKA NR29
  621.  
  622.    '-----------------------------------
  623.    'CZASÓWKA NR30
  624.  
  625.    '-----------------------------------
  626.    'CZASÓWKA NR31
  627.  
  628.    '-----------------------------------
  629.    'CZASÓWKA NR32
  630.  
  631. Return
  632.  
  633. '**********************************************************
  634. 'WYŚWIETL ZAPISY BAZY
  635.  
  636. Czytaj_baze:
  637.  
  638.    '-----------------------------------
  639.    'CZASÓWKA NR1
  640.  
  641.    '                   |HOUR_ON|        |MIN_ON|         |SEC_ON|         |HOUR_OFF|       |MIN_OFF|        |SEC_OFF|
  642.    Locate 1 , 1 : Lcd Base(12) ; ":" ; Base(11) ; ":" ; Base(10) ; " " ; Base(15) ; ":" ; Base(14) ; ":" ; Base(13)
  643.  
  644.    '                   |IDX|           |ON/OFF|        |DAY_MON| |DAY_TUE| |DAY_WED| |DAY_THU| |DAY_FRI| |DAY_SAT| |DAY_SUN|
  645.    Locate 2 , 1 : Lcd Base(1) ; " " ; Base(2) ; " " ; Base(3) ; Base(4) ; Base(5) ; Base(6) ; Base(7) ; Base(8) ; Base(9)
  646.  
  647. Return
  648.  
  649. '**********************************************************
  650. 'DNI TYGODNIA
  651.  
  652. Weekdays:
  653.  
  654. Data "Pn" , "Wt" , "Sr" , "Cz" , "Pt" , "So" , "Nd"         'dzień tygodnia do wyświetlenia
.
Mam problem z funkcjami: Time_on = Syssec(sec_on) i Time_off = Syssec(sec_off) - nie chce coś to działać i dlatego zrobiłem jak wcześniej czyli:
.
  1.             '--------------------------
  2.             'CZAS WŁĄCZENIA
  3.  
  4.             If Sec_on_h < 10 Then
  5.                Time_on_str = "0" + Str(sec_on_h)
  6.             Else
  7.                Time_on_str = Str(sec_on_h)
  8.             End If
  9.  
  10.             If Sec_on_m < 10 Then
  11.                Time_on_str = Time_on_str + ":0" + Str(sec_on_m)
  12.             Else
  13.                Time_on_str = Time_on_str + ":" + Str(sec_on_m)
  14.             End If
  15.  
  16.             If Sec_on_s < 10 Then
  17.                Time_on_str = Time_on_str + ":0" + Str(sec_on_s)
  18.             Else
  19.                Time_on_str = Time_on_str + ":" + Str(sec_on_s)
  20.             End If
  21.  
  22.             Time_on = Syssec(time_on_str , Date$)
  23.  
  24.             '--------------------------
  25.             'CZAS WYŁĄCZENIA
  26.  
  27.             If Sec_off_h < 10 Then
  28.                Time_off_str = "0" + Str(sec_off_h)
  29.             Else
  30.                Time_off_str = Str(sec_off_h)
  31.             End If
  32.  
  33.             If Sec_off_m < 10 Then
  34.                Time_off_str = Time_off_str + ":0" + Str(sec_off_m)
  35.             Else
  36.                Time_off_str = Time_off_str + ":" + Str(sec_off_m)
  37.             End If
  38.  
  39.             If Sec_off_s < 10 Then
  40.                Time_off_str = Time_off_str + ":0" + Str(sec_off_s)
  41.             Else
  42.                Time_off_str = Time_off_str + ":" + Str(sec_off_s)
  43.             End If
  44.  
  45.             Time_off = Syssec(time_off_str , Date$)
.
ale wydaje mi się, że to jest pomysł bezsensu ponieważ robię teraz mnóstwo (zbędnych) obliczeń.

Program ogólnie działa, ale w sumie tylko dla czterech pierwszych czasówek gdy wskakuję do programu "Sprawdz_harmonogram" co sekundę.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: RTC, działania na podstawie czasu

Post autor: niveasoft » 29 sty 2020, 18:54

Z jednej strony nie moge na to patrzeć ahahaha, ale faktycznie moja podpowiedź nie mogła działać ponieważ:
W helpie można przeczytać że "Target = SYSSEC(bSecMinHour)" ..., ale dalej czytając opis mozna przeczytać, że potrzeba sześc bajtów "BSecMinHour
A Byte, which holds the Sec-value followed by Min(Byte), Hour (Byte), Day(Byte), Month(Byte) and Year(Byte)
", tak samo jak w zegarku, czyli potrzeba tez Dzień, Miesiąc i Rok.
Po prostu pisanie w ciągu tygodnia może byc efektywniejsze bo w piątek przeprowadzam czasami reset ahahahaha :D

Myślę, ze taki sub byłby juz lepszy i coś powinno działać :P
  1. Sub Check_scheduler()
  2.      Outs = 0
  3.       Idx = 1
  4.      For N = 1 To Liczba_wpisow
  5.       M = Memcopy(base(idx) , Mybuff(1) , 8)                'wczytaj osiem bitów z bazy
  6.  
  7.       Time_now = Syssec(_sec)                                   'czas aktualny
  8.       M = Memcopy(_sec , Tempbuff(4) , 3)                   'kopiuj do Tempbuff _day, _month i _year
  9.       M = Memcopy(sec_on , Tempbuff(1) , 3)                 'kopiuj sec_on, min_on i hour_on do Tempbuff
  10.       Time_on = Syssec(tempbuff(1))
  11.       M = Memcopy(sec_off , Tempbuff(1) , 3)
  12.       Time_off = Syssec(tempbuff(1))
  13.  
  14.       If Time_now > Time_on Then
  15.        If Time_now < Time_off Then
  16.         Helpb = Mybuff(8)                                       'które wyjście
  17.         _out(helpb) = 1                                         'zapamietaj że mamy to włączyć
  18.        End If
  19.       End If
  20.  
  21.       Idx = Idx + 8
  22.      Next
  23.  
  24.      For N = 1 To 4
  25.       If _out(n) = 1 Then
  26.        Select Case N
  27.         Case 1 : Set Porta.4
  28.         Case 2 : Set Portb.1
  29.         Case 3 : Set Portc.2
  30.         Case 4 : Set Portd.7
  31.        End Select
  32.       Else
  33.        Select Case N
  34.         Case 1 : Reset Porta.4
  35.         Case 2 : Reset Portb.1
  36.         Case 3 : Reset Portc.2
  37.         Case 4 : Reset Portd.7
  38.        End Select
  39.       End If
  40.      Next
  41.     End Sub
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: RTC, działania na podstawie czasu

Post autor: niveasoft » 29 sty 2020, 19:02

A o to mi chodziło kiedy pisałem o sprawdzaniu pierwszego bajtu rekordu.. mozna tam zapisać każdy dzień tygodnia i to czy wpis aktywny..
  1.   Sub Check_scheduler()
  2.      Outs = 0
  3.       Idx = 1
  4.  
  5.      Time_now = Syssec(_sec)                                'czas aktualny oblicz raz
  6.      Dim Daynow As Byte
  7.       Daynow = Dayofweek(time_now)                          'oblicz raz
  8.  
  9.      For N = 1 To Liczba_wpisow
  10.  
  11.       M = Memcopy(base(idx) , Mybuff(1) , 8)                'wczytaj osiem bajtów z bazy
  12.  
  13.        If Mybuff(1).7 = 1 Then                              'jeśli ósmy bit =1 to wpis jest aktywny
  14.           If Mybuff(1).daynow = 1 Then                         'jeśli w bajcie aktywny jest ten dzień tygodnia
  15.  
  16.             M = Memcopy(_sec , Tempbuff(4) , 3)                   'kopiuj do Tempbuff _day, _month i _year
  17.             M = Memcopy(sec_on , Tempbuff(1) , 3)                 'kopiuj sec_on, min_on i hour_on do Tempbuff
  18.             Time_on = Syssec(tempbuff(1))
  19.             M = Memcopy(sec_off , Tempbuff(1) , 3)
  20.             Time_off = Syssec(tempbuff(1))
  21.  
  22.             If Time_now > Time_on Then
  23.              If Time_now < Time_off Then
  24.               Helpb = Mybuff(8)                                       'które wyjście
  25.               _out(helpb) = 1                                         'zapamietaj że mamy to włączyć
  26.              End If
  27.             End If
  28.  
  29.           End If
  30.        End If
  31.       Idx = Idx + 8
  32.      Next
  33.  
  34.      For N = 1 To 4
  35.       If _out(n) = 1 Then
  36.        Select Case N
  37.         Case 1 : Set Porta.4
  38.         Case 2 : Set Portb.1
  39.         Case 3 : Set Portc.2
  40.         Case 4 : Set Portd.7
  41.        End Select
  42.       Else
  43.        Select Case N
  44.         Case 1 : Reset Porta.4
  45.         Case 2 : Reset Portb.1
  46.         Case 3 : Reset Portc.2
  47.         Case 4 : Reset Portd.7
  48.        End Select
  49.       End If
  50.      Next
  51.     End Sub
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: RTC, działania na podstawie czasu

Post autor: pimowo » 29 sty 2020, 19:06

Dzięki, zaraz będę testował ;)
Przeglądałem pliki pomocy etc i na nic mądrego nie mogłem wpaść, ponieważ w głowie miałem "Bartek pisał, że ma tak być"
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: RTC, działania na podstawie czasu

Post autor: niveasoft » 29 sty 2020, 19:08

No to przepraszam, że zmyliłem. Czasem mam coś podłączone i takie błędy wyłapuję od razu bo mi tez nie działa, ale czasem pisze tak z głowy w przekonaniu że powinno fuczeć :D
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: RTC, działania na podstawie czasu

Post autor: pimowo » 29 sty 2020, 19:10

Ja w żadnym wypadku nie mam pretensji czy coś...
Mówię tylko, że najgorzej jak człowiek wbije sobie coś do głowy i trzyma się jednej myśli.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: RTC, działania na podstawie czasu

Post autor: pimowo » 29 sty 2020, 23:48

Bartek, pomóż. Jak ja mam teraz wypełnić bazę? Coś nie ogarniam teraz tego.
Przykładowo chciałbym aby przekaźnik nr1 załączał się w poniedziałek, wtorek, środę i w sobotę od godziny 12:00:00 do godziny 23:30:00
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: RTC, działania na podstawie czasu

Post autor: niveasoft » 30 sty 2020, 0:07

To chyba proste. Napisałem to w kilka minut więc błąd mógł się wkraść.
Do pełni szczęścia potrzebujesz zdefiniować w Eeprom taka samą tablice i ją wstępnie przy pierwszym uruchomieniu zaprogramować zerami w bufor(1) dla każdego rekordu.
  1. Sub Set_record(byval Days As Byte , Byval Secs_on As Byte , Byval Mins_on As Byte , Byval Hours_on As Byte , _
  2.      Byval Secs_off As Byte , Byval Mins_off As Byte , Byval Hours_off As Byte , Byval Out_relay As Byte)
  3.  
  4.      For N = 1 To Liczba_wpisow   'szukaj wolnego
  5.  
  6.       M = Memcopy(base(idx) , Mybuff(1) , 8)                'wczytaj osiem bajtów z bazy
  7.       If Mybuff(1).7 = 0 Then                               'ten rekord jest wolny, zapiszemy go
  8.  
  9.        Mybuff(1) = Days
  10.        Mybuff(2) = Secs_on
  11.        Mybuff(3) = Mins_on
  12.        Mybuff(4) = Hours_on
  13.        Mybuff(5) = Secs_off
  14.        Mybuff(6) = Mins_off
  15.        Mybuff(7) = Hours_off
  16.        Mybuff(8) = Out_relay
  17.  
  18.        'zapis do RAM
  19.        M = Memcopy(mybuff(1) , Base(idx) , 8)
  20.  
  21.        'zapis do eeprom
  22.        Helpb = Idx + 8         'może tu powinno być 7 bo np 1+7 to 8
  23.        For N = Idx To Helpb
  24.         Mybase_ee(n) = Base(n)
  25.        Next
  26.  
  27.  
  28.       End If
  29.  
  30.       Idx = Idx + 8
  31.      Next
  32.  
  33.     End Sub
  34.  
  35.     'bity 7=Aktywny, od prawej pon,wto,sro..i sob.
  36.     Call Set_record(&B1010_0111 , 0 , 0 , 12 , 0 , 30 , 23 , 4)       'relay 4  from 12:00 to 23:30
  37.  
  38.  
ODPOWIEDZ