ADVERTISEMENT

Atmega1284P_Domoticz_v.6d.zip

Bascom - Atmega1284P + ESP8266 + Domoticz - losowe wysyłanie danych JSON

Mam układ w konfiguracji jak w tytule ( do tego czujniki DS, BME280, zapis SD, RFM12 ) Ostatni etap to wysyłanie przez JSON do Domoticz. Niestety szwankuje wysyłanie i robi to losowo, czasem po wysłaniu danych z kilku czujników, czasem przejdzie cały "cykl" Odstęp pomiędzy wysyłaniem wynosi pomiędzy 20 a 30 sekund, natomiast odstęp pomiędzy wysyłaniem danych dla konkretnego czujnika wynosi 11 minut. W załączniku cały kod, wklejam tylko część odpowiedzialną za Domoticz + fragment Select Case. Do odbioru UART wykorzystałem Serial0charmatch według pomysłu Niveasoft. $regfile = "m1284pdef.dat" $crystal = 8000000 $hwstack = 192 ' rozmiar stosu sprzętowego $swstack = 192 ' rozmiar stosu programowego $framesize = 255 $baud = 38400 $baud1 = 19200 '************ Uart 0 Open "COM1:" For Binary As #1 Config Serialin0 = Buffered , Size = 150 , Bytematch = 10 'for COM1 Config Input1 = Crlf , Echo = Cr Echo Off 'Config Serialout0 = Buffered , Size = 100 Const Max_str_len = 150 Dim Com1_str As String * Max_str_len '************ Uart 1 Open "COM2:" For Binary As #4 Config Serialin1 = Buffered , Size = 100 , Bytematch = 13 Dim Got_match2 As Byte Dim Inp_str2 As String * 100 '********************* Deklaracje zmiennych Domoticz Dim Domoticz_idx As String * 3 Dim Domoticz_nvalue As String * 3 Dim Domoticz_data As String * 26 Dim Domoticz_len As Byte Dim Domoticz_len_str As String * 3 Dim Domoticz_ip As String * 16 Dim Cmd_len As String * 15 Dim Domoticz_ciag As String * 150 Dim Domoticz_en As Bit Dim Domoticz_port As String * 4 Dim Domoticz_krok As Byte Domoticz_ip = "192.168.0.92" Domoticz_port = "8080" Domoticz_nvalue = "" '************ deklaracja zmiennych ESP8266 Dim Got_match_0 As Bit Dim Ap_select As Byte ' wybor punktu dostepu Dim Ssid As String * 10 ' nazwa punktu dostepu Dim Pass As String * 14 ' haslo WiFi Dim Flaga_wyslij_domoticz As Bit Print #1 , "AT+RST" Wait 2 Print #1 , "AT+CWMODE=1" Waitms 100 Ssid = "SSid" Pass = "PAss" Ciag_sd = "AT+CWJAP=" + Chr(34) + Ssid + Chr(34) + "," + Chr(34) + Pass + Chr(34) Print #1 , Ciag_sd Waitms 6000 Ciag_sd = "" Com1_str = "" Do '********************** If Domoticz_en = 1 Then ' jesli zezwolono na nasluch UART If Got_match_0 = 1 Then ' gdy cos odebrano Got_match_0 = 0 Call Send_domoticz ' wywolaj program parsowania odpowiedzi End If End If '********************** If Flaga_wyslij_domoticz = 1 Then Flaga_wyslij_domoticz = 0 Domoticz_en = 1 Ciag_sd = "AT+PING=" + Chr(34) + Domoticz_ip + Chr(34) ' sprawdzanie, czy serwer jest dostepny Print #1 , Ciag_sd Ciag_sd = "" End If '********************** If Flaga_zmierz = 1 Then Gosub Getdatetime ' odczytaj czas i date If Godziny = 23 And Minuty = 59 Then If Sekundy >= 45 And Sekundy =< 59 Then Numer_sd1 = 0 ' zerowanie licznika zapisu pliku 1 Numer_sd2 = 0 ' zerowanie licznika zapisu pliku 2 Numer_sd3 = 0 ' zerowanie licznika zapisu pliku 3 Numer_sd4 = 0 ' zerowanie licznika zapisu pliku 4 Numer_sd5 = 0 ' zerowanie licznika zapisu pliku 5 Numer_sd6 = 0 ' zerowanie licznika zapisu pliku 6 Numer_sd7 = 0 ' zerowanie licznika zapisu pliku 6 Numer_sd8 = 0 ' zerowanie licznika zapisu pliku 6 Wybor = 0 ' powrot do poczatku wywolania czujnikow End If End If Select Case Wybor '^^^^^^^^^^^^^^^^^^ Case 0: '^^^^^^^^^^^^^^^^^^ Case 1: Gosub Wywolaj_czujnik '^^^^^^^^^^^^^^^^^^ Case 2: ' pierwszy czujnik ' Ds_number = 1 Ds_adres = 1 Ds_dec_temp = Ds1_dec ' przypisanie do tymczasowego poprzednich wynikow Ds_mod_temp = Ds1_mod ' przypisanie do tymczasowego poprzednich wynikow Ds_t_str_temp = T1 ' przypisanie do tymczasowego poprzednich wynikow Ds_calculation_data_temp = Ds1_calculation_data H1_ds_i = H1_ds_i1 ' przypisanie danych histerezy z poprzedniego pomiaru Call Pomiar_ds(ds1_dec , Ds1_mod , Ds1_calculation_data , T1 , H1_ds_i1 ) '******** If Ds1_same = 1 Or Ds1_stat = 1 Or Ds1_crc_c = 1 Then ' zabezpieczenie w przypadku awarii lub bledu CRC Ds1_dec = Ds_dec_temp ' przypisanie poprzednich Ds1_mod = Ds_mod_temp ' przypisanie poprzednich T1 = Ds_t_str_temp ' przypisanie poprzednich '*********** gdy takie same, przypisanie z poprzedniego pomiaru Rfm_tab_send_klient(13) = Ds_dec_temp ' przypisanie poprzednich Rfm_tab_send_klient(14) = Ds_mod_temp ' przypisanie poprzednich Rfm_tab_send_klient(15) = Ds1_calculation_data ' przypisanie aktualnych Else '******** przypisanie do zmiennych wysylanych Rfm_tab_send_klient(13) = Ds1_dec ' przypisanie aktualnych Rfm_tab_send_klient(14) = Ds1_mod ' przypisanie aktualnych Rfm_tab_send_klient(15) = Ds1_calculation_data ' przypisanie aktualnych End If '******** warunkowe wyslanie powiadomienia na GSM w razie awarii czujnika If Ds1_stat = 1 And Gsm_message_period = 0 Then ' gdy awaria czujnika - wyslanie SMS Gsm_message_period = 5 ' ustaw przerwe pomiedzy wysylaniem SMS Gsm_message_enable = 1 ' zezwol na wyslanie SMS'a Gsm_message = "Ds 1" ' tresc informujaca, ktory czujnik Else Decr Gsm_message_period End If '^^^^^^^^^^^^^^^^^^ Case 3: '******** If Ds1_same = 1 Then ' gdy wartosc zmierzona nie zmienila sie Incr Wybor ' pomin wysylanie do Domoticz, przejscie do nastepnego czujnika End If '^^^^^^^^^^^^^^^^^^ Case 4: ' pierwszy czujnik - wysyłanie do Domoticz '******** wysylanie do Domoticz Domoticz_data = Str(ds1_dec) + "." + Str(ds1_mod) Domoticz_idx = "1" ' numer czujnika w bazie Domoticz Domoticz_nvalue = "0" Flaga_wyslij_domoticz = 1 '^^^^^^^^^^^^^^^^^^ Case 5: ' drugi czujnik 'Ds_number = 2 Ds_adres = 9 Ds_dec_temp = Ds2_dec ' przypisanie do tymczasowego poprzednich wynikow Ds_mod_temp = Ds2_mod ' przypisanie do tymczasowego poprzednich wynikow Ds_calculation_data_temp = Ds2_calculation_data ' przypisanie do tymczasowego poprzednich wynikow Ds_t_str_temp = T2 H1_ds_i = H1_ds_i2 ' przypisanie danych histerezy z poprzedniego pomiaru Call Pomiar_ds(ds2_dec , Ds2_mod , Ds2_calculation_data , T2 , H1_ds_i2 ) '******** If Ds2_same = 1 Or Ds2_stat = 1 Or Ds2_crc_c = 1 Then ' zabezpieczenie w przypadku awarii lub bledu CRC Ds2_dec = Ds_dec_temp ' przypisanie poprzednich Ds2_mod = Ds_mod_temp ' przypisanie poprzednich T2 = Ds_t_str_temp ' przypisanie poprzednich '*********** gdy takie same, przypisanie z poprzedniego pomiaru Rfm_tab_send_klient(16) = Ds_dec_temp ' przypisanie poprzednich Rfm_tab_send_klient(17) = Ds_mod_temp ' przypisanie poprzednich Rfm_tab_send_klient(18) = Ds2_calculation_data ' przypisanie aktualnych Else '******** przypisanie do zmiennych wysylanych Rfm_tab_send_klient(16) = Ds2_dec ' przypisanie aktualnych Rfm_tab_send_klient(17) = Ds2_mod ' przypisanie aktualnych Rfm_tab_send_klient(18) = Ds2_calculation_data ' przypisanie aktualnych End If '******** warunkowe wyslanie powiadomienia na GSM w razie awarii czujnika If Ds2_stat = 1 And Gsm_message_period = 0 Then ' gdy awaria czujnika - wyslanie SMS Gsm_message_period = 5 ' ustaw przerwe pomiedzy wysylaniem SMS Gsm_message_enable = 1 ' zezwol na wyslanie SMS'a Gsm_message = "Ds 2" ' tresc informujaca, ktory czujnik Else Decr Gsm_message_period End If '^^^^^^^^^^^^^^^^^^ Case 6: '******** If Ds2_same = 1 Then ' gdy wartosc zmierzona nie zmienila sie Incr Wybor ' pomin wysylanie do Domoticz, przejscie do nastepnego czujnika End If '^^^^^^^^^^^^^^^^^^ Case 7: ' drugi czujnik - wysyłanie do Domoticz '******** wysylanie do Domoticz Domoticz_data = Str(ds2_dec) + "." + Str(ds2_mod) Domoticz_idx = "7" ' numer czujnika w bazie Domoticz Domoticz_nvalue = "0" Flaga_wyslij_domoticz = 1 End Select End If Loop End '********************** Sub Send_domoticz: Select Case Domoticz_krok Case 0: Select Case Com1_str Case "OK" ' odpowiedz na AT Domoticz_ciag = "AT+CIPSTART=" + Chr(34) + "TCP" + Chr(34) + "," + Chr(34) + Domoticz_ip + Chr(34) + "," + Domoticz_port Print #1 , Domoticz_ciag Domoticz_krok = 1 'Case "CONNECT" ' gdy polaczono End Select Case 1: Select Case Com1_str Case "OK" ' zaraz po CONNECT nastepne OK Domoticz_ciag = "GET /json.htm?type=command¶m=udevice&idx=" + Domoticz_idx + "&nvalue=" Domoticz_ciag = Domoticz_ciag + Domoticz_nvalue Domoticz_ciag = Domoticz_ciag + "&svalue=" + Domoticz_data + " HTTP/1.1" Domoticz_ciag = Domoticz_ciag + "{013}{010}" Domoticz_len = Len(domoticz_ciag) ' obliczanie dlugosci wysylanego ciagu Domoticz_len_str = Str(domoticz_len) Cmd_len = "AT+CIPSEND=" + Domoticz_len_str ' tworzenie ciagu z informacja o dlugosci Print #1 , Cmd_len Domoticz_krok = 2 End Select Case 2: Select Case Com1_str Case "OK" Print #1 , Domoticz_ciag Domoticz_krok = 3 End Select Case 3: Select Case Com1_str Case "SEND OK" Domoticz_ciag = "Host: " + Domoticz_ip + ":" + Domoticz_port Domoticz_ciag = Domoticz_ciag + "{013}{010}" Domoticz_len = Len(domoticz_ciag) ' obliczanie dlugosci wysylanego ciagu Domoticz_len_str = Str(domoticz_len) Cmd_len = "AT+CIPSEND=" + Domoticz_len_str ' tworzenie ciagu z informacja o dlugosci Print #1 , Cmd_len Domoticz_krok = 4 End Select Case 4: Select Case Com1_str Case "OK" Print #1 , Domoticz_ciag Domoticz_krok = 5 End Select Case 5: Select Case Com1_str Case "SEND OK" Domoticz_ciag = "Connection: close" Domoticz_ciag = Domoticz_ciag + "{013}{010}" Domoticz_len = Len(domoticz_ciag) Domoticz_len_str = Str(domoticz_len) ' obliczanie dlugosci wysylanego ciagu Cmd_len = "AT+CIPSEND=" + Domoticz_len_str ' tworzenie ciagu z informacja o dlugosci Print #1 , Cmd_len Domoticz_krok = 6 End Select Case 6: Select Case Com1_str Case "OK" Print #1 , Domoticz_ciag Domoticz_krok = 7 End Select Case 7: Select Case Com1_str Case "SEND OK" Domoticz_ciag = "Accept: */*" Domoticz_ciag = Domoticz_ciag + "{013}{010}" Domoticz_len = Len(domoticz_ciag) Domoticz_len_str = Str(domoticz_len) ' obliczanie dlugosci wysylanego ciagu Cmd_len = "AT+CIPSEND=" + Domoticz_len_str ' tworzenie ciagu z informacja o dlugosci Print #1 , Cmd_len Domoticz_krok = 8 End Select Case 8: Select Case Com1_str Case "OK" Print #1 , Domoticz_ciag Domoticz_krok = 9 End Select Case 9: Select Case Com1_str Case "SEND OK" Domoticz_ciag = "User-Agent: Atmega-Client (compatible; esp8266 Lua; Windows NT 5.1)" Domoticz_ciag = Domoticz_ciag + "{013}{010}" Domoticz_len = Len(domoticz_ciag) Domoticz_len_str = Str(domoticz_len) ' obliczanie dlugosci wysylanego ciagu Cmd_len = "AT+CIPSEND=" + Domoticz_len_str ' tworzenie ciagu z informacja o dlugosci Print #1 , Cmd_len Domoticz_krok = 10 End Select Case 10: Select Case Com1_str Case "OK" Print #1 , Domoticz_ciag Domoticz_krok = 11 End Select Case 11: Select Case Com1_str Case "SEND OK" Domoticz_ciag = "" Domoticz_ciag = Domoticz_ciag + "{013}{010}" Domoticz_len = Len(domoticz_ciag) Domoticz_len_str = Str(domoticz_len) ' obliczanie dlugosci wysylanego ciagu Cmd_len = "AT+CIPSEND=" + Domoticz_len_str ' tworzenie ciagu z informacja o dlugosci Print #1 , Cmd_len Domoticz_krok = 12 End Select Case 12: Select Case Com1_str Case "OK" Print #1 , Domoticz_ciag ; Chr(13) ; Chr(10) ; Domoticz_krok = 13 End Select Case 13: Select Case Com1_str Case "SEND OK" Domoticz_krok = 14 End Select Case 14: Select Case Com1_str Case "CLOSED" '"SEND OK" Domoticz_en = 0 Com1_str = "" Domoticz_ciag = "" Domoticz_krok = 0 End Select End Select End Sub '********************** Serial0charmatch: $asm !PUSH R24 !in R24, sreg !PUSH R24 $end Asm $timeout = 3000 Input Com1_str 'Out_str = Com1_str Clear Serialin0 Got_match_0 = 1 ' Tuned with NoSave Tool $asm !POP R24 !out sreg, r24 !POP R24 $end Asm Return I teraz podpinając się do UART od strony Tx ESP8266 mam: AT+PING="192.168.0.92" +2 OK AT+CIPSTART="TCP","192.168.0.92",8080 CONNECT OK AT+CIPSEND=79 OK > busy s... Recv 79 bytes SEND OK AT+CIPSEND=25 OK > busy s... Recv 25 bytes SEND OK AT+CIPSEND=19 OK > busy s... Recv 19 bytes SEND OK AT+CIPSEND=13 OK > busy s... Recv 13 bytes SEND OK AT+CIPSEND=69 OK > busy s... Recv 69 bytes SEND OK AT+CIPSEND=2 OK > busy s... Recv 2 bytes SEND OK +IPD,213:HTTP/1.1 200 OK Content-Length: 53 Content-Type: application/json;charset=UTF-8 Cache-Control: no-cache Pragma: no-cache Access-Control-Allow-Origin: * { "status" : "OK", "title" : "Update Device"}CLOSED ************************ tutaj zaczynają się problemy AT+PING="192.168.0.92" +6 OK AT+PING="192.168.0.92" +7 OK AT+PING="192.168.0.92" +6 OK AT+PING="192.168.0.92" +9 OK AT+PING="192.168.0.92" +2 OK AT+PING="192.168.0.92" +5 OK AT+PING="192.168.0.92" +7 OK Wygląda tak, że Atmega przestaje reagować na odpowiedź "OK" - na polecenie AT+PING="192.168.0.92". ESP8266 raczej nie jest winny - odsyła "OK" i Atmega powinna w tym momencie rozpocząć wysyłanie. Resetowałem go podczas pracy, to nic nie zmieniło, dopiero reset całego układu pomaga - na chwilę. Dodatkowo jako "bonus" ( ale to wymaga zajrzenia do kodu ) do momentu w którym działa jeszcze wysyłanie do Domoticz, nie działa komunikacja z Masterem 2, w momencie, gdy przestaną być wysyłane dane czujników do Domoticz, odbieranie danych z Master 2 zaczyna działać jak trzeba. No i oczywiście poza tym problemem całość działa - niezależnie, czy dane są wysyłane,czy nie - odczytywanie czujników, wysyłanie do klientów i zapis na SD - wszystko to działa. Co może być przyczyną takiego zachowania UART'a Atmegi ?


Download file - link to post
  • Atmega1284P_Domoticz_v.6d.zip
    • Atmega1284P_Domoticz_v.6d.bas