Skocz do zawartości

Odczytywanie czasów z wiadomości SMS(modułu GSM)


Dawid1B1

Pomocna odpowiedź

Witam wszystkich,

stworzyłem aplikacje na Androida, która komunikuje się poprzez SMS (moduł GSM) z Arduino.

W chwili obecnej możliwe jest włączanie i wyłączanie silnika (używając oczywiście odpowiedniego przekaźnika) poprzez standardowe komendy AT.

Chciałbym używać dodatkowych dwóch funkcji, ale nie wiem jeszcze jak napisać program od strony Arduino i dlatego tutaj pytam o jakąś poradę.

Byłaby to funkcja odpowiedzialna za czas pracy i funkcja odpowiadająca za opóźnienie startu.

Czyli użytkownik wybiera funkcje czas pracy i wpisuje czas (np. 1:30) jaki jaki ma pracować silnik i wysyłany jest sms o treści . "ON WORKTIME 1:30".

Wybierając funkcje opóźnienie startu użytkownik także wpisuje czas np.2:0 za jaki ma się włączyć silnik. Wysyłany jest SMS o treści "DELAY 2:0".

W przypadku wyboru dwóch funkcji i deklaracji przykładowo tych samych czasów wysyłany jest SMS o treści: "DELAY 2:0 WORKTIME 1:30".

Czy ktoś wie jak odczytywać te czasy, żeby sterować tak jak opisałem tym silnikiem?

Wysyłane wiadomości mogę w jakimś stopniu zmodyfikować, jeśli będzie to konieczne.

Dodam, że jestem nowy w programowaniu Arduino, niedawno zakupiłem zestaw do kursu, lecz jeszcze zostało mi kilka poziomów do zrealizowania.

Link do komentarza
Share on other sites

Włączanie i wyłączanie wygląda tak:

//jesli polecenie załaczenia

if (string_sms == "Out on") {

digitalWrite(output1_pin, LOW);

lcd.setCursor(0, 0);

lcd.print(" OUTPUT ON ");

autorefresh = 0;

//nastepny etap - wysyłanie potw.

gsm_step = 7;

}

//jesli polecenie wyłączenia

if (string_sms == "Out off") {

digitalWrite(output1_pin, HIGH);

lcd.setCursor(0, 0);

lcd.print(" OUTPUT OFF ");

autorefresh = 0;

//nastepny etap - wysyłanie potw.

gsm_step = 7;

}

[ Dodano: 03-01-2018, 10:47 ]

Tak wygląda całość, bo chyba o to pytałeś: (i to działa)

case 6: { //AT+CMGR=1

CommandGet();

//jeśli odczytano SMS

if (command == "CMGR") {

//nastepny etap - kasowanie SMS

gsm_step = 8;

//jeśli SMS zawiera treść

if (StringSmsGet() > 0) {

//określa numer nadawcy

StringParamGet(2);

string_number = string_param;

//info

Serial.print("\n\rNew sms:");

Serial.print(string_sms);

Serial.print("\n\rSender:");

Serial.print(string_param);

//jesli polecenie załaczenia

if (string_sms == "Out on") {

digitalWrite(output1_pin, LOW);

lcd.setCursor(0, 0);

lcd.print(" OUTPUT ON ");

autorefresh = 0;

//nastepny etap - wysyłanie potw.

gsm_step = 7;

}

//jesli polecenie wyłączenia

if (string_sms == "Out off") {

digitalWrite(output1_pin, HIGH);

lcd.setCursor(0, 0);

lcd.print(" OUTPUT OFF ");

autorefresh = 0;

//nastepny etap - wysyłanie potw.

gsm_step = 7;

}

//jesli polecenie restartu

if (string_sms == "Out res") {

digitalWrite(output1_pin, HIGH);

lcd.setCursor(0, 0);

lcd.print(" OUTPUT RESTART ");

delay(2000);

digitalWrite(output1_pin, LOW);

autorefresh = 0;

//nastepny etap - wysyłanie potw.

gsm_step = 7;

}

}

//jesli nie ma SMS

} else {

OkGet();

//wróć do sprawdzania siły sygnału GSM

gsm_step = 5;

}

} break;

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

Link do komentarza
Share on other sites

Dobra, czyli większość masz. Teraz chcesz sprawdzić, czy komenda zaczyna się od jakiegoś tekstu, oraz wyciągnąć z niej kawałek oznaczający czas. Poczytaj sobie o metodzie substring: https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/substring/ oraz startswith: https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/startswith/

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Świetne funkcje, dzięki. Tylko mam jeszcze pewien problem.

Użyłem tych funkcji do sprawdzenia jaki rodzaj komendy przyszedł:

//1 przypadek, gdy przyszedł sms np. "WORKTIME 1:30"

if (string_sms.startsWith("WORKTIME")){

}

//2 przypadek, gdy przyszedł sms np. "DELAY 2:30"

if (string_sms.startsWith("DELAY")){

}

//3 przypadek, gdy przyszły 2 funkcje w jednej wiadomości np. "WORKTIME 1:30 DELAY 2:30"

if (string_sms.substring(16, 21) == "DELAY") {

}

nie było tam pokazanego przykładu, ale można funkcję SUBSTRING użyć także w ten sposób:

string, witam na forum! = string_sms.substring(16, 21) --> to przypisze mi do nowego string'u wybrane pozycje z otrzymanej wiadomości?

jeszcze jedno pytanko - jak wrzucić te godziny i minuty do jakiegoś licznika?

Z góry dzięki za pomoc.

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

Link do komentarza
Share on other sites

Tak, możesz te wartości też przypisać do uprzednio zdefiniowanych zmiennych.

Żeby użyć czasów z licznikiem, musisz je przetłumaczyć na jakąś jedną jednostkę, na przykład milisekundy — wtedy będziesz mógł porównywać bezpośrednio z wynikiem funkcji millis().

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Nie, ale jest na to sposób. W miejscu, gdzie byś ją zerował, po prostu zapamiętujesz jej wartość. Potem tam, gdzie ją odczytujesz, odejmujesz zapamiętaną wartość. Jeśli dobrze napiszesz to wyrażenie, to nawet overflow ci niestraszny, bo będzie taki sam po obu stronach.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Nasuną mi się jeszcze jeden problem, może też będziesz w stanie mi pomóc lub ktoś inny.

W przypadku gdy urządzenie którym steruje jest włączone i nastąpi zanik napięcia to po ponownym uruchomieniu programu urządzenie jest wyłączone.

Czy jest jakaś metoda, która pozwoli na przywrócenie tych wszystkich wartości z przed zaniku napięcia?

Link do komentarza
Share on other sites

Dnia 11.01.2018 o 13:36, Dawid1B1 napisał:

Nasuną mi się jeszcze jeden problem, może też będziesz w stanie mi pomóc lub ktoś inny.

W przypadku gdy urządzenie którym steruje jest włączone i nastąpi zanik napięcia to po ponownym uruchomieniu programu urządzenie jest wyłączone.

Czy jest jakaś metoda, która pozwoli na przywrócenie tych wszystkich wartości z przed zaniku napięcia?

Pierwsze skojarzenie to zapis i odczyt do/z pamięci EEPROM: https://www.arduino.cc/en/Reference/EEPROM

Ale trochę zaspałem z tą odpowiedzią, bo to było tydzień temu 🙂

Edytowano przez Treker
Poprawiłem formatowanie.
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.