BASCOM, a projekt MySensors

Miejsce na posty nie związane z powyższymi
ODPOWIEDZ
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

BASCOM, a projekt MySensors

Post autor: pimowo » 27 kwie 2019, 15:36

Hej,
Nie wiedziałem gdzie umieścić swoje pytanie i dlatego wylądowało w "Inne" ;)

Nie wiem czy znacie projekt MySensors, ale jest to dość ciekawe rozwiązanie dla automatyki domu. Cały projekt opiera się o Arduino i wszytko pisane jest w Arduino IDE.
Do meritum... czy da się jakoś zrobić (napisać) "klienta" w BASCOM, który byłby w stanie "gadać" z bramą (bezprzewodową, radiową lub przewodową, RS485) MySensors?

Piotrek
Awatar użytkownika
Pikczu
Posty: 392
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: BASCOM, a projekt MySensors

Post autor: Pikczu » 27 kwie 2019, 20:15

Pewnie że się da. Tylko czy jest sens?
Całe to arduino to taka jedna wielka prowizorka, wiesz wszytko takie "patykiem podparte"
Nie wyobrażam sobie mieć wszędzie takiej prowizorki.
jeśli bardzo chcesz to Server MQTT postawisz na raspberry PI. a resztę można skrobać w bascomie.
Tylko życia ci braknie żeby to wszytko skończyć.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: BASCOM, a projekt MySensors

Post autor: pimowo » 27 kwie 2019, 21:02

Chyba jednak zbyt skrótowo napisałem ;)
Nie chcę żadnych płytek Arduino, jak coś to zbuduję swoje własne PCB dla sterownika/klienta. Chodzi mi tylko (i aż) o komunikację.
Całość dosyć fajnie działa (MySensors + Domoticz) ale niestety nie kumam tego całego Arduino i chciałbym swojego klienta napisać w BASCOM.
Awatar użytkownika
Pikczu
Posty: 392
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: BASCOM, a projekt MySensors

Post autor: Pikczu » 27 kwie 2019, 21:25

No to kolego drogi pewnie że się da :)
Trzeba tylko MQTT postawić i wio.
A komunikacja to banał, chętnie coś skrobnę.
Tylko musimy ustalić jakąś wspólną platformę.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: BASCOM, a projekt MySensors

Post autor: niveasoft » 27 kwie 2019, 22:00

Te bramy to chyba nic skomplikowanego. Ta bezprzewodowa to na NRF24. Biblioteka się tu gdzieś do tego wala :P
Z tego co pamiętam to do tej biblioteki możesz wysyłać stringi jak i surowe bajty.
Wystarczy chyba zrozumieć co tam wysłać. Zobacz na protokół - LINK
Wstawisz parę bajtów i wyślesz. Może tylko trzeba się przyjrzeć jakie mają ustawienia (AES, BURST, NET_ID czy rozgłoszeniowo itp..)
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: BASCOM, a projekt MySensors

Post autor: pimowo » 27 kwie 2019, 22:01

Myślałem, że da się jakoś zrobić klienta w BASCOM, ale żeby komunikował w "standardzie" MySensors i poprzez ich bramę.
Wszytko po to aby działało z ich standardem.
Nie chcę robić jakiś swoich standardów.

EDYTA
Tak sobie teraz myślę, że cały pić polega na tym, że w Arduino mają bibliotekę MySensors która komunikuje się w jakimś tam standardzie i to wszytko. Muszę do tego przysiąść i spróbuje to rozgryźć.
Cały problem polega na tym, że proste rzeczy mogę skopiować bo oni dość dużo tego zrobili, ale jak bym chciał coś większego i swojego zrobić to nie jest tak różowo bo nie znam Arduino. W BASCOM coś tam rozumiem i chcę to jakoś wszytko razem ożenić ;)
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: BASCOM, a projekt MySensors

Post autor: niveasoft » 29 kwie 2019, 12:43

Jakby co to mamy tu na Forum dział "Translator" :D
Nie wiem tylko co tu żenić skoro te czujniki są już oprogramowane. Chcesz podłączyć do tego systemu jakiś nieobsługiwany czujnik/wyjście?
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: BASCOM, a projekt MySensors

Post autor: pimowo » 29 kwie 2019, 12:57

Chciałbym swoje sterowniki podłączyć do tego systemu.
Przykładowo mam moduł z przekaźnikami, który komunikuje się po RS485 i zamiast używać swojego protokołu komunikacji to chciałbym używać protokołu MySensors.

Łatwiej mi się posługiwać językiem BASCOM niż Arduino ;)
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: BASCOM, a projekt MySensors

Post autor: niveasoft » 29 kwie 2019, 21:05

Nie wiem jaki tam masz procesor, ale zrobiłem taki pierwszy szkic.
Na końcu można by z tego zrobić taką bibliotekę żeby to można było zastosować dla USART albo NRF24
  1. $regfile = "m2560def.dat"                                   '256K FLASH, 8K SRAM, 4K EEPROM
  2. $crystal = 16000000
  3. $hwstack = 128
  4. $swstack = 128
  5. $framesize = 255
  6.  
  7. 'mySensors constans
  8. Const Node_id = 5
  9. Const Sensor_id = 5
  10.  
  11.  
  12.  Const Max_usb_out_command_len = 150
  13.  Const Max_usb_in_command_len = 50
  14.  
  15. '*****************************************************************
  16. '*         CONFIG BUFFERED USART FOR DEBUG via USB               *
  17. '*****************************************************************
  18.  
  19. Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  20.  Echo Off
  21.  
  22.  Config Serialin0 = Buffered , Size = Max_usb_in_command_len       'RX from Terminal
  23.   Dim Char As Byte , Cmd_timeout1 As Byte , Got_str1 As Byte
  24.   Dim Command1 As String * Max_usb_in_command_len
  25.   Dim Cmd_buff(max_usb_in_command_len + 1) As Byte At Command1 Overlay
  26.  
  27.  Config Serialout0 = Buffered , Size = Max_usb_out_command_len       'TX to the Terminal
  28.   Open "COM1:" For Binary As #1
  29.   Const Usb = 1                                             'alias dla portu com
  30.  
  31.  '****************************************************************
  32.  
  33.  Enable Interrupts                                          'dla buforowanego USART odbieranego w przerwaniu
  34.  
  35.  Do
  36.     '--[ USART0 COM1 USB ]------------------------
  37.     If 0 < Ischarwaiting(#usb) Then
  38.  
  39.       Char = Inkey(#usb)
  40.  
  41.       Select Case Char
  42.        Case 10 : Got_str1 = 1                               'odebrano znak nowej linii
  43.        Case 13 :
  44.        Case Else
  45.         Command1 = Command1 + Chr(char)
  46.  
  47.       End Select
  48.  
  49.       If Len(command1) > 49 Then Got_str1 = 1
  50.  
  51.       If Got_str1 = 0 Then Cmd_timeout1 = 50                '50x10ms
  52.  
  53.       'end if Ischarwaiting
  54.     End If
  55.  
  56.     '--[ PARSE COM1 USB ]-------------------------
  57.     If Got_str1 = 1 Then
  58.  
  59.      '|NODE_ID|SENSOR_ID|COMMAND|ACK|TYPE|PAYLOAD|
  60.  
  61.        If Cmd_buff(1) = Node_id Then                        'jeśli to adresowane  do nas
  62.         If Cmd_buff(2) = Sensor_id Then
  63.  
  64.             Select Case Cmd_buff(3)
  65.              Case 0                                         'presentation
  66.              Case 1                                         'set
  67.  
  68.               Select Case Cmd_buff(4)                       'czy mamy nadać potwierdzenie?
  69.                Case 0                                       'bez potwierdzenia
  70.                Case 1                                       'z potwierdzeniem
  71.               End Select
  72.  
  73.               'w piątym bajcie powinien być jakiś "typ"
  74.  
  75.               'od szóstego bajtu mamy wiadomość
  76.               'i teraz zależy czy to coś "bajtowego" czy string :D
  77.  
  78.              Case 2                                         'request
  79.              Case 3                                         'internal
  80.              Case 4                                         'OTA
  81.             End Select
  82.  
  83.         End If
  84.        End If
  85.  
  86.  
  87.          Got_str1 = 0
  88.        Command1 = ""
  89.      Cmd_timeout1 = 0
  90.     End If
  91.  
  92.      '--[ TIMER2 10ms ]----------------------------
  93.     If Tifr2.ocf2a = 1 Then
  94.      Tifr2.ocf2a = 1
  95.  
  96.  
  97.      'COM1 USB
  98.      If Cmd_timeout1 > 0 Then
  99.       Decr Cmd_timeout1
  100.        If Cmd_timeout1 = 0 Then
  101.         'Got_str1 = 1       'mozna wymusić parsowanie
  102.          Command1 = ""
  103.        End If
  104.      End If
  105.  
  106.     End If
  107.  Loop
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: BASCOM, a projekt MySensors

Post autor: pimowo » 30 kwie 2019, 12:35

niveasoft pisze:zrobiłem taki pierwszy szkic.
Bardzo dziękuję za kod, będę próbował to jakoś teraz ogarnąć ;)
niveasoft pisze:Nie wiem jaki tam masz procesor
Moduł od którego chciałbym zacząć jest na ATmega8 z kwarcem 11.0592MHz, ale miałem w planach wymianę na ATmega328 i kwarc 16MHz, aby dostosować się do Arduino (UNO, NANO, etc)
Na tą chwilę wszytko mam spięte na płytce stykowej z ATmega328 z kwarcem 16MHz i wszytko podpięte jak w docelowym module.

Kod Arduino skleciłem na podstawie podpatrzonych kodów jak to robią inni i wszytko działa jak bym chciał - sterowanie ośmioma przekaźnikami poprzez osiem przycisków i/lub Domoticz (bramka MySensors) Wgrałem bootloader Arduino UNO. Miałem troszkę problemów ponieważ biblioteka MySensors używa programowego UART, a ja mam MAX485 podpięty pod sprzętowy, ale u dało się.

Kod Arduino wygląda tak:
  1. #define MY_RS485    //komunikacja przewodowa RS485                                        
  2. #define MY_RS485_DE_PIN 4    //sterowanie kierunkiem odbiór/nadawanie                                
  3. #define MY_RS485_BAUD_RATE 9600    //prędkość sieci RS485                            
  4. #define MY_RS485_HWSERIAL Serial    //włączony sprzętowy UART
  5. #define MY_SPLASH_SCREEN_DISABLED    //wyłączone powitanie UART
  6.  
  7. #define MY_NODE_ID 1    //adres modułu w sieci
  8.  
  9. #define SN "SocketNT_RS485"    //nazwa modułu
  10. #define SV "1.0"    //wersja firmware
  11.  
  12. #include <MySensors.h>    //biblioteka MySensors
  13.  
  14. #include <Bounce2.h>    //programowa eliminacja drgania styków
  15.  
  16. #define RELAY_ON 1    //przekaźnik włączony  
  17. #define RELAY_OFF 0    //przekaźnik wyłączony
  18.  
  19. #define noRelays 8    //ilość przekaźników                    
  20. const int relayPin[] = {5, 3, 19, 18, 17, 16, 15, 14};    //piny przekaźników  
  21. const int buttonPin[] = {13, 12, 11, 10, 9, 8, 7, 6};    //piny przycisków  
  22.  
  23. class Relay {
  24.    public:
  25.    int buttonPin;                  
  26.    int relayPin;            
  27.    boolean relayState;              
  28. };
  29.  
  30. Relay Relays[noRelays];
  31. Bounce debouncer[noRelays];
  32. MyMessage msg[noRelays];
  33.  
  34. void setup() {
  35.    for (int i = 0; i < noRelays; i++) {
  36.       Relays[i].buttonPin = buttonPin[i];            
  37.       Relays[i].relayPin = relayPin[i];
  38.       msg[i].sensor = i;                                  
  39.       msg[i].type = V_LIGHT;
  40.       pinMode(Relays[i].buttonPin, INPUT_PULLUP);
  41.       pinMode(Relays[i].relayPin, OUTPUT);                        
  42.       digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
  43.       send(msg[i].set(Relays[i].relayState ? true : false));        
  44.       debouncer[i] = Bounce();                        
  45.       debouncer[i].attach(buttonPin[i]);
  46.       debouncer[i].interval(5);
  47.    }
  48. }
  49.  
  50. void presentation() {
  51.    sendSketchInfo(SN, SV);
  52.    for (int i = 0; i < noRelays; i++)
  53.    present(i, S_LIGHT);
  54. }
  55.  
  56. void loop() {
  57.    for (byte i = 0; i < noRelays; i++) {
  58.       if (debouncer[i].update()) {
  59.          int value = debouncer[i].read();
  60.          if ( value == LOW) {
  61.             Relays[i].relayState = !Relays[i].relayState;
  62.             digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
  63.             send(msg[i].set(Relays[i].relayState ? true : false));
  64.          }
  65.       }
  66.    }
  67. }
  68.  
  69. void receive(const MyMessage &message) {
  70.    if (message.type == V_LIGHT) {
  71.       if (message.sensor < noRelays) {
  72.          Relays[message.sensor].relayState = message.getBool();
  73.          digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF);
  74.       }
  75.    }
  76. }
niveasoft pisze:Na końcu można by z tego zrobić taką bibliotekę żeby to można było zastosować dla USART albo NRF24
To już byłaby bajka ;)
ODPOWIEDZ