Skocz do zawartości

Kurs Arduino - #9 - Czujnik odległości HC-SR04, funkcje


Komentator

Pomocna odpowiedź

Wydaje mi się, że jest niewielki błąd treści kodu w stosunku do grafiki. W kodzie jest napisane, iż wpinamy się buzzerem do pinu nr3, natomiast w grafice zielony kabelek idzie do pinu nr 2.

Pozdrawiam.

Edytowano przez Treker
Usunięcie zbędnego taga.
Link do komentarza
Share on other sites

Bardzo chaotyczne ale działające rozwiązanie 9.1:

int figura = ""; //deklaracja zmiennej do rozpoznawania figur
String wymiar1 = ""; //zmienna wymiarowa
String wymiar2 = ""; //zmienna wymiarowa 2
int wynik = 0; 

int kwadrat (int a){  //liczenie pola kwadratu
  wynik= a*a;
  return wynik;
}
int prostokat (int a, int b){ //liczenie pola prostokata

wynik = a*b;
return wynik;
}
int kolo (int r){ //liczenie pola kola
  wynik = 3.14*r*r;
  return wynik;
}
int trojkat (int a, int h){ //liczenie pola trojkata
  wynik = (a*h)/2;
  return wynik;
}
void setup() {
  Serial.begin(9600); //rozpoczecie transmisji
  Serial.println("podaj figure"); //napis powitalny
  Serial.print("kwadrat (k) \t");
  Serial.print("prostokat (p) \t");
  Serial.print("kolo (o) \t");
  Serial.print("trojkat (t) \n");


}

void loop() {
 if (Serial.available()>0){ //sprawdzenie czy sa dane wyslane
  figura=Serial.read(); //zapisanie ich do rozpoznania
  switch (figura){ 
    case 'k': //jezeli jest to k
    Serial.println("podaj dlugosc boku");
    delay(2000); //oczekiwanie na dlugosc boku
    if (Serial.available()>0){ //jezeli jest podana
     wymiar1=Serial.readStringUntil('\n'); //zapisanie wymiaru boku
     wynik = kwadrat  (wymiar1.toInt()); //obliczanie wyniku
     Serial.println(wynik); //wyswietlenie wyniku
     }else{ //jesli nie uda sie wpisac boku
      Serial.println("Masz 2 sekundy na podanie boku");
      Serial.println ("Spróbuj ponownie");
     }
     break;
     case 'p': //jezeli p
    Serial.println("podaj dlugosc boku a");
    delay(2000); //oczekiwanie na pierwszy bok
    if (Serial.available()>0){
     wymiar1=Serial.readStringUntil('\n'); //zapisanie go jako wymiar 1
    }
    Serial.println("podaj dlugosc boku b");
    delay(2000); // oczekiwanie na drugi bok
    if (Serial.available()>0){
     wymiar2=Serial.readStringUntil('\n'); //zapisanie go jako wymiar2
    
     wynik = prostokat(wymiar1.toInt(), wymiar2.toInt()); 
     Serial.println(wynik); //wyswietlenie wyniku
    }else{ //jesli nie uda sie podac bokow
      Serial.println("Masz 2 sekundy na podanie boku");
      Serial.println ("Spróbuj ponownie");
     }
     break;
     case 'o': //jesli wybrano kolo o
    Serial.println("podaj promien");
    delay(2000); //oczekiwanie na promien
    if (Serial.available()>0){
     wymiar1=Serial.readStringUntil('\n'); //zapisanie promienia pod wymiar1
     wynik = kolo (wymiar1.toInt());
     Serial.println(wynik);//wyswietlenie wyniku
     }else{ //jesli nie uda sie podac promienia
      Serial.println("Masz 2 sekundy na podanie promienia");
      Serial.println ("Spróbuj ponownie");
     }
     break;
      case 't': //jesli wybrano trojkat
    Serial.println("podaj dlugosc boku a");
    delay(2000); //oczekiwanie na bok
    if (Serial.available()>0){
     wymiar1=Serial.readStringUntil('\n'); //zapisanie pod zmienna wymiar1
    }
    Serial.println("podaj wysokosc h");
    delay(2000); //oczekiwanie na wysokosc 
    if (Serial.available()>0){
     wymiar2=Serial.readStringUntil('\n'); //zapisanie wysokosci pod zmienna wymiar2
     wynik = trojkat(wymiar1.toInt(), wymiar2.toInt());
     Serial.println(wynik); //wyswietlenie wyniku
    }else{ //jesli sie nie uda odac wymiarow
      Serial.println("Masz 2 sekundy na podanie boku");
      Serial.println ("Spróbuj ponownie");
     }
     break;
     }
 }
 }

 

  • Lubię! 1
Link do komentarza
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

@Neko Tak sobie czytam Twój kod i...

Dnia 29.09.2019 o 09:36, Neko napisał:

int figura = ""; //deklaracja zmiennej do rozpoznawania figur
String wymiar1 = ""; //zmienna wymiarowa
String wymiar2 = ""; //zmienna wymiarowa 2
int wynik = 0;

 

Zaraz... Skoro wynik jest zmienną globalną...

Dnia 29.09.2019 o 09:36, Neko napisał:

int kwadrat (int a){  //liczenie pola kwadratu
  wynik= a*a;
  return wynik;
}

...to po co funkcja zwraca wartość zmiennej wynik...

Dnia 29.09.2019 o 09:36, Neko napisał:

     wynik = kwadrat  (wymiar1.toInt()); //obliczanie wyniku

 

...do zmiennej wynik!?

Dnia 29.09.2019 o 09:36, Neko napisał:

    Serial.println("podaj dlugosc boku");
    delay(2000); //oczekiwanie na dlugosc boku
    if (Serial.available()>0){ //jezeli jest podana

 

A zamiast tego fragmentu o wiele łatwiej użyć pauzy pętlą while:

    Serial.println("Podaj dlugosc boku");
    while(Serial.available()<=0){ //czekanie na odpowiedź
  • Lubię! 2
Link do komentarza
Share on other sites

Hej 

Chciałem zrobić prosty program który miałby za zadanie po kliknięciu przycisku zamigać diodą, piknąć buzzerem,  odczytać pomiar z czujnika odległości i wyświetlić go w cm na LCD.

Problem w tym że na wyświetlaczu nic się nie ukazuje. Sprawdzałem kilka razy czy wszystko jest dobrze napisane w kodzie i czy jest dobrze podłączone

Postanowiłem sprawdzić czy kod jest poprawny więc dopisałem:

   Serial.print(dystans);
  Serial.println(" cm");

Włączyłem monitor portu szeregowego i normalnie pokazywały się wyniki w cm. Czy to możliwe, że wyświetlacz się przepalił lub uszkodził?

To jest kod programu:

//Biblioteki
#include<LiquidCrystal.h>
LiquidCrystal lcd(8,9,10,11,12,2);
//definiowanie pinów
#define ziel 3
#define klik 6
#define pik 7
#define trig 5
#define echo 4

 //zmienne
int czas1 = 100;
 long czas, dystans;
 
void setup() {
  
// konfiguracja wejść i wyjść

 pinMode(pik, OUTPUT);
 pinMode(klik, INPUT_PULLUP);
 //diody
 pinMode(ziel, OUTPUT);
 //odległościomierz
 pinMode(trig, OUTPUT);
 pinMode(echo, INPUT);
 //LCD

Serial.begin(9600);

}

void loop() {
 
  if(digitalRead(klik) == LOW)
  { 
    
    
    //buzzer przez 100 setnych
    digitalWrite(pik, HIGH);
    delay(100);
    digitalWrite(pik, LOW);
    
    zamigaj2LED ();
    //zmierz odległość
    
   digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  czas = pulseIn(echo, HIGH);
  dystans = czas / 58;
  lcd.begin(16,2);
  lcd.print(dystans);
  lcd.println(" cm");
   Serial.print(dystans);
  Serial.println(" cm");
  
  }
  while(digitalRead(klik) == LOW) {}
}

// własne argumenty

void zamigaj2LED() {
   digitalWrite(ziel, HIGH); 
  delay(czas1); 
  digitalWrite(ziel, LOW);
  delay(czas1);
  digitalWrite(ziel, HIGH); 
  delay(czas1); 
  digitalWrite(ziel, LOW);
  delay(czas1);
}

PS: w ostatnim projekcie miałem też problemy z wyświetlaczem i pisałem tu na forum.

Edytowano przez Dami12250
Link do komentarza
Share on other sites

Aby nie robić zamieszania usunąłem posty, które pojawiły się zanim edytowałeś swój post 😉

17 godzin temu, Dami12250 napisał:

Czy to możliwe, że wyświetlacz się przepalił lub uszkodził?

@Dami12250 w takiej sytuacji warto byłoby odstawić na chwilę gotowy program i zwyczajnie sprawdzić czy LCD działa. Próbowałeś wgrać najprostszy kod, który testuje tylko LCD? Warto wyrobić sobie taki nawyk, bo dzięki temu od razu sprawdzasz czy wyświetlacz działa i czy jest poprawnie podłączony. Co więcej, od razu masz wtedy wskazówkę, że jeśli LCD działa osobno to znaczy, że problemem jest reszta programu i np. mogą gryźć się jakieś biblioteki 🙂

Link do komentarza
Share on other sites

zadanie 9.3 - czy są sposoby aby ładniej zapisać ten długi kod z funkcji void wskaznik? pomijam opcję z pętlą for która zapala piny a następnie wszystkie gasi i tak w kółko.

#define trigger 12
#define echo 11

void setup()
{
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  for (int i = 10; i > 5; i--)
  {
    pinMode(i, OUTPUT);
  }
}

void loop()
{
  wskaznik();
  delay(25);
}

int odleglosc()
{
  int czas = 0;
  digitalWrite(trigger, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);

  czas = pulseIn(echo, HIGH);
  czas = czas / 58.0;

  return czas;
}

void wskaznik()
{
  if (odleglosc() < 50)
  {
    digitalWrite(10, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(6, HIGH);
  }
  else if (odleglosc() < 100)
  {
    digitalWrite(10, LOW);
    digitalWrite(9, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(6, HIGH);
  }
  else if (odleglosc() < 150)
  {
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(6, HIGH);
  }
  else if (odleglosc() < 200)
  {
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    digitalWrite(8, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(6, HIGH);
  }
  else if (odleglosc() < 250)
  {
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, HIGH);
  }
  else
  {
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
  }
}

 

 

 

Zadanie 9.1

 

bool blokadastart=0; // blokada pierwszego if'a
int wybor=0; // deklarowanie wyboru obliczenia

int a=0; // pole prostokata
int b=0;

float aa=0; // pole trojkata zmienne
float h=0;

float r=0; // pole kola
float wynik=0;

void setup(){
  Serial.begin(9600);
}

void loop(){
  
  if (blokadastart==0){
  Serial.println("Wybierz ktore pole chcesz obliczyc");
  Serial.println("Pole kwadratu wcisnij   1");
  Serial.println("Pole prostokata wcisnij 2");
  Serial.println("Pole trojkata wcisnij   3");
  Serial.println("Pole kola wcisnij       4");
        
    blokadastart=1;
  }
   
  if (Serial.available()>0){    
    String zmienna=Serial.readStringUntil('\n');
    wybor=zmienna.toInt();        
  }
  
  
  switch(wybor){
    
    case 1: // pole kwadratu
    Serial.println("Wybrales pomiar pola kwadratu");
    Serial.println("Podaj wymiar boku a");
    while (Serial.available()==0){}
    if (Serial.available()>0){
      String dane=Serial.readStringUntil('\n');
      int a=dane.toInt();
      Serial.print("Podany wymiar: ");
        Serial.println(a);
      int wynik=polekwardaru(a);
        Serial.print("Pole powierzchni kwadratu wynosi: ");
        Serial.println(wynik);      
    }
    blokadastart=0;
    wybor=0;
      break;
    
    case 2: //pole prostokata
    Serial.println("Wybrales pomiar pola prostokata");
    Serial.println("Podaj wymiar boku a");
    while (Serial.available()==0){}
    if (Serial.available()>0){
      String dane=Serial.readStringUntil('\n');
      a=dane.toInt();
      Serial.print("Podany wymiar boku a: ");
        Serial.println(a);
    }
      Serial.println("Teraz prosze podac wymiar boku b");
    while (Serial.available()==0){}
    if (Serial.available()>0){
      String dane=Serial.readStringUntil('\n');
      b=dane.toInt();
      Serial.print("Podany wymiar boku b: ");
        Serial.println(b);
      int wynik=prostokatpole(a,b);
        Serial.print("Pole powierzchni prostokatu wynosi: ");
        Serial.println(wynik);
    }
      blokadastart=0;
      wybor=0;
      break;
    
    case 3: //pole trojkata
    
    Serial.println("Podaj wymiar podstawy a");
    while (Serial.available()==0){}
    if (Serial.available()>0){
      String dane=Serial.readStringUntil('\n');
      aa=dane.toInt();
      Serial.print("Wartosc podstawy to: ");
      Serial.println(aa);
    }        
          Serial.println("Podaj wysokosc trojkata");
          while (Serial.available()==0){}
          if (Serial.available()>0){
          String dane=Serial.readStringUntil('\n');
          h=dane.toInt();
          Serial.print("Wartosc wysokosci to: ");
          Serial.println(h);
        }
        wynik=poletrojkata(aa,h);
        Serial.print("Pole powierzchni prostokata wynosi: ");
        Serial.println(wynik);
        blokadastart=0;
        wybor=0;
        break;
    
    case 4: //pole kola
    
    Serial.println("Wybrales pomiar powierzchni kola");
    Serial.println("Podaj wartosc promienia kola");
    while(Serial.available()==0){}
    if (Serial.available()>0){
      String dane=Serial.readStringUntil('\n');
      r=dane.toInt();
      float wynik=polekola(r);
      Serial.print("pole kola: ");
      Serial.println(wynik);
    }
       blokadastart=0;
       wybor=0;
    break;
    
    }  // zakonczenie funkcji switch case
} // zakonczenie void loop


// funkcje
  

int polekwardaru (int a){
  int wynik=a*a;
  return wynik;
}

int prostokatpole (int a, int b){  //funkcja na pole pow. prostokatu
  int wynik=a*b;  //zmienna lokalna wynik  
    return wynik;  // wynik dzialania ktore pokaze zmienna int wynik
}

float poletrojkata (float a, float h){ //funkcja na pole trojkata
  float wynik=0.5*(a*h); //zmienna lokalna wynik
    return wynik; // wynik dzialania pole trojkata
}

float polekola (float r){ //funkcja na pole kola
  float wynik=PI*(r*r); //zmienna lokalna wynik
    return wynik; // wynik dzialania pole kola
}

Jest haos, są zmienne globalne i zmienne lokalne które nazywają się tak samo a mimo wszystko program działa. Pisany w 100% przeze mnie ale logicznie nie umiem wyjaśnić dlaczego działa. Dlatego w mojej głowie pojawiły się poytanie dotyczące zmiennych i to gdzie są one widoczne w trakcie trwania programu

image.thumb.png.116d77703f0e8757000e5265d54690ba.png

@Treker  czy mógłbyś trochę rozjaśnić moją niepewność dotyczącą tych zmiennych?

Edytowano przez bakardi92
Link do komentarza
Share on other sites

@bakardi92 popracuj trochę nad nazewnictwem zmiennych, bo nazywanie ich "a", "aa" to raczej zły pomysł. Szybko się pomylisz, a do tego nie wiadomo co one oznaczają. Jeśli chodzi o widoczność zmiennych to: zmienne globalne widoczne są wszędzie - dosłownie w całym programie. Zmienne zadeklarowane wewnątrz danej funkcji będą widoczne tylko w danej funkcji.

Link do komentarza
Share on other sites

Cześć, piszę sobie zadanie 9.1 i mam mały problem. Z jakiegoś powodu nie działa mi poprawnie warunek switch.. case... Otóż poprawnie wykonuje się tylko "pierwszy" case wyszczególniony w kodzie. Przy wpisaniu litery odpowiedzialnej za drugi case program jakby starował od nowa i znów prosi o podanie litery. Prześledziłem kod parę razy ale nie widzę błędu. Może "cudze oko" wyłapie gdzie coś jest nie tak. Wysyłam kod: 

int figura = ""; //odczytanie jaka figure chcemy wyliczyc
String dlugoscBoku1 = ""; //zmienna dla dlugosci boku podana
int dlugoscBoku1INT = 0; //zmienan dla dlugosic boku INT
String dlugoscBoku2 = ""; //zmienna dla dlugosci boku podana
int dlugoscBoku2INT = 0; //zmienan dla dlugosic boku INT
String promien = ""; //zmienna dla promienia podana
int promienINT = 0; //zmienna dla promienia
String wysokosc = ""; //zmienan dla wysokosci podana
int wysokoscIN = 0; //zmienna dla wysokosci

void setup()
{
    Serial.begin(9600); //rozpoczecie komunikacji z pc

}

void loop()
{
    Serial.println("Pole jakiej figury checsz obliczyc? Prostokąt - p, Koło - k, Trójkąt - t");
    //zapytanie jaka figure chcemy obliczyc

    czekaj();

    if (Serial.available() > 0)
    { //jesli uzytkownik podal cos z klawiatury
        figura = Serial.read();
    }

    switch (figura)
    {
        case 'k': //jesli uzytkownik chce obliczyc pole kola

            Serial.println("Podaj długość promienia.");
            czekaj();

            if (Serial.available() > 0)
            {
                promien = Serial.readString();
                promienINT = promien.toInt();
            }

            double poleKolo = kolo(promienINT);
            Serial.println("Pole twojego koła to: " + String(poleKolo) + " [mm^2]");
            break;

        case 'p': //jesli uzytkownik chce obliczyc pole prostokąta
            Serial.println("Podaj długość pierwszego boku.");
            czekaj();
            if (Serial.available() > 0)
            {
                dlugoscBoku1 = Serial.readStringUntil('\n');
                dlugoscBoku1INT = dlugoscBoku1.toInt();
            }

            Serial.println("Podaj długość drugiego boku.");
            czekaj();
            if (Serial.available() > 0)
            {
                dlugoscBoku2 = Serial.readString();
                dlugoscBoku2INT = dlugoscBoku2.toInt();
            }
            int poleProstokat = prostokat(dlugoscBoku1INT, dlugoscBoku2INT);
            Serial.println("Pole twojego prostokąta to: " + String(poleProstokat) + " [mm^2]");
        break;

        default:
            Serial.println("podałeś złą literę!");
            break;


    }

}

int prostokat(int a, int b)
{ //funkcja odpowiedzialna za obliczanie pola kwardratu
    int poleProstokat = 0;
    poleProstokat = a * b;

    return poleProstokat;
}

double kolo(double r)
{ //funkcja odpowiedzialna za obliczanie pola kola
    double poleKolo = 0;
    poleKolo = 3.14 * r * r;

    return poleKolo;
}

double trojkat(double a, double h)
{ //funkcja odpowiedzialna za obliczanie pola trojkata 
    double poleTrojkat = 0;
    poleTrojkat = 0.5 * a * h;

    return poleTrojkat;
}

void czekaj()
{
    while (Serial.available() == 0)
    {
        delay(50);
    }
}

 

Link do komentarza
Share on other sites

Takie podwójne zagnieżdżenie odczytywania znaków może być mylące. Na razie spróbuj dać blokujące pętle przy oczekiwaniu na podanie argumentów. Pierwszą tego typu pętlę masz na zewnątrz switch - case (pętla loop), gdzie jak coś się pojawi to przetwarzasz te dane.

Możesz np. zamienić if na while i sprawdzać czy String jest niepusty i kończy się znakiem nowej linii (pamiętaj żeby mieć ustawione to w monitorze portu szeregowego).

Ale najlepiej jakbyś dał odczytywanie portu szeregowego tylko w jednym miejscu i przetwarzanie tego co z niego przyjdzie. Zamiast wpadania w pętle możesz dać zmienne określające stan, np. teraz przetwarzamy dane dotyczące koła, to zmienna int tryb = 0.... itp.

Link do komentarza
Share on other sites

Pogrzebałem trochę, przeszedłem z funkcji switch case na zwykłe funkcje warunkowe if i o dziwo działa bez problemu. Wygląda tak jakby nie podwójne zagnieżdżanie odczytywania znaków było problemem. W wolnej chwili postaram się wrócić do switch case i naprawić kod tak aby działał poprawnie. Póki co prace domowe:

 

9.1. Obliczanie pola powierzchni wybranej figury

String figura = ""; //odczytanie jaka figure chcemy wyliczyc
String dlugoscBoku1 = ""; //zmienna dla dlugosci boku podana
int dlugoscBoku1INT = 0; //zmienan dla dlugosic boku INT
String dlugoscBoku2 = ""; //zmienna dla dlugosci boku podana
int dlugoscBoku2INT = 0; //zmienan dla dlugosic boku INT
String promien = ""; //zmienna dla promienia podana
int promienINT = 0; //zmienna dla promienia
String wysokosc = ""; //zmienan dla wysokosci podana
int wysokoscINT = 0; //zmienna dla wysokosci

void setup()
{
    Serial.begin(9600); //rozpoczecie komunikacji z pc
    
}

void loop()
{
    Serial.println("Pole jakiej figury checsz obliczyc? Prostokąt - p, Koło - k, Trójkąt - t");
    //zapytanie jaka figure chcemy obliczyc
    czekaj();

    if (Serial.available() > 0)
    { //jesli uzytkownik podal cos z klawiatury
        figura = Serial.readStringUntil('\n');
    }

    if (figura == "k")
    { //jesli wybieramy koło

        Serial.println("Podaj długość promienia."); //prosimy użytkownika o podanie długości promienia
        czekaj();

        if (Serial.available() > 0)
        { //odczytanie wartości podanej przez użytkownika
            promien = Serial.readStringUntil('\n');
            promienINT = promien.toInt();
        }

        double poleKolo = kolo(promienINT); //obliczenie pola za pomocą funkcji
        Serial.println("Pole twojego koła to: " + String(poleKolo) + " [mm^2]");

    } else if (figura == "p")
    { //jesli wybieramy prostokąt

        Serial.println("Podaj długość pierwszego boku."); //prosimy o podanie długości pierwszego boku
        czekaj();
        if (Serial.available() > 0)
        { //odczytanie wartości podanej przez użytkownika
            dlugoscBoku1 = Serial.readStringUntil('\n');
            dlugoscBoku1INT = dlugoscBoku1.toInt();
        }

        Serial.println("Podaj długość drugiego boku.");
        czekaj();
        if (Serial.available() > 0)
        { //odczytanie wartosci podanej przez użytkownika
            dlugoscBoku2 = Serial.readStringUntil('\n');
            dlugoscBoku2INT = dlugoscBoku2.toInt();
        }
      
        int poleProstokat = prostokat(dlugoscBoku1INT, dlugoscBoku2INT); //obliczenie pola za pomocą funkcji
        Serial.println("Pole twojego prostokąta to: " + String(poleProstokat) + " [mm^2]");
      
    } else if (figura == "t")
    { //jesli wybieramy trójkąt

        Serial.println("Podaj wysokość."); //prosimy użytkownika o podanie wysokości
        czekaj();

        if (Serial.available() > 0)
        { //odczytanie wartości podanej przez użytkownika
            wysokosc = Serial.readStringUntil('\n');
            wysokoscINT = wysokosc.toInt();
        }

        Serial.println("Podaj dlugość podstawy.");
        czekaj();

        if (Serial.available() > 0)
        { //odczytanie wartosci podanej przez użytkownika
            dlugoscBoku1 = Serial.readStringUntil('\n');
            dlugoscBoku1INT = dlugoscBoku1.toInt();
        }

        double poleTrojkat = trojkat(dlugoscBoku1INT, wysokoscINT); //obliczenie pola za pomoca funkcji
        Serial.println("Pole twojego trójkąta to: " + String(poleTrojkat) + " [mm^2]");
        
    } else
    {
        Serial.println("Podałeś zły argument!");
    }


}

int prostokat(int a, int b)
{ //funkcja odpowiedzialna za obliczanie pola kwardratu
    int poleProstokat = 0;
    poleProstokat = a * b;

    return poleProstokat;
}

double kolo(double r)
{ //funkcja odpowiedzialna za obliczanie pola kola
    double poleKolo = 0;
    poleKolo = 3.14 * r * r;

    return poleKolo;
}

double trojkat(double a, double h)
{ //funkcja odpowiedzialna za obliczanie pola trojkata 
    double poleTrojkat = 0;
    poleTrojkat = 0.5 * a * h;

    return poleTrojkat;
}

void czekaj()
{
    while (Serial.available() == 0)
    {
        delay(50);
    }
}

9.2. program z funkcją umożliwiającą zdefiniowanie pinu, na którym znajduje się dioda, czas przez jaki dioda ma świeci, czas przez jaki dioda ma być wyłączona oraz ile razy sekwnencja ma się powtórzyć. 

void setup()
{
        zamigajLED(3, 2000, 1000, 5);
        zamigajLED(13, 2000, 1000, 5);
}

void loop()
{


}

void zamigajLED(int PIN, int czasWlaczenia, int czasWylaczenia, int ile)
{
    pinMode(PIN, OUTPUT); //konfiguracja pinu wyjscia
    for (int a = 0; a < ile; a++)
    {
        digitalWrite(PIN, HIGH); // zapalenie diody
        delay(czasWlaczenia); //wlaczenie na okreslony czas
        digitalWrite(PIN, LOW); //wylaczenie diody
        delay(czasWylaczenia); //wylaczenie na okreslony czas
       
    }
       
}

9.3. Tutaj zbudowałem sobie prosty czujnik parkowania. Użyłem tutaj również buzzera, którego częstotliwość pikania jest zależna od odległości w jakiej znajduje się przedmiot. 

#define czerwona1 3
#define czerwona2 2
#define zolta1 5
#define zolta2 4
#define zielona1 7
#define zielona2 6
#define buzzer 8
#define echo 11
#define trigger 12

void setup()
{
    pinMode(czerwona1, OUTPUT); //deklaracja pinów dla ledów
    pinMode(czerwona2, OUTPUT);
    pinMode(zolta1, OUTPUT);
    pinMode(zolta2, OUTPUT);
    pinMode(zielona1, OUTPUT);
    pinMode(zielona2, OUTPUT);
    pinMode(buzzer, OUTPUT);
    pinMode(echo, INPUT);
    pinMode(trigger, OUTPUT);

    Serial.begin(9600); //rozpoczęcie komunikacji z PC

    

}

void loop()
{
    

    if (zmierzOdleglosc() > 60)
    { //jesli powyzej metra
        diod0(); //wywołaj funkcje diod0
    } else if ((zmierzOdleglosc() <= 60) && (zmierzOdleglosc() > 50))
    { //jesli odleglosc w pierwszym zakresie
        diod1();
    } else if ((zmierzOdleglosc() <= 50) && (zmierzOdleglosc() > 40))
    { //jesli odlegosc w drugim zakresie
        diod2();
    } else if ((zmierzOdleglosc() <=40) && (zmierzOdleglosc() > 30))
    { //jesli odlegloscw trzecim zakresie
        diod3();
    } else if ((zmierzOdleglosc() <= 30) && (zmierzOdleglosc() > 20))
    { //jesli odlegosc w czwartym zakresie
        diod4();
    } else if ((zmierzOdleglosc() <= 20) && (zmierzOdleglosc() > 10))
    { //jesli odlegosc w piatym zakresie
        diod5();
    } else if (zmierzOdleglosc() <= 10)
    { //jeśli odległość w szóstym zakresie
        diod6();
    }

    delay(100);

}

void pikanieBuzzera(int czas)
{ //funkcja odpowiedzialna za pikanie buzzera
    digitalWrite(buzzer, HIGH);
    delay(czas);
    digitalWrite(buzzer, LOW);
    delay(czas);
}

void diod0()
{ //wszystkie zgaszone
    digitalWrite(zielona1, LOW);
    digitalWrite(zielona2, LOW);
    digitalWrite(zolta1, LOW);
    digitalWrite(zolta2, LOW);
    digitalWrite(czerwona1, LOW);
    digitalWrite(czerwona2, LOW);
}

void diod1()
{ //jedna zielona
    digitalWrite(zielona1, HIGH);
    digitalWrite(zielona2, LOW);
    digitalWrite(zolta1, LOW);
    digitalWrite(zolta2, LOW);
    digitalWrite(czerwona1, LOW);
    digitalWrite(czerwona2, LOW);
}

void diod2()
{ //dwie zielone
    digitalWrite(zielona1, HIGH);
    digitalWrite(zielona2, HIGH);
    digitalWrite(zolta1, LOW);
    digitalWrite(zolta2, LOW);
    digitalWrite(czerwona1, LOW);
    digitalWrite(czerwona2, LOW);
    pikanieBuzzera(1000);
}

void diod3()
{ //dwie zielone, jedna zolta
    digitalWrite(zielona1, HIGH);
    digitalWrite(zielona2, HIGH);
    digitalWrite(zolta1, HIGH);
    digitalWrite(zolta2, LOW);
    digitalWrite(czerwona1, LOW);
    digitalWrite(czerwona2, LOW);
    pikanieBuzzera(600);
}

void diod4()
{ //dwie zielone, dwie zolte
    digitalWrite(zielona1, HIGH);
    digitalWrite(zielona2, HIGH);
    digitalWrite(zolta1, HIGH);
    digitalWrite(zolta2, HIGH);
    digitalWrite(czerwona1, LOW);
    digitalWrite(czerwona2, LOW);
    pikanieBuzzera(400);
}

void diod5()
{ //dwie zielone, dwie zolte, jedna czerwona
    digitalWrite(zielona1, HIGH);
    digitalWrite(zielona2, HIGH);
    digitalWrite(zolta1, HIGH);
    digitalWrite(zolta2, HIGH);
    digitalWrite(czerwona1, HIGH);
    digitalWrite(czerwona2, LOW);
    pikanieBuzzera(150);
}

void diod6()
{ //wszystkie
    digitalWrite(zielona1, HIGH);
    digitalWrite(zielona2, HIGH);
    digitalWrite(zolta1, HIGH);
    digitalWrite(zolta2, HIGH);
    digitalWrite(czerwona1, HIGH);
    digitalWrite(czerwona2, HIGH);
    digitalWrite(buzzer, HIGH);
}

int zmierzOdleglosc()
{ //funkcja do pomiaru odległosci

    long czas, dystans; //deklaracja zmiennych

    digitalWrite(trigger, LOW);
    delayMicroseconds(2);
    digitalWrite(trigger, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigger, LOW);

    czas = pulseIn(echo, HIGH); //odczytanie czasu potrzebnego na odbicie i powrot dźwięku
    dystans = czas / 58; //przeliczenie czasu na dystans

    return dystans;
}

Film z działania czujnika: 

Zestaw do drugiej części kursu już leży i czeka na swoją kolej 🙂

  • Lubię! 2
Link do komentarza
Share on other sites

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.