Skocz do zawartości

ethanak

Użytkownicy
  • Zawartość

    3040
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    141

Wszystko napisane przez ethanak

  1. Przepraszam, jakoś temat mi umknął. Tutaj masz schemat i opis.
  2. Nie robi, wystarczy zerknąć do dokumentacji. Do ograniczania jest constrain.
  3. Pytanie: nie kopiowałeś przypadkiem kodu przez copy/paste? Windowsowe przeglądarki mają taką dziwną przypadłość wspaniałej współpracy z Wordem i niczym więcej...
  4. No - na ESP32 masz biblioteki do audio, konfigurujesz jak chcesz, łącznie z możliwością wykorzystania wbudowanego DAC-a. Poza tym nawet nie korzystając z bibliotek, jest to dużo prostsze... Ponad 30 lat bawię się w dźwięk na różnych ustrojstwach, pewnie gdyby na C64 byłoby to tak proste jak na STM-ach nie powstałoby nic więcej oprócz "beep"
  5. Tyle że to ma być "machine executable" a nie "human readable".
  6. Przede wszystkim: to że masz certyfikat nie spowoduje, że maile nie będą wpadać do spamu. Certyfikat jest ważny, gdy ktoś wysyła do Ciebie maila, a nie gdy Ty wysyłasz. Skonfiguruj prawidłowo RevDNS, SPF, bez tego maile nawet do spamu nie trafią. Co do kopiowania: zapoznaj się z poleceniem su, lub poczytaj o wszystkich parametrach sudo. Zapoznaj się z programem mc, oszczędzi mnóstwo nerwów. A przede wszystkim zabezpiecz tego postfixa baaaaardzo porządnie, bo bez tego trafisz na wszystkie możliwe blacklisty (a usunięcie z niektórych to koszt kilkudziesięciu euro). Tak przy okazji - na komercyjnych serwerach korzystam z letsencrypta...
  7. A coś w stylu (zakładam użycie Bounce2 żeby nie mylić stanu ze zmianą stanu): czujnik1.update(); czujnik2.update(); czujnik3.update(); switch(pozycja) { case 1: if (czujnik1.rose()) pozycja = 2; break; case 2: if (czujnik1.rose() || czujnik3.rose()) pozycja = 1; // błędna sekwencja else if (czujnik2.rose()) pozycja = 3; // prawidłowa sekwencja break; /* i tak dalej */ Pozycja 1 jest trywialna - po prostu zmiana stanu jest możliwa tylko przy reakcji czujnika 1. Przy pozycji 2: jeśli wystąpiło zdarzenie inne niż reakcja czujnika 1, cofnij pozycję do początku, a jeśli był to czujnik 1, zmień na 3. Jeśli nie było żadnej reakcji czujników nie rób nic.
  8. Tak krótko: Dobrze że wiesz jak sprawdzać zmianę stanu pinu, teraz wywalenie tego do archiwum i zastosowanie Bounce2 (na klawiszu kasowania też) uprości program. A błąd masz w założeniach (wciąż nie jest do końca jasne co się stanie przy błędnej sekwencji). Jak to dokładnie określisz (i umieścisz w programie) błąd powinien zniknąć w magiczny sposób...
  9. Ale to masz dwa różne programy: jeden, który blokuje wykonanie ostatniej czynności, a drugi zliczający wykonania. Oczywiście te "programy" mogą być częścią większej całości (czyli wykonane na jednym mikrokontrolerze), ale ważniejszy jest tu ten program numer jeden (bo on steruje produkcją). Pracujesz na stanowisku "inżynier" więc myśl jak inżynier.
  10. Na razie jest nieźle, jesteś na dobrej drodze. Tyle że pamiętaj: na razie wyjechałeś za bramę, a do autostrady masz jeszcze kawałek Dalej nie określiłeś, co ma się stać,jeśli sekwencja będzie inna, niż 1 2 3 4. Jeśli zakładasz, że zawsze będzie taka - czujniki 1, 2 i 3 są niepotrzebne, wystarczy czujnik 4. Nawet w przypadku, gdy z jakichś przyczyn sekwencja skończy się na 2 czy 3 (jakaś awaria czy co) to i tak do zliczenia sztuki/paczki potrzebny jest tylko czujnik 4. Określ, w jakich warunkach sekwencja może być inna i co masz w takim przypadku zrobić. Bo jeśli wyłącznie zliczać udane operacje to taki jeden czujnik wystarczy. Jeśli jednak chciałbyś zliczać nieudane lub błędne (np. podwójna reakcja któregoś czujnika) program musi przewidzieć wszystkie możliwości.
  11. Zasada numer jeden: żadnych while w programie. Żadnych for również (chyba że naprawdę wiesz co robisz). Porównywać stan możesz jak chcesz, choćby zapamiętując w zmiennej int czy to LOW czy HIGH. Będzie działać, a potem się nauczysz że można prościej. Popatrz sobie na kod Bounce2, zobacz co z tego rozumiesz, jak czegoś nie rozumiesz to pytaj o konkrety. Tydzień to długo, jakieś 15 pytań z odpowiedziami A tak przy okazji - co się ma stać jak wciśniesz 1, 2, 2, 4? Program musi to wiedzieć...
  12. A kurs Arduino na Forbocie już przeszedłeś? Pytam, bo nie wiem jak odpowiedzieć. Jak masz nie spać to podam najprostszy sposób: Sprawdzasz, czy poprzedni stan był puszczony, a bieżący wciśnięty. Jeśli nie, nie robisz nic. Jeśli tak, sprawdzasz czy od ostatniej zmiany stanu nie minęło np. 50 milisekund. Jeśli nie, nie robisz nic. Jeśli tak, zapamiętujesz czas wciśnięcia przycisku i wykonujesz jakąś tam funkcję. Może być czy będziesz ganiał do apteki po pigułki na sen?
  13. Biblioteka Bounce2, sprawdzasz przycisk.fell() albo przycisk.rose() zależnie od tego, jak masz podłączony przycisk. Możesz też użyć biblioteki od klawiatury matrycowej, która zwraca wciśnięcie klawisza. Ewentualnie zaprogramować samodzielnie - czyli zapamiętywać poprzedni stan klawisza i reagować tylko wtedy, jeśli poprzedni stan był "puszczony" a aktualny "wciśnięty". Jak widzisz możliwości jest kilka, osobiście polecam albo samodzielne zaprogramowanie (jeśli dokładnie chcesz się nauczyć jak to działa) albo Bounce2 (jeśli chcesz po prostu zrobić działające urządzenie i nie wnikać w szczegóły typu debouncing). Co wybierasz? Zacznij od tego, bo rozwiązywanie dwóch problemów na raz to niespecjalnie dobry pomysł
  14. Wiesz... płytka stykowa ma z płytką lutowaną mniej więcej tyle wspólnego, co krzesło elektryczne z krzesłem wyściełanym
  15. Mam pytanko (od razu mówię że się nie znam, więc proszę się nie śmiać) - czy C201 jest tam potrzebny? Czy nie będzie przeszkadzać programatorowi?
  16. Oczywiście. Możesz użyć np. dyrektywy #define, coś w rodzaju: #define STAN_CZEKAM 1 #define STAN_COS_ROBIE 2 #define STAN_COS_INNEGO 3 i dalej w kodzie coś w stylu: stan = STAN_CZEKAM; ... switch(stan) { case STAN_CZEKAM: W ten sposób zarówno Ty za pięć lat, jak i ktoś kto widzi kod po raz pierwszy będzie od razu wiedział o co chodzi w kodzie i że dana gałąż switch będzie wykonana w stanie oczekiwania. Wygodniejszym sposobem jest użycie enum, czyli: enum { STAN_CZEKAM = 1, STAN_COS_ROBIE, STAN_COS_INNEGO }; W ten sposób w ogóle nie zajmujesz się drobiazgami typu "który stan odpowiada jakiej liczbie" bo w rzeczywistości nikogo to nie interesuje, a enum automatycznie przydzieli kolejne wartości kolejnym stanom. Oczywiście to najprostszy sposób zastosowania enum, można stworzyć np. nowy typ i zmienne tego typu, np.: typedef enum { STAN_CZEKAM = 1, STAN_COS_ROBIE, STAN_COS_INNEGO } stany; // tworzymy nowy typ "stany" do przechowywania stanów maszyny stany stan; // i zmienną "stan" przed chwilą utworzonego typu Temat dość obszerny - wpisz w google "typ wyliczeniowy" i poczytaj na ten temat trochę więcej jeśli chcesz. A, to zwracam honor, cóż - starość nie radość i oczy już nie te... chyba mi się dwie linijki ze sobą połączyły
  17. @leh1992Wszystko fajnie. Pytanie: czy za pół roku jak spojrzysz w ten kod, będziesz pamiętał co znaczy stan numer dwa? A tak przy okazji: jeśli zmienna czas jest typu int, co ma niby oznaczać czas+0.01; Jak myślisz - jeśli zmienna czas ma wartość x to jaką będzie miała po dodaniu 0.01?
  18. Nikt tu nie robi jaj, a jeśli żartujemy to akurat nie z kolegi wątkotwórcy. Forum jest po to aby pomagać, a informacja "się nie da" jest wybitnie pomocna, bo ktoś pytający o rozwiązanie nie będzie tracił czasu na poszukiwania świętego Graala u ciotki w piwnicy. A to, że czasem podchodzimy z uśmiechem do problemu? Poważnie to się w trumnie wygląda; a czasem takie porównania szybciej przemawiają do pytającego niż argumenty o datasheetach, wybranych aspektach konstrukcji AVR-ów czy ogólnie o Wielkiej Trudnej Informatyce... Przemyśl to zanim znów zaczniesz stawiać zarzuty komuś, kto robi dokładnie to samo co Ty, ale nie w ten Jedyny Słuszny Sposób zgodny z Twoimi Poglądami.
  19. Ja już swoje argumenty wyczerpałem. Wczoraj mi się przysiadł do stolika jakiś płaskoziemca, na szczęście w barze nie ma ppf-ów i można go było wysłać niedelikatnie na drzewo (obraził się i powiedział że więcej nie przyjdzie, trzymam za słowo). W każdym razie naprawianie świata należy zacząć od zrozumienia, jak ten świat działa. Bez tego można sobie gdybać, teoretyzować, twierdzić że znasz genialny sposób na to żeby świat był piękny (czyt.: taki jaki chcesz), a potem przylezie jakiś ethanak i powie, że ziemia jest okrągła i masz wypadać bo barman więcej piwa nie poda...
  20. Bo nie wszystko zrobisz na ekspanderze/multiplekserze. Czytałeś to co napisałem wcześniej? Które piny mają zostać tam gdzie są (bo fizycznie nie ma możliwości "przepięcia" ich w inne miejsce) a którymi można się bawić? Jak sobie wyobrażasz np. działanie funkcji odbierającej jakąś szeregową transmisję, jeśli pin z którego chce czytać jest podpięty akurat do czegoś innego? @atMegaTona: przede wszystkim polecam korzystanie z rozwiązań, które (oj, masło maślane mi wychodzi) rozwiązują problem. Przy bibliotekach korzystających z SPI w większości przypadków można podać, że nie używa się pinu CS tylko macha się nim ręcznie - no i machać. A nawet jeśli biblioteka takiej możliwości nie ma - można ją dorobić w bardzo prosty sposób (po prostu zakomentować wszystkie linie w kodzie odnoszące się do tego pinu, nawet jeśli się nie bardzo rozumie co one robią). A przede wszystkim polecam dobieranie komponentów już na etapie wstępnego projektowania. Jeśli Arduino Uno (w domyśle: ATmega328) ma za mało pinów, zastosuję Arduino Mega (w domyśle: ATmega 2560) albo coś podobnego, być może ESP32, być może jakiegoś STM-a... Bardzo ładne marzenie, ale z gatunku tych nierealnych. Oczywiście możesz sobie napisać własne funkcje typu pinMode czy digitalCośtam, i wszystkie biblioteki które ich używają zaczną w automagiczny sposób używać Twoich funkcji - tylko zastanów się czy to będzie działać. Pamiętaj, że przełączenie stanu ekspandera nie jest natychmiastowe ale trwa duuuuuuuużo dłużej niż "stockowy" digitalRead. Pamiętaj, że aby przełączyć ekspander musisz uruchomić transmisję I2C, a nie zawsze można to zrobić (np. w przerwaniu). Poza tym w pewnych przypadkach (jak choćby wspomniany I2C) piny są niejako odłączane od właściwego portu i podłączane do zupełnie innego urządzenia (to oczywiście bardzo duże przybliżenie, ale możesz przyjąć że tak to działa) i w takiej sytuacji nikt inny tego pinu już nie użyje. Poczytaj sobie trochę na forum o ludziach, którzy użyli pinu 0 jako wejścia w jakimś prostym programie a potem byli bardzo zdziwieni, że albo nie działa transmisja serial, albo wejście...
  21. Spójrz na podłączone urządzenia: Czytnik RFID (czyli co najmniej sekunda odczytu z SPI) Czytnik kart (czyli drugie tyle - minimum pół kilobajta przeczytane przez SPI, to też nie mikrosekunda) Wyświetlacz (tu może być mniej ciekawie, bo z reguły potrzebuje jeszcze jednego pinu D/C, ale i tak pchasz tam jakiś ciąg bajtów, a z tych trzech pinów co zostają da się wykroić czwarty) Rozumiem że jakiś ułamek milisekundy w tych przypadkach ma jakiekolwiek znaczenie? Czy odczytanie kodu z RFID w czasie 1234 msec a 1232 msec to takie ważne?
  22. Z całym szacunkiem - przy I2C jest potrzebne zero dodatkowych pinów
  23. Akurat linie CS w SPI możesz podłączyć przez ekspander (chociaż trochę z tym zabawy), ekspander do I2c, i masz trzy piny wolne. Tak przy okazji: pin != port.
  24. Co nie zmienia faktu, że jeśli kontroler (np. atmega wlutowana w arduino) wymaga fizycznego podłączenia odpowiednich drutów do odpowiednich pinów, załatwisz to sobie jakimś ekspanderem. Chyba że wiesz coś więcej ode mnie... dawaj przykład, też chcę!
×
×
  • Utwórz nowe...