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


Ocena wątku:
  • 1 głosów - średnia: 1
  • 1
  • 2
  • 3
  • 4
  • 5
Potrzebna optymalizacja kodu - program urósł za duży
#1
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.


Załączone pliki
.zip   dispenser_state_machine.zip (Rozmiar: 3.51 KB / Pobrań: 0)
.txt   dispenser_state_machine.txt (Rozmiar: 13.91 KB / Pobrań: 17)
 
Odpowiedź
#2
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....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
(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
 
Odpowiedź
#4
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)..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
(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.
 
Odpowiedź
#6
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
 
Odpowiedź
#7
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.
   

a tak będzie wyglądać.
   
 
Odpowiedź
#8
No i zrobione Smile
Tak wygląda skończona maszynka
   
   
 
Odpowiedź
#9
Hm, ładna zabawka. Przydał by się jeszcze alarm antysabotażowy, jak ktoś otworzy górną klapkę Smile.
 
Odpowiedź
#10
(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ć.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości