Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica) +--- Wątek: Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) (/watek-sterowanie-przeka%C5%BAnikiem-za-pomoc%C4%85-sms-arduino-uno-modu%C5%82-gsm) Strony:
1
2
|
Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - MarJanPol - 01-02-2018 Witam, czy mogę prosić o podpowiedź jak zmodyfikować poniższy kod, żeby konkretny sms np o treści ALARM powodował załączenie się przekaźnika na danym pinie? Chodzi mi o to jak te pojedyncze znaki w zmiennej char c wykorzystać w ifie do porównania z jakimś konkretnym wyrazem - zapewne po wyrażeniu (c = sms.read()). Jakoś nie potrafię sam wymyśleć jak zrobić tablicę, która by ściągała dane z sms.read() i potem program porównujący znaki w tej tablizy z konkretnym wyrazem np. ALARM) Kod: // include the GSM library RE: Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - kaczakat - 03-02-2018 Na wiadomość zrób taki sam bufor jak na numer. Wiadomość wczytaj do do tego bufora zamiast drukować na terminal. Rozkaz umieść w znakach rzadko używanych, tak by można było łatwo go wyłowić. Wiadomość podziel sobie funkcjami strtok() i porównuj funkcją strcmp(). Są też funkcje które sprawdzą czy w tekście jest po prostu słowo ALARM, ale może być innym kontekście. Kod: // include the GSM library RE: Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - MarJanPol - 03-02-2018 (03-02-2018, 01:32)kaczakat napisał(a): Na wiadomość zrób taki sam bufor jak na numer.BARDZO DZIĘKUJĘ ZA POMOC!!! SPRÓBUJĘ TO JAKOŚ OGARNĄĆ I PRZETESTOWAĆ RE: Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - MarJanPol - 03-02-2018 Witam, prawie mi się udało, problem jest taki, że działa tylko 2 razy po wgraniu programu do Arduino - to znaczy jednym sms mogą włączyć diodę a drugim wyłączyć. Ale wygaszenie diody i kolejne wysłanie smsa o treści "on" już nie powoduje załączenia się diody. Co robię nie tak? Kod: #include <GSM.h> RE: Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - kaczakat - 06-02-2018 Witam. Pominąłeś sekcję podziału wiadomości i znaki sterujące. Wiadomość SMS nie musi kończyć się znakiem nowej linii, jest to jakiś znak CTR+Z (0x1A być może biblioteka to już robi). Nie kończysz tablicy char znakiem 0 (może jest tam i tak w bilbiotece, a może nie). Ale jest to istotne dla strcmp(), dla niej jest ważna każdy znak i jego wielkość. Jeśli drugi komunikat (OFF) jest dłuższy niż pierwszy (ON), to pierwszy wysłany jako trzeci w buforze=[O,N,F,0] co nie jest =="ON". Poza tym drukuj sobie co jest w buforze aktualnie - to może być bardziej pomocne niż Twoje wrażenie co tam być powinno (gotowe komunikaty). Nawet czasami drukowanie jako bajt może pomóc, by zobaczyć znaki niedrukowalne. No i zastąp if strukturą switch...case (tylko komendy trzeba by zapisać jako typ wyliczeniowy) lub po prostu w każdym if sprawdzaj warunek. Teraz włącza na ON, a wyłącza na cokolwiek. Możesz dorobić sobie dwa klawisze i potestować czy można włączyć SMS, wyłączyć klawiszem i vice versa (komenda z terminala arduino tak samo). Jak znajdę taki moduł i chwilę czasu to przetestuje kod. Edit: Rozumiem, że załapałeś, że wysłanie "of" zamiast "off" (czy jakichkolwiek 2 znaków) załatwia sprawę i nie drążysz tematu. W każdym bądź razie przetestowałem i tak właśnie jest. Brakuje dopisywania 0 na końcu odebranej wiadomości do bufora. Jak by ktoś chciał się pobawić tym kodem, to Arduino komunikuje się softserialem uruchmianym biblioteką wbudowaną w GSM.h z pinu 2 do TX modemu, z pinu 3 do RX modemu. Miłej zabawy. RE: Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - MarJanPol - 07-02-2018 Dopiero niedawno dotarło do mnie kilka podstawowych kwestii: - komunikacja ARDUINO - MODUŁ SIM może odbywać się bezpośrednio z komendami AT albo z wykorzystaniem biblioteki np. GSM.h - jeśli komunikacja przy użyciu komend AT, to albo w trybie tekstowym albo PDU. Tryb tekstowy jest łatwiejszy. Dla laików takich jak ja polecam: http://www.developershome.com/sms/smsIntro.asp http://www.jarzebski.pl/arduino/komponenty/moduly-gsm-sim800-sim900-sim908.html Zaktualizowany cel mam zatem taki, żeby napisać kod z komendami AT w trybie tekstowym (bez biblioteki GSM.h) , dzięki któremu będę mógł SMSem o konkretnej treści włączyć np. diodę na pinie 13. Dotarłem do ciekawego kodu, w którym chyba jest to, co potrzebuję: https://www.cooking-hacks.com/forum/viewtopic.php?f=43&t=8183 Kod: int8_t answer; Niestety blokuje mnie kilka zasadniczych kwestii, których cały czas nie rozumiem: 1. Jak przekazać do Arduino polecenie, by zakończył przenoszenie wiadomości SMS do tablicy z ostatnim znakiem tej wiadomości - gdy nie jest znana jej długość 2. Jak wyłuskać z polecenia "AT+CMGR=1" samą treść wiadomości - czyli jak dokładnie działa parsowanie z wykorzystaniem strtok? 3. Jak dokładnie działa funkcja strstr - czyli jak porównać tablicę znaków ze zdefiniowanym wcześniej łańcuchem? 4. Dlaczego do sprawdzenia zawartości bufora w pamięci raz są stosowane polecenia IF a innym razem WHILE - jak w powyższym kodzie: if(Serial.available() > 0){ while(Serial.available() == 0); Będę bardzo wdzięczny za pomoc! Marek RE: Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - kaczakat - 08-02-2018 Witam Zmieniłeś całkowicie szkic, a tamten działał, wystarczyło do bufora dopisać zero na końcu tablicy (ten z 03-02-2018, 12:37) 1. Nie kończysz, odbierasz wszystko. Różne sprzęty różnie reagują na przerwanie odbioru. Jeśli bufor ma np. [12] bajtów to po odebraniu dwunastego znaku przestajesz inkrementować zmienną index i wtedy wszystko wlatuje do ostatniej komórki ciągle ją zmieniając. Na koniec wpisujesz tam 0 i masz tablice char (string) =11 literek+0. To ważne by nie nadpisywać komórek pamięci za tablicą (w szczególności nie wpisujesz nic do tej tablicy dla index=12, bo tablica numerowana jest od 0 i jej ostatnia komórka jest pod indexem 11) , bo sobie robisz kuku. Czyli dla index =11 powinno być tam w komórce tablicy 0. Analogicznie, gdy interesuje Cię tylko koniec wiadomości możesz wszystko do np. 34 znaku wrzucać do tablicy z index=0, a interesującą Cię wiadomość zapisać od index=0 do index=8 i zakończyć 0. Możesz przerwać odbiór po prostu na podstawie wcześniej przyjętego index>128, lub upłynął jakiś czas. Robisz break i zajmujesz się swoimi sprawami. 2. Masz bibliotekę, nie musisz tego robić. Biblioteka od razu daje treść wiadomości. Jeśli koniecznie chcesz to robić ręcznie to najpierw sprawdzasz jakie informacje dostajesz od modułu GSM, np. Kod: +CMGR: „REC UNREAD”, „numertelefonu”,””,”czas” Można więc tę część skrócić: Kod: // parse the string (TAK JEST) 3. funkcji podajesz dwa argumenty, stringi, jak w pierwszym jest drugi to zwraca coś>0. strstr("sciananosna","ana") da 1, tak samo jak strstr("ana","ana"). Tym czymś jest wskaźnik do pierwszej dopasowanej litery lub gdy dopasowania brak to wskaźnik zerowy. Ważne że if się spełni zawszy gdy drugi zawiera się w pierwszym. Użyta wcześniej funkcja strcmp(string1,string2) zwraca 0 (dla odmiany) tylko w drugim przypadku, gdy każda litera jest zgodna. 4. Te funkcje nie sprawdzają zawartości bufora. if(Serial.available() > 0) sprawdza czy jest jakiś znak oczekujący do odebrania z magistrali UART. Może też być while(Serial.available() > 0) odczytujzUART;. Druga używana jest do dwóch rzeczy. 1 to sprawdzenie czy ciągle nic nie ma na uart? while(Serial.available() == 0); a dalsza część kodu zmusza program do wysyłania ciągle komendy AT. W tym modemie nie ustawiasz jaką ma mieć prędkość UART (domyślnie jest 115200). Wysyłasz mu ze swoją prędkością znaki, a modem po kolei sprawdza i dopasowuje, jak dopasuje to przyleci zrozumiałe OK, warunek nawiązania połączenia się spełni i program ruszy dalej, jak nie to będzie tu wisiał. Lub już po nawiązaniu połączenia i po wysłaniu jakiegoś polecenia AT, gdy nic nie zrobisz bez odpowiedzi, też program zostaje zapętlony i czeka na odpowiedź. A o wszystkim można poczytać tu: https://pl.wikibooks.org/wiki/C RE: Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - MarJanPol - 08-02-2018 Stokrotne dzięki Dobry Człowieku !!! Chylę czoło za chęć pomocy i chętnie się odwdzięczę jeśli będę potrafił Potrzebuję parę chwil, żeby mój skromny umysł przyswoił nowe mądrości. I jeśli przyswoi to dam znać ...a jeśli nie przyswoi to dam znać jeszcze prędzej W każdym razie szacun! Mar RE: Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - MarJanPol - 10-02-2018 Witam znowu. Faktycznie ten pierwszy kod (z wykorzystaniem biblioteki GSM.h) było najłatwiej doprowadzić do używalności Załączam go tu, bo może komuś się przyda. Kod: //PROSTY PROGRAM DO WYZWALANIA AKCJI ZA POMOCĄ SMSA Kaczakat, jeszcze raz bardzo Ci dziękuję! Dzięki Tobie zacząłem rozumieć jak komunikować się komendami AT. (tym bardziej dziękuję, że jak widzę niestety niewiele osób w naszym wspaniałym kraju chce się bezinteresownie dzielić wiedzą z innymi...) Na zakończenie chętnie zapytam jeszcze o parę kwestii: 1. Czy można wykorzystać tablicę znaków w konstrukcji switch case? na zasadzie: "jeśli w tablicy znajdzie się SMS1 to ... a jeśli SMS2 to... a jeśli SMS3, to...." 2. Czy są jeszcze jakieś inne przydatne polecenia do obróbki łańcuchów w tablicach typu str? - inne niż strstr, strtok, strcmp, strcpy? 3. Czym się różni "char dane[]" od "char* dane" ? Czytałem trochę o wskaźnikach, ale dalej nie rozumiem 4. Co daje "F" w poleceniu Serial.println(F("ERROR"));? 5. Czy dobrze rozumiem, że pętla While będzie realizowana tak długo, jak długo w buforze pamięci będą jakieś nieściągniętę bajty? Pozdrawiam serdecznie! Mar RE: Sterowanie przekaźnikiem za pomocą SMS (Arduino UNO + moduł GSM) - kaczakat - 16-02-2018 Nie jestem programistą, więc mi chleba nie odbierasz ucząc się programować . A tak na prawdę po prostu to nie jest popularne hobby, a to to nie jedyna strona w sieci. Jak będziesz chciał zrobić coś więcej to musisz sobie zdobyć/poukładać wiedzę, przeczytać jakiś książki/poradniki od A do Z o c, c++, AVR, Arduino. Ja Ci odpowiem na te 5 pytań, ale nie wiesz, że powinieneś znać odpowiedzi na kolejnych kilkuset? Do switch case można wykorzystywać liczby całkowite, więc nie może to być tablica, element tablicy już tak. Znak/char jest o tyle szczególny, że jest to liczba całkowita wielkości 1 bajta. Można sobie pokierować funkcją np. w 4 znaku SMS wysyłając znak sterujący i podać go SMS[3] do switch case, pod tym elementem będzie char '1', '2' lub '3'. Może też być użyty typ wyliczeniowy, który pod przyjaznymi nazwami kryje po prostu liczby. Dałem Ci link wcześniej, a tam cały dział o napisach, pewnie nie wyczerpujący informacji - jest mnóstwo funkcji. Kopiowanie, obcinanie, konwersja na napisy liczb i odwrotnie. Arduino ma na stronie cały dział poświęcony String i kolejne funkcje specyficzne dla Arduino/C++. Tablica jest zafiksowana, w sensie jej wielkość jest deklarowana jawnie [] lub ilością elementów, char *dane to namiastka stringa, ale faktycznie dalej tablica znaków o wielkości przypisanego napisu. Nie wiem jak działa mechanizm, wolę nie zmieniać zawartości *napis bo skoro jest to tablica a przypiszę większy napis to pojadę po losowych komórkach pamięci za tablicą. Robiłem testy i nic nigdy się takiego nie działo, może kompilator robi z tego jakąś dynamiczną tablicę? F() to funkcja, makro, specyficzna dla Arduino, które nakazuje pozostawić napis we flash, zobacz jak zmienia się wolne miejsce RAM po kompilacji, gdy użyjesz F() do napisu i gdy go nie użyjesz. Normalnie każdy użyty napis jest po uruchomieniu wczytany do RAM i zajmuje tam miejsce. W Arduino/AVR są specjalne polecenia/funkcje deklarujące napisy i inne zmienne jako przeznaczone do przechowywania we flash i specjalne funkcje do odwoływania się do nich do flesh przed użyciem. Normalnie jest to upierdliwe, a makro F() to bardzo ułatwia. Jak się robi rozbudowany system komunikatów to można szybko zjeść dostępną pamięć i jest to jedyne wyjście - trzymać napisy we flash. Oczywiście jest też wolniejszy dostęp do takich danych. While działa tak długo, jak warunek wewnątrz jest różny od 0, char to liczba, koniec stringa to 0. Tu akurat jest ważne co wpadło do zmiennej c, czy jest to jakiś znak czy 0. |