• 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?
#11
Ok, znalazłem i poprawiłem pewien kod, to co chciałem osiągnąłem  i działa Smile

Szkic używa 12066 bajtów (39%) pamięci programu. Maksimum to 30720 bajtów.
Zmienne globalne używają 1447 bajtów (70%) pamięci dynamicznej, pozostawiając 601 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów.

Chyba nie jest źle. Po testuję i zobaczę czy nie ma problemów, jednak przy pierwszych testach wszystko działa wyśmienicie

Kod:
//Tempertatura odczyt

if (lastLine.indexOf("TEMP") >= 0) {
  sensors.request(address);
  delay(1000);
int temperature = sensors.readTemperature(address);
//Serial.println(temperature);
  char buffer[10]; 
  itoa(temperature, buffer, 10);
  // łączenie temperatury z napisem Temperature:
  String smsTemp ="";
  smsTemp = "Temperature: "+String(buffer) +"C";
  smsTemp.toCharArray(sms_Temp,50);
 
 
Serial.println(smsTemp);
// Wysyła sms z temperatura

gprs.sendSMS (buffNumber, sms_Temp);

}
sms_Temp jest zadeklarowane globalnie. Będę bawił się jeszcze z modyfikacją kodu aby uzyskać jeszcze dodatkowo stan jednego wejścia, ewentualnie dwóch + informacja o napięciu zasilania i ewentualnie siłę sygnału lub pozycję GPS. Nie wiem tylko czy na arduino nano da to wszystko radę zrobić, czy starczy pamięci. Muszę nad tym trochę posiedzieć.



Edit: Udało się, wszystko śmiga ok, dodałem również odczyt napięcia z dzielnikiem aby działał z napięciami powyżej 5v, odczyt jeszcze jednego wejścia + dodatkowo wejście alarmowe-jednak tutaj muszę posiedzieć bo nie działa poprawnie. Wiem, że to jakaś pierdoła, ale muszę nad tym chwilę posiedzieć.
 
Odpowiedź
#12
Ciemną stronę wybrałeś, łatwiejszą, przechodząc na String z C++, to bardzo szatkuje pamięć dynamicznie tworząc i kasując ciągi danych w wolnych miejscach RAM - następuje defragmentacja, ale jak bardzo nie rozbudujesz programu to może działać OK, można też cyklicznie zrobić restart układu, z tego samego powodu wymagają to robić Windowsy na PC, w Uno nie dołożysz RAM na 2x8GB. Tak to zostawiam, jakbyś się kiedyś zastanawiał, czemu działa miesiącami OK, a potem robi głupoty.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#13
(07-11-2021, 23:42)kaczakat napisał(a): Ciemną stronę wybrałeś, łatwiejszą, przechodząc na String z C++, to bardzo szatkuje pamięć dynamicznie tworząc i kasując ciągi danych w wolnych miejscach RAM - następuje defragmentacja, ale jak bardzo nie rozbudujesz programu to może działać OK, można też cyklicznie zrobić restart układu, z tego samego powodu wymagają to robić Windowsy na PC, w Uno nie dołożysz RAM na 2x8GB. Tak to zostawiam, jakbyś się kiedyś zastanawiał, czemu działa miesiącami OK, a potem robi głupoty.
Spokojnie, układ cyklicznie się resetuje czasem kilka razy dziennie, a czasem co najmniej raz Smile  Nie wykluczone, że jeszcze przebuduję kiedyś ten kod, ale dopiero się uczę.

Generalnie kod opiera się na tym z błędem https://washerhouse.com/3/en/3652-sms-ko...m800l.html, oczywiście błąd poprawiłem, a po necie krąży ciągle wersja z błędem. Dzisiaj po analizie głębszej zmieniłem  char currentLine [500] = ""; na char currentLine [250] = ""; bo wydaje mi się, że więcej nie potrzeba, a nawet można jeszcze go chyba zmniejszyć. Jak na moje potrzeby to kod aktualnie wystarcza aż nadto, błędów nie zaobserwowałem nie licząc tych, które na testach odkryłem i poprawiłem. Ma oczywiście pewne wady, ale jeżeli nie uda mi się ich usunąć, będę musiał ręcznie napisać go od nowa jeżeli stanę pod ścianą z aktualnym.
 
Odpowiedź
#14
Niestety mam mały problem, chciałem dodać do powyższego kodu  taką pętlę, ale niestety jest problem i to nie ma prawa działać dodane w środku kodu, a na samej górze dam to wykonuje się tylko ten kod, czy jest w ogóle możliwość bez całkowitej przebudowy powyższego kodu dodać taką pętlę z poniższym kodem? W jaki sposób? Jakieś pomysły?

Kod:
alarmlinia = digitalRead(11);

if (alarmlinia == LOW) {
  gprs.sendSMS (buffNumber, "ALARM ON!");
  Serial.println("Alarm ON!");

}

  else { //Jeśli przycisk nie jest wciśnięty
    Serial.println("Brak alarmu");


 
    }


}
 
Odpowiedź
#15
No ten kod nie jest zrobiony w taki sposób, by dało się go dowolnie rozbudowywać o kolejne pomysły, a przynajmniej łatwo i czytelnie. Jak masz w programie jakieś zdarzenie, że z PC wysyłasz tekst i to jest zamienione na SMS, albo wysyłasz SMS i w odpowiedzi na to dostajesz SMS to można się spodziewać, że palcami nie zrobisz takich akcji więcej niż kilka/s. Sprawdzić czy przycisk jest wciśnięty Arduino może mln razy/s i z każdego takiego zdarzenia tworzysz tekst, wrzucasz do bufora nadawczego albo GPRS, albo Serial - obsługa czasu do nauczenia się, liczenie upływu, robienie timeout, to nie może skończyć się dobrze bez tego. Trzeba zacząć liczyć, jak długo czasu jeszcze należy ignorować taki stan alarmu (lub jego braku) zanim się ponowi ponowny komunikat. A jak program jest tak napisany, że gdzieś tam go zajmujesz na kilkadziesiąt ms to też nie zauważy wciśniętego alarmu - obsługa przerwań zewnętrznych do nauczenia się. Oczywiście nie można używać delay, co najmniej millis().
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#16
Trochę poczytałem w między czasie, na chłodno to przemyślałem i faktycznie łatwo nie będzie i w grę chyba właśnie tylko millis wchodzi. Odnośnie złapania stanu alarmu to nie jest problem bo sygnał będzie stały. No nic zamówiłem sobie drugi sim800 i arduino nano do testów.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości