Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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.

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.

Ś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.

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

Dzięki, zrobiłem tak jak napisałeś i wszystko działa, tylko jeszcze z funkcją Millis sobie nie mogę poradzić.

Da się ją jakoś zresetować, żeby zliczała od 0 ponownie?

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

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?

  • 1 rok później...
(edytowany)
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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...