Telefoniczne sterowanie przekaźnikiem

Telefoniczne sterowanie przekaźnikiem

Zapraszam do zapoznania się z moim projektem sterowania przekaźnikiem przy użyciu Arduino oraz modemu SIM800L.

Urządzenie powstało, ponieważ chciałem mieć możliwość otwierania bramy na osiedlu, bez konieczności używania pilota.

Idea była taka, żeby wyzwolić przekaźnik znajdujący się w mieszkaniu, który zwierając odpowiedni styk w domofonie, otworzy bramę.

Założenia:

  • urządzenie powinno obsługiwać tylko wskazane numery
  • numery nie powinny być hardkodowane w kodzie programu
  • urządzenie powinno móc pracować bez zasilacza
  • urządzenie powinno oszczędzać baterię
  • urządzenie powinno w pełni obsługiwać przychodzące wiadomości SMS
  • urządzenie powinno umożliwiać zdalne uruchomienie komend AT
  • urządzenie powinno umożliwiać zdalne wywołanie kodów USSD

Jak to działa?

Jest wskazane aby przy pierwszym użyciu, na karcie SIM nie znajdowały się kontakty. Wynika to z faktu, że numer telefonu kontaktu na pierwszej pozycji karty SIM, jest traktowany jako numer zarządzający. Tylko ten konkretny numer będzie mógł wykonywać operacje za pomocą komend SMS.

Jak sprawdzić kontakty na karcie SIM?

Poniżej znajduje się kod prostego szkicu, do komunikacji Arduino via Serial port z modemem podłączonym do pinów 11/12

Po wgraniu szkicu do Arduino, należy w Serial Monitorze wywołać komendę listującą wszystkie kontakty karty SIM

AT+CPBR=1,250

Jeżeli na pierwszej pozycji mamy jakiś wpis, to kasujemy go przez wywołanie

AT+CPBW=1

Wracamy do kodu głównego.

Szkic wykorzystuje zmodyfikowaną przez mnie bibliotekę GSM-GPRS-GPS-Shield-GSMSHIELD którą należy pobrać i dodać do IDE

Modyfikacja umożliwia m.in. komunikację z modułem SIM800L, czego nie oferował oryginał

Jak widać powyżej, definiujemy dwa przekaźniki RELAY1, RELAY2 sterowane przez wyjścia A1A2callsAddroraz openingAddr są adresami Eprom, gdzie przechowuję wartości calls oraz  opening, które zliczają ile połączeń odebrał modem oraz ile razy został uruchomiony przekaźnik (otwarta brama).

Zakładam że na początku warto przyjrzeć się komunikatom na konsoli, więc nie komentujemy #define LOCAL_DEBUG. Z drugiej strony warto zakomentować #define SMS_ON. Mamy wtedy pewność że kod nie wyśle żadnej wiadomości SMS. #define SMS_ON powinno być odkomentowane kiedy zakończymy debugowanie/testowanie.
 

W setupie nie dzieje się nic szczególnego, włączamy rozszerzone opisy błędów i sprawdzamy czy na karcie znajdują się jakieś wiadomości SMS. To na wypadek, gdyby podczas wyłączenia modemu, lub przy niewgranym szkicu, przyszły do nas nowe wiadomości. Normalnie sprawdzenie wiadomości następuje po wybudzeniu Arduino przez modem.


Pętla

Skoro jesteśmy w pętli, to znaczy że modem uruchomił Arduino. Możliwości są dwie:

  • połączenie głosowe
  • wiadomość SMS

Modem wybudza Arduino przez podanie sygnału z pinu RING w modemie na pin D1. attachInterrupt(1, pinInterrupt, LOW) 

Sprawdzamy to za pomocą call.CallStatus(). Jeżeli zwraca CALL_INCOM_VOICE, to wybudziło połączenie głosowe . W przeciwnym razie –  wiadomość SMS.

Przypadek 1 połączenie głosowe

Warunek (call.CallStatusWithAuth(number, 1, 100) == CALL_INCOM_VOICE_AUTH) sprawdza czy dzwoniący numer numberznajduje się na karcie SIM w przedziale 1-100.

Jeżeli tak, to “podnoszę słuchawkę” czekam po czym “rozłączam się” i wyzwalam przekaźnik. Czemu tak? Oczywiście można wysłać kod zajętości ale wtedy osoba dzwoniąca trafi na pocztę lub wysłucha komunikat o zajętości – po czym będzie musiała się rozłączyć a do nas (modem) przyjdzie SMS o próbie połączenia. Odebranie i szybkie rozłączenie załatwia problem w niecałe 2 sekundy.

Po zakończeniu rozmowy wracamy do pętli i wywoływana jest procedura checkSMS()

 

checkSMS()

Sprawdzamy czy na karcie są jakiekolwiek SMSy

Sprawdzamy czy jest zdefiniowany numer Administratora

Sprawdzamy czy nadawcą wiadomości jest Administrator

Rozdzielamy wiadomość SMS na słowa rozdzielone średnikiem

Lista zdefiniowanych keywordów

  • Dodawanie kontaktu – komenda np C;A;123456789;Janek Michalczewski;N spowoduje sprawdzenie czy podany numer już nie istnieje na karcie SIM, jeżeli nie – to dodanie na pierwszej wolnej pozycji. Ponieważ numer z przykładu ma tylko 9 cyfr, dodany zostanie do niego prefix 48. Poza tym nazwa zostanie przycięta do 14 znaków, co wynika z ograniczeń karty SIM. Litera N na końcu jest opcjonalna, jeżeli zostanie użyta, to po dodaniu do książki, na numer rejestrowanego kontaktu, zostanie wysłany SMS z potwierdzeniem rejestracji.

  • Usuwanie kontaktu – komenda np C;D;123456789 spowoduje odszukanie i usunięcie kontaktu z tym numerem
  • Usuwanie wszystkich kontaktów C;D;A usuwa wszystkie kontakty łącznie z Administratorem
  • Wyszukiwanie kontaktu – np C;F;123456789  sprawdzi czy podany numer znajduje się na karcie SIM
  • Wywołanie komendy AT  -np A;A;AT+CSQ sprawdzi poziom sygnału odbieranego, informacja zwrotna (jeżeli nie dłuższa niż 160 znaków) zostanie odesłana przez SMS

  • Wywołanie kodu USSD -np A;U;1271# sprawdzi stan środków w nju mobile

  • Na koniec komenda którą sprawdzam statystyki połączeń oraz ilość otwarć bramy oraz stan baterii A;I

Przy okazji komend należy pamiętać że wysłanie pierwszej, nie spowoduje jej wykonania! Wynika to z faktu, że na początku nie mamy wpisanego numeru Administratora i komenda nie przechodzi weryfikacji. Pierwszy SMS skutkuje tylko przypisaniem nadawcy do roli Administratora.

Kolejną rzeczą są odpowiedzi na komendy AT oraz kody USSD. Jeżeli ich długość przekroczy 160 znaków, nie zostaną odesłane do Administratora.

Jeżeli program odbierze nieautoryzowaną wiadomość SMS prześle ją do Administratora.

Pełny kod

O sofcie było sporo, teraz trochę o sprzęcie.

Urządzenie jest zasilane przez akumulator Li-Po 3.7V (odzysk z baterii do laptopa). Akumulator oprócz uniezależnienia od gniazdka, zapobiega niespodziewanym restartom modemu. Mogą one wynikać z chwilowego zapotrzebowania na energię (są komentarze że modem SIM800L może potrzebować nawet 2A podczas logowania do sieci).

Akumulator ładowany jest przez moduł 03962a. Na zdjęciu widoczny jest (zielony) zacisk. Są do niego wyprowadzone inputy ładowarki. Był pomysł żeby zasilać urządzenie nie przez port USB ale z instalacji domofonowej (u mnie wychodzi 6V). Niestety to źródło miało za mały amperaż.   

Poniżej na zdjęciu mamy DC booster podnoszący napięcie z wyjścia ładowarki na 5V. Pracując nad kolejnym projektem, dochodzą do wniosku że ten booster nie jest prawdopodobnie potrzebny. Napięcie z naładowanego akumulatora LiPo jest wystarczające do zasilanie Arduino 5V. Myślę że modem i przekaźniki też dały by radę. Z drugiej strony taki booster to grosze. Jedyny minus to drobna strata przy podnoszeniu napięcia i zasilenia LEDa.

Kolejny moduł to konwerter stanów logicznych. Jest on wpięty w TX/RX pomiędzy modemem a pinami Arduino. Spotkałem się z opinią i nawet sprawdziłem że SIM800L gada z Arduino bez konwersji stanów logicznych. Ale nie polecam takiego podejścia bo w końcu modem to najdroższa część całego urządzenia (konwerter chyba najtańszy).

Na koniec przekaźnik. Chociaż w kodzie korzystam tylko z jednego, zamontowałem podwójny. Bo się komponował, daje możliwości rozbudowy i.. nie miałem pojedynczego ;)

I jeszcze koszty

  • moduł ładowania 1,45PLN
  • przekaźnik 3,46PLN
  • arduino 8,40PLN
  • konwerter stanów logicznych 1,18PLN
  • SIM800L 15,47PLN
  • koszyk baterii 1,46PLN
  • DC boost converter 3,01PLN
  • obudowa około 4PLN
  • akumulator z odzysku

Całość poniżej 40PLN

 

Ocena: 4.89/5 (głosów: 19)

Podobne posty

45 komentarzy do “Telefoniczne sterowanie przekaźnikiem

    • Dzięki Leszek. Co ważne działa i żyje swoim życiem. Moje sąsiadki korzystają regularnie-bo maja tylko jednego pilota do bramy. Ja się wdzwaniam minutę przed dojechaniem do bramy i czeka na mnie otwarta :)

      Odpowiedz
    • Listę sprzętu dopisałem dziś rano. Na schemat nie mam zwyczajnie czasu. Trzeba pracować żeby zarobić na przesyłki z Aliexpress :) Nie ukrywam że część softwareowa zajęła mi bardzo dużo czasu i to na niej skupiam opis. Podpięcia wynikają bezpośrednio z kodu. Oczywiście jak ktoś nie znajdzie to zapraszam do komentarzy.

      Odpowiedz
  • Myślałem o czymś podobnym. Ale zorganizowałem to inaczej. Przekaźnik podobnie zwiera styki w domofonie, ale mam inną komunikację. Mózgiem jest raspberry. Mam na nim inne rzezczy, i do tego też go wykorzystałem. Plus jest taki, że już go mam i nie potrzebuję nic nowego. Ale mam go zasilanego z gniazdka. Na raspi stoi serwer www (właśnie on jest używany do tych ‘innych rzeczy’), widoczny jest z zewnątrz. Zrobiłem prostą aplikację na smartfona, w której klikam ‘otwórz’ albo ‘zamknij’. Każde kliknięcie zmienia stan pinu połączonego z przekaźnikiem. I na tej podstawie przekaźnik zwiera albo rozwiera domofon.
    Plus mam taki, że sprzęt praktycznie miałem już w domu. Rozbudowałem tylko istniejący system.
    Minus, muszę mieć w smartfonie internet włączony.

    Odpowiedz
  • Kolejny projekt typu “chwalimy się – nie pokazujemy szczegółów”.
    Pomysł fajny, projekt fajny ale sorry, dla majsterkowicza, który chciałby skorzystać albo czegoś się nauczyć jest prawie bezwartościowy :(

    Odpowiedz
    • Andy, jakich szczegółów nie pokazuję? Omawiam praktycznie cały kod. Niemało, prawie 600 linijek. Mam pisać że puls ładowarki łączę z plusem arduino? Twój komentarz też jest dla mnie ‘prawie bezwartościowy’, bo nie wiem co mam poprawić. Jeżeli jest faktycznie zapotrzebowanie na schemat, to proszę pisać w komentarzach lub założyć temat na forum. Pewnie znajdę godzinę żeby go narysować.

      Odpowiedz
  • Projekt jest ciekawy, ale nie przydatny dla użytkowników, którzy chcieliby go powtórzyć (brak schematu połączeń). Założenie oszczędzania energii zostało sprowadzone tylko do usypiania arduino. Dlaczego nie jest usypiany najbardziej prądożerny element układu jakim jest sim800l? Sim800l posiada różne tryby oszczędzania energii, które należało umiejętnie zaaplikować w kodzie programu. Proszę poczytać o poleceniu “CSCLK”. Jeżeli jednym z złożeń projektu była oszczędność energii to należało: zastosować przekaźniki bistabilne i arduino 3.3V bez usb, wywalić moduł ładowania i DC boost converter. Gdyby autor pomyślał wcześniej i zamiast sim800l kupił sim800c (koszt na ali około 5$) z pinem VMCU to konwerter stanów logicznych też byłby nie potrzebny. Wprowadzenie poprawek, które wymieniłem powyżej pozwoliłaby układowi na kilkutygodniową pracę przy zasilaniu z jednego ogniwa 18650. Przy opisywaniu projektu zabrakło też podstawowej informacji jaki jest pobór prądu (proszę podać taką informację).

    Odpowiedz
    • Pisałem o oszczędzaniu baterii nie o pracy przez kilka tygodni. Jesteś pewien że SIM800L poprawnie implementuje CSCLK? Jak wybudzić modem przy połączeniu przychodzącym? Żeby to zrobić trzeba podać DTR z… czego? Nie sądzę żeby modem w trybie uśpienia potrafił sam się wybudzić. O schemacie już pisałem w komentarzu, szkoda że nie czytałeś. O DC boosterze i konieczności jego użycia też jest w tekście. Argument że mogłem użyć innych części – jak dla mnie kulą w płot. Moje projekty powstają spontanicznie i składam z tego co mam pod ręką. A części zamawiam w Chinach, wiec czas oczekiwania to koło miesiąca. Szkoda że nie znalazłeś w moim projekcie nic pozytywnego. Poza tym, nie_przydatny piszemy razem. Pozdrawiam.

      Odpowiedz
      • 1. Kilka komentarzy wyżej napisałeś, że cyt. “Jeżeli jest faktycznie zapotrzebowanie na schemat, to proszę pisać w komentarzach” więc napisałem, że w opisie projektu zabrakło schematu połączeń. 2. Napisałeś też, że cyt. “są komentarze że modem SIM800L może potrzebować nawet 2A podczas logowania do sieci”. Komentarze w tym przypadku mówią prawdę, ale takie rzeczy sprawdza się specyfikacji. 3. Kolejny cytat ” Jesteś pewien że SIM800L poprawnie implementuje CSCLK? Jak wybudzić modem przy połączeniu przychodzącym? Żeby to zrobić trzeba podać DTR z… czego?” Tak jestem pewien, że sim800l poprawnie obsługuje tryby oszczędzające energię, ponieważ sam z nich korzystam. Komentarze pod projektem to nie jest najlepsze miejsce na wykład, a szczególnie jak piszę się ze smartfona. Tak jak napisałem wcześniej sim800l posiada kilka trybów oszczędzających energię. Jeszcze raz polecam zapoznać się ze specyfikacją sim800l, a o ewentualne niejasności zapytać tutaj. Tak w skrócie. Sim800l możemy wprowadzić w Sleep Mode 1 i Sleep Mode 2. Zarówno przy sleep mode 1, jak i przy sleep mode 2 sim800l wybudza się automatycznie kiedy odbiera sms-a lub przychodzi połączenie głosowe. W tym czasie na pinie RI przez około 1 sekundę pojawia się stan niski. RI możemy użyć jako przerwanie, aby wybudzić arduino. Jak zapewne się domyśliłeś ustawienie trybu sleep mode 1 lub 2 nie odcina sim800l od sieci, ale różnice w oszczędności energii są bardzo duże. W sleep mode 2 zużycie energii w czasie monitorowania sieci wynosi tylko do 3 mA, a bez włączonego sleep mode minimum 13 mA. Przy Twoim projekcie oszczędzanie energii powinno być priorytetem, które można rozwiązać małym kosztem.

        1. Nigdzie nie napisałem, że projekt mi się nie podoba. Napisałem tylko, że można poprawić to i owo.
        Odpowiedz
        • Na balkonie marznie już czujnik temperatury, (Arduino PM 3,3V 8Mhz) do stacji pogody. Ten to będzie miał szansę na kilka jak nie kilkadziesiąt tygodni pracy bez ładowania :) O trybach pracy uśpienia SIM800L czytałem kilka artykułów które opisywały wyłącznie kłopoty z tym związane. Więc na razie nie podejmuję tematu- przynajmniej do czasu zamówienia kolejnego modemu. Nie chcę demontować sterownika, bo po prostu już działa i co tu nie mówiąc – robi robotę.

          Odpowiedz
      • Bo SIM800L domyślnie loguje się do BTSa z najwyższym RSSI, którego ID sieci się zgadza z tym na karcie SIM. Załatwia to antena kierunkowa wycelowana w moduł. Numer można poznać poprzez nasłuch ruchu sieciowego dla danego IMEI. IMEI mam na zdjęciu w artykule :) Ogólnie projekt bardzo mi się podoba, ale nie polegałbym na rzekomym bezpieczeństwie sieci 2G. Takowe praktycznie nie istnieje. Sensowniej byłoby nawiązać komunikację przez GPRS i dane przesyłać szyfrowane. Chociażby z użyciem MQTT. Niemniej muszę przyznać, że wdzwanianie się na numer modemu jest nieporównywalnie wygodniejsze.

        Odpowiedz
        • Moduł wykorzystuje Arduino, można zatem zaimplementować szyfrowanie RSA i podpis cyfrowy (funkcja skrótu). Komunikacja jest tylko w jedną stronę. Klucz prywatny wgrywasz osobiście. Są odpowiednie algorytmy do generowania haseł jednorazowych (nadawca) i ich jednorazowej weryfikacji (odbiorca). Można też wykorzystywać rzeczy zmienne, ale znane dla obu stron (np. data, godzina jeśli do układu dodać by zegar RTC). Jest sporo sposobów by bardzo skutecznie zabezpieczyć transmisję :)

          Odpowiedz
  • Projekt świetny – myślałem kiedyś nad czymś podobnym, tylko zamiast modułu GSM stara nokia, no ale to gra nie warta świeczki, jeżeli moduł kosztuje 15zł :D
    Powiedz mi proszę czy wiesz, czy ciągłe ładowanie tym modułem nie wpływa negatywnie na pojemność baterii? Czy bez problemu można korzystać z niego cały czas, czy lepiej programowo załączać go np. mosfetem gdy napięcie aku spadnie poniżej jakiegoś poziomu?

    Odpowiedz
    • Widzę, że autorowi projektu ciężko jest odpowiedzieć na Twoje pytanie. Przypomnę, że obiecał też umieszczenie schematu połączeń, ale go nie wstawił  :)

      Odpowiedz
      • Nie jest ciężko. Po prostu nie zaglądam do tematu co dziennie. Nie ma też maili o nowym komentarzu. woysz akumulatory powinny pracować w trybie buforowania, czyli być zasilane określonym napięciem konserwującym. W projekcie można się pokusić o mocniejszy zasilacz i całkowicie pozbyć się akumulatora. @nowy, mogę się jedynie usprawiedliwić, że pracuję nad fajną stacją pogodową i już powoli kończę. Przy okazji zrobię dwa schematy ;)

        Odpowiedz
    • woysz masz rację. Nie wiem, jak ciągłe ładownie ogniw wpłynie na jego żywotność, ale wiem, że takie rozwiązanie nie jest dobrym pomysłem. Włączanie ładowania ogniwa powinno być sterowne programowo. W sim800l wartość napięcia zasilania można sprawdzić poleceniem AT+CBC.

      Odpowiedz
  • Gdzie kupić SIM800L za 15,47zł? Wszędzie, gdzie szukałem to po ~30zł
    Najlepiej podaj link do sklepu w którym się zaopatrzyłeś w komponenty. :)

    Odpowiedz
  • Hej, Bardzo fajny ten projekt ale po amatorskiej próbie jego sprawdzenia jak działa, pojawił się problem z wgraniem szkicu a własciwie biblioteki GSM-GPRS-GPS-Shield-GSMSHIELD którą należy pobrać i dodać do IDE. Czy mógłbyś podpowiedzieć w jaki sposób należy dodać tą bibliotekę? Za każdym razem kiedy próbuję dodać ją w formie ZIP, program krzyczy że jest to niepoprawna biblioteka. Dzięki z góry za szybką odpowiedź,
    Pozdrawiam,

    Odpowiedz
  • Witam ponownie. Udało się finalnie wgrać i bibliotekę i kod. Ważne aby przy wgrywaniu Arduino nie było podłączone do żadnego układu i w moim przypadku musiałem nacisnąć przycisk reset na płytce tuż przed wgraniem kodu. Po wgraniu pokazuje się informacja że jest mało pamięci ale całość działa bardzo fajnie.
    DZIĘKI i kciuk w górę!

    Odpowiedz
  • Witam,
    próbuję skompilować powyższy kod ale w efekcie otrzymuję komunikat:

    exit status 1
    unterminated argument list invoking macro “F”

    Odpowiedz
  • Zrobiłem podobne sterowanie, ale uprościłem układ do minimum. Użyłem tylko modułu gsm Air200 i przekaźnika + zasilanie 5V z ładowarki. Włączanie i wyłączanie odbywa się za pomocą wiadomości sms. Dodałem także przywracanie wcześniej ustawionego stanu przekaźnika po wyłączeniu prądu.

    Odpowiedz
  • Fajny projekt (:
    Ale takie zamazywanie numerów nie wcale nie uniemożliwia ich odczytania. Trochę pracy w gimpie i można się domyślić co to za numer. Rozmycie też nie działa za dobrze.
    Najlepiej jest zamazać je jednolitym kolorem. (:

    Odpowiedz
    • Nie mój numer, nie mój problem ;) Ale pewnie masz rację. Zastanawiam się czy mój egzemplarz SIM800 MA jakiś feler. Średnio raz w miesiącu przestaje się wybudzać. Muszę restarować całość. Poza tym działa nieprzerwanie.

      Odpowiedz
        • Buforem jest ogniwo 18650. A po restarcie wszytko działa. Być może SIM800 kończy żywot. Jaki moduł GSM jest teraz na topie? Muszę przyznać że porzuciłem Arduino na rzecz ESP8266 i nie jestem w temacie. Jakieś Air200?

          Odpowiedz
          • Dla zainteresowanych sterowanie przekaźnikiem za pomocą modułu gsm Air200. Skrypt umożliwia nie tylko sterowanie włącz/wyłącz, ale także sterowanie czasowe. Dodane jest zabezpieczenie przed niepowołanym włączeniem/wyłączeniem z innego numeru. Jest też możliwość sprawdzenia aktualnego stanu pinu oraz przywracanie wcześniej ustawionego stanu pinu po zaniku zasilania. O szczegółach można przeczytać na tej stronie https://www.elektroda.pl/rtvforum/viewtopic.php?p=17008021#17008021

            Odpowiedz

Odpowiedz

anuluj

Masz uwagi?