Skocz do zawartości

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


Komentator

Pomocna odpowiedź

7 minut temu, kaminski-tomek napisał:

Ktoś wie, o co może chodzić? Czujnik uszkodzony? Oczywiście pochodzi z zestawu dedykowanego dla kursu.

Program jest OK, czujnik reaguje prawidłowo. Może któreś połączenia na płytce stykowej nie łączą? Jeżeli masz przewody F/M podłącz czujnik bez pośrednictwa płytki, bo to najpewniej wadliwy element 😉 Jak nie to czujnik nawala, albo kabelki są źle wpięte.

Link do komentarza
Share on other sites

1 godzinę temu, H1M4W4R1 napisał:

Program jest OK, czujnik reaguje prawidłowo. Może któreś połączenia na płytce stykowej nie łączą? Jeżeli masz przewody F/M podłącz czujnik bez pośrednictwa płytki, bo to najpewniej wadliwy element 😉 Jak nie to czujnik nawala, albo kabelki są źle wpięte.

Dzięki za odpowiedź. Niestety nie mam oscyloskopu, żeby dokładnie zbadać odpowiedź czujnika 😞

To co udało mi się ustalić:
1. to nie kwestia Arduino - kiedy przełączyłem się na płytkę Arduino Leonardo, problem pozostał ten sam (chociaż wyświetlana wartość minimalnie się różniła)
2. przewody są połączone prawidłowo, dodatkowo miernikiem upewniłem się, że każdy z nich przewodzi
3. między Vcc i Gnd na czujniku na pewno jest 5V - sprawdzone multimetrem
4. myślałem, że może miałem ustawiony nieprawidłowy programator, ale nic z tego - próbowanie innych programatorów nie przyniosło efektu

 

Link do komentarza
Share on other sites

@kaminski-tomek chyba niestety trafiłeś na uszkodzony element, nie pamiętam, aby kiedykolwiek był problem z tymi czujnikami, ale różnie bywa 🙂 Zgłoś sprawę do sprzedawcy (czyli zapewne do Botlandu), a na pewno szybko uda się wymienić czujnik na nowy. Mam nadzieję, że dalej obejdzie się już bez takich komplikacji!

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

Mój projekt oparty o rejestr przesuwny, diody led , buzzer i czujnik odległości:

int Trig = 7;  
int Echo = 6;  
int POMIAR;        
long CZAS;   

const int SER = 8;
const int LATCH = 9;
const int CLK = 10;

int minVal = 4;

int maxVal = 12;


int vals[9] = {255,127,63,31,15,7,3,1,0};
 
void setup()
{              
  pinMode(Trig, OUTPUT);                    
  pinMode(Echo, INPUT);  

  pinMode(SER, OUTPUT);
  pinMode(LATCH, OUTPUT);
  pinMode(CLK, OUTPUT);  

  pinMode(2, OUTPUT);
}
  
void loop()
{
  pomiar_odleglosci();     
  int distance = POMIAR;
  distance = map(POMIAR,minVal,maxVal,0,8);
  distance = constrain(distance,0,8);

  digitalWrite(LATCH, LOW);
  shiftOut(SER, CLK, MSBFIRST, vals[distance]);
  digitalWrite(LATCH, HIGH);
  delay(10);

if(POMIAR <= minVal){
  digitalWrite(2,HIGH);
    delay(200);
  digitalWrite(2,LOW);
   delay(200);
  }
  else
  digitalWrite(2,LOW);
}
  
void pomiar_odleglosci ()
{
  digitalWrite(Trig, LOW);       
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH);      
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);
  digitalWrite(Echo, HIGH); 
  CZAS = pulseIn(Echo, HIGH);
  POMIAR = CZAS / 58;           
}

 

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

Przedostatnia lekcja zakończona sukcesem 💪

Gdyby ktoś potrzebował pomocy, poniżej podrzucam własne spostrzeżenia oraz działające kody programów do zadań domowych 😉

1️⃣ Zadanie domowe 9.1

Wykonując to zadanie należy pamiętać, aby połączyć diodę z pinem PWM (~):

void setup() {
  pinMode(11, OUTPUT);                //Sygnał PWM
}

void loop() {
  zamigajLED();
}

void zamigajLED() {

  int i = 0;
  
  for (int i = 0; i <= 255; i++) {
    analogWrite(11, i);               //Spokojne rozjaśnianie diody
    delay(25);
  }
  for (int i = 255; i >= 0; i--){     //Spokojne przygaszanie diody
    analogWrite(11, i);
    delay(25);
  }
}

2️⃣ Zadanie domowe 9.2

void setup() {
  pinMode(13, OUTPUT);
  zamigaj_LED(1000, 500, 7);
}
 
void loop() {
  
}
 
void zamigaj_LED(int czas_ON, int czas_OFF, int ile) {
  
  for (int i = 0; i < ile; i++) {
    digitalWrite(13, HIGH);
    delay(czas_ON);
    digitalWrite(13, LOW);
    delay(czas_OFF);
  }
}

3️⃣ Zadanie domowe 9.3

W tym przypadku postanowiłem napisać kod obliczający pole prostokąta. Dzięki drobnym modyfikacjom spokojnie można uzyskać dowolny kalkulator pola wybranej figury. Wystarczy delikatnie przekształcić podany szkic:

String odebraneDaneA = "";
String odebraneDaneB = "";

int DaneA = 0;
int DaneB = 0;

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

void loop() {
  Serial.println("Kalkulator pola prostokata");
  Serial.println();
  Serial.println("Podaj dlugosc boku A");

  while (Serial.available() == 0) {} //Czekaj do momentu podania liczby
  delay(50);
  
  if(Serial.available() > 0) {
    odebraneDaneA = Serial.readStringUntil('\n');
    DaneA = odebraneDaneA.toInt();
  }
  Serial.print("Dlugosc boku A: ");
  Serial.println(DaneA);
  Serial.println();
  Serial.println("Podaj dlugosc boku B");

  while (Serial.available() == 0) {} //Czekaj do momentu podania liczby
  delay(50);

  if(Serial.available() > 0) {
    odebraneDaneB = Serial.readStringUntil('\n');
    DaneB = odebraneDaneB.toInt();
  }
  Serial.print("Dlugosc boku B: ");
  Serial.println(DaneB);
  Serial.println();

  int wynik = prostokatPole(DaneA, DaneB);
  Serial.print("Pole prostokata: ");
  Serial.println(wynik);
  Serial.println();
  Serial.println("***************************");
  delay(500);
}

int prostokatPole(int a, int b) {
  int wynik = 0;
  wynik = a * b;

  return wynik;
}

4️⃣ Zadanie domowe 9.4

#define trigPin 12
#define echoPin 11

#define dioda_zielona_A 7
#define dioda_zielona_B 6
#define dioda_zolta_A 5
#define dioda_zolta_B 4
#define dioda_czerwona_A 3
#define dioda_czerwona_B 2

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  pinMode(dioda_zielona_A, OUTPUT);
  pinMode(dioda_zielona_B, OUTPUT);
  pinMode(dioda_zolta_A, OUTPUT);
  pinMode(dioda_zolta_B, OUTPUT);
  pinMode(dioda_czerwona_A, OUTPUT);
  pinMode(dioda_czerwona_B, OUTPUT);
}

void loop() {
  Serial.print(zmierzOdleglosc());
  Serial.println(" cm");
  delay(10);

  if(zmierzOdleglosc() >= 60) {
    digitalWrite(dioda_zielona_A, LOW);
    digitalWrite(dioda_zielona_B, LOW);
    digitalWrite(dioda_zolta_A, LOW);
    digitalWrite(dioda_zolta_B, LOW);
    digitalWrite(dioda_czerwona_A, LOW);
    digitalWrite(dioda_czerwona_B, LOW);
    delay(10);
  }
  
  if((zmierzOdleglosc() < 60) && (zmierzOdleglosc() > 50)) {
    digitalWrite(dioda_zielona_A, HIGH);
    
    digitalWrite(dioda_zielona_B, LOW);
    digitalWrite(dioda_zolta_A, LOW);
    digitalWrite(dioda_zolta_B, LOW);
    digitalWrite(dioda_czerwona_A, LOW);
    digitalWrite(dioda_czerwona_B, LOW);
    delay(10);
  }
  
  if((zmierzOdleglosc() <= 50) && (zmierzOdleglosc() > 40)) {
    digitalWrite(dioda_zielona_A, HIGH);
    digitalWrite(dioda_zielona_B, HIGH);
    
    digitalWrite(dioda_zolta_A, LOW);
    digitalWrite(dioda_zolta_B, LOW);
    digitalWrite(dioda_czerwona_A, LOW);
    digitalWrite(dioda_czerwona_B, LOW);
    delay(10);
  }
  
  if((zmierzOdleglosc() <= 40) && (zmierzOdleglosc() > 30)) {
    digitalWrite(dioda_zielona_A, HIGH);
    digitalWrite(dioda_zielona_B, HIGH);
    digitalWrite(dioda_zolta_A, HIGH);
    
    digitalWrite(dioda_zolta_B, LOW);
    digitalWrite(dioda_czerwona_A, LOW);
    digitalWrite(dioda_czerwona_B, LOW);
    delay(10);
  }
  
  if((zmierzOdleglosc() <= 30) && (zmierzOdleglosc() > 20)) {
    digitalWrite(dioda_zielona_A, HIGH);
    digitalWrite(dioda_zielona_B, HIGH);
    digitalWrite(dioda_zolta_A, HIGH);
    digitalWrite(dioda_zolta_B, HIGH);
    
    digitalWrite(dioda_czerwona_A, LOW);
    digitalWrite(dioda_czerwona_B, LOW);
    delay(10);
  }
  
  if((zmierzOdleglosc() <= 20) && (zmierzOdleglosc() > 10)) {
    digitalWrite(dioda_zielona_A, HIGH);
    digitalWrite(dioda_zielona_B, HIGH);
    digitalWrite(dioda_zolta_A, HIGH);
    digitalWrite(dioda_zolta_B, HIGH);
    digitalWrite(dioda_czerwona_A, HIGH);
    
    digitalWrite(dioda_czerwona_B, LOW);
    delay(10);
    }

  if((zmierzOdleglosc() <= 10)) {
    digitalWrite(dioda_zielona_A, HIGH);
    digitalWrite(dioda_zielona_B, HIGH);
    digitalWrite(dioda_zolta_A, HIGH);
    digitalWrite(dioda_zolta_B, HIGH);
    digitalWrite(dioda_czerwona_A, HIGH);
    digitalWrite(dioda_czerwona_B, HIGH);
    delay(10);
    } 
}

int zmierzOdleglosc() {
  long czas;
  long dystans;

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

  czas = pulseIn(echoPin, HIGH);
  dystans = czas / 58;

  return dystans;
}

5️⃣ Zadanie domowe 9.5

Badając zmienność odczytu czujnika w zależności od materiału, zauważyłem, że wybierając przedmioty "miękkie" takie jak np. odzież, otrzymamy lekko zakłamany wynik wskazujący na większą odległość niż wynik sugerowany przez przedmioty "twarde" typu ściany budynku 📊

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


```cpp
boolean resetProgramu = 0;  //resetowanie programu
String odebraneDaneA = "";  // odebraneDane boku a
String odebraneDaneB = "";  // odebraneDane boku b
String odebraneDaneH = "";  //odebraneDane wysokosci
String odebraneDaneR = "";  //odebraneDane promienia

int wybor = 0;      //pusty ciag odebranych danych
float wymiarA = 0;  //wymiar najkrotszego boku
float wymiarB = 0;  //wymiar najdluzszego boku
float wymiarH = 0;  //wymiar wysokosci
float wymiarR = 0;  //wymiar promienia

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (resetProgramu == 0) {  //Jezeli zresetowano program to zacznij tutaj
    Serial.println("Witaj obliczymy pola kwadrat, prostokata, kola i trojkata!");
    delay(1000);
    Serial.println("Wybierz pole figury, ktorej chcesz obliczyc:");
    delay(1000);
    Serial.println("Jezeli wybierasz kwadrat napisz: K");
    Serial.println("Jezeli wybierasz prostokat napisz: P");
    Serial.println("Jezeli wybierasz kolo napisz: O");
    Serial.println("Jezeli wybierasz trojkat napisz: T");
    resetProgramu = 1;
  }
  if (Serial.available() > 0) {  //jezeli oodebrano dane
    wybor = Serial.read();       //odczytaj je do pierwszego znaku
  }
  switch (wybor) {  //wartosc do sprawdzenia
    case 'K':       //pole kwadratu
      Serial.println("Wybrano pole kwadratu!");
      delay(1000);
      Serial.println("Podaj wymiar boku a:");
      while (Serial.available() == 0) {}                      //poczekaj na podanie danych
      if (Serial.available() > 0) {                           //jezeli odebrano dane
        String odebraneDaneA = Serial.readStringUntil('\n');  //przeczytaj je do konca znaku i zapisz w zmiennej odebraneDaneA
        wymiarA = odebraneDaneA.toFloat();                    //przekonwertuj odebrane dane na zmienna float
        delay(200);
        Serial.println("Podany wymiar boku a:" + String(wymiarA));
        float wynik1 = poleKwadratu(wymiarA);
        Serial.println("Pole kwadratu wynosi:" + String(wynik1));
      }
      resetProgramu = 0;  //zresetuj program
      wybor = 0;          //wartosc do sprawdzenia
      wymiarA = 0;        // zresetuj wymiar boku a
      break;              //zakoncz case K

    case 'P':
      Serial.println("Wybrano pole prostokata!");
      delay(1000);
      Serial.println("Podaj wymiar krotszego boku a: ");
      while (Serial.available() == 0) {}                      //czekamy na podanie danych
      if (Serial.available() > 0) {                           //jezeli odebrano dane
        String odebraneDaneA = Serial.readStringUntil('\n');  //odczytaj je do znaku konca lini i zapisz w zmiennej odebraneDaneA
        wymiarA = odebraneDaneA.toFloat();                    //przekonwertuj odebraneDaneA na zmienna float
        Serial.println("Podaj wymiar dluzszego boku b: ");
        while (Serial.available() == 0) {}                      // czekamy na podanie danych
        if (Serial.available() > 0) {                           //jezeli odebralo dane
          String odebraneDaneB = Serial.readStringUntil('\n');  //odczytaj je do znaku konca lini i zapisz w zmiennej odebraneDaneB
          float wymiarB = odebraneDaneB.toFloat();              //przekonwertuj odebraneDaneB na zmienna float
          Serial.println("Podany wymiar boku a wynosi:" + String(wymiarA));
          Serial.println("Podany wymiar boku b wynosi:" + String(wymiarB));
          float wynik2 = poleProstokata(wymiarA, wymiarB);
          Serial.println("Pole prostokata wynosi:" + String(wynik2));
        }
      }
      resetProgramu = 0;  //zresetuj program
      wybor = 0;          //wartosc do sprawdzenia
      wymiarA = 0;        // zresetuj wymiar boku a
      wymiarB = 0;        //zresetuj wymiar boku b
      break;              //zakoncz case P

    case 'O':
      Serial.println("Wybrano pole kola!");
      delay(1000);
      Serial.println("Podaj wymiar promienia: ");
      while (Serial.available() == 0) {}                      //czekamy na podanie danych
      if (Serial.available() > 0) {                           //jezeli odebrano dane
        String odebraneDaneR = Serial.readStringUntil('\n');  //to odczytaj je do konca lini i zapisz w zmiennej odebraneDaneR
        float wymiarH = odebraneDaneR.toFloat();              //przekonwertuj odebraneDaneR na zmienna float
        delay(200);
        Serial.println("Podana dlugosc promienia wynosi:" + String(wymiarR));
        float wynik3 = poleKola(wymiarR);
        Serial.println("Pole kola wynosi:" + String(wynik3));
      }
      resetProgramu = 0;  //zresetuj program
      wybor = 0;          //wartosc do sprawdzenia
      wymiarR = 0;        //zresetuj wymiar promienia
      break;              //zakoncz case O

    case 'T':
      Serial.println("Wybrano pole trojkata!");
      delay(1000);
      Serial.println("Podaj dlugosc podstawy trojkata: ");
      while (Serial.available() == 0) {}                      //czekamy na podanie danych
      if (Serial.available() > 0) {                           //jezeli odebrano dane
        String odebraneDaneA = Serial.readStringUntil('\n');  //to odczytajje do znaku konca lini i zapisz w zmiennaej odebraneDaneA
        float wymiarA = odebraneDaneA.toFloat();              //przekonwertuj odebraneDaneA na zmienna float
        delay(200);
        Serial.println("Podaj wysokosc trojkata: ");
        while (Serial.available() == 0) {}                      //czekamy na odebranie danych
        if (Serial.available() > 0) {                           //jezeli odebrano dane
          String odebraneDaneH = Serial.readStringUntil('\n');  //to odczytaj je do znaku konca lini i zapisz w zmiennej odebraneDaneH
          float wymiarH = odebraneDaneH.toFloat();              //przekonwertuj odebraneDaneH na zmienna float
          delay(200);
          Serial.println("Podana dlugosc podstawy wynosi:" + String(wymiarA));
          Serial.println("Podana dlugosc wysokosci wynosi:" + String(wymiarH));
          float wynik4 = poleTrojkata(wymiarA, wymiarH);
          Serial.println("Pole trojkata wynosi:" + String(wynik4));
        }
      }
      resetProgramu = 0;  //zresetuj program
      wybor = 0;          //wartosc do sprawdzenia
      wymiarA = 0;        //zresetuj wymiar boku a
      wymiarH = 0;        //zresetuj wysokosc
      break;              //zakoncz case T
  }
  delay(50);
}



float poleKwadratu(float wymiarA) {
  float wynik1 = wymiarA * wymiarA;
  return wynik1;
}

float poleProstokata(float wymiarA, float wymiarB) {
  float wynik2 = wymiarA * wymiarB;
  return wynik2;
}

float poleKola(float wymiarR) {
  float wynik3 = PI * wymiarR * wymiarR;
  return wynik3;
}

float poleTrojkata(float wymiarA, float wymiarH) {
  float wynik4 = 1 / 2 * wymiarA * wymiarH;
  return wynik4;
}

Hej, mój kod wygląda następująco, ale mam problem, bo pętla while nie działa, nie zatrzymuje programu żebym mógł podać konkretne wartości tylko z automatu moje wartości to 0 i wynik też jest 0. Co mogę ewentualnie poprawić 

Link do komentarza
Share on other sites

W linii

    wybor = Serial.read();       //odczytaj je do pierwszego znaku

odczytujesz tylko jeden bajt, a pozostałe (CR, LF - w zależności ustawienia terminala) pozostają w buforze.

Tak więc do pętli while() dochodzimy mając już coś buforze (np. znak nowej linii), a więc:

Serial.available() > 0 , program idzie dalej, przekształca zawartość bufora w pusty String (bo są w nim tylko znaki sterujące), któremu po przekształceniu do float odpowiada wartość 0.0.

Należy więc tuż przed instrukcją case wyczyścić bufor np. tak: 

  while (Serial.available() > 0) {Serial.read();}

Dodatkowo, na początek:

  • czy jest potrzeba instrukcja if() występująca zaraz po instrukcji while()?
  • zapoznaj się z funkcją Serial.parseFloat()
  • Twoje funkcje do obliczeń mogą wyglądać prościej:
float poleProstokata(float wymiarA, float wymiarB) {
  return wymiarA * wymiarB;
}

 

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

@jand

boolean resetProgramu = 0;  //resetowanie programu
String odebraneDaneA = "";  // odebraneDane boku a
String odebraneDaneB = "";  // odebraneDane boku b
String odebraneDaneH = "";  //odebraneDane wysokosci
String odebraneDaneR = "";  //odebraneDane promienia

int wybor = 0;      //pusty ciag odebranych danych
float wymiarA = 0;  //wymiar najkrotszego boku
float wymiarB = 0;  //wymiar najdluzszego boku
float wymiarH = 0;  //wymiar wysokosci
float wymiarR = 0;  //wymiar promienia

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (resetProgramu == 0) {  //Jezeli zresetowano program to zacznij tutaj
    Serial.println("Witaj obliczymy pola kwadrat, prostokata, kola i trojkata!");
    delay(1000);
    Serial.println("Wybierz pole figury, ktorej chcesz obliczyc:");
    delay(1000);
    Serial.println("Jezeli wybierasz kwadrat napisz: K");
    Serial.println("Jezeli wybierasz prostokat napisz: P");
    Serial.println("Jezeli wybierasz kolo napisz: O");
    Serial.println("Jezeli wybierasz trojkat napisz: T");
    resetProgramu = 1;
  }
    if (Serial.available() > 0) {  //jezeli oodebrano dane
    wybor = Serial.read();       //odczytaj je do pierwszego znaku
    }
  switch (wybor) {  //wartosc do sprawdzenia
    case 'K':       //pole kwadratu
    while (Serial.available() > 0) {Serial.read();}           //podczas gdy odebrano dane przeczytaj do pierwszego znaku
      Serial.println("Wybrano pole kwadratu!");
      delay(1000);
      Serial.println("Podaj wymiar boku a:");
      while (Serial.available() == 0) { }                      //poczekaj na podanie danych
      delay(1000);
      if (Serial.available() > 0) {                           //jezeli odebrano dane
        String odebraneDaneA = Serial.readStringUntil('\n');  //przeczytaj je do konca znaku i zapisz w zmiennej odebraneDaneA
        wymiarA = odebraneDaneA.toFloat();                    //przekonwertuj odebrane dane na zmienna float
        delay(200);
        Serial.println("Podany wymiar boku a:" + String(wymiarA));
        Serial.println("Pole kwadratu wynosi:" + String(poleKwadratu(wymiarA)));
      }
      resetProgramu = 0;  //zresetuj program
      wybor = 0;          //wartosc do sprawdzenia
      wymiarA = 0;        // zresetuj wymiar boku a
      break;              //zakoncz case K

    case 'P':
    while (Serial.available() > 0) {Serial.read();}           //podczas gdy odebrano dane przeczytaj do pierwszego znaku
      Serial.println("Wybrano pole prostokata!");
      delay(1000);
      Serial.println("Podaj wymiar krotszego boku a: ");
      while (Serial.available() == 0) { }                      //czekamy na podanie danych
      if (Serial.available() > 0) {                           //jezeli odebrano dane
        String odebraneDaneA = Serial.readStringUntil('\n');  //odczytaj je do znaku konca lini i zapisz w zmiennej odebraneDaneA
        wymiarA = odebraneDaneA.toFloat();                    //przekonwertuj odebraneDaneA na zmienna float
        Serial.println("Podaj wymiar dluzszego boku b: ");
        while (Serial.available() == 0) {}                      // czekamy na podanie danych
        if (Serial.available() > 0) {                           //jezeli odebralo dane
          String odebraneDaneB = Serial.readStringUntil('\n');  //odczytaj je do znaku konca lini i zapisz w zmiennej odebraneDaneB
          float wymiarB = odebraneDaneB.toFloat();              //przekonwertuj odebraneDaneB na zmienna float
          Serial.println("Podany wymiar boku a wynosi:" + String(wymiarA));
          Serial.println("Podany wymiar boku b wynosi:" + String(wymiarB));
          Serial.println("Pole prostokata wynosi:" + String(poleProstokata(wymiarA,wymiarB)));
        }
      }
      resetProgramu = 0;  //zresetuj program
      wybor = 0;          //wartosc do sprawdzenia
      wymiarA = 0;        // zresetuj wymiar boku a
      wymiarB = 0;        //zresetuj wymiar boku b
      break;              //zakoncz case P

    case 'O':
    while (Serial.available() > 0) {Serial.read();}           //podczas gdy odebrano dane przeczytaj do pierwszego znaku
      Serial.println("Wybrano pole kola!");
      delay(1000);
      Serial.println("Podaj dlugosc promienia: ");
      while (Serial.available() == 0) {}                      //czekamy na podanie danych
      if (Serial.available() > 0) {                           //jezeli odebrano dane
        String odebraneDaneR = Serial.readStringUntil('\n');  //to odczytaj je do konca lini i zapisz w zmiennej odebraneDaneR
        float wymiarR = odebraneDaneR.toFloat();              //przekonwertuj odebraneDaneR na zmienna float
        delay(200);
        Serial.println("Podana dlugosc promienia wynosi:" + String(wymiarR));
        Serial.println("Pole kola wynosi:" + String(poleKola(wymiarR)));
      }
      resetProgramu = 0;  //zresetuj program
      wybor = 0;          //wartosc do sprawdzenia
      wymiarR = 0;        //zresetuj wymiar promienia
      break;              //zakoncz case O

    case 'T':
    while (Serial.available() > 0) {Serial.read();}           //podczas gdy odebrano dane przeczytaj do pierwszego znaku
      Serial.println("Wybrano pole trojkata!");
      delay(1000);
      Serial.println("Podaj dlugosc podstawy trojkata: ");
      while (Serial.available() == 0) {}                      //czekamy na podanie danych
      if (Serial.available() > 0) {                           //jezeli odebrano dane
        String odebraneDaneA = Serial.readStringUntil('\n');  //to odczytajje do znaku konca lini i zapisz w zmiennaej odebraneDaneA
        float wymiarA = odebraneDaneA.toFloat();              //przekonwertuj odebraneDaneA na zmienna float
        delay(200);
        Serial.println("Podaj wysokosc trojkata: ");
        while (Serial.available() == 0) {}                      //czekamy na odebranie danych
        if (Serial.available() > 0) {                           //jezeli odebrano dane
          String odebraneDaneH = Serial.readStringUntil('\n');  //to odczytaj je do znaku konca lini i zapisz w zmiennej odebraneDaneH
          float wymiarH = odebraneDaneH.toFloat();              //przekonwertuj odebraneDaneH na zmienna float
          delay(200);
          Serial.println("Podana dlugosc podstawy wynosi:" + String(wymiarA));
          Serial.println("Podana dlugosc wysokosci wynosi:" + String(wymiarH));
          Serial.println("Pole trojkata wynosi:" + String(poleTrojkata(wymiarA,wymiarH)));
        }
      }
      resetProgramu = 0;  //zresetuj program
      wybor = 0;          //wartosc do sprawdzenia
      wymiarA = 0;        //zresetuj wymiar boku a
      wymiarH = 0;        //zresetuj wysokosc
      break;              //zakoncz case T
  }
  delay(50);
}



float poleKwadratu(float wymiarA) {
   return wymiarA * wymiarA;
}

float poleProstokata(float wymiarA, float wymiarB) {
  return wymiarA * wymiarB;
}

float poleKola(float wymiarR) {
  return PI * wymiarR * wymiarR;
}

float poleTrojkata(float wymiarA, float wymiarH) {
  return 0.50* wymiarA * wymiarH;
}

Dziękuję za pomoc i cenne wskazówki, poprawiłem funkcje do obliczeń na bardziej czytelne, gdybyś mógł jeszcze podać mi przykład z funkcją Serial.parseFloat() to byłbym wdzięczny 😉 

Link do komentarza
Share on other sites

1 godzinę temu, lukasz957 napisał:

gdybyś mógł jeszcze podać mi przykład z funkcją Serial.parseFloat() to byłbym wdzięczny 😉 

Miałem nadzieję, że po przeczytaniu opisu tej funkcji dasz sobie radę...

Zamiast np.:

        String odebraneDaneA = Serial.readStringUntil('\n');  //to odczytajje do znaku konca lini i zapisz w zmiennaej odebraneDaneA
        float wymiarA = odebraneDaneA.toFloat();              //przekonwertuj odebraneDaneA na zmienna float

Wstaw:

float wymiarA = Serial.parseFloat();

 

Edytowano przez jand
Link do komentarza
Share on other sites

9.2 

zauważyłem, że jeżeli czas jest za mały to diody lubią świecić słabiej, to tylko moja obserwacja 

Kod do 9.2:

void setup() {
  zamigajLED(1000, 500, 6, 8);
}
void zamigajLED(int czas_on,int czas_off, int ile, int pin){

  for(int i=0; i < ile; i++){
    pinMode(pin, OUTPUT);
    digitalWrite(pin, HIGH);
    delay(czas_on);
    digitalWrite(pin, LOW);
    delay(czas_off);
  }
}
void loop() {
  
}

 

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

18 godzin temu, Rychu2115 napisał:

zauważyłem, że jeżeli czas jest za mały to diody lubią świecić słabiej, to tylko moja obserwacja 

Tak, gdy diody migają bardzo szybko to bezwładność ludzkiego oka sprawia, że wydaje się nam, że świecą one słabiej - w praktyce nadal jednak migają 😉

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

Zadanie 9.1 z wykorzystaniem for(). Pozwoliłem sobie dodać połączenie z komputerem do odczytania wartości 😀

int wypelnienie = 0;

void setup() {
  Serial.begin(9600); //rozpoczęcie komunikacji z komputerem
  pinMode(11, OUTPUT); //wyjscie na pin 11 z opcją PWM
}

void loop() {
  zamigajLED(); //zapętlenie całej pętli zamigajLED()
}

void zamigajLED() {

  for (int wypelnienie = 0; wypelnienie < 25; wypelnienie++ ) { //Ustawienie parametrów dla funkcji for(), (od zera do 25, za kazdym razem dodaj o 1)
    analogWrite(11, wypelnienie); //ustawienie pinu 11 na zmianę wartości
    delay(50); //ustawienie pinu 11 na zmianę wartości
    Serial.println(wypelnienie); //wyświetlenie komunikatu o aktualnej wartości wypelnienia

  }


    for (int wypelnienie = 25; wypelnienie >= 0; wypelnienie--) { //Ustawienie parametrów dla funkcji for(), (od 25 do 0, za kazdym razem odejmij o 1)
      analogWrite(11, wypelnienie); //ustawienie pinu 11 na zmianę wartości
      delay(50); //ustawienie pinu 11 na zmianę wartości
      Serial.println(wypelnienie); //wyświetlenie komunikatu o aktualnej wartości wypelnienia
    }
  
}

 

  • Lubię! 1
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.