Skocz do zawartości

Kurs budowy robotów - #6 - Światłolub (sterowanie latarką)


Pomocna odpowiedź

html_mig_img
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.

Link to post
Share on other sites

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

Link to post
Share on other sites

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 😉

Link to post
Share on other sites

Ś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 😉

Link to post
Share on other sites

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. 

Link to post
Share on other sites

@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) 😉

  • Lubię! 1
Link to post
Share on other sites

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: 

 

  • Lubię! 2
Link to post
Share on other sites

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ę ? 

Link to post
Share on other sites

@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ć).

Link to post
Share on other sites
#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++;}
}

 

 

Link to post
Share on other sites

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 :). 

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.