Dawid1B1 Napisano Styczeń 3, 2018 Udostępnij Napisano Styczeń 3, 2018 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. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Styczeń 3, 2018 Udostępnij Styczeń 3, 2018 A jak odczytujesz wiadomości dotychczas? Cytuj Link do komentarza Share on other sites More sharing options...
Dawid1B1 Styczeń 3, 2018 Autor tematu Udostępnij Styczeń 3, 2018 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. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Styczeń 3, 2018 Udostępnij Styczeń 3, 2018 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/ 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Dawid1B1 Styczeń 3, 2018 Autor tematu Udostępnij Styczeń 3, 2018 Ś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. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Styczeń 3, 2018 Udostępnij Styczeń 3, 2018 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(). 1 Cytuj Link do komentarza Share on other sites More sharing options...
Dawid1B1 Styczeń 4, 2018 Autor tematu Udostępnij Styczeń 4, 2018 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? Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Styczeń 4, 2018 Udostępnij Styczeń 4, 2018 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. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Dawid1B1 Styczeń 9, 2018 Autor tematu Udostępnij Styczeń 9, 2018 Dzięki wielkie. Wszystko działa 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Dawid1B1 Styczeń 11, 2018 Autor tematu Udostępnij Styczeń 11, 2018 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? Cytuj Link do komentarza Share on other sites More sharing options...
Juka58 Styczeń 16, 2019 Udostępnij Styczeń 16, 2019 Hej Dawid1B1 czy możesz mi podesłać swój kod potrzebuję odczytywać SMSy na Arduino Cytuj Link do komentarza Share on other sites More sharing options...
Zero Styczeń 17, 2019 Udostępnij Styczeń 17, 2019 (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 Styczeń 17, 2019 przez Treker Poprawiłem formatowanie. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!