<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=47&amp;t=15071&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-04-08T19:39:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=47&amp;t=15071&amp;mode</id>
<entry>
<author><name><![CDATA[Mekada]]></name></author>
<updated>2016-04-08T19:39:44+01:00</updated>
<published>2016-04-08T18:55:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15071&amp;p=158112#p158112</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15071&amp;p=158112#p158112"/>
<title type="html"><![CDATA[Sterowanie otwieraniem drzwi przez moduł GSM i arduino]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15071&amp;p=158112#p158112"><![CDATA[
Witam. Otóż chciałem stworzyć moduł sterujący otwieraniem i zamykaniem drzwi za pomocą GSM. Znalazłem gotowy szkic na arduino, który włącza i wyłącza diodę led za pomocą sms`ów. Po drobnych przeróbkach chce podłączyć mostek H, który będzie sterował pracą siłownika. Ze względu na pewne niedoskonałości w komunikacji mojego modemu GSM (stary modem Simensa ES 75). Sms`y czasami zostają błędnie odczytane i moduł nie podejmuje żadnej akcji. W związku z tym postanowiłem dołączyć do mojego zestawu przycisk, który będzie zwierany w przypadku zamknięcia (stan HIGH) i rozwierany w przypadku otwarcia drzwi (stan LOW). Niestety w żaden sposób nie mogę dać sobie rady z dopisaniem prawidłowej instrukcji, próbowałem już wszystkich komend od if po while i switch. Kiedy dopisuję tą komendę cały czas na mój telefon dostaję informację o stanie rozwarcia mojego przycisku, co zresztą zakłóca pracę pozostałego kodu( nie mogę zmieniać stanu &quot;led&quot;). Dlatego proszę o pomoc w dopisaniu prawidłowej funkcji, która jednorazowo poinformuje mnie o zmianie stanu. W oryginalnym skrypcie nie działa też funkcja, która po wysłaniu sms`a powinna przesłać mi informację zwrotną o stanie mojej &quot;diody&quot;. Chciałbym też dopisać funkcję, która wysyłała by sms o zbyt niskim naładowaniu akumulatora. Z góry dziękuję za wszelkie info i pomoc.<br />* <br /> [syntax=c]* GSM TC35 SIMPLE DEMO <br /> * Autor: Piotr Rzeszut (http://piotr94.net21.pl) <br /> * Data: 26.07.2014 <br /> * Artykuł pobrany z blogu: http://mikrokontrolery.blogspot.com <br />*/  <br />#include &lt;AltSoftSerial.h&gt;  <br />int led = 13;<br />int led2 = 12;<br />int buttonPin = 2;<br />  <br />// AltGSM always uses these pins:  <br />//  <br />// Board          Transmit  Receive   PWM Unusable  <br />// -----          --------  -------   ------------  <br />// Arduino Uno        9         8         10  <br />// Arduino Leonardo   5        13       (none)  <br />// Arduino Mega      46        48       44, 45  <br />  <br />AltSoftSerial GSM;  <br />  <br />void setup() {  <br />  Serial.begin(115200);  <br />  while (!Serial) ; // wait for Arduino Serial Monitor to open  <br />  Serial.println(&quot;GSM testing&quot;);  <br />  GSM.begin(115200);  <br />    <br />  GSM.print(&quot;ATE1\r&quot;);//ATE1 powoduje, że wszystko co wyślemy DO modułu będzie przez niego wysyłane do nas (echo)  <br />  //GSM.print(&quot;ATE0\r&quot;);//ATE0 wyłącza powyższą funkcjonalność  <br />  delay(550);//czekamy nieco  <br />  GSM.print(&quot;AT+CMGD=ALL\r&quot;); //KASUJEMY SMS~Y !!!!!!!!!!!!!!!!!!!!!!!!!<br />  pinMode(led,OUTPUT);//ustawiamy pin dla diody led jako wyjście<br />  pinMode(buttonPin, INPUT);  <br />}  // KONFIGURACJA POŁACZENIA INFORMUJACEGO MNIE O STANIE PRZYCISKU<br />  void call() {<br /> GSM.print(&quot;\r&quot;);<br /> delay(1000); <br /> GSM.println(&quot;ATD604XXXXXX;&quot;);<br /> Serial.println( &quot;RING&quot;);<br /> delay(8000);<br /> GSM.println(&quot;ATH;&quot;); // koniec rozmowy<br />}<br />void call2() {<br /> GSM.print(&quot;\r&quot;);<br /> delay(1000); <br /> GSM.println(&quot;ATD604XXXXXX;&quot;);<br /> Serial.println( &quot;RING DING&quot;);<br /> delay(12000);<br /> GSM.println(&quot;ATH;&quot;); // koniec rozmowy<br />}<br />//definiujemy zmienne pomocne przy odbiorze danych  <br />char buffer&#91;256&#93;;  <br />byte field_begin&#91;14&#93;;  <br />int num=0;  <br />  <br />//oraz zmienne kontrolujące odbiór danych, stałe do porównywania  <br />const char SMS_REC&#91;&#93;=&quot;+CMGL: &quot;;  <br />const char OK&#91;&#93;=&quot;OK&quot;;  <br />const char ERROR&#91;&#93;=&quot;ERROR&quot;;  <br />const char accepted_nr&#91;&#93;=&quot;\&quot;+48604XXXXXX\&quot;&quot;;  <br />byte nr_correct=0;  <br />int var; <br />enum states{IDLE,NEXT_TXT};  <br />states stan=IDLE;  <br />  <br />byte msg_id=0;  <br />  <br />byte ok;  <br />int j;  <br />byte send_resp,wait_for_sending;  <br />  <br />unsigned long old_millis=millis();  <br />  <br />//pętla główna programu  <br />void loop() { <br />  <br />  char c;//zmienna pomocznicza  <br />  //ten blok pozwala nam przesyłać komendy do telefonu z terminala komputera  <br />  if(Serial.available()){ <br />    c=Serial.read(); <br />    GSM.print(c); <br />  } <br />    <br />  //ten blok co 5 sekund ustawia format wiadomości na tekstowy a następnie sprawdza listę wiadomości odebranych przez moduł  <br />  //i romimy to tylko wtedy gdy nie czekamy na nadanie wiadomości SMS  <br />  if(millis()-old_millis&gt;5000&amp;&amp;wait_for_sending==0){  <br />    GSM.print(&quot;AT+CMGF=1\r&quot;);//ustaw format wiadomości na tesktowy  <br />    delay(550);  <br />    GSM.print(&quot;AT+CMGL=ALL\r&quot;);//wyślij zapytanie o wyświetlenie wszystkich wiadomości   <br />    old_millis=millis();  <br />  }  <br />    <br />  if (GSM.available()) {//jeśli czeka na odbiór jakiś znak  <br />    c = GSM.read();//to odczytujemy go  <br />   //Serial.print(c);//a tu możemy do celów debugowania wyświetlić na ekranie to co wysyła nam moduł - nie tylko nasze komunikaty  <br />    if(c=='\n'){//jeśli to znak zakończenia linii (koniec ramki) to przystępujemy do jej dekodowania  <br />      switch(stan){  <br />        case IDLE://normalny stan - sprawdzamy ramki pod kątem tego czego dotyczą  <br />        //-----------------------------------------------------------------------------------------------------------------------------------  <br />        //SMS przychodzący po poleceniu AT+CMGL... - dekodujemy początek wpisu  <br />        //-----------------------------------------------------------------------------------------------------------------------------------  <br />        ok=1;//zakładamy, ze to interesująca nas ramka  <br />        for(int i=0;i&lt;6;i++){//w pętli porównujemy pierwsze znaki ramki ze wzorcem informacji o sms'ie  <br />          if(buffer&#91;i&#93;!=SMS_REC&#91;i&#93;)ok=0;//jeśli jakiś znak się różni to to nie jest interesująca nas ramka  <br />        }  <br />        j=0;  <br />        if(ok){//jeśli mamy interesującą nas ramkę to możemy ją dekodować  <br />          for(int i=0;i&lt;num;i++){//przeglądamy ją znak po znaku  <br />            if(buffer&#91;i&#93;==','){//jeśli trafiliśmy na przecinek  <br />              buffer&#91;i&#93;=0;//to zastępujemy go znakiem 0 - kończy on ciąg znaków  <br />              field_begin&#91;j++&#93;=i+1;//kolejny znak po przecinku to początek nowego pola - zapisujemy jego pozycję  <br />              if(j&gt;5){//maksymalnie w tej ramce moze być 5 pól  <br />                j=0;  <br />                ok=0;  <br />              }  <br />            }else if(buffer&#91;i&#93;=='\r'||buffer&#91;i&#93;=='\n')buffer&#91;i&#93;=0;//znaki kończące ramkę też zastąpimy znakami zerowymi  <br />          }  <br />            <br />        }  <br />        if(ok){  <br />          //tu odczytuję z tekstu ID wiadomości  <br />          msg_id=atoi(&amp;buffer&#91;7&#93;);  <br />          Serial.print(&quot;Wiadomosc nr: &quot;);  <br />          Serial.println(msg_id);  <br />          Serial.print(&quot;Od numeru: &quot;);  <br />          //następnie z pól odczytujemy numer telefonu wraz z &quot;&quot; w których jest zawarty  <br />          Serial.println(&amp;buffer&#91;field_begin&#91;1&#93;&#93;);  <br />          //tu porównujemy ten ciąg z zapisanym w stałej na początku programu - nie chcemy by reklamy czy inne osoby coś mogły zrobić  <br />          if(strcmp(&amp;buffer&#91;field_begin&#91;1&#93;&#93;,accepted_nr)==0){  <br />            nr_correct=1;  <br />            Serial.println(&quot;NUMER ZGODNY&quot;);  <br />          }else{  <br />            nr_correct=0;  <br />            Serial.println(&quot;NUMER NIEOBSLUGIWANY&quot;);  <br />          }  <br />          stan=NEXT_TXT;//po tej ramce na pewno otrzymamy tekst sms'a, więc informujemy program, że kolejna linijka musi być dekodowana jako tekst a nie komenda  <br />        }  <br />          <br />        //-----------------------------------------------------------------------------------------------------------------------------------  <br />        //OK - komunikat poprawnego zakońvczenia wykonywania komendy  <br />        //-----------------------------------------------------------------------------------------------------------------------------------  <br />        ok=1;//zakładamy, ze to interesująca nas ramka  <br />        for(int i=0;i&lt;2;i++){//w pętli porównujemy pierwsze znaki ramki ze wzorcem OK  <br />          if(buffer&#91;i&#93;!=OK&#91;i&#93;)ok=0;//jeśli jakiś znak się różni to to nie jest interesująca nas ramka  <br />        }  <br />        if(ok){  <br />          wait_for_sending=0;//kasujemy blokadę wysyłania na czas nadawania sms'a  <br />          //jeśli odebrano jakąś wiadomość  <br />          if(msg_id!=0){  <br />            //to ją usuniemy  <br />            GSM.print(&quot;AT+CMGD=&quot;);  <br />            GSM.print(msg_id);  <br />            GSM.print(&quot;\r&quot;); <br />             delay(100);              //  <br />            GSM.print(&quot;AT+CMGD=&quot;);  //<br />            GSM.print(msg_id);<br />            GSM.print(&quot;\r&quot;);       //POWIELONE KASOWANIE SMS~ÓW BEZ TEGO GUBIŁ SIĘ PRZY WIEKSZEJ LKICZBIE SMS~ÓW!!!!!!!!!!!!!!! <br />            msg_id=0;  <br />          }else if(send_resp){//jeśli wiadomość zostałą usunięta i mamy nadać odpowiedź   <br />            send_resp=0;  <br />            GSM.print(&quot;AT+CMGS=+48604XXXXXX\r&quot;);//to wysyłamy ją na ten numer  <br />            delay(550);  <br />            GSM.print(&quot;Led is &quot;);//tu wpisujemy treść wiadomości (do 160 znaków)  <br />            if(digitalRead(13)){  <br />              GSM.print(&quot;ENABLED&quot;);  <br />            }else{  <br />              GSM.print(&quot;DISABLED&quot;);  <br />            }  <br />            GSM.print((char)26);//a następnie zatwierdzamy wysłanie   <br />            Serial.println(&quot;Info wyslane&quot;);  <br />            wait_for_sending=1;//musimy zadbać, by zanim telefon potwierdzi nadanie wiadomości nie nadać nic do niego  <br />          }  <br />        }  <br />          <br />        //-----------------------------------------------------------------------------------------------------------------------------------  <br />        //ERROR  <br />        //-----------------------------------------------------------------------------------------------------------------------------------  <br />        ok=1;//zakładamy, ze to interesująca nas ramka  <br />        for(int i=0;i&lt;5;i++){//w pętli porównujemy pierwsze znaki ramki ze wzorcem OK  <br />          if(buffer&#91;i&#93;!=ERROR&#91;i&#93;)ok=0;//jeśli jakiś znak się różni to to nie jest interesująca nas ramka  <br />        }  <br />        if(ok){  <br />          wait_for_sending=0;//kasujemy blokadę wysyłania na czas nadawania sms'a  <br />          Serial.println(&quot;Oczekiwanie...&quot;);  <br />        }  <br />        break;  <br />        //-----------------------------------------------------------------------------------------------------------------------------------  <br />        //Tekst wiadomości SMS  <br />        //-----------------------------------------------------------------------------------------------------------------------------------  <br />        case NEXT_TXT:  <br />          for(int i=0;i&lt;num;i++){//przeglądamy ją znak po znaku  <br />            if(buffer&#91;i&#93;=='\r'||buffer&#91;i&#93;=='\n')buffer&#91;i&#93;=0;//znaki kończące ramkę też zastąpimy znakami zerowymi  <br />          }  <br />          Serial.print(&quot;Wiadomosc: &quot;);  <br />          Serial.println(buffer);  <br />          //sprawdzamy czy to któreś z interesujących nas poleceń - możemy tu dodać własne polecenie, przesyłanie np. nastawy dla PWM itp.  <br />          if(nr_correct){//ale najpierw sprawdzamy czy numer był naszym numerem - nie chcemy, zeby irytująca reklama włączyła nam oświetlenie w domu :D  <br />            if(strcmp(buffer,&quot;ON&quot;)==0){ <br />              delay(10); <br />              digitalWrite(led,HIGH);<br />              delay(10);<br />              digitalWrite(led2, LOW);  <br />            }  <br />            if(strcmp(buffer,&quot;OFF&quot;)==0){<br />              delay(10);  <br />              digitalWrite(led,LOW);<br />              delay(10);<br />              digitalWrite(led2, HIGH);  <br />            }  <br />            if(strcmp(buffer,&quot;?&quot;)==0){  //TUTAJ NIE DOSTAJĘ ŻADNEJ INFORMACJI ZWROTNEJ<br />              send_resp=0;//poinformujemy, aby po zakończeniu nadawania wysłać informację do użytkownika  <br />            } <br />            <br />          <br />          }  <br />          Serial.println();  <br />          stan=IDLE;  <br />        break;  <br />      }  <br />        <br />        <br />      num=0;  <br />    }else{//jeśli to inny znak niż zakończenie ramki to dopisujemy go do bufora  <br />      buffer&#91;num++&#93;=c;  <br />      buffer&#91;num&#93;=0;//ponadto zawsze kończymy zawartośc bufora znakiem 0 - koniec ciągu znaków  <br />      if(num&gt;255)num=0;//i dodatkowo dbamy o to, żeby nie przepełnić bufora  <br />    }  <br />    warunek = digitalRead(buttonPin); //mój przycisk zwierany przez drzwi<br />  <br />   switch (warunek) // MOJE PRÓBY ODDNOSNIE INFORMACJI O STANIE MOJEGO PRZYCISKU<br />   {<br />    case HIGH:<br />      call();<br />      break;<br />    case LOW:<br />      call2();<br />      break;<br />   }  <br />  }  <br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12878">Mekada</a> — 8 kwi 2016, o 18:55</p><hr />
]]></content>
</entry>
</feed>