Forseti 11 Kwiecień 2, 2021 Udostępnij Kwiecień 2, 2021 (edytowany) Dnia 2.04.2021 o 07:24, Gieneq napisał: @Forseti super, fajnie że robisz zadania samemu, ale mam radę nie używaj zmiennych a,b,c,d,e itp. bo jest to bardzo niejasny zapis. Czy o to chodziło? #define trigPin 12 #define echoPin 11 void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); //Trig jako wyjście - pomiar odległości pinMode(echoPin, INPUT); //ECHO jako wejście - odczyt zmierzonej odległości pinMode(2, OUTPUT); //Wyjście na LED zielona 1 pinMode(3, OUTPUT); //Wyjście na LED zielona 2 pinMode(4, OUTPUT); //Wyjście na LED czerwona 1 pinMode(5, OUTPUT); //Wyjście na LED czerwona 2 } void loop() { zakres(10, 15, 20, 25, 30 ); //Włącz LEDY jeśli odległość 10,15,20,30 - poniżej 10 migaj 2x LED czerwony delay(100); } int zmierzOdleglosc(){ long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas/58; return dystans; } void zakres(int od_10cm, int od_15cm, int od_20cm, int od_25cm, int od_30cm) { int jakDaleko = zmierzOdleglosc(); if ((jakDaleko >od_30cm) ){ digitalWrite(3,LOW); //Odpal LED zielona 1 }else{ digitalWrite(3,HIGH);//Wyłączamy LED zielona 1 gdy obiekt poza zakresem } if ((jakDaleko >od_25cm) ){ digitalWrite(2,LOW); //Odpal LED zielona 2 }else{ digitalWrite(2,HIGH); //Wyłącz LED zielona 2 } if ((jakDaleko >od_20cm) ){ digitalWrite(4,LOW); //Odpal LED czerwona 1 }else{ digitalWrite(4,HIGH); //Wyłącz LED czerwona 1 } if ((jakDaleko >od_15cm)){ digitalWrite(5,LOW); //Odpal LED czerwona 2 }else{ digitalWrite(5,HIGH); //Wyłącz LED czerwona 2 } if ((jakDaleko <od_10cm)){ digitalWrite(4,LOW); digitalWrite(3,LOW); digitalWrite(2,LOW); digitalWrite(5,HIGH); //Miganie LED czerwona 2 digitalWrite(4,HIGH); //Miganie LED czerwona 1 delay(100); digitalWrite(5,LOW); //Miganie LED czerwona 2 digitalWrite(4,LOW); //Miganie LED czerwona 1 delay(100); } } Pracuję teraz nad rozbudową kombinacji o przycisk startowy (ON/OFF). Chcę podpiąć go tak aby to on włączał program. Czyli: Podłączenie Arduino UNO do zasilania - Przycisk w pozycji OFF nic się nie dzieje Przycisk w pozycji ON - uruchamia się program. Przycisk w pozycji OFF - wyłącza się program Mam pewne wątpliwości co do podpięcia. Czy przycisk powinien być wpięty jako separator zasilania całości czy samo Arduino to określi - Przełącznik połączony z całością tylko za pomocą GND ? Męczę się z kodem ale nic nie wychodzi. Nie wiem jak zaprogramować ten układ aby działał tak jak opisałem wyżej :/. Jakaś sugestia, w którą stronę iść? Nie poddaję się ! Taką mam wizję. Edytowano Kwiecień 3, 2021 przez Forseti Dodany schemat Cytuj Link to post Share on other sites
Gieneq 1 794 Kwiecień 5, 2021 Udostępnij Kwiecień 5, 2021 @Forseti Możesz zrobić to na dwa sposoby: albo jak piszesz odłączyć zasilanie - Arduino po podłączenia zasilania zresetuje program i zacznie od nowa. albo zrobić to w programie. Pierwsza opcja nie wymaga raczej komentarza. Druga opcja jest bardziej rozwojowa, bo możesz zmienić funkcjonalność. W pętli loop() tworzysz maszynę stanów (if lub swtch-case), a przyciskiem ustawiasz jakąś zmienną. Poczytaj mój wpis o zatrzasku i złóż z tego całość 1 Cytuj Link to post Share on other sites
Forseti 11 Kwiecień 5, 2021 Udostępnij Kwiecień 5, 2021 (edytowany) @Gieneq Dziękuję bardzo za odpowiedź i link do super poradnika - korzystam i dokształcam się. Ale odnośnie zagadnienia chyba nie do końca się zrozumieliśmy. Próbuję się nauczyć jak wykonać mechaniczne przełączenie pomiędzy programami. Chcę zbudować robota, który będzie miał min. dwie funkcje, które będzie można przełączać za pomocą np. przełącznika suwakowego 3- wyjściowego. Zasilanie główne robota ma swoje oddzielne wyłączenie. Zatem po podaniu napięcia na układ (wyłącznik główny) żaden z programów nie startuje dopóki nie wybiorę odpowiedniej pozycji na przełączniku (PIN wyzwalający pracę programu). Na szybko machnąłem "schemat" o co mi chodzi: Chciałbym aby odczyt stanu na PINie (wywołany przełącznikiem) był nadrzędny nad pętlą pracy danego programu. Chcę mieć możliwość przełączania jego pracy w trakcie. Prześledziłem kurs 1 oraz Twoje porady (zabieram się z wolna za kurs 2) i nadal czuję, że jestem w lesie ze swoją wiedzą. Mam problem z zaimplementowaniem "pollingu" do kodu. Popraw mnie proszę ale wydaje mi się, że do mojej aplikacji najrozsądniej będzie korzystać właśnie z tej metody przerwania programu (zamiast zerwania- ograniczenie tylko do 2 PINów). Sam pooling w prostych kodach idzie mi całkiem sprawnie ale nie wiem jak to przełożyć na bardziej zaawansowany kod. Dopóki nie opanuję tego na etapie prostych LEDów to nie ma po co iść dalej :/. Nie mniej walczę Edytowano Kwiecień 5, 2021 przez Forseti Cytuj Link to post Share on other sites
Gieneq 1 794 Kwiecień 6, 2021 Udostępnij Kwiecień 6, 2021 (edytowany) @Forseti Czyli masz przycisk z 3 pozycjami - ma pewnie 4 wyprowadzenia w tym jedno wspólne. 3 z nich dajesz do Arduino, jedno np do masy. Wejścia Arduino ustawiasz z PULL-UP. Sprzęt gotowy. W kodzie traktujesz ten 3 pozycyjny przełącznik jak 3 osobne przyciski, które nigdy nie będą włączone w tym samym momencie. Do obsługi możesz podejść na przynajmniej 3 sposoby: typowy polling - 3 warunki w stylu jeżeli przycisk A (pozycja przełączonika) wciśnięty to część 1 itd. przerwania - 3 zewnętrznych przerwań nie masz, masz tylko 2 - ale nawet na 2 zrobisz co chcesz, bo 3 stan będzie domniemany na podstawie 2 poprzednich. Ja bym jednak radził Ci najpierw zrobić ładny polling, a później przerwania, żeby sie czegoś więcej nauczyć. programowe przerwania - to co opisałem w poradniku. Sprawdzasz co było na przycisku kiedyś i co jest teraz i z tego wyznaczasz typ przejścia - włączony/wyłączony. W tym przypadku potrzebujesz dodatkowe zmienne określające stan przycisku. Pisze tu przycisk bo to niczym się nie różni od dźwigienki. Uznaj dźwigienkę za 3 przyciski, które wyglądają tak jakby ktoś caly czas trzymał jeden z nich. Wtedy przyłożenie kodu z kursu na twoje zadanie będzie prostsze. Edytowano Kwiecień 6, 2021 przez Gieneq 1 Cytuj Link to post Share on other sites
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Forseti 11 Kwiecień 8, 2021 Udostępnij Kwiecień 8, 2021 Dziękuję za wskazówki. Udało się za pomocą opcji 1 - poolingu. Działa to bardzo dobrze. Wstawiam kod: //Program symulujący pracę dwóch programów przełączanych za pomocą przełącznika ON/OFF/ON lub suwakowego. Nie dotyczy przycisków typu microswitch #define LED_1 8 //Symbolizuje Program 1 #define LED_2 9 //Symbolizuje Program 1 #define LED_3 10 //Symbolizuje Program 2 #define LED_4 11 //Symbolizuje Program 2 #define Przycisk_1 2 #define Przycisk_2 3 #define Przycisk_3 4 void setup() { pinMode(LED_1, OUTPUT); //Wyjście na LED 1 pinMode(LED_2, OUTPUT); //Wyjście na LED 2 pinMode(LED_3, OUTPUT); //Wyjście na LED 3 pinMode(LED_4, OUTPUT); //Wyjście na LED 4 pinMode(Przycisk_1, INPUT_PULLUP); //Wejście przycisku 1 w trybie PULLUP pinMode(Przycisk_2, INPUT_PULLUP); //Wejście przycisku 2 w trybie PULLUP pinMode(Przycisk_3, INPUT_PULLUP); //Wejście przycisku 3 w trybie PULLUP digitalWrite(LED_1, LOW); //Stan diody LED1 - wyłączona digitalWrite(LED_2, LOW); //Stan diody LED2 - wyłączona digitalWrite(LED_3, LOW); //Stan diody LED1 - wyłączona digitalWrite(LED_4, LOW); //Stan diody LED2 - wyłączona } void loop() { if (digitalRead(Przycisk_1)==LOW) {//Jeśli przycisk 1 jest włączony - Program 1 miganie ledów 1,2 na przemian digitalWrite(LED_1, HIGH); //Stan diody LED1 - włączona delay(100); digitalWrite(LED_2, HIGH); //Stan diody LED2 - włączona delay(100); digitalWrite(LED_1, LOW); //Stan diody LED1 - wyłączona delay(100); digitalWrite(LED_2, LOW); //Stan diody LED2 - wyłączona delay(100); }else if(digitalRead(Przycisk_2)==LOW){ //Jeśli przycisk 2 jest włączony - Program 2 miganie ledów 3,4 jednocześnie digitalWrite(LED_3, HIGH); //Stan diody LED3 - włączona digitalWrite(LED_4, HIGH); //Stan diody LED4 - włączona delay(100); digitalWrite(LED_3, LOW); //Stan diody LED3 - wyłączona digitalWrite(LED_4, LOW); //Stan diody LED4 - wyłączona delay(100); }else if(digitalRead(Przycisk_3)==LOW){//Tutaj wszystko off - LEDY dla efektu w linię digitalWrite(LED_1, HIGH); //Stan diody LED1 - włączona delay(100); digitalWrite(LED_2, HIGH); //Stan diody LED2 - włączona delay(100); digitalWrite(LED_1, LOW); //Stan diody LED1 - wyłączona delay(100); digitalWrite(LED_2, LOW); //Stan diody LED2 - wyłączona delay(100); digitalWrite(LED_3, HIGH); //Stan diody LED1 - włączona delay(100); digitalWrite(LED_4, HIGH); //Stan diody LED2 - włączona delay(100); digitalWrite(LED_3, LOW); //Stan diody LED1 - wyłączona delay(100); digitalWrite(LED_4, LOW); //Stan diody LED2 - wyłączona delay(100); } else{ }} Teraz próbuję powyższe zaimplementować do kodu bardziej zaawansowanego - z czujnikiem HC-SR04 jako jednym z programów ale póki co idzie czerstwo Cytuj Link to post Share on other sites
Vuko 6 Maj 2, 2021 Udostępnij Maj 2, 2021 Witam, Zmienne "czas" oraz "dystans" zostały zadeklarowane jako "long" podczas gdy funkcja "zmierzOdleglosc" zwraca dystans jako "int". Czy mamy tu do czynienia z rzutowaniem? Kiedy konkretnie należy stosować polecenie ".toInt"? Czy tylko w przypadku komunikacji przez UART? Z góry dzięki za odpowiedź. Cytuj Link to post Share on other sites
Gieneq 1 794 Maj 4, 2021 Udostępnij Maj 4, 2021 (edytowany) @Vuko dobre pytania, zacznę od najprostszego: Dnia 2.05.2021 o 23:47, Vuko napisał: Kiedy konkretnie należy stosować polecenie ".toInt"? funkcja toInt konwertuje ciąg znaków na liczbę int - odbierasz po UARTcie znaki* i wrzucasz to do funkcji dostajesz typ całkowity long. Pierwsze pytanie jest trudniejsze. Jesteśmy w obrębie liczb całkowitych i najważniejsze aby nie wyjść poza zakres. Czy to long, int, czy unsigned long - grunt żeby nie przekroczyć zakresu, chyba że interesują nas różnice, wtedy zakresy nie mają tak dużego znaczenia; ale to inny temat... Zacznijmy od tego jak reprezentowane są te zmienne. Patrzymy na tabelkę dla Arduino UNO: Int ma 16 bity, long 32 bity. Możesz to sprawdzić operatorem sizeof() na typie danych: size_t rozmiar_long_w_bajtach = sizeof(long); size_t rozmiar_int_w_bajtach = sizeof(int); I tu ciekawostka, nie wszędzie tak jest. Np. mikrokontroler STM32L4 ma 4 B (32 b) dla int i long. Druga sprawa funkcja pulseIn - zwraca unsigned long. Więc czas powinien mieć taki typ, nie jest to wielki błąd, bo czas jest zwracany w microsekundach (10^-6s) więc przepełnienie longa nastąpi po 35 godzinach Wracając do UNO, czyli jak z inta robimy long to jest ok, a w drugą stronę już niekoniecznie Czy zrzutujesz, czy przypiszesz, jeżeli przekroczysz zakres to wartość zmiennej się "przekręci", tu masz przykład: int zmienna1_int = 32767; Serial.println(zmienna1_int); long zmienna1_long = zmienna1_int; Serial.println(zmienna1_long); Serial.println("inkremetuje..."); zmienna1_int += 1; zmienna1_long += 1; Serial.println(zmienna1_int); Serial.println(zmienna1_long); Serial.println("rzutuje..."); int jakbylong = zmienna1_long; int jakbylong2 = (int)(zmienna1_long); Serial.println(zmienna1_int); Serial.println(zmienna1_long); Serial.println(jakbylong); Serial.println(jakbylong2); Wynik: 32767 32767 inkremetuje... -32768 32768 rzutuje... -32768 32768 -32768 -32768 Wystarczyło dorzucić 1 i już jesteśmy na ujemnym biegunie zmiennej Więc jeżeli poczekasz ponad 35 godzin to faktycznie typ long zepsuje wynik funkcji pulseIn. A co z tym intem w returnie? Sprawdzamy po jakim czasie zwróci głupoty. Tu już gorzej, ale nie będzie problemów - masz tam dzielenie przez stałą, wiec mnożymy i wychodzi 1,9 sekundy. Mało ale ten pomiar tyle nie trwa i nie zepsuje nic. Zgodnie ze sztuką wewnątrz funkcji powinniśmy operować na unsigned long i taki też typ powinna mieć cała funkcja, ale dozwolony jest ten int, zwłaszcza gdy poza funkcją interesuje cię nie long ale int. Też w ramach ciekawostki możesz sprawdzić dokumentację delay'a jaki ma typ argumentów Edytowano Maj 4, 2021 przez Gieneq Cytuj Link to post Share on other sites
Vuko 6 Maj 4, 2021 Udostępnij Maj 4, 2021 @Gieneq dzięki wielkie za szczegółowe wyjaśnienie. Sprawa jasna! Rozumiem, że 1 impuls musiałby trwać te 35h w przypadku pulseIn aby 'przekrecic' wynik? Sprawdziłem typ zmiennej dla parametru w funkcji delay: unsigned long. Czyli wychodzi mi na to że gdybym z jakiegoś powodu chciał użyć tej funkcji dłużej niż 49dni 16h i 48min musiałbym ją powtórzyć? Pytanie czysto teoretyczne oczywiście Pozdrawiam Cytuj Link to post Share on other sites
Gieneq 1 794 Maj 4, 2021 Udostępnij Maj 4, 2021 (edytowany) 20 minut temu, Vuko napisał: Rozumiem, że 1 impuls musiałby trwać te 35h w przypadku pulseIn aby 'przekrecic' wynik? Tak, ale sama funkcja zwraca typ unsigned long, czyli jeżeli zostawić funkcję włączoną ponad 71 godzin to nastąpi w niej przepełnienie. A w przykładzie zrzutowanie wyniku z unsigned long na long skraca ten czas właśnie do tych około 35 godzin. 20 minut temu, Vuko napisał: Sprawdziłem typ zmiennej dla parametru w funkcji delay: unsigned long. Tak zgadza się I właśnie z tym powtarzaniem jest pewien trik. Jak spojrzysz do wnętrza delaya: void delay( unsigned long ms ) { if (ms == 0) { return; } uint32_t start = micros(); while (ms > 0) { yield(); while (ms > 0 && (micros() - start) >= 1000) { ms--; start += 1000; } } } To widać jakieś zliczanie i odejmowanie. Jest to prosty sposób na mierzenie interwałów - jakiś okresów czasu. I wiesz że to jest odporne na przepełnienia? Przykład: int zmienna1_int = 32767; int zmienna1_int2 = 32767; zmienna1_int2 += 1; int zmienna1_int3 = zmienna1_int2 - zmienna1_int; Zmienna "zmienna1_int2" po zwiększeniu będzie mieć wartość -32768, a wynik operacji odejmowania to: -32768 - 32767 = ... 1 Można wyobrazić sobie że liczby w takim zapisie są na okręgu, tak jak tu dla 3 bitów: jak do 3 dodasz 1 to trafisz na -4, wtedy operacja -4 - 3 da w wyniku odległość pomiędzy nimi czyli 1. Niestety choć wygląda to pięknie, to gdy przepełnisz zmienną kilka razy to już stracisz tę informację. Więc jakbyś robil coś co ma długo zliczać, to trzeba pomyśleć jak realne jest przepełnienie i jak sobie z tym poradzić. Edytowano Maj 4, 2021 przez Gieneq 1 Cytuj Link to post Share on other sites
Vuko 6 Maj 4, 2021 Udostępnij Maj 4, 2021 @Gieneq Dzięki za kolejną porcję wyjaśnień. Wniosek z tego taki, że trzeba uważać na przepełnienia i mieć świadomość kiedy mogą nastąpić. Pozdrawiam! Cytuj Link to post Share on other sites
Krawi92 68 Lipiec 9, 2021 Udostępnij Lipiec 9, 2021 Zadanko 9.1 Funkcja pulsowania LED wlacza sie, kiedy wcisniemy jeden lub drugi przycisk. void setup () { pinMode(3,OUTPUT); // Wyjscie PWM pin3 pinMode(6,INPUT_PULLUP); // przycisk nr 1 pinMode(7,INPUT_PULLUP); // przycisk nr 2 } void loop () { if (digitalRead(6) == LOW) { // jesli wcisniemy nr 1 miganie (); // wywolujemy funkcje migania } if (digitalRead(7) == LOW) { // jesli wcisniemy nr 2 miganie (); // wywolujemy funkcje migania } } void miganie () { for (int i = 0; i<5; i++) { // Pętla, która zapętla całość 5x for (int i=0; i<255; i++) { // Zwiekszanie wypelnienia od 0 do 255 analogWrite(3, i); delay(1); //przerwa } for (int o=255; o>0; o--) { //Zmniejszanie wypelnienia od 255 do 0 analogWrite(3, o); delay(1); // przerwa digitalWrite(3,LOW); // Stan niski na PWM. Ponieważ po zakonczeniu migania } // dioda lekko się swieci. } } Cytuj Link to post Share on other sites
Gieneq 1 794 Lipiec 10, 2021 Udostępnij Lipiec 10, 2021 @Krawi92 to naprawdę działa? for (int i = 0; i<5; i++) { // Pętla, która zapętla całość 5x for (int i=0; i<255; i++) { // Zwiekszanie wypelnienia od 0 do 255 Też polecam używać wcięć i autoformatu, żeby widać zagnieżdżenia pętli Cytuj Link to post Share on other sites
Krawi92 68 Lipiec 10, 2021 Udostępnij Lipiec 10, 2021 A co w tym kodzie nie tak, że miałaby nie działać? Wciskam przycisk nr 1 i Led pulsuje 5x. Wciskając nr 2 i to samo. Cytuj Link to post Share on other sites
Krawi92 68 Lipiec 10, 2021 Udostępnij Lipiec 10, 2021 (edytowany) Poprawiłem jeden operator i teraz po zakonczeniu petli dioda jest zupelnie zgaszona. Przeanalizowalem na serial monitorze jak zmienia sie wypelnienie i po zakonczeniu petli wartosc zatrzymala sie na 1, dlatego pewnie troszke swiecila. for (int o=255; o>=0; o--) { //Zmniejszanie wypelnienia od 255 do 0 analogWrite(3, o); delay(1); // przerwa a tu zadanko 9.2 void setup () { pinMode(3, OUTPUT); miganie (1000, 500, 5); } void loop () { } void miganie (int czas1, int czas2, int ile) { for (int i = 0; i < ile; i++) { digitalWrite(3, HIGH); delay(czas1); digitalWrite(3, LOW); delay(czas2); } } I na koniec jeszcze zadanko 9.3 #define trigPin 12 // wyjscie trigger #define echoPin 11 // wejscie echo #define czerwona1 3 // Linijka LED #define czerwona2 4 #define zolta1 5 #define zolta2 6 #define zielona1 7 #define zielona2 8 #define buzzer 2 // buzzer void setup () { pinMode(trigPin, OUTPUT); // Trigger jako wyjscie pinMode(echoPin, INPUT); // echo jako wejscie pinMode(buzzer, OUTPUT); // Wyjscie buzzera pinMode(czerwona1, OUTPUT); // Wyjscie linijki LED pinMode(czerwona2, OUTPUT); pinMode(zolta1, OUTPUT); pinMode(zolta2, OUTPUT); pinMode(zielona1, OUTPUT); pinMode(zielona2, OUTPUT); } void loop () { odleglosc(); // Wywolanie funkcji odleglosc delay(100); } int odleglosc () { long czas, dystans; digitalWrite(trigPin, LOW); // wyslanie impulsu stanu niskiego delayMicroseconds(2); digitalWrite(trigPin, HIGH); // wyslanie impulsu stanu wysokiego delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); // Przypisanie zmiennej czas do pomiaru dlugosci impulsu z wejscia echo dystans = czas / 58; // Podzielnik, aby wartosc byla w cm dystans = map(dystans, 1, 20, 1, 6); // Mapowanie dystansu, podzielenie wartosci 1-20 na 6 czesci. if (dystans == 1) { // jesli przeszkoda najblizej. digitalWrite(zielona2, HIGH); digitalWrite(zielona1, HIGH); digitalWrite(zolta2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(czerwona2, HIGH); digitalWrite(czerwona1, HIGH); digitalWrite(buzzer, HIGH); } else if (dystans == 2) { // troszke dalej digitalWrite(zielona2, HIGH); digitalWrite(zielona1, HIGH); digitalWrite(zolta2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(czerwona2, HIGH); digitalWrite(czerwona1, LOW); digitalWrite(buzzer, HIGH); } else if (dystans == 3) { // jeszcze dalej digitalWrite(zielona2, HIGH); digitalWrite(zielona1, HIGH); digitalWrite(zolta2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(czerwona2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(buzzer, HIGH); } else if (dystans == 4) { //dalej dalej digitalWrite(zielona2, HIGH); digitalWrite(zielona1, HIGH); digitalWrite(zolta2, HIGH); digitalWrite(zolta1, LOW); digitalWrite(czerwona2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(buzzer, HIGH); } else if (dystans == 5) { // jeszcze dalej dalej digitalWrite(zielona2, HIGH); digitalWrite(zielona1, HIGH); digitalWrite(zolta2, LOW); digitalWrite(zolta1, LOW); digitalWrite(czerwona2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(buzzer, HIGH); } else if (dystans == 6) { // prawie poza zakresem digitalWrite(zielona2, HIGH); digitalWrite(zielona1, LOW); digitalWrite(zolta2, LOW); digitalWrite(zolta1, LOW); digitalWrite(czerwona2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(buzzer, HIGH); } else { // przeszkoda poza zakresem digitalWrite(zielona2, LOW); digitalWrite(zielona1, LOW); digitalWrite(zolta2, LOW); digitalWrite(zolta1, LOW); digitalWrite(czerwona2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(buzzer, LOW); } return dystans; } A jakby ktos nie wierzyl ze działa https://vimeo.com/573448440 Kolejny edit xD Wieczorkiem wzięło mnie, aby udoskonalić czujnik i wyświetlać dystans na LCD. Niestety ograniczyła mnie ilość pinów, więc trzeba było skrócić linijkę do 3 ledów. Ale efekt mnie w sumie zadowolił. Edytowano Lipiec 10, 2021 przez Krawi92 Cytuj Link to post Share on other sites
StefanekP 75 Lipiec 11, 2021 Udostępnij Lipiec 11, 2021 Czy istnieje inny sposób na zrobienie zadania 9.3 niż napisanie bardzo rozbudowanej instrukcji warunkowej? Cytuj Link to post Share on other sites
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!