• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pierwszy kod, weryfikacja poprawności?
#1
Witam,

Napisałem samodzielnie swój pierwszy w życiu kod, w zasadzie to rozbudowałem i poprawiłem gotowca, tzn. rozbudowałem go o dodatkowe funkcje korzystając z określonych bibliotek. Testuję go od jakiegoś czasu i wygląda, że wszystko działa. Jak zweryfikować poprawność tego kodu, czy wystarczy, że nie wywala się podczas kompilacji i działają wszystkie nowo dodane w nim funkcje? Wgrany na klona nano, korzysta z 72% biblioteki dynamicznej, nie mam co prawda ostrzeżenia, ale starałem się go wcześniej optymalizować żeby jak najmniej tej biblioteki pożarł. Jaka jest granica której nie powinno się przekraczać?

Pozdrawiam
 
Odpowiedź
#2
(03-01-2020, 20:03)nowy napisał(a): Jak zweryfikować poprawność tego kodu, czy wystarczy, że nie wywala się podczas kompilacji i działają wszystkie nowo dodane w nim funkcje?
Nie wystarcza, że wynik kompilacji jest ok.

Program trzeba sprawdzić pod kątem wystąpienia różnych błędów, czy to użytkownika, czy uszkodzenia sprzętu, błędów w transmisji itp. Napisz co robi program to podpowiem co i jak należy przetestować. Jakiś punkt wyjścia będziesz miał, bo testy jakie należy przeprowadzić zależą od wielu czynników.
 
Odpowiedź
#3
Arduino jest spięte z sim800l poprzez konwerter poziomów logicznych rx/tx, steruje to 4 przekaźnikami poprzez komendy sms (gotowy szkic, ale źle napisany z błędami, co poprawiłem). Dodałem do tego obsługę czujnika ds18b20, miałem z nim lekki problem. ponieważ standardowy kod sms, który wykorzystałem nie daje wyniku pobierając liczby jako float albo int, jedynie jako zmienna char. Udało się to zrobić za pomocą itoa i wysyłając teraz sms z odpowiednią komendą dostaje zwrotną informację z temperaturą. Dodatkowo dodałem opcję sprawdzenia czy występuje stan low lub high na jednym z pinów cyfrowych. Opcja ta też działa bez błędnie po dodaniu odpowiedniego rezystora, który wywołuje stan low jeżeli czujnik ntc osiągnie odpowiednią temperaturę. Co więcej dodałem dzisiaj opcję odebrania rozmowy. Jeszcze myślę nad dodaniem informacji o napięciu zasilania w przyszłości, ale z tym będzie większy problem ponieważ wynik musi być z przecinkiem jako zmienna float. Jak na razie błędów nie zauważyłem i w sumie działą. Z racji, że domyślnie będzie to działać w samochodzie w temp od -20st do +5st sprawdzę stabilność na dworzu idzie teraz ochłodzenie.

Kod to ten, ale pobrany gdzieś przez webarchive i naprawiony https://www.instructables.com/id/SMS-Con...IM800L-V2/

Generalnie komendy wysyłające sms są z niego wykorzystane.
 
Odpowiedź
#4
GSM:
- W czasie działania programu zresetuj moduł GSM. Jak nastąpi ponowne zalogowanie to ok.
- Kolejny to test na nieotrzymanie odpowiedzi zapytanie/komendę i otrzymanie odpowiedzi, której się nie spodziewasz (np o wylogowaniu, ponownym zalogowaniu, RING, itp).
Na tych 2 testach 99,99% programów na arduino polega. Jeśli te testy ok to:
- Jak używasz karty z PIN to jak program zachowa się z kartą bez PIN?
- Gdy PIN jest błędny co robi program?
- Jeśli używasz karty bez PIN, to co będzie po włożeniu karty z PIN? jak sygnalizujesz błąd?
Tych testów na arduino nigdy nie robiłem bo nie przeszły pierwszego testu.

DS18B20:
- Zewrzyj magistralę z masa, jakie otrzymujesz odczyty temperatury?
- Odłącz termometr, jakie otrzymujesz odczyty temperatury?
Na pierwszym z testów 99,99% programów zwraca 0, na drugim -127. Oba wyniki są naturalnie nie prawdziwe.
- Błąd CRC, co robi program?
Tego testu nigdy nie robiłem na arduino bo nie przeszła pierwszych 2 testów.

Inne testy:
- Trwa konwersja temperatury przez DS18B20. W tym czasie przychodzi SMS. Zostanie poprawnie odczytany?
Na tym teście ponad 90% programów na arduino działa błędnie.


PS
Używasz float choć nigdzie nie jest wymagane. Z jakim uC masz Arduino?
 
Odpowiedź
#5
To jest nano atmega328p z tego co kojarzę.

Karta jest bez pin, nóżka resetu jest podpięta do arduino, układ resetuje się z arduino bez problemu. sim800l się nie usypia, arduino to samo, ale udało mi się ograniczyć pobór do 30mA. Zasilanie na nano jest podane poprzez vin, ale błędnie bo 5v niestety musiałem to ograniczyć bo przy 7809 było 5mA więcej, na 7805 działa stabilnie, jeżeli będzie problem wystarczy, że wypnę i wsadzę inny.

Przy odłączonym termometrze otrzymuję wiadomość -273st
Przy zwarciu magistrali z masą otrzymuję też -273st.
D18b20 jest podłączony jako poprzez 2 przewody zgodnie ze sztuką.
Jak program się załaduje to dostaję smsy za każdym razem. Jedna sytuacja jaką zauważyłem przy podpiętej konsoli, jak odpaliłem układ i nie załadował się do końca to "err cmfg" po wysłaniu smsm o załączenie przekaźnika, odpowiedzi nie otrzymałem. Jednak nie wiem na ile był to problem z załadowaniem czy coś w kodzie za dużo zoptymalizowałem, inne smsy poszły wtedy bez problemu. Będę to jeszcze weryfikował. Jeszcze jeden scenariusz muszę przetestować to brak sieci w danym momencie, nie wiem jak zachowa się układ, musiałbym dodać jakiegoś watchdoga.

Tak faktycznie teraz na szybko wyszukałem czy gdzieś jest w kodzie zmienna float i faktycznie nie ma, chodziło o sytuacje jak na początku testowałem czujnik ds18b20 na konsoli, korzystałem tam z funkcji float i na serialu wszystko działało, jednak przy sms nie. Zacząłem wtedy szukać, czytać i najpierw zmieniłem na int, temp dalej czytało, ale sms nie był wysyłany i znalazłem gdzieś, że ktoś miał podobny problem zastosowałem takie rozwiązanie i bingo zadziałało

//Tempertatura odczyt

if (lastLine.indexOf("temperatura") >= 0) {
int temperature = sensors.readTemperature(address);
Serial.println(temperature);
char buffer[10]; // adjust size to suit
itoa(temperature, buffer, 10);
//Serial.println(F(" 'C"));
// Wysyła sms z temperatura
gprs.sendSMS (buffNumber, buffer);
sensors.request(address);
}

Problem pojawi się jak będę chciał odczytać dokładne napięcie 12v z akumulatora i będę musiał użyć zmiennej float do tego a potem jakoś odczytać smsa, który jak widać z biblioteki gprs / gprs.h obsługuje wysyłkę tego jako char. Nie znam się jeszcze na tyle, żeby to przerobić. Sam fakt ogarnięcia czujnika temp zajął mi 3h, próbowałem na różne sposoby, ale nic to nie dało, dopiero poszukałem w innym sposób rozwiązania i powyższe zadziałało od strzała.
 
Odpowiedź
#6
Cytat:Przy odłączonym termometrze otrzymuję wiadomość -273st
Przy zwarciu magistrali z masą otrzymuję też -273st.
Więc pierwsze dwa testy oblane.

Odłącz reset SIM800 od arduino i przeprowadź kolejne testy albo pokaz kod. Wnioskuję, że błędów jest dużo, bo fragment wysyłający SMS z temperaturą nie sprawdza czy modem jest zalogowany do sieci. Na 90% nie sprawdza, czy SMS udało się wysłać. Zgadłem?

"Wstrzelenie" się w odbiór SMS podczas pomiaru temperatury jest trudne i wymaga dodatkowych zabiegów. Pokaz więc kod pomiaru temperatury. Na 90% jest błędny i program "wisi" 700ms.
 
Odpowiedź
#7
Ponawiam pytanie, ostatnio zauważyłem pewien problem. Otóż wysyłając info o temp, odsyła mi temperaturę jakby po uruchomieniu, zamiast aktualnej. Po wysłaniu sms ponownie odsyła prawidłową. Czy wystarczy, że dam zamiast
Kod:
if (lastLine.indexOf("temperatura") >= 0) {
int temperature = sensors.readTemperature(address);
Serial.println(temperature);
char buffer[10]; // adjust size to suit
itoa(temperature, buffer, 10);
//Serial.println(F(" 'C"));
// Wysyła sms z temperatura
gprs.sendSMS (buffNumber, buffer);
sensors.request(address);
}
na
Kod:
if (lastLine.indexOf("temperatura") >= 0) {
sensors.request(address); //zmiana
int temperature = sensors.readTemperature(address);
Serial.println(temperature);
char buffer[10]; // adjust size to suit
itoa(temperature, buffer, 10);
//Serial.println(F(" 'C"));
// Wysyła sms z temperatura
gprs.sendSMS (buffNumber, buffer);

}

Zamiana sensors.request(address); wyżej rozwiąże problem? (nie chce mi się iść po urządzenie i wgrywać bo już zamontowałem) Wink

Czy trzeba dać delay po sensor request np 1s?
 
Odpowiedź
#8
Hej,
Od ostatniego mojego posta kod działał bez problemu poprawnie i wystarczał na moje potrzeby w zupełności, nie miałem też żadnych większych problemów. Teraz chciałbym jednak dodać pewną informację zwrotną do temperatury, w zasadzie sam napis. Chodzi o to, że ten kod, wysyła samą informację zwrotną z temperaturą, teraz chciałbym aby dodatkowo przed temperaturą doszedł prosty napis "Temperatura:" niestety nie wiem jak się za to zabrać żeby to ruszyć. Wpisanie do linjki  gprs.sendSMS (buffNumber, "Temperature:", buffer) oczywiście nie ma prawa zadziałać. Jakieś pomysły jak to ugryźć i czy jest to w ogóle możliwe? 

Kod:
if (lastLine.indexOf("temperatura") >= 0) {
sensors.request(address); //zmiana
int temperature = sensors.readTemperature(address);
Serial.println(temperature);
char buffer[10]; // adjust size to suit
itoa(temperature, buffer, 10);
//Serial.println(F(" 'C"));
// Wysyła sms z temperatura
gprs.sendSMS (buffNumber, buffer);

}
 
Odpowiedź
#9
char buffer[10]; - to jest tablica, w której zapisujesz bajty odpowiadające literce, tę tablicę wysyłasz potem, możesz sobie zrobić tablicę, która będzie na tyle duża by zmieścić w niej napis "Temperature:" i na jej koniec od znaku ':' przekopiować 10 znaków z tablicy buffer, pętla for int i, z jednej tablicy index i do drugiej index x+i . Są też gotowe funkcje C strings które łączą dwie tablice - strcat(napis1, napis2), jak używać znajdziesz tu:
https://pl.wikibooks.org/wiki/C/Napisy . Są też funkcje, które wklejają w ciąg napisów od razu zmienne, ale z floatem może być problem w Arduino, oczywiście do obejścia jak się grzebnie głębiej.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#10
Dzięki za trop, bo już zacząłem szukać, ale muszę pójść Twoim tropem i spróbować, tak samo jak na początku próbowałem z itoa bo też był problem z wyświetlaniem temperatury.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości