Arduino Polska Forum

Pełna wersja: Potrzebna optymalizacja kodu - program urósł za duży
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Witam serdecznie i chcę poprosić o pomoc w poprawieniu kodu, jestem bardzo początkującym programistą Arduino i prawdę mówiąc to mój pierwszy projekt Smile który piszę używając przykładów z internetu. Przez co kod jest mało optymalny i niestety doszedłem do ściany bo skończyło się miejsce w pamięci Sad . Niestety na tym etapie nie umiem sobie z tym poradzić samodzielnie. Jeśli więc ktoś mógłby zerknąć na moje dzieło, byłbym bardzo wdzięczny.
Chciałbym aby ten program działał na Arduino UNO.
A co to jest?? co ma robić??

Bo ja tak pić razy oko myśle jaki sens zapisywać datę i godzinę na SD.. Żeby chociaż jakiś czujnik był i inne dane a tu nic tylko zegar i silnik krokowy coś przestawia....
(02-01-2021, 00:59)Jarewa0606 napisał(a): [ -> ]A co to jest?? co ma robić??

Bo ja tak pić razy oko myśle jaki sens zapisywać datę i godzinę na SD.. Żeby chociaż jakiś czujnik był i inne dane a tu nic tylko  zegar i  silnik krokowy coś przestawia....
To ma wydać papierosa Smile zapisać datę i godzinę, następnym razem po wciśnięciu przycisku ma powiedzieć jaki czas temu wydano ostatnią sztukę i jeśli ktoś (moja żona Smile ) będzie będzie chciał kolejnego papierosa to musi wcisnąć przycisk jeszcze raz, wtedy dostanie fajkę a maszynka powie ile fajek wzięła dzisiaj oraz poda liczbę fajek pobranych wczoraj. Big Grin
To po co ci te "stringi" ?? one zżerają pamięć nie lepiej operować na czasie UNIX?? tylko liczbami i tylko tym.. Po c pobierać informacje miesiąca dnia roku jak to wszystko jest zapisane w jednej liczbie "UNIX" (brak tylko kalendarza ale to nie problem). Odpalić timer by liczył czas unix a tylko synchronizować 2 razy dziennie z RTC (a nawet i raz wystarczy)..
(02-01-2021, 12:02)Jarewa0606 napisał(a): [ -> ]To po co ci te "stringi" ?? one zżerają pamięć  nie lepiej operować na czasie  UNIX??  tylko liczbami i tylko tym..  Po c pobierać informacje miesiąca dnia roku jak to wszystko jest zapisane w jednej liczbie "UNIX" (brak tylko kalendarza ale to nie problem). Odpalić timer by  liczył czas unix  a tylko synchronizować 2 razy dziennie z RTC (a nawet i raz wystarczy)..
Cóż, napisałem że jestem początkującym, a nawet bardzo początkującym w tej dziedzinie. I pewnie masz rację z tymi wszystkimi "po co". Jednak ja to zrobiłem jak umiałem i w pewnym momencie napotkałem problem z którym sobie nie umiem poradzić. Znalazłem to forum i poprosiłem o pomoc/poradę. A otrzymuję nic nie wnoszącą krytykę, że mogłem to zrobić lepiej. Dziękuję za info, ale to to ja wiedziałem i bez tego posta.
Może znajdzie się ktoś kto będzie chciał pomóc i poradzi co zmienić i jak, niestety ja już wbiłem się w pewne schematy w tym projekcie i choćbym siedział miesiąc to zapewne będę krążył w kółko.
Tak czy inaczej na innym forum poradzono mi by wszędzie gdzie drukuję jakieś teksty na port szeregowy czy wyświetlacz używać makra F() co powoduje przechowywanie tych danych w pamięci programu an nie w pamięci zmiennych, co rozwiązało problem na ten moment.
Wiem też że zamiast Zmiennych String mogę użyć char ale tu miałem jakieś problemy i nie wiedziałem jak to obejść, muszę się tego nauczyć.
A jeśli chodzi o czas w formacie UNIX to nie bardzo umiem wyciągnąć z tej liczby tylko datę bez godzin, i dlatego wyciągam z tego dzień, miesiąc, rok za pomocą dostępnych funkcji.
Nie wiem czy pomogę.
Używasz RTC DS3231, więc możesz z niego czytać datę. Czas między papierosami możesz obliczać na podstawie czasu unix odejmując od czasu przy pobieraniu "cygara" czas jaki zapisałeś przy pobieraniu poprzedniego i masz już sekundy. Czas UNIXowy odczytujesz dt.unixtime z biblioteki Jarzębskiego Arduino-DS3231-master.
Dodatkowo ja bym użył pamięci EEPROM, która jest w "procesorku", do zapisu danych z ostatniej doby.
Przydzieliłbym jedną komórkę na godzinę doby czyli 24 komórki i do każdej zapisywałbym ile "cygarów" zostało pobranych w danej godzinie. Może zapisanie 2 czy 3 razy na dobę danych do takiej komórki nie nadwyręży jej żywotności i wystarczy jej na lata. O "24" czy o "0" godzinie sumujesz wartości z poszczególnych komórek i zapisujesz je do innej do tego dedykowanej. Z niej będziesz odczytywał ilość wypalonych "cygarów" poprzedniego dnia jak żonka naciśnie guziczek na dystrybutorze.
Raz na dobę też o godzinie 24 możesz archiwizować dane na karcie pamięci dla potomnych.
Mam tak robione wykresy dobowe na mojej stacji pogody i nie tylko. Zaletą jest to, że w przypadku resetu mogę stracić tylko dane z ostatniej godziny, reszta zostaje w pamięci. Dodatkowo takie rozwiązanie nie obciąża pamięci procesorka.
Wcześniej miałem to zrobione na tablicach, które zajmowały sporo pamięci i wpadłem właśnie na pomysł użycia EEPROMu
Dzięki za sugestię, Jak na razie po przerzuceniu wszystkich drukowanych stringów do pamięci programu za pomocą makra F(), wszystko działa bez zarzutu. A znaczniki czasowe  zapisuję każdorazowo na karcie SD, co pozwala nawet na odłączenie maszynki od prądu i po ponownym włączeniu wszystkie dane są, a fajki liczę na podstawie ilości zapisów z danego dnia. W ostateczności też mogę użyć tego pliku do analizy postępów np w excelu Smile. Obciążeniem procka się nie przejmuję bo i tak większość czasu lata w pętli i sprawdza czy wciśnięto guzik.
Jedyny problem jaki mam teraz to karta SD, często zdarza się że mimo tego że czyta dane z karty to nie może na niej z jakiegoś powodu pisać i nie mogę dojść dlaczego.

A tak to wygląda teraz, reszta obudowy właśnie się drukuje.
[attachment=1087]

a tak będzie wyglądać.
[attachment=1088]
No i zrobione Smile
Tak wygląda skończona maszynka
[attachment=1093]
[attachment=1094]
Hm, ładna zabawka. Przydał by się jeszcze alarm antysabotażowy, jak ktoś otworzy górną klapkę Smile.
(16-01-2021, 09:34)Agregacik napisał(a): [ -> ]Hm, ładna zabawka. Przydał by się jeszcze alarm antysabotażowy, jak ktoś otworzy górną klapkę Smile.
Cały wic polega na tym że to nie ma być narzędzie przymusu, tylko rodzaj uświadamiacza o skali problemu. Jeśli osoba z tego korzystająca miała by kantować to równie dobrze mogła by mieć "lewą@ paczkę papierosów.
Szczerze nie wiem czy to zadziała, ale wg. mnie warto spróbować.
Stron: 1 2