Skocz do zawartości

Tablica liderów


Popularna zawartość

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

  1. 3 punkty
    1. Wprowadzenie Pewnego dnia zapragnąłem stać się właścicielem lampki nocnej RGB, którą mógłbym sterować smartfonem przy wykorzystaniu przeglądarki internetowej. Z możliwością sterowania w przyszłości takimi systemami, jak Domoticz, czy też asystentem takim jak Google Home Mini, czy Alexa Amazon. Nie potrzebuje dużej mocy, aby na przykład móc czytać przy jej świetle literaturę piękną, a raczej preferuję podejście proekologiczne w zużyciu energii. Lampka ma pełnić funkcję głównie dekoracyjną tworząc przyjemny nastrój w pomieszczeniu. Przeglądając ofertę dostępnych na rynku rozwiązań doszedłem do wniosku, że ceny tego typu urządzeń są w moim mniemaniu bardzo wysokie, więc postanowiłem zbudować lampkę własnoręcznie. Moją uwagę przykuł jeden z modeli marki Xiaomi, a mianowicie Mi Bedside Lamp (cena to około 250 pln). Na tym projekcie będę bazował podczas budowy. Całość planuję wykonać z materiałów ekologicznych, oczywiście w miarę moich skromnych możliwości. 1.1. Lampka nocna Mi Bedside Lamp Silver. 1.2. Lampka nocna Mi Bedside Lamp Silver – schemat budowy wewnętrznej. 1.3. Lampka nocna Mi Bedside Lamp Silver – prezentacja wyglądu podświetlenia w różnych kolorach. 2. WS2812 Według producenta WS2812 jest on inteligentnym sterownikiem LED z wbudowanym źródłem światła. Bliższe rzeczywistości jest jednak stwierdzenie, że układ ten składa się zazwyczaj z diody RGB 5050 z wbudowanym w nią sterownikiem WS2811. Należy zaznaczyć, że rozwiązanie to produkowane jest wielu typach obudów. Ogromną zaletą takiego rozwiązania w przeciwieństwie do konwencjonalnych diod RGB jest możliwość szeregowego łączenia i sterowania niemalże dowolną liczbą diod za pomocą pojedynczego przewodu sygnałowego z cyfrowego pinu mikrokontrolera. 2.1. Schemat szeregowego połączenia WS2812. Na rynku dostępne jest wiele wersji WS2812 w różnych obudowach. Dość popularną wersją, która została wykorzystana tym w projekcie jest wersja WS2812B w obudowie 5050. Wersja WS2812 posiada sześć nóżek, natomiast wersja z dopiskiem B tylko cztery. Największą różnicą między modelami bez dopisku B i z dopiskiem jest zabezpieczenie przed odwrotnym podłączeniem zasilania diody dla wersji B, co w przypadku standardowej wersji skutkuje zniszczeniem elementu. 2.2. Pojedyncza dioda WS2812 w wersji obudowy 5050. 2.3. Pojedyncza dioda WS2812B w wersji obudowy 5050. 2.4. Schemat szeregowego łączenia WS2812B. Podczas pracy z WS2812 niezależnie od wersji należy pamiętać, aby: Nie przekraczać napięcia zasilania powyżej 5V, ponieważ uszkodzimy układ. Dodać kondensator elektrolityczny o pojemności od 100µF do 1000µF (na 6.3V lub wyższy) przy zasilaniu pierwszej diody. Dodać rezystor o wartości od 300Ω do 1kΩ pomiędzy mikrokontrolerem, a pierwszym pinem DIN i aby umieść go jak najbliżej diody. W miarę możliwości jak najbardziej skrócić odległość pomiędzy mikrokontrolerem, a pierwszą diodą. Nie podłączać diod przy włączonym zasilaniu. Jeśli nie mamy innego wyboru, to należy zachować kolejność: masa, zasilanie, linia sterująca, a odłączamy w odwrotnej kolejności. Jeżeli diody zasilane są z oddzielnego źródła zasilania, to najpierw należy doprowadzić zasilanie do diod, a następnie do mikrokontrolera. 3. Projekt i narzędzia Główną część lampy stanowi szklany słoik, wewnątrz są warstwy rozpraszające światło w postaci arkusza kalki technicznej i białego papieru. Całość została osadzona w kartonowej podstawie. Całość będzie składała się z: Szklany słoik, najlepiej wypiaskowany aby dobrze rozpraszał światło. Ja użyłem słoika Ikea Dropper, ale nada się każdy inny podobny. Ten, którego użyłem nie jest idealny, ponieważ nie jest w całości wypiaskowany. Kalka techniczna do rozpraszania światła. Pomaga uzyskać lepsze rozproszenie, zwłaszcza gdy piaskowanie nie jest całkowite. Kartka białego papieru A4. Również pomocna przy rozpraszaniu, warto wąski pasek umieścić przy tuż przy diodach. Karton, tektura. Do do budowy podstawy, jeśli nie umiemy sobie takiej podstawy wyrzeźbić na przykład z drewna lub nie mamy drukarki 3D. Klej biurowy, przeźroczysta taśma klejąca. Ładowarka z wyjściem USB 5V 1A+. Taka, jakiej używa się się do ładowania większości smartfonów. Kabel USB – micro USB o długości dostosowanej do własnych potrzeb. W projekcie zastosowałem taki o długość 100 cm. Kondensator elektrolityczny w przedziale od 100µF do 1000µF na 6.3V. W projekcie został użyty 1000µF 6.3V. Rezystor o wartości od 300Ω do 1kΩ. W projekcie został użyty 470Ω ¼W. Gniazdo wejściowe microUSB do zasilania układu. Z racji braku gniazda użyłem moduły TP4056, co daje dodatkową możliwość zastosowania w przyszłości zasilania bateryjnego z ogniw 18650. Koło / pierścień diod WS2812B + moduł ESP8266 (ESP-01 / ESP-01S) + łącznik ESP-01S/ESP-01 RGB LED. W tym konkretnym projekcie zostało użyte koło z 16 diodami. Lutownica lub stacja lutownicza, stop lutowniczy i topnik. Przewody, kilka cm. Cążki do metalu. Śrubokręt, nożyczki, czy inne narzędzia potrzebne do obróbki wybranego materiału. 3.1. Zestaw składający się z WS2812B, ESP-01 i łącznika. 4. Schemat połączeń Jeśli korzystamy z gotowego zestawu, to schemat połączeń jest bardzo prosty. 4.1. Schemat połączeń wszystkich podzespołów. 5. Kod i programowanie #include <adafruit_neopixel.h> #include <esp8266wifi.h> const char* ssid = "<nazwa_sieci_wifi>"; const char* password = "<haslo_do_sieci_wifi>"; Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, 2, NEO_GRB + NEO_KHZ800); WiFiServer server(80); long aniMillis = 0; byte aniFlag = 0; void setup() { Serial.begin(115200); delay(100); strip.begin(); for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 0); strip.show(); } IPAddress ip(192, 168, 0, 100); IPAddress gateway(192, 168, 0, 1); IPAddress subnet(255, 255, 255, 0); WiFi.config(ip, gateway, subnet); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } server.begin(); } void loop() { while (WiFi.status() == WL_CONNECTED) { WiFiClient client = server.available(); if (!client) { return; } while (!client.available()) { delay(10); } String request = client.readStringUntil('\r'); client.flush(); if (request.indexOf("/off") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 0); strip.show(); } } // jasnosc if (request.indexOf("/b0") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setBrightness(30); strip.show(); } } if (request.indexOf("/b1") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setBrightness(128); strip.show(); } } if (request.indexOf("/b2") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setBrightness(255); strip.show(); } } // jasnosc end // kolory // bialy if (request.indexOf("/c0") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 255, 255, 255); strip.show(); } } // zoly if (request.indexOf("/c1") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 255, 255, 0); strip.show(); } } // pomaranczowy if (request.indexOf("/c2") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 255, 127, 0); strip.show(); } } // czerwony if (request.indexOf("/c3") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 255, 0, 0); strip.show(); } } // rozany if (request.indexOf("/c4") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 255, 0, 127); strip.show(); } } // magenta if (request.indexOf("/c5") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 255, 0, 255); strip.show(); } } // fioletowy if (request.indexOf("/c6") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 127, 0, 255); strip.show(); } } // niebieski if (request.indexOf("/c7") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 0, 0, 255); strip.show(); } } // blekitny if (request.indexOf("/c8") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 0, 127, 255); strip.show(); } } // cyjan if (request.indexOf("/c9") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 0, 255, 255); strip.show(); } } // wiosenna zielen if (request.indexOf("/c10") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 0, 255, 127); strip.show(); } } // zielony if (request.indexOf("/c11") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 0, 255, 0); strip.show(); } } // zielen chartreuse if (request.indexOf("/c12") > 0) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, 127, 255, 0); strip.show(); } } // kolory end client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); client.println(""); client.println(""); client.println(""); client.println("<title>Lampka</title>"); client.println("<meta charset="\"utf-8\"">"); client.println("<meta name="\"apple-mobile-web-app-capable\"" content="\"yes\"">"); client.println("<meta name="\"apple-mobile-web-app-status-bar-style\"" content="\"black\"">"); client.println("<meta name="\"robots\"" content="\"none\"">"); client.println("<meta name="\"viewport\"" content="\"width=device-width," initial-scale="1\"">"); client.println("<style>"); client.println("body {background: #313236; text-align: center; padding: 0; margin: 50px 0;}"); client.println("button {border: 0; font: bold 12px Verdana, sans-serif; color: #000000; width: 85px; height: 85px; border-radius: 50%;}"); client.println(".b0 {background: #000000; color: #ffffff;}"); client.println(".b1 {background: #949494;}"); client.println(".b2 {background: #bdbebd;}"); client.println(".b3 {background: #e9e9e9;}"); client.println(".c0 {background: rgb(255, 255, 255); margin-right: 266px;}"); // bialy client.println(".c1 {background: rgb(255, 255, 0);}"); // zolty client.println(".c2 {background: rgb(255, 127, 0);}"); // pomaranczowy client.println(".c3 {background: rgb(255, 0, 0);}"); //czerwony client.println(".c4 {background: rgb(255, 0, 127);}"); // rozany client.println(".c5 {background: rgb(255, 0, 255);}"); // magenta client.println(".c6 {background: rgb(127, 0, 255);}"); // fioletowy client.println(".c7 {background: rgb(0, 0, 255);}"); // niebieski client.println(".c8 {background: rgb(0, 127, 255);}"); // blekitny client.println(".c9 {background: rgb(0, 255, 255);}"); // cyjan client.println(".c10 {background: rgb(0, 255, 127);}"); // wiosenna zielen client.println(".c11 {background: rgb(0, 255, 0);}"); // zielony client.println(".c12 {background: rgb(127, 255, 0);}"); // zielen chartreuse client.println(".mgb4 {margin-bottom: 4px;}"); client.println(".mgb50 {margin-bottom: 50px;}"); client.println("</style>"); client.println(""); client.println(""); client.println("<a href="\"/b0\""><button class="\"b1" mgb50\"="">MIN</button></a>"); client.println("<a href="\"/b1\""><button class="\"b2" mgb50\"="">50%</button></a>"); client.println("<a href="\"/b2\""><button class="\"b3" mgb50\"="">MAX</button></a>"); client.println("<a href="\"/off\""><button class="\"b0" mgb50\"="">OFF</button></a><br>"); client.println("<a href="\"/c0\""><button class="\"c0" mgb4\"=""></button></a><br>"); client.println("<a href="\"/c1\""><button class="\"c1" mgb4\"=""></button></a>"); client.println("<a href="\"/c2\""><button class="\"c2" mgb4\"=""></button></a>"); client.println("<a href="\"/c3\""><button class="\"c3" mgb4\"=""></button></a>"); client.println("<a href="\"/c4\""><button class="\"c4" mgb4\"=""></button></a><br>"); client.println("<a href="\"/c5\""><button class="\"c5" mgb4\"=""></button></a>"); client.println("<a href="\"/c6\""><button class="\"c6" mgb4\"=""></button></a>"); client.println("<a href="\"/c7\""><button class="\"c7" mgb4\"=""></button></a>"); client.println("<a href="\"/c8\""><button class="\"c8" mgb4\"=""></button></a><br>"); client.println("<a href="\"/c9\""><button class="\"c9\""></button></a>"); client.println("<a href="\"/c10\""><button class="\"c10\""></button></a>"); client.println("<a href="\"/c11\""><button class="\"c11\""></button></a>"); client.println("<a href="\"/c12\""><button class="\"c12\""></button></a>"); client.println(""); client.println(""); delay(10); } setup(); } 6. Efekt końcowy Efekt końcowy prezentuje się tak, jak to widać na poniższych zdjęciach. Należy zaznaczyć, że w rzeczywistości podświetlenie jest bardziej jednolite, niż widać to na zdjęciach. Prawdopodobnie ekspozycja podczas robienia zdjęcia byłą zbyt długa, ale ciężko zrobić w inny sposób zdjęcia w nocy bez dobrego sprzętu. Obsługa lampki odbywa się przez interfejs sieciowy pod adresem 192.168.0.100. 6.1. Interfejs sieciowy pod adresem 192.168.0.100. 6.2. Wnętrze podstawy lampy. 6.3. Warstwy rozpraszające światło bez i z koszem. 6.4. Wybrane kolory.
  2. 2 punkty
    Sam przycisk z diodami: NodeMCU (tanie i sprawdzone w tego typu projektach, na pokładzie wifi). Oprogramowanie tego - to raczej podstawy, nic skomplikowanego tam nie ma. Co do aplikacji na skanerach/tabletach - to już zależy od systemu operacyjnego na tych tabletach. Jeśli to RPi albo inny Linux - również nie wymaga to jakiejś tajemnej wiedzy. Jeśli jednak to jakiś iOS, Android czy Windows... no cóż, niech się wypowie ktoś z ową tajemną wiedzą obeznany
  3. 2 punkty
    Ta cewka to spędza mi sen z głowy . To jeden z dwóch tzw. aktuatorów magnetycznych, czyli mówiąc po naszemu takie serwo, w wersji minimalistycznej. Ponieważ gotowe takie cewki kosztują dosyć dużo w specjalistycznych sklepach modelarskich to postanowiłem nawijać sobie sam takie cewki z drutu 0,05mm. Powstało więc do tego celu całe ustrojstwo w postaci nawijarki bo ręcznie nie byłoby to zbyt proste. Pierwsze cewki nawijałem "na oko" i powstawały o zbyt dużej rezystancji (około 240Ω). Musiałem więc kontrolować ilość zwoi, aby celować w określoną rezystancję (docelowo około 60Ω co równa się w przybliżeniu 480 zwojom na mojej rolce). Zasilanie samolotu na bogato , malutki akumulatorek 1s i pojemność około 100-120mAh. Wracając do cewki, zasilając ją sygnałem PWM z mostka H można sterować wychyleniem magnesu 3x1mm z doklejonym ramieniem (widoczne na zdjęciach). To ramie wklejone będzie w usterzenie pionowe i poziome samolotu na ogonie. Na chwilę obecną brak ogona, bo pierwszy został przeze mnie zrecyklingowany gdyż niestety cewki przez swoją rezystancję były za słabe . PS. Podziękowania dla znajomego, który cierpliwie mi drukuje elementy 3D do tej nawijarki (i nie tylko).
  4. 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
  5. 1 punkt
    Wszystko zależało od biblioteki nie mogłem żadnej dopasować a Google nic nie doradziło . Otóż taka dopiero dała rade <MCUFRIEND_kbv.h> ;]
  6. 1 punkt
    Tam od razu do zamknięcia, pochwal się jak ogarnąłeś problem, może ktoś też zechce kupić taki wyświetlacz i też będzie główkował, może ja, może kto inny... @Mrpatryk pisz...
  7. 1 punkt
    Tak, choć mam też trochę pomysłów na urozmaicenie go (na przykład zrobienie klawiatury do tabletu jak na poniższym zdjęciu). Autor niestety nie opublikował jeszcze plików projektu, więc nie jest on ogólnodostępny, ale nie ma w nim raczej nic odkrywczego, powinno dać się go dość łatwo odtworzyć.
  8. 1 punkt
    Ja byłem ostatnio na spotkaniu klawiaturowym i nabyłem płytki pod prostą łamaną klawiaturę. Urzekła mnie właśnie prostota tego projektu. No i teraz kompletuję części i powoli składam.
  9. 1 punkt
    Osobiście nie jestem pewien czy ta moda na identyfikatory jest taka dobra — strasznie dużo się marnuje tak naprawdę na pół dnia zabawy. W tym przypadku mam nadzieję, że przynajmniej niektóre urządzenia po spełnieniu swojego obowiązku na konferencji staną się narzędziami edukacyjnymi. Opracowanie wspólnego projektu w ramach Forbota mogłoby być ciekawym projektem.
  10. 1 punkt
    Zaczęło się od problemów ze zbyt cienką wierzchnią warstwą, która pękała przez to na rogach przy dziurkach od śrubek. Oddalenie dziurek od krawędzi niestety nie wystarczyło, trzeba było zrobić grubszą płytkę (dzięki czemu udało się też trochę zaoszczędzić, bo można wyciąć całość z jednego arkusza), przez co przyciski nie wystawały wystarczająco. Zacząłem kombinować co można z tymi przyciskami zrobić (nawet zrobiłem malutkie płytki PCB do przylutowania pod przyciskami, żeby je trochę podnieść) i w końcu wpadłem na pomysł z nakładkami na przyciski także wyciętymi z tego samego materiału, co obudowa. W testach wyszło to znacznie bardziej naturalne niż osobne przyciski, więc postanowiłem się na tym skupić. Testuję też inne rozwiązania, między innymi wykorzystanie plastikowych nakładek od istniejących konsol (łatwo je kupić, bo sprzedaje się je dla tych, co chcą mieć je w nietypowych kolorach), zobaczymy co wygra na końcu.
  11. 1 punkt
    Protel Schematic.pdf Arduino.zip Akcelerator_Graficznych_LCD_STM32.zip Schemat i soft dla Arduino i STM32 w załączniku. Idea działania jest prosta, akcelerator przyjmuje dane 8-bit o kolorze, położeniu punktu itp co już daje ok dwukrotne przyspieszenie bo np LCD wymaga CMD, 2 bajty X, 2 bajty Y, 2 bajty koloru - razem 7 bajtów. Akcelerator zadowalają 4 bajty (CMD, X 1 bajt, Y 1 bajt, kolor - 1 bajt). Ponadto ma sprzętowe funkcje czyszczenia ekranu, wypełniania obszarów, rysowania linii, stringów a co najważniejsze dane do LCD są wysyłane gdy AVR przyśle wszystko co chce wyświetlić po czym wyda komendę DISPLAY. Wtedy akcelerator wysyła dane do LCD w 31ms z wykorzystaniem DMA. Można więc wysyłać dane długo, po czym w 30ms przesłać do LCD (klasyczne podwójne buforowanie). Poza obsługą LCD (właściwie sterownika) akcelerator ma 4 wyjścia cyfrowe, 4 wejściowe i 1 PWM. Dołączam film, w którym UNO steruje wyświetlaczem. Film.rar Na fotografii zestaw uruchomieniowy. Limity w praktyce nie pozwalają na umieszczenie czegoś większego. Czy to ma sens? Czy warto zrobić taki akcelerator dla większych wyświetlaczy nawet 480x320? Wstępnie wygląda to obiecująco, niestety cena uC to ok 40zł. Aktualizacja: Link do filmu https://es2.000webhostapp.com/Szescian_3D_Akcelerator+UNO_Red-White.mp4 Wysłanie danych o 32k pikseli (128x128 8-bit) do Akceleratora: CLS góra UNO-akcelerator, dół zestaw UNO-LCD bezpośrednio: Porównanie jednej klatki animacji sześcianu w zestawie UNO-LCD (dół) z pracą z akcelerometrem przy czym linie nie są rysowane sprzętowo (muszę zmodyfikować soft dla Arduino): Dla zainteresowanych pliki z analizatora logicznego - niestety, 8.8M Dodam, że akcelerator pracuje na zasadzie bufora (na zakładkę). DMA przyjmuje dane, pętla główna dekoduje komendy. AVR nie musi czekać na wykonanie komendy poza sytuacją, w której chce wydać komendę DISPLAY. W takim przypadku trzeba czekać aż BUSY przyjmie poziom wysoki. W czasie wysyłania danych przez akcelerometr do LCD można wysyłać kolejne komendy ale nie wszystkie. Jeśli będą operować na danych, które jeszcze przez DMA nie zostały wysłane, to pojawią się zakłócenia. Na razie nie ma możliwości odczytu licznika danych wysłanych, jest tylko informacja o zakończeniu wysyłki. W sumie, AVR coś tam jeszcze robi poza wysyłaniem danych o obrazie, więc ma na to co najmniej 30ms, po tym czasie może wysyłać kolejne dane do akceleratora. Zasada działania jest podobna do FT8xx ale nie taka sama. W FT8xx ograniczeniem jest ok 2000 obiektów, tu tego ograniczenia nie ma.
  12. 1 punkt
    Co do ilości elementów, zgodzę się - ale tu tych elementów nie ma nie wiadomo ile - także branie większego Arduino tylko po to aby zastąpić 4051 bo do tego Twój argument się sprowadza? Naprawdę uważasz, że kod będzie dużo bardziej skomplikowany tylko z powodu, że dodatkowo będę sterował 4051 (Twój argument: RAM i prostszy program)? Arduino nie będzie wykonywał nie wiadomo czego aby mu go zabrakło - a napewno nie z powodu sterowania 4051. Ma to co odczyta przekazać po RS485 i tyle + reagować na to co dostanie (włącz/wyłącz poszczególne elementy). Program będzie praktycznie miał 4 linijki więcej aby wysterować bitowo 4051 w pętli i odczytać dane (które odrazu zostaną wysłane do OpenHABa i to on podejmuje decyzje co dalej). Argument o niższej cenie chyba nie w tym przypadku - elementy ze schematu mam, to co proponujesz muszę zakupić, czyli wydać kolejne pieniądze (gdzie widzisz oszczędność?). Mój post zamieściłem aby zweryfikować to co zaprojektowałem. Nie chce się kłócić, także chyba nie ma sensu dalej prowadzić tej dyskusji - bo nie wnosi nic merytorycznego dla mnie. Zadałem merytoryczne pytanie na temat przeciwfazy - niestety nie dostałem odpowiedzi tylko atak dlaczego nie chce zrobić po Twojemu i nie używać 4051.
  13. 1 punkt
    Witam wszystkich mam na imię Mateusz, mam 28 lat. Na stronę Forbot trafiłem przypadkiem (reklama na YT). Zaczynam totalnie od podstaw Pozdrawiam i liczę, że spędzę tutaj dużo czasu
  14. 1 punkt
    Faktycznie ostatnie aktualizacje raspbiana w moim przypadku dużo zmieniły. Początkowo myślałem, że to zasługa nowo zakupionych akcesoriów, ale po zrobieniu kilku testów wyszło mi, że kabel HDMI z potrójnym ekranowaniem może poprawia stabilność połączenia, ale trudno stwierdzić, czy zwiększa prędkość. Markowa karta SD (w której prędkość zapisu nie wiele ustępuje prędkości odczytu) wprawdzie przyśpiesza działanie systemu i streamingu filmów po LANie, ale na samą prędkość WiFi średnio wpływa. Nadal podtrzymuję tezę o zmianie HDMI0 na HDMI1. W moim przypadku jest zauważalna różnica około 5 Mbps. Największy wpływ mają jednak ostatnie aktualizację - obecnie prędkość downloadu mam na poziomie 30Mbps.
  15. 1 punkt
    Nie wiem co to u Ciebie znaczy "odłączenie i ponowne podłączenie" - ja staram się nie dokonywać takich modyfikacji przy pracującym urządzeniu. Może system się resetuje? Serial.println("Reset systemu...:); w setup() może pomóc w diagnostyce.
  16. 1 punkt
    @wn2001 o, pneumatyczny chwytak to chyba rzadko spotykany dodatek do robotów DIY Jak ogólnie oceniasz tego robota od Arduino, fajny?
  17. 1 punkt
    @Belferek Nie wiedziałem, że ten return; nie działa. Teraz już wiem. Nie wiem dlaczego, ale po odłączeniu i ponownym podłączeniu diód wszystko działa.
  18. 1 punkt
    funkcja void loop() nigdy się nie kończy zobacz: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp więc po co ten return; ?
  19. 1 punkt
    To mikro-projekt, ale na pokazy w szkole do robota Braccio dołożyłem chwytak pneumatyczny i klocki drukowane 3D z skrótem nazwy szkoły: Z, S i Ł. Robot je chwyta, podnosi i odkłada
  20. 1 punkt
    W jaki sposób to zmieniasz??? Przecież kodu nie zmienisz dopóki nie skompilujesz i nie wgrasz na nowo poprawionego. Do tego co chcesz osiągnąć służą zupełnie inne mechanizmy (np. EEPROM) i zmienne a nie wtykanie literałów do kodu, bo takie 25 choćbyś je prosił, groził i szantażował - nie stanie się nagle 26.
  21. 1 punkt
    @Itap88 zacznijmy od najważniejszego... Na Arduino UNO nie ma żadnego przycisku, który można wykorzystać we własnych programach. Jest tam ewentualnie tylko RESET... Co dokładnie wykorzystałeś w roli przycisku? Po drugie w Arduino nie można tworzyć warunków tego typu: if((right - 50) < guess < (right + 50)){ Jest wiele sposobów na rozwiązanie tego problemu (np. najprostszy to rozbicie tego na dwa warunki), ale na pewno nie można robić tego tak, jak w cytowanym tutaj fragmencie.
  22. 1 punkt
    Jeszcze nie ma co pokazywać, ale od kilku miesięcy walczę z własną płytką do małych, zdalnie sterowanych samolotów. Na pokładzie jest podwójny mostek H, atmega168 w egzemplarzu prototypowym i tranzystor do sterowania silniczkiem szczotkowym. Sterowanie odbywa się poprzez moduł 2,4GHz NRF24l01 w wersji smd, do tego mam radio również własnoręcznie zbudowane aczkolwiek do tej pory służyło do sterowania pojazdem jeżdżącym. Na jednym ze zdjęć jest nowa wersja płytki z czerwoną soldermaską, na czarnej jest błąd w postaci braku jednej ścieżki, ale na nowej wprowadziłem kilka zmian i dodałem 1 diodę, abym mógł sobie jakieś informacje przekazać migając nią.
  23. 1 punkt
    Wczoraj wgrałem nowego Raspbian Buster obraz z 26 września 2019 i okazało się że problem z wolnym wi-fi tak jakby był o wiele mniejszy wi-fi zwalnia ale nie ma takich momentów że wcale nie działa w sumie teraz już można by pracować na wi-fi
  24. 1 punkt
    Dostępne na rynku oczyszczacze powietrza nie kosztują mało. Sam filtr, który wydaje się najważniejszym elementem kosztuje najczęściej nie więcej niż 1/3 oczyszczacza. Postanowiłem więc zbudować własny oczyszczacz. Oczywiście czas poświęcony na budowę też ma wartość, ale nie traktuje tego jako roboczogodziny a po prostu zabawę . W moim przypadku, koszt całości wyniósł około 300zł. Dla porównania, gotowy oczyszczacz Xiaomi to wydatek około 500zł, jesienią było to minimum ~650zł . Kupiłem filtr Xiaomi z wkładem węglowym, który jest nieco droższy niż zwykły, który montowany w fabrycznych oczyszczaczach. Użyty przeze mnie wentylator posiada według producenta wydajność 150m³/h co jest wartością 2x mniejszą niż fabryczny oczyszczacz. Jest to jednak w zupełności wystarczające. Mechanika Oczyszczacz składa się z filtra powietrza, wentylatora 200mm, łącznika filtra z wentylatorem i sterownika. Łącznik został wydrukowany na drukarce 3D. Wentylator to najtańszy wentylator 200mm jaki znalazłem w sklepie komputerowym. Elektronika Całość bazuje na płytce z ESP32. Na niej znajduje się shield prototypowy Arduino, a do niego są zamontowane kolejne elementy. Używałem głównie gotowych modułów. Starałem się w miarę możliwości nie lutować ich bezpośrednio do PCB tylko umieszczać na listwach kołkowych. Schematu niestety nie mam. Wszystko było lutowane na bieżąco w przypływach weny Planuje jeszcze wyprowadzić drugą szynę I2C i podłączyć do niej drugi barometr który będzie umieszczony w wewnętrznej części filtra. Będę mógł w ten sposób zbadać zależność różnicy ciśnień od obrotów wentylatora. Czujniki Jako czujnik pyłu zastosowałem GP2Y1010AU0F. Kluczem była niska cena. Niestety wymaga on dość dokładnego synchronizowania w czasie załączania diody LED i pomiaru napięcia wyjściowego. Z czym miałem duże problemy o czym napiszę niżej. Dodatkowo, jako że jest to czujnik analogowy, jego wyjście skaluje się względem napięcia zasilania. A tak się składa że o ile ESP32 jest zasilane ze stabilnych 3.3V, to czujnik jest zasilany z szyny 5V. Tutaj występuje wyraźny rozstrzał między zasilaniem z zasilacza (wtedy szyna 5V jest zasilana przez diodę która powoduje spadek napięcia) a zasilaniem przez USB. Staram się to kompensować dodatkowym pomiarem napięcia szyny 5V. Nie jest to idealnie, choć daje dużo. Prawdopodobnie czujnik nie skaluje swojego wyjścia idealnie liniowo z napięciem zasilania, stąd ten problem. Oprócz tego na płytce znajduje się czujnik wilgotności HDC1080 oraz ciśnienia BMP280. Oba mają wbudowane termometry, więc nie potrzeba dodatkowego. Teraz prawdopodobnie użyłbym BME280. Interfejs W sterowniku użyłem wyświetlacza OLED. Wyświetlane są na nim aktualne parametry, takie jak: temperatura, wilgotność, poziom zanieczyszczeń, moc wentylatora i inne. Wyświetlacz jest sterowany za pomocą interfejsu I2C. Obok wyświetlacz znajduje się enkoder. Użyłem gotowego modułu bo akurat nie miałem pod ręką tego typu enkodera z przyciskiem. Można nim regulować moc oczyszczacza oraz przełączać między trybami: "auto" i "manual". Oczywiście jak na 2019 rok przystało, oczyszczaczem można sterować też po WiFi :) Na ESP32 jest uruchomiony webserver. Panel webowy wygląda tak: W kodzie znajdują się funkcje które utrzymują stałą łączność WiFi z routerem. Dane dostępowe do znanych nam WiFi należy umieścić w pliku "wifi_credentials.json" i wgrać wraz z innymi plikami. Niestety hasła należy umieścić w formie tekstowej. Biblioteka micropythona do obsługi WiFi nie obsługuje haseł w wersji zahashowanej (PSK). W przyszłości może dopiszę bardziej ludzką formie wprowadzania haseł Sterowanie wentylatorem Z racji tego że użyłem najtańszego wentylatora o tej średnicy, posiada on tylko 3 pinową wtyczkę. Taki wentylator można sterować jedynie napięciowo. Wymyśliłem więc sposób na regulację PWMem napięcia wyjściowego przetwornicy impulsowej. Polega to na podkradaniu lub wprowadzaniu dodatkowego prądu do wyjściowego dzielnika napięcia. Schemat tego wygląda następująco: Zauważyłem że im mniejsza częstotliwość sygnału PWM, tym bardziej nieliniowa jest zależność Vout=f(PWM). Dlatego częstotliwość PWM została ustawiona na 312kHz. Aproksymacje tej funkcji stworzyłem robiąc pomiary Vout w zależności od danego wypełnienia PWM, a następnie w arkuszu kalkulacyjnym wyznaczyłem współczynniki funkcji liniowej. Współczynniki te są na sztywno zapisane w kodzie. Micropython Zdecydowałem się użyć micropythona ze względu na chęć nauki czegoś nowego. Niestety, jak okazało się w trakcie, posiada on wiele ograniczeń. Największą wadą jest używanie blokującego dostępu do interfejsów komunikacyjnych. Przez co np.: w trakcie odświeżania wyświetlacza nie można dokonywać pomiarów czujnika pyłu czy obsługiwać żądań serwera. Ne można też używać drugiego rdzenia ESP32. Przez co interfejs użytkownika chodzi wyraźnie wolno, i nie wygląda na uruchomiony na czymś tak mocnym Cały kod jest dostępny na GitHubie: https://github.com/Harnas/ESP32_Airpurifier
  25. -1 punktów
    Na siłę próbujesz znaleźć zastosowanie dla układów, które posiadasz zamiast użyć tego co byłoby najlepsze. Nie w kodzie bo tak robią tylko amatorzy a w konfiguracji. Jeśli już koniecznie chcesz mieć każdy termometr na osobnej magistrali to użyj 8 wyprowadzeń mikrokontrolera a nie na siłę wstawiasz miltiplekser bo go akurat masz. Czemu służą Q4 i Q5? Zabezpieczenie przed włączeniem US3 i US4 razem nie wymaga multipleksera, wystarczy podłączyć je w przeciwfazie do dwu portów mikrokontrolera.
Tablica liderów jest ustawiona na Warszawa/GMT+01:00
×
×
  • Utwórz nowe...