Skocz do zawartości

Belferek

Użytkownicy
  • Zawartość

    508
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    6

Wszystko napisane przez Belferek

  1. Może to Ci pomoże: https://tkkrlab.nl/wiki/Arduino_KY-026_Flame_sensor_module a najlepiej strona producenta Waveshare: https://www.waveshare.com/wiki/Flame_Sensor
  2. Ten algorytm to sobie musisz sam wymyślić i rozpisać (rozrysować)! Wyżej masz tylko przykład algorytmu na zapis czasu włączenia i wyłączenia do EEPROM wraz z jego przełożeniem na kod programu (szablon). Czy znasz odpowiedzi na poniższe (przykładowe) pytania: Czy RTC ma ustawiony prawidłowy czas, czy nie? Piszesz, że Twój program zapisuje dane do eeprom ale co konkretnie zapisuje? Czy zapisuje datę, godzinę czy jakiś inny parametr czasowy (np. EPOCH time)? Ile sekwencji włączeń/wyłączeń chcesz zapisać w EEPROM (32kb = 4kB)? Czy należy sprawdzać poprawność zapisanych w eeprom danych? Jaka jest częstotliwość włączeń/wyłączeń urządzenia? Jaki jest typowy czas pracy/bezczynności urządzenia? itp. To muszą być Twoje przemyślenia, a są one ważne bo to one decydują o sposobie organizacji (wykorzystania) pamięci eeprom. Najprościej jak można moim zdaniem to ja bym podszedł do tego tak: 1. Do obsługi RTC wykorzystałbym wspomnianą już przeze mnie bibliotekę RTC by Makuna (jest dostępna z poziomu zarządzania bibliotekami Arduino IDE). 2. Dane w eeprom zapisywałbym w postaci rekordów o stałej długości np 5 bajtów: 1 bajt - kod zdarzenia np. 0 - wyłączenie, 1 - włączenie ...... itd kody od 0 - 255 4 bajty - czas zdarzenia w formacie zwracanym przez funkcję z biblioteki RTC by Makuna: Epoch32Time() 3. Pod adresami 0-1 pamięci eeprom przechowywałbym ilość zapisanych w pamięci rekordów. Rozumiem, że mowa o sytuacji gdy Arduino się resetuje. Tu wypadałoby porównać w setup() aktualny czas RTC i stan urządzenia z ostatnio zapisanymi w eeprom danymi. Można by więc np. ustalić jeden (specjalny, pierwszy) rekord w którym co określony czas zapisujemy aktualny stan pracy urządzenia i czas. I teraz to od Twoich założeń konstrukcyjnych zależy reakcja programu na takie zdarzenie. Biorąc pod uwagę ograniczoną ilość możliwych zapisów eeprom warto byłoby się zastanowić nad wykorzystaniem zamiast eeprom np. pamięci FRAM: https://botland.com.pl/pl/pamieci-fram/4137-adafruit-mb85rc256v-pamiec-256kb32kb-fram-nieulotna-i2c.html?gclid=EAIaIQobChMIz6ew7e_i5wIVRuaaCh1oEgG1EAYYASABEgLRhfD_BwE To bardzo ciekawa moim zdaniem i "bardziej pojemna" propozycja. Moduł także korzysta z i2c więc wiele nie zmienia. Tak więc to co pisałem wcześniej jest nadal w mej ocenie aktualne: Pokaż swój algorytm i program, który jak piszesz działa.
  3. Tu nie ma czarnej magii - wróć do algorytmu. Nie musisz umieć programować by ustalić "przepis" (algorytm) na to jak program ma działać. Pokaż swój przepis - pomysł wtedy spróbujemy zamienić go na działający program.
  4. Bo pokazany szablon tego nie uwzględnia. Tutaj sam popracuj nad programem i pokaż co wymyśliłeś. Może warto zapamiętać w eeprom ostatni stan_urzadzenia? Warto zastanowić się nad tym jaka maksymalna może być "przerwa" w zasilaniu by potraktować ją jako "ciągłość pracy"? Tu będziesz musiał porównać czas bieżący z RTC z ostatnio zapisanym. Nie wiem jakiej używasz biblioteki do obsługi swojego RTC. Ja bym polecał RTC by Makuna (https://github.com/Makuna/Rtc) Autor udostępnia obszerne WIKI na temat swojego produktu - https://github.com/Makuna/Rtc/wiki
  5. Z tymi bibliotekami jest chyba zamieszanie (zob. ten wątek Może spróbuj skorzystać z porad tam zawartych?
  6. Link u mnie nie działa, a program nie dzieła u autora wątku. Może więc warto pokazać ten problematyczny program?
  7. #define URZADZENIE 2 //na tym pinie stan HIGH oznacza wlaczone urzadzenie boolean stan_urzadzenia; //true jesli wlaczone false jesli wylaczone void zapiszCzas_ON() { //funkcja zapisuje czas wlaczenia np. w EEPROM } void zapiszCzas_OFF() { //funkcja zapisuje czas wylaczenia np. w EEPROM } //-------------------------------------------------------------------------- void setup() { pinMode(URZADZENIE,INPUT_PULLUP); stan_urzadzenia=false; } //-------------------------------------------------------------------------- void loop() { if(digitalRead(URZADZENIE)==HIGH) //sprawdzamy stan URZADZENIA (1) { //urzadzenie jest wlaczone (3) if(stan_urzadzenia==false) //urzadzenie bylo wylaczone { stan_urzadzenia=true; //zapamietaj, ze wlaczono (5) zapiszCzas_ON(); //zapisz czas wlaczenia (6) } } else //(2) { //urzadzenie wylaczone (7) if(stan_urzadzenia==true) //urzadzenie bylo wlaczone { stan_urzadzenia=false; //zapamietaj, ze wylaczono (9) zapiszCzas_OFF(); //zapisz czas wylaczenia (10) } } } Tak mógłby wyglądać jeden z szablonów Twojego programu - nie uwzględnia przycisku i innych drobiazgów
  8. Czyli algorytm zapisywania czasu włączenia i wyłączenia mógłby wyglądać np. tak: 1. Pobierz stan wejścia (digitalRead()) 2. Jeśli to stan LOW (wyłączone) to 7 3. Urządzenie pracuje. 4. Jeśli urządzenie włączono wcześniej to 1 5. Zapamiętaj, że urządzenie zostało włączone. 6. Zapisz czas włączenia i 1 7. Urządzenie wyłączone. 8. Jeśli wyłączono wcześniej to 1 9 Zapamiętaj, że zostało wyłączone. 10. Zapisz czas wyłączenia i 1
  9. Czyli projekt układu już chyba posiadasz. Pokaż ten projekt bo na razie tylko wiemy, że masz bliżej nieznany moduł RTC z pamięcią 24c32. Tylko nie wiemy (bo tego nie pokazujesz i o tym nie piszesz) dlaczego właśnie taki moduł, jakie ma pełnić funkcje w twoim urządzeniu itd. Nikomu nie będzie się chciało zgadywać jak zbudowane jest to urządzenie. Pokaż je i opisz. Wtedy będzie łatwiej coś doradzić. Moim zdaniem trudno mówić o programowaniu urządzenia gdy nie wiemy jak jest ono zbudowane. Pytanie zasadnicze moim zdaniem to - czego czas pracy ma być rejestrowany przez Arduino i skąd "Arduino ma wiedzieć", że urządzenie pracuje?
  10. Napisz coś więcej o budowanym urządzeniu, pokaż jego schemat. Co to znaczy? Czy nie wiesz jak ma działać program, czy nie potrafisz swojego "pomysłu na program" czyli algorytmu przełożyć na kod źródłowy C/C++? Pokaż co do tej pory zrobiłeś. Wiele osób od razu siada przed klawiaturą i próbuje pisać swoje programy. Warto jednak (sam się o tym przekonałem) czasami rozpocząć od stworzenia algorytmu programu czyli swoistego przepisu według, którego program ma działać. Taki algorytm można, a nawet trzeba sobie rozpisać, a najlepiej rozrysować. Widząc swój algorytm będziesz w stanie go przeanalizować i zoptymalizować. Kolejny krok to zapisanie swojego algorytmu w języku programowania.
  11. W monitorze portu szeregowego zaznacz opcję "Bez zakończenia linii" - napisz czy pomogło, a jeśli tak to zastanów się czym jest to "zakończenie linii"?
  12. Może pokaż swój program, który stwarza problemy. Tak naprawdę w danej chwili to w zasadzie tylko jedno polecenie (instrukcję) może realizować mikrokontroler. Ty możesz jedynie ustalić kolejność wykonywania poszczególnych instrukcji programu i starać się "sterować czasem" jaki poświęca na np. obsługę wyświetlacza, sterowanie przyciskiem czy też silnikiem. Jaki wyświetlacz, jaki silnik i jak nim sterujesz? Napisz coś więcej i pokaż program wtedy forumowicze z pewnością pomogą.
  13. Dzięki za wskazówki. Daleki jestem od "testowania kompilatora". Chodziło mi najzwyczajniej o jakby nie było ponad 100 bajtów oszczędności bez wnikania w gąszcz opcji konfiguracyjnych kompilatora.
  14. Nie, kompiluję z domyślnymi ustawieniami świeżo zainstalowanego IDE 1.8.11 Gdzie w Arduino IDE mogę włączyć (wyłączyć) optymalizację, o której piszesz?
  15. Powiem jak Ferdek -" jak nie ma jak ma": Skompilowany programik z 3 wywołaniami delay(): Szkic używa 2990 bajtów (9%) pamięci programu. Maksimum to 32256 bajtów. I to samo kiedy zamieniam delay() na _delay_ms() Szkic używa 2828 bajtów (8%) pamięci programu. Maksimum to 32256 bajtów. Ja tu widzę różnicę 162 bajtów, a to już trochę jest.
  16. Wiadomo, że wszelkie blokujące delay-e to nie najlepszy wybór. Eksperymentując okazuje się, że programując Arduino Uno w dedykowanym IDE możemy oprócz standardowego delay() użyć _delay_ms(). Różnica jest od razu widoczna w wielkości kodu wynikowego. Kod z _delay_ms() jest wyraźnie mniejszy. Wiem, że to różne funkcje i zastanawiam się dlaczego we wszystkich źródłach dot. programowania w Arduino IDE preferuje się delay(), które generuje bardziej obszerny kod wynikowy. Pytanie więc do doświadczonych kolegów kiedy (a kiedy nie) możemy użyć _delay_ms()?
  17. Może omomierzem. Przy sprawnym tranzystorze + na bazę i - na emiter omomierz pokaże przewodzenie dla tranzystora NPN, a dla PNP odwrotnie. Z pewnością warto zajrzeć do noty katalogowej tranzystora.
  18. A po co ten kąt obrotu chciałbyś mierzyć? Żeby "coś" wprowadzić w ruch to nie musisz przecież niczego mierzyć lecz jedynie włączyć silnik, a całe sterowanie to włącz - wyłącz ewentualnie szybciej - wolniej.
  19. No to musisz poczekać na zwolnienie przycisku lub/i nie zliczać jeśli przycisk nie został zwolniony (jest zakleszczony - ciągle wciśnięty). Opóźnienie delay(1000) tego nie wykrywa.
  20. Przyjrzyj się jeszcze raz. Ta funkcja przyjmuje nie dwie lecz jedną zmienną typu uint8_t o nazwie data_to_write. W sieci znalazłem datasheet tego układu - powinieneś się z nim zapoznać (zobacz). Na stronie 22 opisany jest przykład "4-Bit Transfer Example". Po lekturze będziesz wiedział czym są piny D4-D7, RW, i E. Co do << , &=, a także |, ~ to operacje na bitach Bitwise Operators, o których mówi chociażby Arduino Reference - (zobacz). Z pewnością domyślasz się, że _delay_ms(1) to funkcja generująca opóźnienie 1ms. Spróbuj poczytać o tym, a z pewnością sam opiszesz słownie ten obrazek. Pierwsze zdanie może brzmieć: "Na rysunku przedstawiono definicję funkcji void LCD_just_write(uint8_t). Funkcja nie zwraca wyniku, a jako argument przyjmuje 8 bitową liczbę bez znaku...." itd. Może też pomóc Ci to. To bardzo popularny sterownik, który w Arduino obsługiwany jest za pomocą ( np. tej biblioteki ). Układ ten szeroko jest opisany w wielu źródłach np. tutaj No ale bez znajomości operacji bitowych to nie uda ci się tego opisać i zrozumieć. Tak z ciekawości to jakie to studia i przedmiot?
  21. Błąd pewnie tkwi w programie więc pokaż cały program. Wtedy z pewnością znajdzie się ktoś kto będzie mógł pomóc.
  22. A próbowałeś troszeczkę poczytać o sieciach? Sprawdzałeś możliwość połączenia np. za pomocą ping (w obie strony). Jak RPi został przydzielony adres IP przez działający w routerze serwer DHCP to musi działać komunikacja pomiędzy tymi urządzeniami - więc RPi działa w sieci.
  23. C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtt\libraries\Servo\src\avr\Servo.cpp:130:5: error: 'TCNT1' was not declared in this scope TCNT1 = 0; // clear the timer count ^ Przecież wszystko masz napisane w komunikacie. Próbujesz użyć klasy Servo, a ta odwołuje się do nieistniejącego rejestru tu- TCNT1 Moim zdaniem nie możesz tej biblioteki użyć z tym mikrokontrolerem. Zobacz datasheet dla ATtiny13A - tam nie ma Timer1. Tak na marginesie tu znajdziesz wiele projektów korzystających z ATtiny13 - warto zobaczyć.
  24. A czy w ATtiny13A jest taki rejestr TCNT1? Ten mikrokontroler ma tylko jeden licznik TCNT0. Twój program raczej powinien pracować na rejestrach, które w układzie się znajdują.
×
×
  • Utwórz nowe...