Skocz do zawartości

Cała aktywność

Strumień aktualizowany automatycznie     

  1. Wczoraj
  2. Takie rzeczy można zrobić inaczej, ale co kto woli. Jeśli będzie Ci działać to możesz robić jak chcesz. Nikt nie będzie Ci narzucał jak pisać swoje programy. Ważne by działały zgodnie z tym co sobie założyłeś. Dobrej praktyki nabędziesz z czasem. Co do pętli for.. masz poniżej. Mniej więcej widział bym to tak. Kompilator nie zgłasza żadnego błędu więc stylistycznie raczej jest ok. void cosTam() { unsigned long oldTime1; unsigned long newTime1; byte zmienna1 = 0; byte liczbaDiod = 7; for (int i = 0; i < liczbaDiod; i = i) { newTime = millis(); if (newTime1 - oldTime1 >= 1000) { oldTime = newTime; zmienna1++; i++; } switch (zmienna) { case 1: break; case 2: break; } byte zmienna2 = 0; long wartosc = digitalRead(A0); byte czas; czas = map(wartosc, 0, 1023, 0, 10); do { newTime = millis(); if (newTime1 - oldTime1 >= 1000) { oldTime = newTime; zmienna2++; } } while (zmienna2 < czas); switch (zmienna) { case 3: break; case 4: break; } } } Nie wiem tylko jak zadziała fragment: for (int i = 0; i < liczbaDiod; i = i) ponieważ jak pisałem wyżej, kompilator nie zgłasza błędu w tym przypadku, ale to nie jest prawidłowe sformułowanie warunku for. Prawidłowe wygląda tak: for (int i = 0; i < liczbaDiod; i++) Ale ta prawidłowa pętla for wykona się w mgnieniu oka a ja chciałem dodać możliwość zwiększania wartości zmiennej "i" co 1sek, więc do zmiennej "i" wpisuję wartość "i" a samą zmienną "i" zwiększam w warunku co sekundę. Jeszcze raz na koniec napiszę. Cały mój kod niekoniecznie musi działać a wręcz prawdopodobnie nie będzie działał prawidłowo bo pisanie kodu bez sprawdzania to nie pisanie. Trzeba co jakiś czas kod przetestować. W teorii działa jak trzeba bo kompilator nie zgłasza problemów a jak zgłasza to piszę tak by nie zgłaszał. Ale bez załadowania tego do procesora i bez sprawdzenia jak działa dany fragment na tzw żywym organizmie czyli w projekcie docelowym, lub chociaż w złożonym na jakieś płytce prototypowej to nie pisanie kodu. Ja zawsze robię tak że myślę nad układem, projektuję taki układ w EasyEda, często wprowadzam do takiego układu poprawki przez nawet kilka tygodni (chyba że coś chcę mieć bardzo szybko). Jeżeli uznam że układ jest gotowy to myślę nad tym jak ma działać. Co ma się znaleźć w pętli głównej, co najczęściej się powtarza i gdzie z pętli mam się odwoływać. Program dzielę na funkcje i testuję fragment po fragmencie, nigdy całość. Jeśli każdy fragment z osobna będzie mi działał prawidłowo to całość też zadziała jak trzeba. Mała podpowiedź, jeżeli coś ma się wykonać wiele razy po zadziałaniu jakiegoś czynnika to trzeba takie coś zamknąć w jakiejś pętli.
  3. Napisałem tak, ponieważ przycisk naciskam tylko na chwilę, więc warunek (2)=LOW szybko przestanie być prawdziwy i wystarczy na rozświetlenie jednej diody. Gdy zapiszę to jako stan przycisku, to będzie on trzymany aż do końca sekwencji rozświetlania. Gdy "zmiennaP1" osiągnie maksymalną wartość, czyli przejdą wszystkie kroki, to wtedy zeruję wartość przycisku. if(zmiennaP1 < iloscKrokow) //jeśli zmienna mniejsza niż zakładana ilość krooków to { zmiennaP1++; //można zwiększyć wartość zmiennej - }else { zmiennaP1 = 0; //jeśli "zmienna" zwiększy swoją wartość powyżej ilości kroków to wyzeruj + Wyzeruj zapamiętany stan przycisku stanPrzycisku1=0;
  4. Pierwsza sprawa to niewykorzystanych case w środku nie piszesz bo nie musisz jeśli nic nie robią, najzwyczajniej je pomijasz. Druga sprawa to owszem, żeby to wszystko miało ręce i nogi czyli było zrobione jak przysłowiowa książka pisze to faktycznie, należało by użyć pięciu czujników jak wyżej opisał kolega szymonw, chociaż nie do końca tak musi być bo wyobraź sobie sytuację że wchodzisz od którejś strony na schody czyli aktywujesz któryś czujnik to raczej nie wrócisz a pójdziesz do końca schodów tak więc wedle tej teorii powinieneś aktywować ten drugi czujnik. Więc można zastosować tylko dwie bariery podczerwieni plus czujnik zmierzchu. Druga sprawa, po co w ten sposób robisz sobie pod górkę ? if(digitalRead(2)==LOW) //jeśli wciśnięty przycisk 1 to {stanPrzycisku1=1; } if(stanPrzycisku1==1){ newTime = millis(); //do zmiennej newTime wpisujesz czas z millis if (newTime - oldTime >= 300) Napisz od razu: if(digitalRead(2)==LOW) //jeśli wciśnięty przycisk 1 to {newTime = millis(); //do zmiennej newTime wpisujesz czas z millis if (newTime - oldTime >= 300) Nie są Ci potrzebne linie z poleceniami stanPrzycisku = 1; oraz if (stanPrzycisku == 1). Jeżeli potrzebny Ci dalej ten stanPrzycisku = 1; to wpisz to sobie zaraz po wejściu do warunku if (digitalRead(2) == LOW) Teraz żeby nie było za łatwo to nie podam Ci wszystkiego na tacy bo się niczego nie nauczysz. Podpowiem że aby ustawić czas pomiędzy świeceniem a rozpoczęciem wygaszania to robisz sobie dwa switche. w poniższy sposób: void cosTam() { byte zmienna = 0; unsigned long oldTime; unsigned long newTime; long czas = 0; newTime = millis(); if (newTime - oldTime >= 1000) { oldTime = newTime; zmienna++; } switch (zmienna) { case 1: //włączasz led1 break; case 2: //włączasz led2 break; case 3: //włączasz led3 itd break; } byte zmienna2 = 0; do //cała ta pętla wstrzyma Ci cały program póki nie zostanie spełniony warunek za wyrażeniem while { //ale wstrzymuje inteligentnie i tylko raz po uruchomieniu czujki long zmiennaOdczytana = digitalRead(A0); //odczytujesz wartość z portu A0 czas = map(zmiennaOdczytana, 0, 1023, 0, 10); //zamienia zmienną z przedziału od 0 do 1023 na zmienną od 0 do 10 (sekund) newTime = millis(); if (newTime - oldTime >= 1000) //znowu odliczasz sobie 1sek { oldTime = newTime; zmienna2++; //co 1sek zwiększasz wartość zmiennej 2 } } while (zmienna2 < czas); //a pętla trwa póki zmienna2 nie osiągnie wartości zmapowanej zmiennej czas switch (zmienna) { case 4: //wyłączasz led1 break; case 5: //wyłączasz led2 break; case 6: //wyłaczasz led3 break; } } Tak naprawdę jest to tylko i wyłącznie przykład z racji iż cały ten fragment kodu jest napisany w pewien sposób źle. Nie bierze pod uwagę żadnego zerowania zmiennych, sprawdzania czasów itp. Jest to tylko przykład pokazania jak można stosować switch...case. Nad pętlą for pomyślę innym razem. Mówiłem że to co piszę jest tylko przykładem. Nie będzie działać poprawnie ponieważ zadziała tylko raz. Jeśli będziesz trzymał przycisk cały czas to będą rozświetlać się kolejne diody. Pomyśl dlaczego ?
  5. Proszę o podpowiedź co zepsułem, że teraz po naciśnięciu przycisku 1 (lub 2) rozświetla mi się tylko pierwsza dioda. Żeby zapaliła się kolejna, to muszę kolejny raz nacisnąć przycisk. Chciałem w funkcji loop umieścić tylko wejścia do dwóch funkcji- rozświetlania od dołu lub od góry, ale same funkcje odpowiedzialne za rozświetlanie umieścić już poza funkcją loop. void loop() { if(digitalRead(2)==LOW) { stanPrzycisku1=1; rozswietlZdolu(); } if(digitalRead(3)==LOW) {stanPrzycisku2=1; rozswietlZgory(); } } void rozswietlZdolu(){ if(stanPrzycisku1==1){ newTime = millis(); if (newTime - oldTime >= 300) { oldTime = newTime; Serial.print("nowy czas "); Serial.println(oldTime); if(zmiennaP1 < iloscKrokow) { zmiennaP1++; Serial.print("zmienna P1 "); Serial.println(zmiennaP1); }else { zmiennaP1 = 0; stanPrzycisku1=0; } switch (zmiennaP1) { case 1: digitalWrite(led1, HIGH); break; case 2: digitalWrite(led2, HIGH); break; case 3: digitalWrite(led3, HIGH); break; case 4: digitalWrite(led4, HIGH); break; case 5: digitalWrite(led5, HIGH); break; case 6: digitalWrite(led6, HIGH); break; case 7: digitalWrite(led7, HIGH); break; case 8: break; case 9: break; case 10: break; case 11: digitalWrite(led1, LOW); break; case 12: digitalWrite(led2, LOW); break; case 13: digitalWrite(led3, LOW); break; case 14: digitalWrite(led4, LOW); break; case 15: digitalWrite(led5, LOW); break; case 16: digitalWrite(led6, LOW); break; case 17: digitalWrite(led7, LOW); break; } } } } Myślę, że gdzieś coś z "klamerkami" popsułem.
  6. 1,96zł ale to za samą diodę, a nie za całą barierę która podawałaby odpowiedni sygnał po wykryciu przerwania wiązki, a tak jak wspomniałem, raczej nie poradziłbym sobie ze zrobieniem odpowiedniego generatora.
  7. @szymonw O tym, żeby sprawdzać wejście na schody przy pomocy dwóch czujek podczerwieni też myślałem. Wiem że jeden PIR może aktywować sekwencję gdy ktoś tylko będzie przechodził obok schodów. Jednak jestem bardzo początkujący i sam bym takiej bariery nie zrobił. Myślałem o barierach z bram, ale takie nawet najtańsze kosztują ok 40zł, a tu potrzebne byłyby 4, więc robi się już dodatkowe 160zł. Poza tym, projekt jest tylko dla mnie, bardziej w celu nauki programowania, więc nie musi być idealny.
  8. Tam, gdzie byś się spodziewał, a nawet dwa, w bonusie.
  9. @matrix0606 Dzięki za oświecenie z tą pętlą for. Rzeczywiście trochę by się tu nie sprawdziła, bo w czasie jej wykonywania ktoś może wejść na schody i tego program nie wykryje, jeśli będzie w pętli. Z ciekawości i dla nauki, prosiłbym jednak o napisanie fragmentu kodu który rozświetlałby diody w pętli for. Druga prośba i pytanie. Napisałem kod jak poniżej. Żeby było mi trochę łatwiej to na początku dla sterowania przyciskami a nie PIR-ami. Zrobiłem dla dwóch przycisków, w środku "kejsów" są trzy które nic nie robią- czyli po rozświetleniu jeszcze np. 3 s świecą wszystkie (u mnie okresy są 300UL bo narazie robię na symulatorze Tinkercad). Pytanie, czy mógłbym teraz jakoś regulować czas podtrzymania świecenia wszystkich schodów za pomocą np. potencjometru? Teraz, żeby zmienić czas tego podtrzymania, muszę zmienić ilość i akcje we wszystkich "kejsach" np. dodać kolejne dwa puste, żeby przedłużyć podtrzymanie o 2s. Jeśli można to jakoś zmienić tak, żebym mógł zmieniać ten czas np. potencjometrem, to poproszę o pomoc i napisanie takiego fragmentu kodu. #define led1 4 #define led2 5 #define led3 6 #define led4 7 #define led5 8 #define led6 9 #define led7 10 unsigned long oldTime=0; //zmienna starego czasu unsigned long newTime=0; byte iloscKrokow = 17; // il. diod x 2 bo zapalanie i gaszenie + podtrzymanie np 3 okresy nic nie robią- podtrzymanie. 7 diod=>2x7+3=17 byte zmiennaP1 = 0; //zmienna dla przycisku 1 byte zmiennaP2 = 0; // zmienna dla przycisku 2 byte stanPrzycisku1=0; //0-puszczony, 1-wciśnięty byte stanPrzycisku2=0; void setup(){ pinMode(led1,OUTPUT); pinMode(led2,OUTPUT); pinMode(led3,OUTPUT); pinMode(led4,OUTPUT); pinMode(led5,OUTPUT); pinMode(led6,OUTPUT); pinMode(led7,OUTPUT); pinMode(2,INPUT_PULLUP); //przycisk 1 pinMode(3,INPUT_PULLUP); // przycisk 2 Serial.begin(9600); } void loop() { if(digitalRead(2)==LOW) //jeśli wciśnięty przycisk 1 to {stanPrzycisku1=1; } if(stanPrzycisku1==1){ newTime = millis(); //do zmiennej newTime wpisujesz czas z millis if (newTime - oldTime >= 300) //jeśli nowy czas - stary czas jest >= 1000 czyli mniej więcej 1sek to { oldTime = newTime; //stary czas = nowy czas Serial.print("nowy czas "); Serial.println(oldTime); if(zmiennaP1 < iloscKrokow) //jeśli zmienna mniejsza niż ilość kroków to dodaj 1 { zmiennaP1++; // zwiększ wartość zmiennej dla przycisku1 Serial.print("zmienna P1 "); Serial.println(zmiennaP1); //wypisuje w jakim kroku jesteśmy }else { zmiennaP1 = 0; //jeśli "zmienna" zwiększy swoją wartość powyżej ilości ustalonych kroków to wyzeruj jej wartość stanPrzycisku1=0; } switch (zmiennaP1) //dzięki temu że minęla 1sek możemy wybrać co się stanie { case 1: //jeśli minęły 1sek włącz led1 digitalWrite(led1, HIGH); break; case 2: //odliczasz kolejne 1sek i włączasz led2 digitalWrite(led2, HIGH); break; case 3: digitalWrite(led3, HIGH); //itd break; case 4: digitalWrite(led4, HIGH); break; case 5: digitalWrite(led5, HIGH); break; case 6: digitalWrite(led6, HIGH); break; case 7: digitalWrite(led7, HIGH); break; case 8: // puste case-y jako podtrzymanie świecenia break; case 9: break; case 10: break; case 11: digitalWrite(led7, LOW); // gaszenie co sekundę break; case 12: digitalWrite(led6, LOW); break; case 13: digitalWrite(led5, LOW); break; case 14: digitalWrite(led4, LOW); break; case 15: digitalWrite(led3, LOW); break; case 16: digitalWrite(led2, LOW); break; case 17: digitalWrite(led1, LOW); break; } } } if(digitalRead(3)==LOW) //jeśli odczytany stan przycisku 2= 0 to {stanPrzycisku2=1; } if(stanPrzycisku2==1){ newTime = millis(); //do zmiennej newTime wpisujesz czas z millis if (newTime - oldTime >= 300) //jeśli nowy czas - stary czas jest >= 1000 czyli mniej więcej 1sek to { oldTime = newTime; //stary czas = nowy czas Serial.print("nowy czas "); Serial.println(oldTime); if(zmiennaP2 < iloscKrokow) //jeśli zmienna mniejsza niż zakładana ilość kroków to dodaj 1 { zmiennaP2++; Serial.print("zmienna P2 "); Serial.println(zmiennaP2); }else { zmiennaP2 = 0; //jeśli "zmienna" zwiększy swoją wartość powyżej ustalonej ilości kroków to wyzeruj jej wartość stanPrzycisku2=0; } switch (zmiennaP2) //dzięki temu że minęla 1sek możemy wybrać co się stanie { case 1: //jeśli minęła 1 sek włącz led 7 bo tu idziemy od góry digitalWrite(led7, HIGH); break; case 2: digitalWrite(led6, HIGH); break; case 3: digitalWrite(led5, HIGH); //itd break; case 4: digitalWrite(led4, HIGH); break; case 5: digitalWrite(led3, HIGH); case 6: digitalWrite(led2, HIGH); break; case 7: digitalWrite(led1, HIGH); break; case 8: break; // puste case-y jako podtrzymanie świecenia wszystkich diod przez 3 okresy case 9: break; case 10: break; case 11: digitalWrite(led7, LOW); // wygaszenie break; case 12: digitalWrite(led6, LOW); break; case 13: digitalWrite(led5, LOW); break; case 14: digitalWrite(led4, LOW); break; case 15: digitalWrite(led3, LOW); break; case 16: digitalWrite(led2, LOW); . break; case 17: digitalWrite(led1, LOW); break; } } } }
  10. Nie chcę niczego sugerować ale takie coś robi się na 5-ciu czujnikach.Zacznijmy od tego ,ze weźmiesz kartkę papieru,ołówek i gumkę do wycierania.Narysuj kreskę poziomą u góry a na końcach dwie małe kreski pionowe.Ten rysunek symbolizuje schody(jak w casino de Paris, schody które nie mogą wyjść z mody...).Z lewej strony narysuj dwa małe kwadraciki i po prawej też dwa małe kwadraciki.To są symbole czujników podczerwieni.Opisz je 1,2,3,4.Proponuję użyć jako czujników ruchu TSOP31233.Są to czujniki wysokiej klasy,które jak spojrzysz do datasheet to dowiesz się,że są odporne na refleksy,zmianę oświetlenia i inne zakłócenia.Czujnik reaguje na podczerwień pulsująca z częstotliwością ok.33khz.Generator kupisz gotowy albo zrobisz.Dlaczego 33khz.Bo jest to typowa częstotliwość używana w prostych zegarach a rezonator lub generator jest powszechnie dostępny.Tych czujników będziesz potrzebował 4 szt.Dwa na dole dwa na górze. Załóżmy,że jesteś na dole i zbliżasz się do schodów wówczas przecinasz strumień podczerwieni płynący do pierwszego czujnika po czym przecinasz drugi strumień podczerwieni idący do drugiego czujnika.Kontroler ma zarejestrować tę sekwencję zdarzeń.Jeśli rozpozna to ma za zadanie włączyć oświetlenie.Teraz idziesz do góry( w środku programu masz bla,bla,bla i diody zapalają się jako sekwencja) i dochodzisz do kolejnych dwóch czujników i sytuacja się powtarza.Ta druga sekwencja wyłącza oświetlenie z pewnym opóźnieniem.Analogicznie jest w odwrotną stronę.Piąty czujnik to fotorezystor wykrywający dzień/noc po to by włączyć/wyłączyć urządzenie.
  11. W pętli for to będzie kiszka bo pętla for zatrzymuje działanie całego programu póki się nie wykona. Wówczas w pętli for to sobie można nawet delay używać. Można oczywiście przerwać działanie pętli for ale wówczas po co to jej działanie rozpoczynać ? Procedura switch wbrew pozorom jest bardzo prosta i przede wszystkim genialna w swoim działaniu. Ja na ten przykład switch kocham, ponieważ diametralnie upraszcza działanie programu i nie zatrzymuje go nawet jeśli w jej przypadku skorzystam z metody poolingu odpytując jakąś funkcję w której switch jest zawarta. Tak wygląda zapalanie i gaszenie co 1sek 5 schodów za pomocą dyrektywy switch. Mogą występować małe błędy bo pisane na sucho bez testów. Jeśli będziesz bardzo chciał to napiszę Ci to i dla pętli for... Za pomocą switch to ja napisałem mini menu dla stacji lutowniczej -> PODGLĄD FILMU <- (jeszcze nie skończone) void cosTam() { byte iloscDiod = 10; byte zmienna = 0; unsigned long oldTime; //jeśli źle działało by ze zmiennymi lokalnymi to trzeba unsigned long newTime; //zadeklarować je jako globalne if (digitalRead(PIR) == 1) { newTime = millis(); if (newTime - oldTime >= 1000) { oldTime = newTime; if (zmienna <= iloscDiod) { zmienna++; } else { zmienna = 0; } switch (zmienna) { case 1: digitalWrite(led1, HIGH); break; case 2: digitalWrite(led2, HIGH); break; case 3: digitalWrite(led3, HIGH); break; case 4: digitalWrite(led4, HIGH); break; case 5: digitalWrite(led5, HIGH); break; case 6: digitalWrite(led5, LOW); break; case 7: digitalWrite(led4, LOW); break; case 8: digitalWrite(led3, LOW); break; case 9: digitalWrite(led2, LOW); break; case 10: digitalWrite(led1, LOW); break; } } } }
  12. Witam, U mnie z kolei nie zgadza sie prad na diodzie IR, przy uzyciu rezystora 330 OM prad wynosi 4,12 mA a nie 13mA tak jak jest w artykule, napiecie na diodzie wynosi 0.8V. Co robie nie tak ?
  13. @Wprost123 Jeśli chodzi o mnie i moje założenia, to są takie że diody powinny działać w dwie strony. Kolega matrix0606 napisał fragment który odpwiada tylko za jeden czujnik. Dla drugiego byłoby analogicznie. Ja próbuję narazie w ten sposób, że po tych np 5 "kejsach" zapalania diod są 3 "kejsy" które nic nie robią- to takie podtrzymanie świecenia. Następnie 5 kolejnych kejsów czyli 9-13 tak samo jak w przykładzie, ale zamiast stanu HIGH daję LOW, żeby wygasić diody po kolei. @matrix0606 Ok dziękuję. Wczoraj nad tym siedziałem, kombinowałem. Udało mi się zrobić rozświetlanie, 3 kejsy które nic nie robią- na podtrzymanie świecenia i potem kolejne na gaszenie. Pytanie, czy zamiast kejsów mógłby Kolega napisać takie rozświetlanie (ze sprawdzaniem czasu czy minęła 1s) ale w pętli for? Wtedy przez analogię, próbowałbym dopisać podtrzymanie i wygaszenie. Myślę, że wtedy może udałoby mi się napisać taki kod, w którym można byłoby regulować potencjometrem zmienną odpowiadającą za czas podtrzymania świecenia.
  14. Że zadam może głupie pytanie.Czy ten program obsługuje komunikację dwukierunkową.To znaczy czy jak schodzę ze schodów to najpierw zapalają się diody te od góry a później jak wchodzę po schodach do góry to zapalają się diody od dołu.Jak to jest u Ciebie w założeniach konstruktorskich?
  15. Dziękuję bardzo @Gieneq za ciepłe słowa! Zainteresowanie wynikło z tego, iż znalazł mnie jeden tuner z USA, konkretnie Clown Shoe Motorsports z Texasu gdzie rynek E36 używanych do motorsportu jest olbrzymi. On używa sprzętu do retransmisji i loggingu samochodów oraz łączenia tych starych ECU z telemetrią działającą na CAN. Obecnie działamy na BMW ale wierzę, że projekt rozwinie się jako development board i więcej samochodów będzie wspieranych gdyż w sumie projekt pod tym względem nie ma żadnych ograniczeń!
  16. SSD ma bardzo podobny pobór mocy, tzw jest mnisza o 1W czyli od 26,28W do 35.04W czyli wg obliczeń 18.39 - 24.53 zł rocznie koło 5zł taniej . No ale dyski SSD są droższe i szybciej się psują do tego główna zaleta tzw. bezgłośna praca nie robi różnicy bo możesz położyć z daleka od miejsca w którym przebywasz.
  17. Takie projekty wyglądają ładnie, ale niestety na sam koniec wszystko się sprowadza do kodu, a ten jest słaby. To co widzimy na filmikach to są pojedyncze przykłady, każdy robiacy tylko ten jeden ruch, tylko film jest zmontowany tak, że wydaje się, że nie wiadomo jaki uniwersalny ten robot. W praktyce będziemy mieć jeden przykład który robi ten płynny chód, ale tylko po prostej i na ślepo, a drugi w którym robot reaguje na czujnik już jest tylko jakieś pokraczne kuśtykanie albo nawet tylko ruszanie głową. Ich pierwszy robot nawet nie miał przykładu na chodzenie, ten ma, bo ktoś napisał dla tego pierwszego dla nich. Robot to niestety trochę więcej niż kilka serw i parę plastikowych części.
  18. @deshipu świetnie to wygląda, gratulacje
  19. @maj0nez witam na forum i zachęcam do stałej aktywności
  20. @sorek genialny projekt! Sam od dłuższego czasu planuję coś wpakować w OBD ale od kiedy naprawiłem instalację gazową i check engine poszedł w zapomnienie jakoś mi się odechciało. Narazie jest przejściówka z BT ale temat leży odłogiem. Podoba mi się że sprzęt wygląda naprawdę profesjonalnie. Na pewno zajrzę do tego jak zabiorę się za swoje dzieło... A pytanko, bo piszesz że sprzedajesz - jakie jest zainteresowanie takim sprzętem?
  21. Wygląda świetnie. Mam nadzieję, że kiedyś nauczę się coś takiego sam zrobić.
  22. Do nauki, czy zabawy fajne, ale psa prawdziwego nic nie zastąpi.
  23. Problem w sumie rozwiązany, w VSCode można też użyć wtyczki PlatformIO do programowania STM na frameworku STM32Cube ale nie ma żadnych plików main trzeba je sobie samemu zrobić.
  1. Załaduj więcej aktywności
×
×
  • Utwórz nowe...