Komentator Napisano Luty 4, 2017 Udostępnij Napisano Luty 4, 2017 Gdy Arduino nie było jeszcze popularne, dużo początkujących szukało poradników opisujących budowę robotów bez mikrokontrolerów.Popularnym wyborem był wtedy światłolub, czyli robot, który jechał w kierunku światła. W praktyce oznaczało to możliwość zdalnego sterowania za pomocą latarki! UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.Przeczytaj całość »Poniżej znajdują się komentarze powiązane z tym wpisem. Cytuj Link do komentarza Share on other sites More sharing options...
leepa79 Luty 7, 2017 Udostępnij Luty 7, 2017 Zadanie 6.1 - oczywiście w moim, pokrętnym, stylu 🙂 Zdradzę Wam sekret - staram się wykonać zadania tylko z pomocą tych kursów, tzn. mam przygotowane materiały do nauki, ale póki kursy trwają staram się korzystać tylko z nich. Książki po kursie 🙂 Chociaż ostatnio miałem problem przy kursie Arduino II z default: w case: 🙂 bo nie było przykładu na lekcji. Chyba czas na posiłkowanie się źródłami zewnętrznymi bo po napisaniu tego zadania przed oczami pojawił mi się mem z kotkiem "Andrzej to jeb... 🙂 Zatem przedstawiam kod: #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 #define R_LIGHT_SENSOR A0 #define L_LIGHT_SENSOR A1 #define BUZZER 10 #define LED 13 int bip = 0; //Zmienna na potrzeby 'bipania' void setup() { //Konfiguracja pinow od mostka H pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); pinMode(LED, OUTPUT); //Konfiguracja LED //Konfiguracja pozostalych elementow pinMode(BUZZER, OUTPUT); digitalWrite(BUZZER, 0); //Wylaczenie buzzera } void loop() { int odczytLewy = analogRead(L_LIGHT_SENSOR); int odczytPrawy = analogRead(R_LIGHT_SENSOR); int roznica = odczytLewy - odczytPrawy; migLed(); stopMotors(); while (odczytPrawy < 600 || odczytLewy < 600 ){ if (bip < 3){ BUZZASTER(); bip++; }else{ JAZDA(); } } } void leftMotor(int V) { if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia) V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //Kierunek: do przodu analogWrite(L_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //Kierunek: do tyłu analogWrite(L_PWM, V); //Ustawienie predkosci } } void rightMotor(int V) { if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia) V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 0); //Kierunek: do przodu analogWrite(R_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); //Kierunek: do tyłu analogWrite(R_PWM, V); //Ustawienie predkosci } } void stopMotors() { analogWrite(L_PWM, 0); //Wylaczenie silnika lewego analogWrite(R_PWM, 0); //Wylaczenie silnika prawego } void migLed() { digitalWrite(LED, 1); delay(200); digitalWrite(LED, 0); delay(200); } void BUZZASTER() { digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); delay(500); } //Jazde wrzucilem tu zeby miec czysto w loop podczas 'wymyslania' zadania domowego :) void JAZDA(){ int odczytLewy = analogRead(L_LIGHT_SENSOR); int odczytPrawy = analogRead(R_LIGHT_SENSOR); int roznica = odczytLewy - odczytPrawy; if (roznica > 50) { //Jesli obliczona roznica jest wieksza leftMotor(30); //To skręcamy w prawo rightMotor(-30); } else if (roznica < -50){ //Jesli obliczona roznica jest mniejsza leftMotor(-30); //To skręcamy w lewo rightMotor(30); } else { //W pozostałych przypadkach jedziemy prosto leftMotor(30); rightMotor(30); } } i film Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Luty 11, 2017 Udostępnij Luty 11, 2017 leepa79, dałbym sobie rękę uciąć, że odpisywałem na Twoją wiadomość... i teraz nie miałbym czym pisać artykułów... Robot radzi sobie bardzo ładnie. Faktycznie program napisany trochę pokrętnie, ale ważne, że działa! Główna zmiana jakąś bym wprowadził, to przeniesienie procedury startowej do funkcji setup(), bo ten kod z założenia powinien wykonać się tylko raz. A jak idzie innym programowanie światłolubów? Przy okazji niestety muszę powiedzieć, że "coś mnie bierze", a wolę się nie rozchorować na najbliższe 2 tygodnie, więc musiałem sobie trochę dziś odpuścić i nie zdążyłem dorobić wszystkich zdjęć do kolejnego artykułu. Nie chcę publikować wybrakowanego, więc będzie drobna zmiana w kalendarzu publikacji. Postaram się od razu ustalić terminy wszystkich pozostałych artykułów. Będę informował o postępach 😉 Cytuj Link do komentarza Share on other sites More sharing options...
leepa79 Luty 14, 2017 Udostępnij Luty 14, 2017 Światłolub otrzymał dodatkowe 'oczy'. Czujnik odległości HC-SR04 i krańcówki z poprzedniej lekcji. #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 #define trigPin A4 #define echoPin A3 #define L_SIDE_SENSOR 7 #define R_SIDE_SENSOR A2 #define R_LIGHT_SENSOR A0 #define L_LIGHT_SENSOR A1 #define BUZZER 10 #define LED 13 #define ROZNICA_MIN -300 #define ROZNICA_MAX 300 int bip = 0; //Zmienna na potrzeby 'bipania' void setup() { //Konfiguracja pinow od mostka H pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); //Konfiguracja pinów HC-SR04 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); //Konfiguracja pinow od czujnikow pinMode(L_SIDE_SENSOR, INPUT_PULLUP); pinMode(R_SIDE_SENSOR, INPUT_PULLUP); //Konfiguracja pozostalych elementow pinMode(BUZZER, OUTPUT); digitalWrite(BUZZER, 0); //Wylaczenie buzzera pinMode(LED, OUTPUT); randomSeed(analogRead(5)); //Inicjalizacja generatora } void loop() { int odczytLewy = analogRead(L_LIGHT_SENSOR); int odczytPrawy = analogRead(R_LIGHT_SENSOR); int roznica = odczytLewy - odczytPrawy; migLed(); //Miganie diody przed jazda stopMotors(); while (odczytPrawy < 600 || odczytLewy < 600 ){//Kiedy mocniejsze swiatlo //Bipnij 3 razy if (bip < 3){ BUZZASTER(); bip++; }else{ int odczytLewy = analogRead(L_LIGHT_SENSOR); int odczytPrawy = analogRead(R_LIGHT_SENSOR); int roznica = odczytLewy - odczytPrawy; //Pomiar odleglosci long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; //W przod leftMotor(50); rightMotor(50); int los = random(5, 20) * 10; //Dodajemy losowo od 50 do 200 ms obrotu //Jesli przeszkoda if (dystans < 15) { stopMotors(); delay(150); leftMotor(-40); rightMotor(-40); delay(500); leftMotor(-35); rightMotor(35); delay(140+los); } if (digitalRead(L_SIDE_SENSOR) == LOW) { //Jesli przeszkoda po lewej stronie //Jedz do tylu i w prawo leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(700); leftMotor(50); rightMotor(10); digitalWrite(BUZZER, 0); delay(800); //Koniec warunku wracamy do jazdy prosto } if (digitalRead(R_SIDE_SENSOR) == LOW){ //Jesli przeszkoda po prawej stronie //Jedz do tylu w lewo leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(700); leftMotor(10); rightMotor(50); digitalWrite(BUZZER, 0); delay(800); //Koniec warunku wracamy do jazdy prosto } if (roznica < ROZNICA_MIN) { //Jeśli roznica mniejsza od dopuszczalnej roznica = ROZNICA_MIN; //To ustaw najmniejszą dopuszczalną wartość } else if (roznica > ROZNICA_MAX) { //Jeśli różnica większa od dopuszczalnej roznica = ROZNICA_MAX; //To ustaw największą dopuszczalną wartość } //Przeliczenie odczytow z czujnikow na zmiane predkosci silnikow int zmianaPredkosci = map(roznica, ROZNICA_MIN, ROZNICA_MAX, -45, 45); //Dodajemy lub odejmujemy wyliczoną zmianę od prędkosci bazowej leftMotor(30+zmianaPredkosci); rightMotor(30-zmianaPredkosci); } } } void leftMotor(int V) { if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia) V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //Kierunek: do przodu analogWrite(L_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //Kierunek: do tyłu analogWrite(L_PWM, V); //Ustawienie predkosci } } void rightMotor(int V) { if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia) V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 0); //Kierunek: do przodu analogWrite(R_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); //Kierunek: do tyłu analogWrite(R_PWM, V); //Ustawienie predkosci } } void stopMotors() { analogWrite(L_PWM, 0); //Wylaczenie silnika lewego analogWrite(R_PWM, 0); //Wylaczenie silnika prawego } void migLed() { digitalWrite(LED, 1); delay(200); digitalWrite(LED, 0); delay(200); } void BUZZASTER() { digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); delay(500); } i film Teraz jest samodzielnym zwierzakiem 😉 Cytuj Link do komentarza Share on other sites More sharing options...
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
Treker (Damian Szymański) Luty 16, 2017 Udostępnij Luty 16, 2017 leepa79, super - miło widzieć, że ciągle rozwijasz robota 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
juk3n Lipiec 11, 2019 Udostępnij Lipiec 11, 2019 Dzień dobry, mam problem z czujnikami światła. W trakcie sprawdzania wartości przez UART, mimo tych samych warunków, zachowują się zupełnie inaczej. Dla prawego czujnika cały czas wykazywana jest wartość około tysiąca przy normalnym świetle, a przy lewym wartość zero, przy takim samym świetle. Nie wiem jak mam sobie poradzić z tym problemem. Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Lipiec 12, 2019 Udostępnij Lipiec 12, 2019 @juk3n czy gdy zamienisz czujniki miejscami (podłączenie na płytce) to nadal uzyskujesz złe wyniki na tym samym czujniki? 1 Cytuj Link do komentarza Share on other sites More sharing options...
juk3n Lipiec 17, 2019 Udostępnij Lipiec 17, 2019 @Treker sytuacja jest taka sama, tylko wartości zmieniły się miejscami Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Lipiec 18, 2019 Udostępnij Lipiec 18, 2019 @juk3n w takim razie faktycznie trafił Ci się uszkodzony czujnik 😞 Przepraszam za kłopot, dawno nie było już takiej sytuacji. Zgłoś reklamację w Botlandzie - na pewno szybko wymienią uszkodzony element. W między czasie możesz zająć się innymi częściami kursu. Alternatywnie, jeśli masz lutownicę, to możesz spróbować poprawić luty fotorezystora i sprawdzić miernikiem gdzie "znika" sygnał z czujnika. Jednak to tylko taka sugestia, jeśli masz czas i ochotę samemu to zweryfikować (zepsuć bardziej i tak Ci się nie uda) 😉 1 Cytuj Link do komentarza Share on other sites More sharing options...
BHBmacieg Marzec 30, 2020 Udostępnij Marzec 30, 2020 Kolejna część kursu zakończona. Podobnie jak kolega @leepa79 również wykorzystałem krańcówki oraz czujnik HC-SR04. Z tym, że u mnie krańcówki wykrywają przeszkody przed robotem, a HC-SR04 pomaga nie wjechał w przeszkody tyłem. Tutaj kod: #define R_LIGHT_SENSOR A0 #define L_LIGHT_SENSOR A1 #define L_SIDE_SENSOR A2 #define R_SIDE_SENSOR 12 #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 #define BUZZER 10 #define DIODA 13 #define ROZNICA_MIN -400 #define ROZNICA_MAX 400 #define trigPin 8 #define echoPin 7 bool START = false; //zmienna dla procedury startu void setup() { //konfiguracja pinów mostka H pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); pinMode(DIODA, OUTPUT); pinMode(L_SIDE_SENSOR, INPUT_PULLUP); //koniguracja pinu jak przyckiski pinMode(R_SIDE_SENSOR, INPUT_PULLUP); randomSeed(analogRead(5)); //inicjalizacja generatora liczb losowych //konfigutacja pozostałych elementów pinMode(BUZZER, OUTPUT); digitalWrite(BUZZER, 0); //wyłączenie buzzera digitalWrite(DIODA, LOW); //wylaczenie diody pinMode(trigPin, OUTPUT); //Deklaracja pinów dla czujnika zbliżeniowego pinMode(echoPin, INPUT); Serial.begin(9600); } void loop() { int odczytLewy = analogRead(L_LIGHT_SENSOR); //odczytanie wartości z lewego czujnika int odczytPrawy = analogRead(R_LIGHT_SENSOR); //odczytanie wartości z prawego czujnika int roznica = odczytLewy - odczytPrawy; int los = random(5, 40) * 10; //wylosowanie liczby dla czasu obrotu int randomSpeed = random(2, 6) * 10; //wylosowanie predkosci jazdy do przodu if (roznica < ROZNICA_MIN) { //ewentualna korekcja skrajnych warotści róznic roznica = ROZNICA_MIN; } else if (roznica > ROZNICA_MAX) { roznica = ROZNICA_MAX; } int zmianaPredkosci = map(roznica, ROZNICA_MIN, ROZNICA_MAX, -40, 40); //zmienna pozawalająca przeliczenie odczytów z czuników na zmianę prędkości silnikó if (START == true) { //sprawdzenie warunku dla procedury staru leftMotor(30+zmianaPredkosci); //korekty prędkości zależnie od natężenia światła rightMotor(30-zmianaPredkosci); if (digitalRead(L_SIDE_SENSOR) == LOW) { //jeśli przeszkoda zostanie wykryta po lewej stronie int odleglosc = zmierzOdlegosc(); //zmienna odczytująca dystans z czujnika US if (odleglosc > 30) //jeśli odległość jest większa niż 30 cm to robot zdąży wykonać pełny zadany ruch { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(1000); } else { while (odleglosc > 8) //jeśli odległość mniejsza niż 30 cm sprawdzanie kolejnych odległości do momentu osiągnięcia wartości 8 cm { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); odleglosc = zmierzOdlegosc(); //zamiana wartości odległości delay(50); } } //obrót w miejscu w prawo leftMotor(randomSpeed); rightMotor(-randomSpeed); digitalWrite(BUZZER, 0); delay(150 + los); //koniec warunku, wracamy do jazdy prosto } if (digitalRead(R_SIDE_SENSOR) == LOW) { //jeśli przeszkoda zostanie wykryta po prawej stronie //jedź wstecz i wydawaj dźwięk int odleglosc = zmierzOdlegosc(); //powtarzamy co w poprzednim warunku if (odleglosc > 30) { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(1000); } else { while (odleglosc > 8) { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); odleglosc = zmierzOdlegosc(); delay(50); } } //obrót w miejscu w lewo leftMotor(-randomSpeed); rightMotor(randomSpeed); digitalWrite(BUZZER, 0); delay(150 + los); //koniec warunku, wracamy do jazdy prosto } } else if (odczytPrawy < 50) { //procedura startu po mocnym naświetleniu prawego czujnika START = !START; sygnalizacjaUruchomienia(); //wywołanie funkcji sygnalizującej uruchomienie BUZZEREM } else { //miganie diody sygnalizującej gotowość do startu MiganieNaGotowosc(); //wywołanie funkcji migającej diodą gotowości } } void leftMotor(int V) { //funkcja odpowiedzialna za sterowanie lewym silnikiem if (V > 0) { //jeśli wartość prędkości więszka od 0 V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //do przodu analogWrite(L_PWM, V); //zadanie prędkości } else { V = abs(V); //wyciągnięcie wartości bezwzględnej V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //do tyłu analogWrite(L_PWM, V); //zadanie prędkości } } void rightMotor(int V) { //to samo co wyżej tylko dla prawego if (V > 0) { V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 0); analogWrite(R_PWM, V); } else { V = abs(V); V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); analogWrite(R_PWM, V); } } void StopMotors() { //zatrzymanie silników analogWrite(L_PWM, 0); analogWrite(R_PWM, 0); } int zmierzOdlegosc() //funkcja dla mierzenia odległości przez czujnik SC { 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 sygnalizacjaUruchomienia() { //sygnalizacja dźwiękowa startu int i = 0; for (i; i < 3; i++) { digitalWrite(BUZZER, HIGH); delay(200); digitalWrite(BUZZER, LOW); delay(200); } } void MiganieNaGotowosc() { //funkcja odpowiedzialna za miganie diodą gotowości digitalWrite(DIODA, HIGH); delay(100); digitalWrite(DIODA, LOW); delay(100); } A tutaj film: 2 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Marzec 30, 2020 Udostępnij Marzec 30, 2020 @BHBmacieg super, działa bardzo fajnie - dobra robota! Cytuj Link do komentarza Share on other sites More sharing options...
Antagonista99 Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 Dobry. Mam problem związany z tą lekcją dokładnie z zadaniem 6.1. Napisałem zewnętrzne funkcje związane z miganiem i dźwiękiem void Led() { if (mig <3){ digitalWrite(LED, 1); delay(200); digitalWrite(LED, 0); delay(200); mig++; }} i z dźwiękiem jest podobna. I w tym problem ponieważ nie wykonuje od razu 3 razy tylko na zmianę. Co zrobić żeby funkcja była wykonywane 3 razy a nie na zmianę ? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 @Szabla99 witam na forum 🙂 Możesz dla formalności wkleić jednak cały program? Tak będzie łatwiej zobaczyć co tam się dzieje. Pamiętaj jednak, że Arduino wykonuje wszystkie instrukcje po kolei, jeśli korzystasz z delay to ciężko będzie uzyskać efekt równoległego działania dwóch funkcji (jeśli to chcesz uzyskać). Cytuj Link do komentarza Share on other sites More sharing options...
Antagonista99 Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 #define prawy 9 #define lewy 4 #define PWN_P 5 #define PWN_L 6 #define PWN_MAX 165 //czujnikikranoce #define R_K A0 #define L_K A1 //BUZZER #define Buzzer 10 //diodA #define dioda 13 int bip = 0; int mig = 0; void setup() { // put your setup code here, to run once: //ustawieniesilnikow pinMode(prawy, OUTPUT); pinMode(lewy, OUTPUT); pinMode ( PWN_L, OUTPUT); pinMode( PWN_P, OUTPUT); pinMode(dioda, OUTPUT); //ustawieniekrancowek digitalWrite(dioda , LOW); //Buzzer pinMode (Buzzer, OUTPUT); digitalWrite(Buzzer, 0); digitalWrite(dioda, 0); //generTORLOSOWYCHLICZB randomSeed(analogRead (5)); } void loop() { int lewyy = analogRead (L_K); int prawyy = analogRead (R_K); int roznica= lewyy - prawyy; while(lewyy >600 || prawyy >600){ start(); } ledstart(); if ( roznica >50){ lewysilnik(60); prawysilnik(-60); }else if (roznica <-50){ lewysilnik(-60); prawysilnik(60); }else { lewysilnik(60); prawysilnik(60); } } //funkcjasilnikalewego void lewysilnik(int V){ if (V >0){ V=map (V ,0, 100, 0 , PWN_MAX); digitalWrite(lewy, 0), analogWrite( PWN_L , V); }else{ V=abs(V); V=map( V, 0 , 100,0, PWN_MAX); digitalWrite (lewy, 1); analogWrite (PWN_L , V); } } void prawysilnik(int V){ if (V >0){ V=map (V ,0, 100, 0 , PWN_MAX); digitalWrite(prawy, 0), analogWrite( PWN_P , V); }else{ V=abs(V); V=map (V, 0, 100,0, PWN_MAX); digitalWrite (prawy, 1); analogWrite (PWN_P , V); } } void stopsilniki(){ analogWrite( PWN_P , 0); analogWrite (PWN_L , 0); } void jazdazczujnikami(){ int lewyy = analogRead (L_K); int prawyy = analogRead (R_K); int roznica= lewyy - prawyy; if ( roznica >50){ lewysilnik(60); prawysilnik(-60); }else if (roznica <-50){ lewysilnik(-60); prawysilnik(60); }else { lewysilnik(60); prawysilnik(60); } } void start(){ if (bip<3){ digitalWrite ( Buzzer , HIGH); delay(300); digitalWrite ( Buzzer , LOW); delay(300); bip++; } } void ledstart(){ while (mig<4){ digitalWrite (dioda, HIGH); delay(400); digitalWrite(dioda, LOW); delay(300); mig++;} } Cytuj Link do komentarza Share on other sites More sharing options...
BHBmacieg Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 Prawdopodobnie dzieje się tak, ponieważ korzystasz z funkcji warunkowej "if" zamiast z pętli "for". Teraz program działa tak, wchodzi do funkcji start, włącza, wyłącza buzzer, zwiększa wartość zmiennej bip i wychodzi z funkcji. Chodzi o to, że warunek sprawdzany jest tylko raz, jeśli jest prawdziwy wykonuje się sekwencja zapisana w funkcji "if" i program idzie dalej do kolejnych instrukcji. Napisz te funkcje z wykorzystaniem pętli "for" i sprawdź wtedy :). Cytuj Link do komentarza Share on other sites More sharing options...
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!