Skocz do zawartości

Tablica liderów


Popularna zawartość

Pokazuje zawartość z najwyższą reputacją od 11.09.2019 we wszystkich miejscach

  1. 5 punktów
    Jakiś czas temu zacząłem się zastanawiać, czy da się zrobić kroczącego robota na dwóch serwach. Pooglądałem sobie parę filmików, i wyszło na to że owszem można - ale skręcanie będzie niemożliwe. Ponieważ zawsze uważałem, że niemożliwe to jest włożenie hełmu na lewą stronę (chociaż podobno jeden żołnierz udowodnił że jest to możliwe kiedy wrócił nażłopany z lewizny) - postanowiłem przeanalizować, co w istniejących konstrukcjach mi się nie podoba. No i nie spodobało mi się to, że robot mimo że przestawia sobie wszystkie nogi i tak się ślizga (nawet na trzech serwach nie da się chyba zrobic prawdziwego, precyzyjnego chodu). Postanowiłem więc, że ten "prawdziwy" chód będzie taki trochę z przymrużeniem oka, a ważniejsze jest wrażenie chodu (ech, lata pracy w teatrze lalek) i umiejętność manewrowania. Pierwszy robot powstał w ciągu praktycznie jednej nocy - niestety, trwałość konstrukcji ze spienionego PCW poklejonego czym się dało była znikoma. Co prawda Ciapek stoi mi na biurku i powoli wymieniam wszystkie elementy tak, aby doprowadzić go do stanu pełnej używalności, ale zawsze mam coś ważniejszego do zrobienia... Ostatnio ponieważ kupiłem kilka drobiazgów postanowiłem "pożyczyć" je do mniejszej wersji robota. Serwa były przeznaczone do kolejnej lalki, Arduino Pro Mini zawsze jakieś mi się w szufladzie pałęta, akumulatorek ma zasilać RPi Zero W, odżałowałem tylko parę drobnych elementów elektronicznych, parę śrubek i kilka metrów filamentu. Tak że mam przyjemność przedstawić Pseudopoda - czyli robota który co prawda tak naprawdę nie chodzi, ale skrzętnie ten fakt ukrywa Napęd robota stanowią dwa serwa Feetecha FS0307 - w stosunku do rozmiarów (najmniejsze jakie mi się udało znaleźć) mają całkiem niezły moment i prędkość. Jak widać, ruchoma jest tylko jedna (środkowa) para nóg, przednie i tylne służą jako podpory. Teoretycznie można stworzyć konstrukcję, w której będzie się ślizgać wyłącznie tylna noga podporowa, ale nie bardzo mi się chciało bawić w jakieś skomplikowane mechanizmy - szczególnie, że robot i tak pójdzie do demontażu. Mózg to Arduino Pro Mini, zasilanie - akumulatorek LiPo 980mAh plus przetwornica MT3608. Zmysłem robota jest pojedynczy czujnik TCRT5000L, który całkiem nieźle reaguje z całkiem sporej odległości (rzędu kilku-kilkunastu cm). Algorytm działania jest bardzo prosty: robot ma się szwendać po pokoju, co jakiś czas zmieniając sobie kierunek owego szwendania się a w przypadku napotkania na przeszkodę ma od niej odejść. Kod jest na tyle prosty, że zamieszczam go tu w całości. #include <Servo.h> #define VERT_PIN 10 #define HORIZ_PIN 11 #define INFRA_PIN 6 #define PHOTO_PIN A3 #define VS_ZERO 100 #define VS_MINI 85 #define VS_MAXI 125 #define HS_ZERO 80 #define HS_MINI 40 #define HS_MAXI 120 #define INFRA_STEP 40 Servo vservo, hservo; void setup(void) { pinMode(13, OUTPUT); pinMode(INFRA_PIN, OUTPUT); vservo.attach(VERT_PIN); hservo.attach(HORIZ_PIN); vservo.write(VS_ZERO); hservo.write(HS_ZERO); } enum { STEP_NO=0, STEP_FWD, STEP_BAK, STEP_LEFT, STEP_RIGHT}; uint8_t steptable[2][10]={ {VS_ZERO, VS_ZERO, VS_MINI, VS_MAXI, VS_MAXI, VS_MINI, VS_MAXI, VS_MINI, VS_MINI, VS_MAXI}, {VS_ZERO, VS_ZERO, VS_MAXI, VS_MINI, VS_MINI, VS_MAXI, VS_MAXI, VS_MINI, VS_MINI, VS_MAXI}}; void _step(int8_t lr, int8_t fwbr) { int i; hservo.write(HS_ZERO); delay(100); vservo.write(steptable[lr][2*fwbr]); delay(100); hservo.write(lr?HS_MAXI:HS_MINI); delay(100); #define SPP 7 for (i=1; i<=SPP; i++) { vservo.write(steptable[lr][2*fwbr]+ ((steptable[lr][2*fwbr+1] - steptable[lr][2*fwbr]) * i) / SPP); delay(40); } hservo.write(HS_ZERO); } void step(int8_t fwbr) { static int8_t s=0; _step(s,fwbr); s = !s; } int getPhoto(void) { int a; digitalWrite(INFRA_PIN,1); delay(5); a=analogRead(PHOTO_PIN); digitalWrite(INFRA_PIN,0); delay(5); a -= analogRead(PHOTO_PIN); a = a > INFRA_STEP; digitalWrite(13, a); return a; } bool rdz=0; void loop() { int i,n,m; n=random(8,12); for (i=0;i<n;i++) { if (getPhoto()) { if (!rdz) randomSeed(micros()); rdz=1; break; } step(STEP_FWD); } n=random(4,6); for (i=0;i<n;i++) { getPhoto(); step(STEP_BAK); } n=random(4,8); m=random(2) ? STEP_LEFT:STEP_RIGHT; for (i=0;i<n;i++) { getPhoto(); step(m); } } Tak swoją drogą ciekawe, czy da się zrobić pseudopoda z jednym serwem...
  2. 2 punkty
    Witam, podczas kursu rpi natknąłem na ten sam problem. Wyskakuje Ci ten błąd ponieważ nie jesteś w katalogu gdzie zapisane masz zdjęcia. Wejdź w folder gdzie kamerka zrobiła zdjęcia do time lapsa i tam wpisz: ffmpeg -i image%04d.jpg -r 10 -vcodec libx264 -vf scale=1280:720 timelapse.mp4
  3. 2 punkty
    To źle szukałeś - do RPi masz takie. Wiem, że chcesz oszczędzić, ale policz sobie koszty iluś tam trzypinowych złączy plus jakaś płytka co to trzyma w kupie... naprawdę lepiej kupić coś gotowego (szczególnie jeśli kosztuje niecałe dwa zeta). Przy okazji - do tej wtyczki się całkiem fajnie lutuje bezpośrednio kabelki, tylko trzeba jakieś koszulki (np. termorurki) na piny ponakładać żeby zwarcia nie zrobić. A i podejście z boku może być wygodniejsze. Oprócz tego RPi ma dwa piny +5V (trzeba je połączyć równolegle) i chyba z pięć GND, czyli spokojnie wytrzyma. Oprócz tego oczywiście przewody (nie bawiłbym się w cieńsze niż 1 mm², w ostateczności 0.75mm², można wypruć z kawałka przewodu od lampki nocnej). I to nie tylko od przetwornicy do RPi, od akumulatorów do przetwornicy też (czyli te śmieszne koszyki na dwa akumulatorki z takimi cienkimi chińskimi drucikami możesz odłożyć na półkę albo użyć jako bazy do zmiany przewodów na normalne). Jeśli masz dostęp do drukarki 3D - poszukaj na thingiversie "18650 high current", jest parę fajnych rozwiązań, mi się w tej chwili drukuje coś takiego z PETG - jak skończy to dam znać czy to coś warte.
  4. 2 punkty
    Świetne założenie Ale mam pytanko po pierwsze jak sprawują Ci się pompki wody? Doniczka IoT to jedna z moich ostatnich zajawek (którą robię od ponad pół roku....) , kupiłem identyczne pompki od Chińczyka ale wersja z "amphibious" czyli że da się tam podpiąć rurkę. Niestety zapowietrzają się i są za słabe na zawór przeciwzwrotny. Rozumiem że u Ciebie są one cały czas zanurzone i unikasz jak ognia spadku poziomu wody i zapowietrzenia? Na czym polega hexagonalność tej sklejki?
  5. 1 punkt
    Opis konstrukcji Dość modny ostatnio temat, poruszający jakość powietrza, powstał w celu wykonania pomiarów wpływu kominka w domu na zapylenie. W ten oto sposób powstała stacja pogodowa z prezentacją pomiarów na LCD 2004 z I2C oraz możliwością udostępnienia danych dla Domoticz lub ThingSpeak. Sercem stacji jest układ ESP8266-12F na adapterze ESP Shild. Całość umieszczono na PCB zaprojektowanym w EAGLE. Płytka jest zaprojektowana w sposób umożliwiający szybką wymianę poszczególnych elementów. Może być ona wykorzystywana do programowania ESP z wykorzystaniem złącza PROG (po podpięciu się konwerterem USB-UART), jak również w innych projektach wykorzystujących I2C, wejście analogowe ESP, wejścia cyfrowe. Jako zasilanie wykorzystałem zasilacz 12V 1A, których mam kilkanaście. Dla potrzeb zasilania czujników potrzebujemy zasilania 5V o wydajności prądowej ok 1A. W tym celu wykorzystano przetwornicę impulsową step down - przetwornica DC-DC Mini 360 . Przetwornica, jak i inne elementy jest wymienna (na goldpinach). Takie rozwiązanie wymusiło stosowanie tego samego układu w innych projektach, gdzie miałem dostępne zasilania 24-30VDC). Projekt spodobał się znajomym, więc płytka została od razu wykonana w kilku egzemplarzach na frezarce mojego wykonania. Wygląd PCB od strony druku można zobaczyć na zdjęciach. Realizacja pomiarów: W założeniach miałem mierzyć tylko zawartość pyłów ale w szufladach zalegało jeszcze kilka innych czujników. Stąd też dodatkowe pomiary. Pyły: PM1; PM2,5; PM10 - czujnik PMS5003 Ciśnienie, temperatura, wilgotność - czujnik BME280 Wskaźnik CO2 - czujnik MQ135 Wyniki prezentowane są na LCD oraz przez WiFI korzystając z oprogramowania EasyEsp. Istnieje możliwość konfiguracji oprogramowania w celu przesyłania pomiarów do Domoticz lub ThingSpeak. Oprogramowanie W założeniach miałem napisać własny soft wykorzystując biblioteki dostępne dla Arduino IDE, ale z braku czasu poszedłem na łatwiznę i wykorzystałem EasyEsp. Soft wgrywamy za pomocą oprogramowania Esp8266Flasher - wykorzystujemy połączenie po USB - UART (złącze PROG na PCB). Konfiguracja Proces konfiguracji jest dokonywany z poziomu strony WWW oprogramowania ESPEasy i jest dość intuicyjny. Wszystkie parametry wpisujemy w zakładkach odpowiedzialnych za obsługę sieci, czujników iitp. Oczywiście proces konfiguracji opisany jest dokładnie na stronie projektu ESPEasy. Dla osób nie obeznanych w tej tematyce zamieszczam plik konfiguracyjny mojego projektu wraz z dokumentacją zdjęciową (Konfiguracja ESP). Podsumowanie Na chwilę obecną brak jest obudowy, ale układ powstał jako prototyp i każdy adresat układu ma ją wykonać we własnym zakresie. Sam zrobię to jak skończę inne projekty. Konstrukcja ma sporo wad: 1. Brak kalibracji czujników. 2. Pomiar MQ135 to tylko wskazanie przesunięte o 400 ppm (~poziom CO2 w atmosferze, nie uwzględniam wpływu temperatury i wilgotności). 3. Brak dzielnika napięcia na A0 (ESP ma pomiar 0-1V, MQ135 może dać do 5 V przy 5000 ppm), jednak zakładam, że nie będę miał stężenia ponad 1000ppm w domu. Później przetnę ścieżkę na PCB i dam dzielnik na analogu (co niestety zmniejszy dokładność pomiarów) lub zabezpieczę wejście analogowe diodą zenera. 4. Gotowe oprogramowanie z wieloma wadami, w planach zmiana na własny soft i wysyłanie informacji na Cayenne IOT. Zalety: 1. Prosta modułowa konstrukcja, uniwersalna płytka PCB stosowana przeze mnie w innych projektach. 2. Gotowy soft możliwy do wgrania i konfiguracji dla zupełnych laików. Jeśli ktoś jest zainteresowany dodatkowymi materiałami, to proszę o kontakt PW. W załączniku zamieszczam: 1. EAGLE - schemat w EAGLE 9.1.2 wraz z rysunkiem ścieżek. 2. ESP - oprogramowanie w wykorzystanej wersji. 3. ESP8266Flasher - soft do wgrania oprogramowania. Podczas testów pomiar pyłów miałem na zewnątrz przy mrozach ponad 300 szczytowo i pokrywało się to z lokalną stacją w Połańcu (odchyłka była w granicach 5%). Czujnik PM5003 pracuje u mnie w cyklu 60 sekund pomiary/ 30 minut uśpienie. Żywotność czujnika laserowego to 8000 h. Częstszych pomiarów nie potrzebuję do swoich potrzeb. Czas 60 sekund wystarcza do odpowiedniego wygrzania czujnika i ustabilizowania się pomiarów. Cała stacja pobiera zaraz po starcie ok. 3 W, a po nagrzaniu czujnika MQ135 pobór energii spada do ok. 1,8 W. ESP8266Flasher.zip EAGLE.zip ESP.zip Konfiguracja_ESPEasy.zip
  6. 1 punkt
    A dobrze podłączyłeś linie SDA i SCL? Spróbuj takiego kodu ale uruchom go przed pętlą while. uint8_t value; HAL_I2C_Mem_Write(&i2c, 0x3a, 0x0f, 1, &value, 1, 1000);
  7. 1 punkt
    Co więcej jest darmowy nawet do użytku komercyjnego (bardzo dobra opcja dla startupu): https://www.autodesk.com/campaigns/fusion-360-for-hobbyists: "Fusion 360 is free for startups generating less than $100K per year in total revenue or wholly non-commercial hobbyist users"
  8. 1 punkt
    @MasloMlg witamy na forum! Diody programowalne są naprawdę banalnie prostym tworem. Do użycia potrzeba tylko dowolne Arduino, w zasadzie jaką kolwiek programowalną płytkę. Może to być UNO, Nano itd. Podpinasz zasilanie, linie danych do wybranego, dowolnego pinu. Pobierasz bibliotekę NeoPixel z repozytorium Arduino i w zasadzie to wszystko. W przykładowym programie wybierz liczbę diod jakie masz w pasku i tyle, reszta jest wytłumaczona w przykładach. W kursie Arduino poziom 2 jest przykład z kilkoma diodami programowalnymi, rozwieje to wszelkie wątpliwości. Powodzenia!
  9. 1 punkt
    Wyrazistość obrazu nie zależy od siły podświetlania. Poeksperymentuj z kontrastem. Poszukaj linijki: lcd_cmd(0x80 | 0x2f); //Ustawienie kontrastu i zmień 0x2f na inna wartość, np: lcd_cmd(0x80 | 0x3f); //Ustawienia kontrastu Pozdrawiam, Marek
  10. 1 punkt
    Dzięki wielkie za rady i wskazówki, gdy już coś uda mi się zbudować na pewno wstawię na forum Pozdrawiam!
  11. 1 punkt
    https://forbot.pl/forum/topic/16565-spadek-napiecia-na-pololu-drv8838/ To jest praktycznie ten sam sterownik, tylko w wersji jednokanałowej. Najprawdopodobniej tak. Zresztą co do zasilania - pytałem niedawno o coś podobnego, na razie wątek traktuję jako niedokończony ale coś tam mądrego mi podpowiedzieli: https://forbot.pl/forum/topic/16608-wykorzystanie-przetwornicy-akumulatorow-18650-oraz-bms-do-budowy-pojazdu/
  12. 1 punkt
    Dlaczego DIY? Przecież to można normalnie kupić w sklepie... Właśnie sprawdziłem, w Botlandzie 5.70 PLN
  13. 1 punkt
    @sliskii stałego wyniku nie uzyskasz. Trzeba jeszcze zapytać na czym ma polegać jego stałość. Jeżeli mierzysz 9V i na drugiej pozycji po przecinku coś się zmienia to jest w normie. Miernik warsztatowy służy do tego, żeby zmierzył z grubsza, a Twoja intuicja ma Ci podpowiedzieć czy jest dobrze. Np ostatnio budowałem układ na płytce prototypowej i po każdym dodaniu nowej części wpinałem miernik żeby zobaczyć czy jest ok. W pewnym momencie zamiast 3,1-3,3V miałem coś około 2,7V... Sygnał, że coś jest źle. Ale czy była tam jakaś setna część wolta to nie było istotne. Jeżeli będziesz miał potrzebę mierzyć dokładne wartości z kilkoma miejscami po przecinku, to wtedy możesz rozpocząć przygodę z oscyloskopem, albo profesjonalnymi miernika za grubsze pieniądze A z sondami możesz pokombinować. Może nie będę sugerował cięcia kabli i lutowania goldpinów... Ale możesz przytwierdzić drucik do końcówek, albo zaopatrzyć się w "banany i krokodyle" i złożyć z nich własne gryzące sondy
  14. 1 punkt
    Ja korzystam z Domoticza. Spina mi wszystkie zabawki ze sobą, dodatkowo możesz za pośrednictwem niego (ma apkę na androida) sterować urządzeniami ze sterowaniem przez http.
  15. 1 punkt
  16. 1 punkt
    Oj nie nie , może niejasno się wyraziłem. Rezystory R1 i R2 mogą być dowolne. Jest zależność że wypadkowa rezystancja wyraża się wzorem. Jeżeli pytasz o 3 część kursu to tego nie ma tutaj, jest za to w poprzedniej (2 części). Śródtytuł Połączenie równoległe rezystorów. Masz tam przykład jak użyć wzór. Uzyskasz wypadkową rezystancję gdzie łatwo policzysz spadek napięcia z dzielnika napięcia (masz to w 3 części kursu). Na spokojnie policz, poeksperymentuj. Dobrze jest wyrobić sobie pewną intuicję. Np wyobraź sobie że jeden z rezystorów ma opór zerowy albo nieskończony i co się wtedy dzieje. Jak jest nieskończony to prawie rozwarcie, czyli przestaje mieć wpływ na spadek napięcia. Jak jest zerowy to prawie zwarcie, co wtedy się dzieje? Stawianie sobie takich pytań pomaga
  17. 1 punkt
    @Arkady dziękujemy za miłe słowa. Jest to świetna motywacja do pracy nad kolejnymi kursami i artykułami! Z baterią 9V faktycznie trzeba uważać, co prawda napięcie jakie daje jest idealne do takich eksperymentów ale pojemność nie jest za duża.około 9V na baterii powinno się trochę utrzymać o ile będziesz unikał zwarć. Miernik masz z kursu czy jakiś własny? W tym z kursów, na zakresie 20V powinny być 2 miejsca po przecinku. @Adas Gdybyś obliczył wypadkową rezystancję połączonych równolegle rezystorów to uzyskasz jeden rezystor na którym odłoży się jakieś napięcie. Jest on połączony do tych samych węzłów co wyjściowe 2 rezystory zatem napięcie będzie te same. Możesz więc podejść do tematu, że oba te rezystory wymuszają jakieś napięcie, jeżeli zmienisz rezystancję jednego, to wpływa to na drugi i odwrotnie. To prawda, rezystor ten powoduje zmniejszenie prądu płynącego w obwodzie, odkłada też się na nim napięcie. W tych zadaniach dobrze jest, jeżeli będziesz znał metody upraszczania obwodów składających się z rezystorów. Jeżeli połączysz R1 i R2 to uzyskasz układ nazywany dzielnikiem napięcia, w którym łatwo obliczyć napięcie jakie odłoży się na każdym z rezystorów.
  18. 1 punkt
    Na początek w miarę prostym pomysłem będzie moduł ładowarki pojedynczego ogniwa, możesz je kupić już za kilka zł. Mają złącze USB do lądowania, 2 pady do przylutowania ogniwa litowo-polimerowego i 2 pady do przylutowania obciążenia. Zazwyczaj mają choćby kilka zabezpieczeń i przetwornicę DC-DC gdzie na wyjściu masz 5V niezależnie od stopnia rozładowania akumulatora (oczywiście do pewnych granic). Ładowarki różnią się prądem ładowaia, ale z 500mA powinny mieć. Wtedy ogniwo do 1500mAh powinno być wystarczające. Dobrze by było żeby moduł ten miał zabezpieczenie przed zbyt dużym rozładowaniem - nie musisz się wtedy martwić że za mocno rozładuje się akumulator i nieodwracalnie uszkodzi.
  19. 1 punkt
    E tam - tak to za proste. Zresztą widziałem takie konstrukcje z jeszcze mniejszą ilością serw, mianowicie zero (Strandbeest) Przy założeniu, że serwo to nie silnik tylko siłownik (tak to się chyba powinno nazywać), a pozycja dowolnej nogi jest funkcją wyłącznie położenia orczyka serwa raczej sobie tego nie wyobrażam... bo w przeciwnym razie można dokleić buty do samochodu i powiedzieć że to robot (bo przecież ma tylko jeden silnik, tupie, skręca , a takie drobiazgi jak kierownica to się nie liczą )
  20. 1 punkt
    O ile nie potrzebujesz skręcania to da się i na jednym nawet bez ślizgania: Tylko trzeba serwo przerobić na ruch ciągły (albo dodać jakieś sprzęgło które na przykład nie przenosi ruchu poniżej określonej prędkości)
  21. 1 punkt
    Super artykuł ktory dobrze obrazuje to, jak działają zjawiska związane elektrycznoscia i elektronika. Brakuje mi w pierwszej części wyjaśnienia, dlaczego dodanie źródła o zbyt wysokim napięciu spowoduje uszkodzenie układu skoro odbiornik weźmie tyle prądu ile potrzebuje ?
  22. 1 punkt
    Przerobiłem tą lekcję. Coś się przypomina ze szkoły ale nie jest łatwo. Miałem kłopot z mierzeniem prądu (I) bo wyskakiwało cały czas zero. Winny był bezpiecznik. Teraz mierzy ale mój miernik pokazuje tylko jedno miejsce po przecinku co przy tych przykładach trochę daje małą dokładność. I ta bateryjka, która szybko traci napięcie po jednym dni z 10V spadła na 9V. Jedziemy dalej. Dzięki za kurs!
  23. 1 punkt
    No to ruszyłem z kursem. Wszystko jest ok. Trochę jest odnośników i można w pętlę wpaść ale daję radę. Wszak to pierwsza lekcja
  24. 1 punkt
    Witam Od niedawna wczytuję się w Forum na Forbocie (wcześniej robiłem tylko zakupy) i przez te 5 lat jakoś nie było okazji tu zaglądać. Teraz widzę jak wiele straciłem - kursy programowania Arduino a teraz genialne kursy dla STM i to z biblioteką HAL ... duży szacun Jest już lepiej z polskimi odpowiednikami (i tłumaczeniami prawie dosłownymi) obcojęzycznej literatury, ale taki kurs bez konieczności kupowania drogich i często nietrafionych pozycji jest kopalnią wiedzy dla początkujących w temacie. Arduino, mimo że ma już więcej niż10 lat ciągle jest popularne i budzi zainteresowanie wśród szerokich rzeszy zapaleńców i majsterkowiczów. Gdy robiłem podyplomówkę w ramach akcji (50 + ... tak, to kryteruim to wiek )... to na naszej uczelni nikt z pracowników tejże nawet nie słyszał o projekcie Arduino... a ja wybrałem sobie kontrowersyjny temat "Projekt robota MINISUMO w oparciu o moduł Arduino UNO ". Na szczęście teraz jest już o niebo lepiej. Sami studenci robotyki orientują się w temacie o wiele lepiej od swoich wykładowców Ale do rzeczy... czytając liczne wpisy na Forum zorientowałem się, że spora grupa entuzjastów Arduino wcześniej lub później boryka się z problemem wielozadaniowości. Jakieś 5 lat temu udzielałem się troszkę na forum majsterkowo.pl i tamże popełniłem kilka artykułów mniej lub bardziej przydatnych Chciałbym zainteresować kolegów (i koleżanki oczywiście) zastosowaniem w projektach biblioteki Timers ( nie Timer One ... Timer Tree itp.) Biblioteka Timers jest tak banalnie prosta, że jej autor nawet nie wysilił się na podział jej na pliki *.h i *.cpp, a po prostu umieścił wszystko w pliku nagłówkowym. Przy okazji przypomnę, bo też o tym kiedyś pisałem, jak czytać pliki bibliotek....że w tejże bibliotece i w każdej innej wartościowej...jest także bardzo przydatny pliczek : keywords.txt, dzięki niemu i wpisom w sekcjach KEYWORD1 KEYWORD2 mamy kolorowanie składni przy użyciu zmiennych i funkcji bibliotecznych Biblioteka Timers.zip jest do pobrania i zalokowania w IDE ( bo trudno to nazwać instalacją) w załączniku poniżej. A o to opis najważniejszych funkcji tejże biblioteki: OPIS BIBILOTEKI (skrócony): ---------------------------- Czym biblioteka Timers różni się od biblioteki Timer, TimerOne czy TimerTree? Przede wszystkim prostotą użycia jej w programie. Zasadniczo korzystamy z 4 wygodnych funkcji składowych klasy Timers: 1) Konstruktor - inicjalizacja obiektu klasy Timers. Przykład: Timers <8> akcja; // - Powołujemy do życia obiekt klasy Timers o przykładowej nazwie akcja, który może obsłużyć 8 niezależnych wątków (zdarzeń) 2) Funkcja attach(nr wątku, interfał wywołania, funkcja obsługi), gdzie: - numer wątku, to numer jednego z 8 wcześniej zdefiniowanych w konstruktorze wątków; - interwał - odstęp czasu w ms. W tych odsępach będzie wywoływana funkcja obsługi - funkcja obsługi - nazwa funkcji, jak ma być wykonywana. W tym zakresie funkcja attach jest łudząco podobna do funkcji attachInterrupt. Przykłady: akcja.attach(2,5000,pokazTemp); - co 5 sekund wątek 3 (liczymy od 0) wywołuje funkcję pokazTemp() akcja.attach(0, 1000, pokazCzas); - co 1 sekundę wątek pierwszy wywołuje funkcję pokazCzas() akcja.attach(1,0,flopKierunek); - definiujemy wątek nr 2, ale nie mamy na razie zamiaru z niego korzystać - interwał =0 UWAGA!!! Funkca attach musi być zainicjowana w funkcji setup() dla każdego z wątków. Jeśli nie mamy zamiaru od razu korzystać z danego wątku, to w funkcji attach ustawiamy interwał na 0. 3) Funkcja updateInterval(nr wątku, akt interwał), gdzie: - nr wątku, to numer jednego z 8 wcześniej zdefiniowanych w konstruktorze wątków; - akt interwał - dynamiczna zmiana czasu wywoływania funkcji, w szczególnym przypadku dla interfał=0 wyłączamy obsługę wątku. Przykłady: akcja.updateInterval(2,0); - zatrzymanie obsługi wątku nr 3 akcja.updateInterval(4,189); - zmiana lub ustawienie dla wątku nr 5 czasu wywoływania funkcji obsługi na 189 ms. 4) funkcja process() - wywoływana w pętli loop, uruchamia globalną obsługę wszystkich zadeklarowanych w konstruktorze wątków Przykład: akcja.process(); ...a oto przykładowy program: [/code] #include <Timers.h> // dołączona biblioteka Timers (konieczna do poprawnej pracy ... jest w załączniku) Timers <8> akcja; // na poczatek 8 niezależnych wątków (procesów, zadań, procedur, akcji itp.) int x=1, y=2; // takie zmienne pomocnicze, dla testów; // --- poniżej przykładowe definicje zadań: ------ void zadanie1() { // tutaj obsługa jakieś sekwencji zdarzeń, zapalenie diody, ruch silnika itp } void zadanie2() { // tutaj obsługa jakieś sekwencji zdarzeń dla zadania 2 } void zadanie3() { } void zadanie4() { // analogicznie dla pozostałych zadań } void zadanie5() { } void zadanie6() { } // ------------------------------------------------ void setup() { // Teraz najważniejsze :-) akcja.attach(0, 1000, zadanie1); // Wątek 1: wcześniej zdefiniowana funkcja o nazwie zadanie1, wywoływana co ok 1 sek. akcja.attach(1,0,zadanie2); // anlogicznie dla zadanie2 , ale tutaj na razie nie robimy nic, bo interwał =0;. akcja.attach(2,5000,zadanie3); // zadanie3 wykonuje się co 5 sek. (np. pomiar temperatury) akcja.attach(3,200,zadanie4); // co 200 ms sprawdzamy np stan przycisku akcja.attach(4,189,zadanie5); // a co 189 ms sprawdzamy stan czujnika odległości akcja.attach(5,1211,zadanie6); // a co 1211 ms wysyłamy jakis komunikat na Seriala } void loop() { akcja.process(); // inicjalizacja lub aktualizacja wszystkich procedur(wątków, zdarzeń itp.) if(x==1){akcja.updateInterval(1,300);} // odpalamy akcje dla zadania 2, co 300 ms. if(y!=2) {akcja.updateInterval(4,0);} // zatrzymujemy zadanie 5 } Proszę zauważyć, że w loop nie ma delay.:-) Możemy się zatem skupić na definicji funkcji obsługi zdarzeń, czyli zająć się logiką programu i nie borykać się już więcej z zawieszaniem się obsługi programu. mamy zatem tu namiastkę wielozadaniowości .... nasz minisystem "nasłuchuje" w określonych przez nas odstępach czasu co się wydarzyło i zależnie od sytuacji zajmuje się obsługą zdarzeń. Na co należy uważać? Lepiej aby interwały nie zachodziły na siebie, czyli należy dokładnie przemyśleć i oszacować czasy wykonywania poszczególnych zadań. Nie zalecam użycia w samych funkcjach delay(). Przecież możesz w jednym zadaniu np. uruchomić silnik a w drugim go zatrzymać (zależnie od warunku, który możesz sprawdzać np w zadaniu nr 7 :-). Całkowita dowolność, a jak 8 zadań to za mało to możesz zawsze utworzyć i obsłużyć kolejny obiekt klasy Timers, na przykład taki " Timers <6> akcja2; Jedynym ograniczeniem może być tylko ograniczona pamięć mikrokontrolera Bardziej obszerny przykład zamieściłem 5 lat temu na forum majsterkowo.pl Gorąco zachęcam także do zapoznania się (przejrzeniem źródła Tmers.h)... Leci własnie mecz siatkówki, grają nasze złotka ...więc kończę Pozdrawiam Wojtek Timers.zip
  25. 1 punkt
    Porobiłem kilkanaście testów, z których wynika, że na niską prędkość WiFi składa się kilka rzeczy: 1. W ustawieniach routera miałem na sztywno wybrany kanał 13, tymczasem moje RPi ma najstabilniejszy transfer na kanale 1 mimo tego, że najluźniejszy jest właśnie 13. W ten sposób prędkość uwolniła się z poziomu ułamków do kilku megabitów. 2. Dużym czynnikiem zakłócającym jest stojący obok dekoder TV (WiFi) jeśli był akurat włączony. Po wyłączeniu prędkość doszła do ok. 15 Mbps, ale jest bardzo chwiejna. 3. Poza zmniejszeniem odległości od routera, najlepsze rezultaty przynosi odłączenie kabla HDMI. W takiej sytuacji prędkość wzrasta do 25-35 Mbps. Wydaje mi się, że pewne korzyści, daje również podłączenie telewizora do drugiego portu HDMI. Niestety nie wiem, jak na drugim porcie spowodować, aby działało audio (nie ma również HDMI-CEC)? [edytowane] znalazłem w sieci, może się komuś przyda amixer -q cset numid=3 3 [/edytowane] Zastanawiam się, czy to może mieć jakiś związek z jakością kabla? Zauważyłem przy kablu dedykowanym do RPi adnotację „potrójna warstwa ekranowania w celu izolacji od fal Bluetooth i WiFi”?
  26. 1 punkt
    Witam. U mnie po złożeniu układu diody nie mrugają a świecą na stałe. wszystko sprawdziłem kilka razy i jest złożone poprawnie. Nie wiem gdzie szukać błędu? Dobra ,udało się. Miałem podobną sytuacje jak była opisywana wyżej - zaklejone styki przewodów!!!
  27. 1 punkt
    Pozwolę sobie być innego zdania... ale to Ty jesteś informatykiem (a przynajmniej moderatorem w dziale dla informatyków) a nie ja
  28. 1 punkt
    Pozwólcie, że się wtrącę. W tym wątku idealnie widać różnicę między podejściem Elvisa i Ethanaka o której już kiedyś pisałem. Ethanak mówi, "hej coś jest źle, bardzo źle, zgadnij co to i popraw lub się wytłumacz" , a Elvis, " to konkretnie masz źle, popraw albo się wytłumacz". Ja osobiście wyciągnąłem wiele nauki od obydwu kolegów , ale grubą skórę trza mieć :-D, tym bardziej, że w końcu kiedyś musimy skończyć tą moją stronę www, co Ethanak? Także Wojtek ziomalu, (kiedy Kryry nawiedzisz?), gruba skóra i pióra jak u kaczki to podstawa... Sorry za offtopic;)
  29. 1 punkt
    Cały mój pierwszy post to przecież przykład, dość obszerny i szczegółowy.... jeszcze więcej i na gotowo jest tutaj: https://majsterkowo.pl/forum/viewtopic.php?f=38&t=1974 Co mam jeszcze napisać? Jakiś konkretny przykład na zaliczenie dla kilku leniwych studentów? Nie warto, w swoim życiu miałem już studentów, niby coś tam potrafią niby coś wiedzą... a jak dokładnie zapytać, to okazuje się że C++ to dla nich rozmiar stanika jest Od czasu do czasu zaglądam tu i tam, bo pomimo wieku chcę nadal być na bieżąco z nowinkami. Cóż zaczynałem w 1980 r. i wtedy na uczelni królował ALGOL-60, w domu kupiony w Pewexie ZX-Spectrum i wszechobecny Basic. Ech fajne czasy.... Commodore, Amiga , potem pierwszy 386 z koprocesorem Jakie chce pozostawić wrażenie? Nie zależy mi, sam to oceń, przynajmniej się staram... ps. mam wrażenie, że kolega zbyt poważnie podchodzi do tematu... dla mnie to jest hobby, zabawa i ciekawość świata... nic więcej Pozdrawiam
  30. 1 punkt
    Schemat połączeń poproszę, bo równolegle można połączyć diody na różne sposoby.
  31. 1 punkt
    Mój pierwszy pecet miał zegar 800MHz. Był wtedy odrobinę droższy niż 20 dolców.
  32. 1 punkt
    Mam pytanie jeśli chodzi o wzór na liczenie rezystancji zastępczej równoległej, czy jest on prawidłowy? Przy łączeniu 4 oporników tj, 330om,1000om,10000om oraz 330om wychodzą błędne wyliczenia, znalazłem na internecie wzór, który wygląda inaczej a wyliczenia wychodzą poprawnie. Czy to moje jakieś przeoczenie? Czy wzór dla większej ilości oporników nie zgadza się?
  33. 1 punkt
    Możesz to jakoś przybliżyć, bo nie za bardzo mogę sobie wyobrazić na jakiej zasadzie miałoby to niby działać.
  34. 1 punkt
    A zajrzałeś w ogóle do dokumentacji spidev (nie python-spidev bo ta zakłada, że spidev już znasz)? Owszem ma zwracać ale nie stan pinu. Może jednak spróbuj takiego prostego kodu (możesz w konsoli pythona wpisać z palca): import spidev help(spidev.SpiDev()) Tam będzie co to mode, co to cshigh i jeszcze parę innych wielce przydatnych informacji.
  35. 1 punkt
    To jest wheezy... trzeba było tak od razu. Postaw na czysto system (buster, najnowszy z lipca) i nawet się nie zastanawiaj.
  36. 1 punkt
    Zacznij od: sudo apt-get update Potem odśwież sobie system: sudo apt-get upgrade A na końcu pokaż co powie: dpkg -l | grep libgd
  37. 1 punkt
    Jeśli będzie to tylko jedno przerwanie (np. od drugiego enkodera) wszystko będzie zliczone prawidłowo.
  38. 1 punkt
    Gieneq - nie jestem pewien o co dokładnie chodzi w Twoim zliczaniu / odświeżaniu ale nasuwają mi się 2 konkluzje: 1). Każde wywołanie jakiejkolwiek funkcji, czyli nawet obsługi przerwań, sprzętowych, programowych czy Timerów wiąże się z "zaprzęgnięciem do pracy procesora", który stara się na boku robić coś jeszcze, prawda? Niestety procesor póki co jest jeden, więc na czas obsługi np przerwania robi to, co do niego należy i nie robi niczego w LOOP-ie ! Jeśli procedura obsługi przerwania właśnie zawiera w sobie wiele instrukcji, to procesor musi wykonać sporo więcej taktów (nawet dla procesorów "riskowych"), czyli jednak upływa troszkę czasu, prawda? Wyobraźmy sobie taki oto scenariusz: - w Loop-ie zapuściłeś silnik, który się kręci, powiedzmy 5000 obr/sek. - masz do niego podpięty enkoder i zliczasz impulsy, na przykład przez inkrementację zmiennej licznik...(w pętli loop) , coś w stylu: if(digitalRead(1) ==LOW) licznik ++; - to jeśli wywołasz na boku przerwanie (wykonasz jakieś instrukcje) to silnik będzie się przecież nadal kręcić.... ale już Twoja zmienna w tym czasie nie będzie zwiększać swojej wartości, prawda? czyli ileś tam impulsów przeleci bez echa (i nie pomoże nawet przedrostek volatile) Po powrocie z przerwania licznik będzie się zwiększał. Nie będzie gwarancji, że nic nie uciekło niestety. 2). Wobec powyższego modyfikujesz kod i impulsy z enkodera podpinasz do Pinu INT0 (przerwanie sprzętowe) a w funkcji obsługi zwiększasz wartość zmiennej licznik.... Teoretycznie jest OK, teraz każdy impuls będzie zapisany.... ale czy oby na pewno? Co jeśli w tym czasie będziesz miał podpięte inne przerwania, np . od Timera lub drugi silnik z drugim enkoderem? Nikt nie da Ci gwarancji, że w skutek zajęcia procesora obsługą jednego z 3 przerwań silnik nie wykona maleńkiego obrotu o kąt który zarejestruje enkoder? ...Czyli rodzi nam się kolejny problem - priorytety przerwań, a tutaj bez gruntownego zaznajomienia z architekturą procesora i notą katalogową procka, łącznie z analizą przedstawianych tam wykresów... raczej się nie ujedzie Wcześniej czy później należy bowiem zrozumieć, że mamy oto przed sobą tylko mały procesor 8 bitowy, a marzy nam się na nim wielozadaniowość, z którą nie radzą sobie nawet wypasione 8 rdzeniowe procesory w naszych telefonach, porażka, prawda? Pozdrawiam
  39. 1 punkt
    Przerwania Timera de facto nie są przerwaniami stricte "sprzętowymi". Przerwanie sprzętowe "nasłuchuje" na pinie do niego przypisanym. Jeśli zmieni się stan takiego PINU np. z LOW na HIGH, to wtedy procesor przerywa działanie pętli LOOP i wskakuje do procedury (funkcji) obsługi takiego przerwania. Jak już zrobi swoje, to procesor zdejmuje sobie ze stosu i z odpowiednich rejestrów potrzebne mu informacje ( które sobie wcześniej zapisał), po to aby sprawnie powrócić do LOOP-a. Innymi słowy - jak wcisnąłeś np. przycisk (który jest podpięty do wcześniej przypisanego i skonfigurowanego PINU przerwania INT0 lub INT1), to wykonuje się przerwanie sprzętowe, czyli funkcja, którą sobie napisałeś na tę okoliczność (wciśnięcia przycisku) właśnie. Natomiast przerwanie Timera (właściwie powinno się mówić "od Timera") to po prostu cykliczny skok do podprogramu (funkcji) w ściśle określonych odstępach czasu. Na przykład jeśli skonfigurujesz Timer i powołasz go do żywota w programie, to program np. co 300 ms sam będzie wykonywał przerwanie "od Timera", czyli wykonywał ciąg instrukcji zdefiniowanych w funkcji obsługi tego przerwania właśnie. Nic się w LOOP-ie nie dzieje. A ściślej, to co tam się wyrabia, zostaje tam "zamrożone" na czas obsługi przerwania i potem loop dalej sobie robi co powinien. Jeśli zapuściłeś silnik, zapaliłeś Leda itd., to on nadal się kręci , Led nadal świeci i ani jedno ani drugie nie wie, że w tym czasie co 300ms program cyklicznie wykonuje sobie coś jeszcze Jedyny warunek: - funkcja obsługi przerwania musi wykonywać się maksymalnie szybko, czyli na pewno unikamy w niej delay() i staramy się robić możliwie najmniej, tak aby maksymalnie skrócić ilość instrukcji (cykli procesora). W przytoczonym przykładzie w przerwaniu Timera, sprawdzam co naciśnięto i w instrukcji switch - case i dokonuję wyboru odpowiedniego działania Na szczególna uwagę zasługuje tu sposób w jaki wywołuję funkcję obsługi wciśnięcia klawisz OK: case 5: My.items[poz].ItemAkcja(); // wciśnieto klawisz OK - wywołujemy funkcję przypisaną do akt. pozycji w menu. ... i tutaj trzeba "zerknąć" do definicji klasy MyMenu ... bowiem tam jest zdefiniowany wskaźnik do funkcji, po którą sięga konstruktor definiując element MENU. W ciele biblioteki MyMenu jest zaszyty ten mechanizm przekazywania nazwy funkcji do obsługi określonego elementu menu. Użytkownik nawet nie musi wiedzieć, co się tam dzieje.... ale powinien !... i tutaj zachęcam do zerknięcia do tej biblioteki właśnie Nawiasem mówiąc noszę się z zamiarem napisania osobnego postu na temat bardzo fajnej techniki używania w naszych programach wskaźników do funkcji Przydałby się także jakiś tutorial na temat samego używania class, bo wszyscy to robimy, a tylko niewielu wie o co tu chodzi. W końcu zapis : int x=0; to przecież powołanie do życia obiektu klasy integer, o nazwie x i przypisanie temu obiektowi wartości 0. Prawda ? Pozdrawiam
  40. 1 punkt
    Taki wyjdzie najtaniej (nie używałem), taki jest trochę bardziej skomplikowany (używałem, dość skomplikowana klawiszologia). Do obu można podłączyć bezpośrednio głośnik. Linki do bibliotek i przykładów masz na stronach które podałem.
  41. 1 punkt
    xxd był do podglądu, że wszystko działa - też mam 64bitowy system i xxd śmiga - ja mam go z toolsów z instalacji GITa. Plik binarny tworzysz tym programem w C.
  42. 1 punkt
    no w linku wyżej do exampla "DumpFile" jest wszystko co potrzebne
  43. 1 punkt
    @wojtekizk witam ziomala z Kryr:). Sam z powodzeniem korzystam z biblioteki od stoperów, bardzo ułatwia sprawę "wielozadaniowości;)" Arduino. Wojtku w kursie Arduino również jest odcinek dotyczący tego zagadnienia: https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418 jednakże Twoja biblioteka bardzo upraszcza stosowanie liczników. Tym niemniej polecam ww. odcinek kursu wszystkim początkującym aby zrozumieli samą zasadę tych operacji. Belferek też ma rację co do nazewnictwa, pamiętam, że też się naszukałem "tej" biblioteki, kiedyś, wśród wielu o podobnej lub identycznej nazwie.
  44. 1 punkt
    Oj, jest jest! Tylko że klientów trzeba szukać Samodzielnie może być trochę ciężko, ale jak się podczepisz do jakiejś firemki to może jakieś zlecenie kapnie (klienci z treguły radzą sobie sami, a po jakimś czasie takiego radzenia sobie smędzą "panowie poprawcie bo coś się samo popsuło"). Tylko od razu mówię: kokosów z tego nie ma, na chleb zarobisz ale z masłem to już może być nieciekawie. A i WP trzeba znać bardzo dobrze.
  45. 1 punkt
    Jeśli chodzi o LoRa zawsze po stronie odbiornika możesz sprawdzić RSSI przychodzącego sygnału i nie reagować jeśli jest za słaby
  46. 1 punkt
    Powiem tak boję się. Sami sobie gotujemy ten los. Żadnej frajdy z posiadanego auta, kloc który robi wszystko. Nie umiemy jeździć i tyle dlatego są korki, ale nie ma pomysłów jak szkolić kierowców to zrobią autonomiczne pojazdy. Potem jak to się popsuje wszystko to okaże się że nikt nie umie jeździć i wtedy korki się zrobią. Ba powiem więcej już też nie umiesz chodzić bo tylko leżysz. Szkoda, że większość kierowców nie chce poświęcić czasu i skupić się na jechaniu tylko telefon tablet odsypianie zawalonej nocki. masakra. Oczywiście makieta i autka szacun i to że się komunikują
  47. 1 punkt
    Cześć, jeśli chodzi o konkretne umiejętności to "the must" jest: bardzo dobra znajomość programowania w języku C dobra znajomość budowy sieci komputerowych (nie tylko TCP/IP) dobra znajomość sytemu operacyjnego Linux umiejętność programowania w języku Python (cżęsto używany w narzędziach hakerskich) znajomość framework'ów do testów penetracyjnych i dystrybucji Linux stosowanych do tego celu (np. Kali Linux) Oosbiście uważam, że ten zawód ma sens jedynie gdy jest się wyróżniającym informatykiem i ma się w tym kierunku zainteresowania. Nie jest to zawód dla "średniaków". Pozdrawiam
  48. 1 punkt
    Po prostu informatyka i przy okazji kształcenie się we własnym zakresie w security. Jest masa materiałów w internecie na ten temat np: https://www.youtube.com/channel/UClcE-kVhqyiHCcjYwcpfj9w/videos
  49. 1 punkt
    Praktycznie w każdym sklepie znajdziesz dedykowane płyny do mycia ekranów. Równie dobrze może wykorzystać cokolwiek mokrego, byle zachować umiar i nie zalać sprzętu. Klawiaturę czyszczę regularnie mokrymi chusteczkami do czyszczenia okularów i problemów żadnych to nie generuje
  50. 1 punkt
    W ramach pracy magisterskiej wykonałem dedykowany sterownik do stacji uzdatniania wody, jako alternatywę dla sterowników PLC. Sam temat pracy został zaproponowany przeze mnie dlatego, że lubię robić coś bardziej kreatywnego niż pisanie suchego tekstu. Promotorowi bardzo się to spodobało i nie było żadnego problemu aby przystąpić do tego zagadnienia. Pewnie niektórzy się zastanowią dlaczego akurat stacja uzdatniania wody? W tamtym czasie pracowałem w automatyce przemysłowej i głównie robiliśmy właśnie takie obiekty. Zawsze były one robione na sterownikach PLC, są to drogie zabawki. Pomyślałem, że można zrobić prototyp takiego dedykowanego sterownika do tego rodzaju pracy, a w przyszłości dostosować go do różnych obiektów, gdzie jest różna ilość zaworów, pomp, zbiorników itp, ale zawsze jest ta sama część wspólna czyli sterowanie samym procesem uzdatniania. Sterownik został oparty o procesor Atmega128, a wszystko zostało dopasowane do obudowy na szynę DIN Z104J. Podstawowe cechy to: 32 wejścia cyfrowe 16 wyjść cyfrowych 5 wejść analogowych zegar RTC RS485 zdalny dostęp przez przeglądarkę www Sam procesor ma zbyt małą ilość wyprowadzeń aby obsłużyć wszystkie sygnały sterujące. Aby zwiększyć ilości wejść/wyjść wykorzystałem ekspandery na I2C - PCF8574. Podzieliłem całość na logiczne moduły, podobnie jak to jest w sterownikach PLC: 4 moduły DI - cyfrowe sygnały wejściowe 2 moduły DO - cyfrowe sygnały wyjściowe 1 moduł AI - analogowe sygnały wejściowe moduł RS485 Na wejściach cyfrowych do zabezpieczenia zastosowałem optoizolatory takie jak są wykorzystane np. tutaj TLP281. Na poniższym schemacie przedstawiony jest jeden taki blok. Masy są rozdzielone, co może w prost nie wynika ze schematu. Układ wyjściowy jest zrealizowany w oparciu o UDN2987 Moduł Analogowy został skonstruowany tak aby przyjmować sygnały prądowe 4..20mA. Jest to przemysłowy standard najczęściej wykorzystywany w czujnikach. Cechuje go prostota obsługi i uniwersalność, a fakt, że dolny zakres pomiarowy to 4mA ułatwia to detekcję wadliwego czujnika. W celu pokazania całego procesu uzdatniania wody wykonałem model o wymiarach 100cm x 50cm ukazujący różne etapy pracy takiej stacji, jak: uzdatnianie płukanie zbiorników ze złożem uzdatniającym napowietrzanie zbiorników napełnianie zbiornika retencyjnego chlorowanie układu w celu dezynfekcji dostarczanie uzdatnionej wody do odbiorców Na makiecie umieszczone zostały diody sygnalizujące otwarcie poszczególnych zaworów, co pozwala w łatwy sposób zaobserwować jak zachodzi cały proces pracy takiej stacji. Zamontowane są również potencjometry przy przepływomierzach, są one wpięte w pętle prądową aby zachować zgodność z prawdziwymi czujnikami przepływu. Na tej podstawie można zliczać ile wody zostało uzdatnionej, dobierać interwały pracy i wyznaczać potrzebę płukania filtrów. Całe sterowanie wykonałem w oparciu o web serwer z wykorzystaniem ASP.NET, tworząc taką mini SCADe. Wizualizacja wiernie odzwierciedla cały model. Serwer to aplikacja na system Windows, do którego podpięty jest moduł USB <-> RS485 zapewniający komunikację ze sterownikiem. Mamy podgląd na żywo całego procesu, dane są odświeżane automatycznie na bieżąco. W aplikacji możemy ustawić wszystkie parametry pracy sterownika, podglądać alarmy i włączać na żądanie wybrane etapy takie jak płukanie filtrów czy pobieranie wody ze studni głębinowej. Sam proces uzdatniania wody może nie jest technologicznie skomplikowany, ale jest bardzo ciekawy od strony automatyki. Jako ciekawostkę dodam, że złoże które znajduje się w zbiornikach filtrujących to po prostu odpowiednie kruszywo wiążące konkretne cząsteczki z wody, najczęściej jest to odżelaziacz i odmanganiacz.
Tablica liderów jest ustawiona na Warszawa/GMT+02:00
×
×
  • Utwórz nowe...