Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

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

Autor Wiadomość
Dawid1B1 



Posty: 16
Wysłany: 03-01-2018, 09:16   Odczytywanie czasów z wiadomości SMS(modułu GSM)

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.

Warto przeczytać » Kurs elektroniki II - #13 - QUIZ, podsumowanie


Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 2516
Pomógł: 138 razy
Otrzymał 221 piw(a)
Programuję w:
Python, C, Lua
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 03-01-2018, 10:18   

A jak odczytujesz wiadomości dotychczas?

Postaw piwo autorowi tego posta
 
 
Dawid1B1 



Posty: 16
Wysłany: 03-01-2018, 10:37   

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
Kod programu, dla lepszej czytelności, należy umieszczać w tagach [code]. Proszę to poprawić.

Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 2516
Pomógł: 138 razy
Otrzymał 221 piw(a)
Programuję w:
Python, C, Lua
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 03-01-2018, 10:52   

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/re...ions/substring/ oraz startswith: https://www.arduino.cc/re...ons/startswith/

Polecany artykuł » Kurs STM32 F4 - #12 - Programowanie przez bootloader


Ostatnio zmieniony przez deshipu 03-01-2018, 10:53, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Dawid1B1 



Posty: 16
Wysłany: 03-01-2018, 23:44   

Ś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_nowy = 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
Kod programu, dla lepszej czytelności, należy umieszczać w tagach [code]. Proszę to poprawić.

Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 2516
Pomógł: 138 razy
Otrzymał 221 piw(a)
Programuję w:
Python, C, Lua
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 04-01-2018, 00:18   

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().

Postaw piwo autorowi tego posta
 
 
Dawid1B1 



Posty: 16
Wysłany: 04-01-2018, 15:52   

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?

Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 2516
Pomógł: 138 razy
Otrzymał 221 piw(a)
Programuję w:
Python, C, Lua
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 04-01-2018, 16:58   

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.

Postaw piwo autorowi tego posta
 
 
Dawid1B1 



Posty: 16
Wysłany: 09-01-2018, 20:55   

Dzięki wielkie. Wszystko działa :)

Postaw piwo autorowi tego posta
 
 
Dawid1B1 



Posty: 16
Wysłany: 11-01-2018, 13:36   

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?

Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Atmega - problem z b... Przysyłanie/Odbieran... Arduino i programowa... Arduino, problem z o...
lub przeszukaj forum po wybranych tagach: czasow, gsm, odczytywanie, smsmodulu, wiadomosci


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki