Skocz do zawartości

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


Pomocna odpowiedź

int trigPin = 12;
int echoPin = 11;
int green1 = 3;
int green2 = 7;
int red1 = 5;
int red2 = 2;
int yellow1 = 6;
int yellow2 = 4;
void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(2, OUTPUT);
  pinMode(green1, OUTPUT);  //zielona
  pinMode(green2, OUTPUT);
  pinMode(red1, OUTPUT);  //czerwona
  pinMode(red2, OUTPUT);
  pinMode(yellow1, OUTPUT);
  pinMode(yellow2, OUTPUT);  //żółta
}

void loop() {
  zakresgreen1(6);    //odleglosc 5cm świeci
  zakresgreen2(10);   //odleglosc 10cm świeci
  zakresyellow1(15);  //odleglosc 15cm świeci
  zakresyellow2(20);  //odleglosc 20cm świeci
  zakresred1(25);     //odleglosc 25cm świeci
  zakresred2(30);     //odleglosc 30cm świeci

  Serial.print(zmierzOdleglosc());
  Serial.println(" cm");
  delay(100);
}
int zmierzOdleglosc() {
  long czas, dystans;

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

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

  return dystans;
}

void zakresgreen1(int a) {
  int jakDaleko = zmierzOdleglosc();
  if ((jakDaleko >= a)) {  //jakDaleko większe lub równe 6cm świeci green1
    digitalWrite(green1, HIGH);
  } else {
    digitalWrite(green1, LOW);  //jesli jest mniejsze to gaśnie
  }
}
void zakresgreen2(int b) {
  int jakDaleko = zmierzOdleglosc();
  if ((jakDaleko >= b)) {  //jakDaleko większe lub równe 10cm świeci green2
    digitalWrite(green2, HIGH);
  } else {
    digitalWrite(green2, LOW);  //jesli jest mniejsze to gaśnie
  }
}
void zakresyellow1(int c) {
  int jakDaleko = zmierzOdleglosc();
  if ((jakDaleko >= c)) {  //jakDaleko większe lub równe 15cm świeci yellow1
    digitalWrite(yellow1, HIGH);
  } else {
    digitalWrite(yellow1, LOW);  //jesli jest mniejsze to gaśnie
  }
}
void zakresyellow2(int d) {
  int jakDaleko = zmierzOdleglosc();
  if ((jakDaleko >= d)) {  //jakDaleko większe lub równe 20cm świeci yellow2
    digitalWrite(yellow2, HIGH);
  } else {
    digitalWrite(yellow2, LOW);  //jesli jest mniejsze to gaśnie
  }
}
void zakresred1(int e) {
  int jakDaleko = zmierzOdleglosc();
  if ((jakDaleko >= e)) {  //jakDaleko większe lub równe 25cm świeci red1
    digitalWrite(red1, HIGH);
  } else {
    digitalWrite(red1, LOW);  //jesli jest mniejsze to gaśnie
  }
}
void zakresred2(int f) {
  int jakDaleko = zmierzOdleglosc();
  if ((jakDaleko >= f)) {  //jakDaleko większe lub równe 30cm świeci red2
    digitalWrite(red2, HIGH);
  } else {
    digitalWrite(red2, LOW);  //jesli jest mniejsze to gaśnie
  }
}

Moje rozwiązanie do zadania 9.4 to była super przygoda z nauką lecę poszerzać swoją wiedzę z kursem nr 2 :)))

  • Lubię! 1
  • 4 tygodnie później...
(edytowany)
include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

int trig = 3;
int echo = 2;
int redled = 8;
int yellowled = 9;
int greenled = 10;
int buzzer = 11;

#define NEOPIXEL_PIN 6
#define NUM_PIXELS 30

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXELS, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);

long czas;
int odleglosc;
int poprzednieOdczyty[10];
int indeksOdczytu = 0;

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(redled, OUTPUT);
  pinMode(yellowled, OUTPUT);
  pinMode(greenled, OUTPUT);
  pinMode(buzzer, OUTPUT);
  Serial.begin(9600);

  strip.begin();
  strip.show();

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Odleglosc:");
}

void loop() {
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);

  czas = pulseIn(echo, HIGH);
  odleglosc = czas / 58;

  poprzednieOdczyty[indeksOdczytu] = odleglosc;
  indeksOdczytu = (indeksOdczytu + 1) % 10;
  int sumaOdczytow = 0;
  for (int i = 0; i < 10; i++) {
    sumaOdczytow += poprzednieOdczyty[i];
  }
  odleglosc = sumaOdczytow / 10;

  Serial.print("Odleglosc wynosi: ");
  Serial.print(odleglosc);
  Serial.println(" cm");

  lcd.setCursor(11, 1); // Ustaw kursor po słowie "Odleglosc"
  lcd.print("   "); // Wyczyść poprzednie dane
  lcd.setCursor(11, 1);
  lcd.print(odleglosc);
  lcd.print(" cm"); // Dodaj jednostkę po odległości

  if (odleglosc <= 30) {
    digitalWrite(redled, HIGH);
    digitalWrite(yellowled, LOW);
    digitalWrite(greenled, LOW);
    tone(buzzer, 900);
    for (int i = 0; i < NUM_PIXELS; i++) {
      strip.setPixelColor(i, strip.Color(255, 0, 0));
    }
    strip.show();
  } else if (odleglosc <= 50) {
    digitalWrite(redled, LOW);
    digitalWrite(yellowled, HIGH);
    digitalWrite(greenled, LOW);
    tone(buzzer, 400);
    for (int i = 0; i < NUM_PIXELS; i++) {
      strip.setPixelColor(i, strip.Color(255, 255, 0));
    }
    strip.show();
  } else {
    digitalWrite(redled, LOW);
    digitalWrite(yellowled, LOW);
    digitalWrite(greenled, HIGH);
    noTone(buzzer);
    for (int i = 0; i < NUM_PIXELS; i++) {
      strip.setPixelColor(i, strip.Color(0, 255, 0));
    }
    strip.show();
  }

  delay(100);

Hejka,

Mam delikatną sprawę, zrobiłem czujnik ultradźwiękowy plus wyświetlacz LCD plus diody led, neopixel8 oraz buzzer. Wszystko działa,  podam kod ale moja prośba brzmi czy może mnie ktoś poratować kodem np do Processing abym mógł dostać wizualny obraz tego co wykryje czujnik. Jestem początkującym elektronikiem, wiem że dużo pracy jeszcze przede mną ale taka pomoc na samym początku z pewnością by mi się przydała. Z góry dziękuję a teraz kod:

 

Edytowano przez jnowak
  • 2 miesiące później...

Witam 🙂

Poniżej rozwiązane zadania z obliczania pól:

-koła;

-trójkąta;

-prostokąta;

A na końcu :

-odległość pokazana za pomocą diod + buzzer

Pozdrawiam i dziękuję za świetne artykuły.

 

 

 

Obliczanie pola koła:

String odebraneDaneA = ""; //Pusty ciąg odebranych danych
String odebraneDaneB = "";


void setup()
{
  Serial.begin(9600);
  Serial.println("\nPodaj liczbę a, aby obliczyć pole kola."); //Intro
  Serial.println("Wciśnij enter.");
}

void loop()
{
  if(Serial.available() > 0) //Czy Arduino odebrało dane
  {
    odebraneDaneA = Serial.readStringUntil('\n'); //jeśli tak to odczytaj do końca linii
    double wynik = koloPole(odebraneDaneA.toDouble());
    Serial.print("3.14159");
    Serial.print(" * ");
    Serial.print("(");
    Serial.print(odebraneDaneA);
    Serial.print(" * ");
    Serial.print(odebraneDaneA);
    Serial.print(")");
    Serial.print(" = ");
    Serial.println(wynik); //wyświetl komunikat
  }
}
/*operacja zmiany typu zmiennej na inny oznaczamy rzutowaniem*/

double koloPole(double a)
{ 
  double wynik = 0;
  wynik = 3.14159 * (a*a);

  return wynik;
}

Obliczanie pola trojkata:

String odebraneDaneA = ""; //Pusty ciąg odebranych danych
String odebraneDaneH = "";

boolean prawda = true; //w celu przekierowania do podania kolejnej liczby

void setup()
{
  Serial.begin(9600);
  Serial.println("\nPodaj liczbę a i h, aby obliczyć pole trujkata."); //Intro
  Serial.println("Wciśnij enter, po podaniu każdej liczby");
}

void loop()
{
  if(prawda == true) //jeżeli podany warunek jest spełniony to
  if(Serial.available() > 0) //Czy Arduino odebrało dane
  {
    odebraneDaneA = Serial.readStringUntil('\n'); //jeśli tak to odczytaj do końca linii
    prawda = false;
  }
  if(prawda == false)
  if(Serial.available() > 0)
  {
    odebraneDaneH = Serial.readStringUntil('\n'); //jeśli tak to odczytaj do końca linii
    int wynik = trojkatPole(odebraneDaneA.toInt(), odebraneDaneH.toInt());
  
    Serial.print("(");
    Serial.print(odebraneDaneA);
    Serial.print(" * ");
    Serial.print(odebraneDaneH);
    Serial.print(")");
    Serial.print(" / ");
    Serial.print(" 2 ");
    Serial.print(" = ");
    Serial.println(wynik); //wyświetl komunikat
    prawda = true; //przyjmij true za prawdę, ażeby zacząć obliczanie od początku
  }
}
/*operacja zmiany typu zmiennej na inny oznaczamy rzutowaniem*/

int trojkatPole(int a, int h)
{ 
  int wynik = 0;
  wynik = (a * h) / 2;

  return wynik;
}



Obliczanie pola prostokąta:

String odebraneDaneA = ""; //Pusty ciąg odebranych danych
String odebraneDaneB = "";

boolean prawda = true; //żeby na każde wpisanie liczby był czas
void setup()
{
  Serial.begin(9600);
  Serial.println("\nPodaj dwie liczby, aby obliczyć pole prostokąta."); //Intro
  Serial.println("Po każdej podanej liczbie wciśnij enter.");
}

void loop()
{

  if(prawda == true)
  if(Serial.available() > 0) //Czy Arduino odebrało dane
  {
    odebraneDaneA = Serial.readStringUntil('\n'); //jeśli tak to odczytaj do końca linii
    prawda = false;
  }

  if(prawda == false)
  if(Serial.available() > 0) //Czy Arduino odebrało dane
  {
    odebraneDaneB = Serial.readStringUntil('\n'); //jeśli tak to odczytaj do końca linii
    int wynik = prostokatPole(odebraneDaneA.toInt(), odebraneDaneB.toInt());
    Serial.print(odebraneDaneA);
    Serial.print(" * ");
    Serial.print(odebraneDaneB);
    Serial.print(" = ");
    Serial.println(wynik); //wyświetl komunikat
    prawda = true;
  }
}
/*operacja zmiany typu zmiennej na inny oznaczamy rzutowaniem*/

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

  return wynik;
}



Odległość pokazana za pomocą diod + buzzer

#define trigPin 12
#define echoPin 11

#define redLed1 3
#define redLed2 4
#define yellowLed1 5
#define yellowLed2 6
#define greenLed1 8
#define greenLed2 9 

#define buzzer 2

void setup()
{
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT); //Pin, do którego podłączamy trig jako wyjście
  pinMode(echoPin, INPUT); //a echo, jako wejście

  pinMode(redLed1, OUTPUT); //wyjście diod
  pinMode(redLed2, OUTPUT);
  pinMode(yellowLed1, OUTPUT);
  pinMode(yellowLed2, OUTPUT);
  pinMode(greenLed1, OUTPUT);
  pinMode(greenLed2, OUTPUT);

  pinMode(buzzer, OUTPUT); //wyjście dla buzzera
}

void loop()
{ 
 
  if((zmierzOdleglosc() < 1201) && (zmierzOdleglosc() >= 50)) //jeżeli odległość jest w przedziale od 50 do 1200 to
  {
    digitalWrite(greenLed2, HIGH); //zaświeć czerwone diody
    digitalWrite(greenLed1, HIGH);
    digitalWrite(yellowLed2, LOW);
    digitalWrite(yellowLed1, LOW);
    digitalWrite(redLed2, LOW);
    digitalWrite(redLed1, LOW);
  }
  else if((zmierzOdleglosc() <= 50 ) && (zmierzOdleglosc() >= 30)) //jeżeli odległość jest w przedziale od 50 do 30 to
  {
    digitalWrite(greenLed2, LOW);
    digitalWrite(greenLed1, LOW);
    digitalWrite(yellowLed2, HIGH); //zaświeć diody żółtte
    digitalWrite(yellowLed1, HIGH);
    digitalWrite(redLed2, LOW);
    digitalWrite(redLed1, LOW);
  }
  else if((zmierzOdleglosc() < 30) && (zmierzOdleglosc() >= 0)) //jeżeli odległość jest w przedziale od 29 do 0 to
  {
    digitalWrite(greenLed2, LOW);
    digitalWrite(greenLed1, LOW);
    digitalWrite(yellowLed2, LOW);
    digitalWrite(yellowLed1, LOW);
    digitalWrite(redLed2, HIGH); //zaświeć diody żółte
    digitalWrite(redLed1, HIGH);
  }

  zakres(10, 25); //włącz alarm jeśli wodległości od 10 do 25 cm jest przeszkoda
  Serial.print(zmierzOdleglosc());
  Serial.println(" cm");

  delay(500);

}

int zmierzOdleglosc()
{
  long czas, dystans;

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

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

return dystans;
}

void zakres(int a, int b)
{
  int jakDaleko = zmierzOdleglosc();
  if((jakDaleko > a) && (jakDaleko < b))
  {
    digitalWrite(buzzer, HIGH); //włącz buzzer
  }
  else
  {
    digitalWrite(buzzer, LOW); //Wyłączamy buzzer,gdy obiekt poza zakresem 
  }
}

 

  • Lubię! 1

Zadanie domowe 9.1

void setup() {
pinMode(10, OUTPUT); // wyjście PWM
}

void loop() {
zamigajLED(); //miganie diodą w pętli
}
void zamigajLED(){ // funkja migania diodą
  int i = 0;
  for (i = 0; i < 255; i++) { //pętla rozjaśniająca
    analogWrite(10, i);
    delay(5);
  }
  for (i = 255; i > 0; i--) { //pętla przygaszająca
    analogWrite(10, i);
    delay(5);
  }
}

 

  • Lubię! 1

Zadanie domowe 9.3

#define trigPin 13
#define echoPin 8
#define LED1 2 //przypisanie nazw diod do pinów
#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6
#define LED6 7
 
void setup() {
  Serial.begin (9600); //komunikacja z UART (dla kontroli)
  pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
  pinMode(echoPin, INPUT); //a echo, jako wejście
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT); //wyjścia diod
}
 
void loop() {
  zakres(); //wykonywanie tej funkcji w pętli
  delay(25); //opóźnienie dla redukcji zakłóceń

}

int odleglosc() { //funckja zwracająca odległość w cm
  long czas, dystans;
 
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  czas = pulseIn(echoPin, HIGH);
  dystans = czas / 58;
  Serial.println(dystans);
  return dystans;
}

void zakres() { //funkcja dzieląca odległość na podzakresy dla 6 diod i uruchamiająca je
  int jakDaleko = map(odleglosc(), 0, 130, 6, 1);
    switch(jakDaleko) {
    case 1:
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, LOW);
      digitalWrite(LED4, LOW);
      digitalWrite(LED5, LOW);
      digitalWrite(LED6, LOW);
    break;
    case 2:
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, LOW);
      digitalWrite(LED4, LOW);
      digitalWrite(LED5, LOW);
      digitalWrite(LED6, LOW);
    break;
    case 3:
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, HIGH);
      digitalWrite(LED4, LOW);
      digitalWrite(LED5, LOW);
      digitalWrite(LED6, LOW);
    break;
    case 4:
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, HIGH);
      digitalWrite(LED4, HIGH);
      digitalWrite(LED5, LOW);
      digitalWrite(LED6, LOW);
    break;
    case 5:
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, HIGH);
      digitalWrite(LED4, HIGH);
      digitalWrite(LED5, HIGH);
      digitalWrite(LED6, LOW);
    break;
    case 6:
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, HIGH);
      digitalWrite(LED4, HIGH);
      digitalWrite(LED5, HIGH);
      digitalWrite(LED6, HIGH);
    break;

  }
}

 

  • Lubię! 1
  • 2 miesiące później...
(edytowany)

Cześć,

Moje rozwiązania:

Zadanie 9.1:
 

int fill = 0;
int step = 5;
bool isMax = false;
bool isLow = false;

void setup() {
  pinMode(3, OUTPUT);
}

void loop() {
  analogWrite(3, fill);
  dimmingLED();
}

void dimmingLED(){
  if (fill < 255 && isMax == false){
    fill = fill + step;
    if(fill == 255){
      isMax = true;
      isLow = false;
    }
  } else if(fill > 0 && isLow == false){
    fill = fill - step;
    if(fill == 0){
      isLow = true;
      isMax = false;
    }
  }

  delay(50);
}

Zadanie 9.2:

void setup() {
  //pinMode(13, OUTPUT);
  blinkLED(3, 1000, 2000, 5);
}

void loop() {

}

void blinkLED(int pin, int timeOn, int timeOff, int count){
  pinMode(pin, OUTPUT);
  for (int i = 0; i < count; i++){
    digitalWrite(pin, HIGH);
    delay(timeOn);
    digitalWrite(pin, LOW);
    delay(timeOff);
  }
}

 

Zadanie 9.3:

#define TRIGGPIN 10
#define ECHOPIN 11
#define PINLED2 2
#define PINLED3 3
#define PINLED4 4
#define PINLED5 5
#define PINLED6 6
#define PINLED7 7

int distance = 0;

void setup() {
  pinMode(TRIGGPIN, OUTPUT);
  pinMode(ECHOPIN, INPUT);
  Serial.begin(9600);

  // Ustawienie pinw od 2 do 7 jako OUTPUT oraz na stan LOW
  for(int i = 2; i < 8; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }

}

void loop() {
  distance = calculateDistance(); 
  distanceLED(distance);
  delay(300);
}

// Funkcja wykonująca pomiary oraz zwracająca odległość w cm
int calculateDistance() {
  long echoTime, distance = 0;

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

  echoTime = pulseIn(ECHOPIN, HIGH);
  distance = echoTime / 58;

  return distance;
}

// Funkcja wyłączająca LEDy poza numerem LED przekazanym do funkcji
void turnOffLED(int excludeLED){
    for (int i = 0; i < excludeLED; i++){
      digitalWrite(i, LOW);
  }
}

// Funkcja włączająca LEDy w zależności od argumentów przekazanych do funkcji
void turnOnLED(int firstLED, int lastLED){
  for(firstLED; firstLED < lastLED; firstLED++){
    digitalWrite(firstLED, HIGH);
  }
}

// Funkcja włączająca i wyłączająca LEDy z logiką
void distanceLED(int distance){
  if (distance >= 0 && distance <= 50){
    turnOffLED(7);
    digitalWrite(PINLED7, HIGH);
  }else if(distance > 50 && distance <= 100){
    turnOffLED(6);
    turnOnLED(PINLED6, PINLED7);
  }else if(distance > 100 && distance<= 150){
    turnOffLED(5);
    turnOnLED(5, 7);
  }else if(distance > 150 && distance <= 200){
    turnOffLED(4);
    turnOnLED(4, 7);
  }else if(distance > 200 && distance <= 250){
    turnOffLED(3);
    turnOnLED(3, 7);
  }else if(distance > 250){
    turnOnLED(2, 7);
  }


}



 

Edytowano przez FTNewbie
  • Lubię! 1
  • 4 tygodnie później...
void setup() {
  pinMode(11, OUTPUT); //pin 13 is configuration as output
}

void loop() {
  zamigajLED();
}

void zamigajLED () {
  for(int fill = 0; fill <= 255; fill++) {
    analogWrite(11, fill);
    delay(25);
  }
  for(int fill = 255; fill >= 0; fill--) { 
    analogWrite(11, fill);
    delay(25);
  }
}

zadanie 9.1

  • Lubię! 1
void setup() {
  pinMode(11, OUTPUT); //pin 13 is configuration as output
  zamigajLED(500, 100, 5);
}

void loop() {
  
}

void zamigajLED(int time_1, int time_2, int number) {
  for(int i = 0; i < number; i++) {
    digitalWrite(11, HIGH);
    delay(time_1);
    digitalWrite(11, LOW);
    delay(time_2);
  }
}

Zadanie 9.2

  • Lubię! 1
  • 1 miesiąc później...

Zadanie 9.1

#define Switch 4
#define Restart 5
#define Red 6
#define Green 7
String Figure = ""; //Empty string of received data
String receivedDataA = ""; //Empty string of receivedDataA
String receivedDataB = ""; //Empty string of receivedDataB
String receivedDataH = ""; //Empty string of receivedDataH 
String receivedDataR = ""; //Empty string of receivedDataR

void setup() {
  Serial.begin(9600); //Transmission speed setting
  pinMode(Red, OUTPUT); //Signal is showing figure area counting
  pinMode(Green, OUTPUT); //Changing figure signal 
  pinMode(Switch, INPUT_PULLUP); //Switch for count
  pinMode(Restart, INPUT_PULLUP); //Switch for figure change
  Serial.print("Define which figure area do you want to count: "); //Text display
}

void loop() {
  if(Serial.available() > 0) { //Whether arduino received data
    Figure = Serial.readStringUntil('\n'); //If yes, to read them to the sign of the end this line and save in Figure variable
  
    while(Figure == "Rectangle") { //Write Rectangle if you want to count its area
      Serial.println("Rectangle"); //Text display
      digitalWrite(Red, HIGH); //Red diode on
      digitalWrite(Green, LOW); //Green diode off
      delay(500); //Time delay
      while(digitalRead(Switch) == HIGH) {} //Stop loop until switch push
      receivedDataA = Serial.readStringUntil('\t'); //If yes, to read them to the sign of the end this line and save in receivedDataA variable
      Serial.print("A: "); //Text display
      Serial.println(receivedDataA.toFloat()); //Data display and convert data to Float
      delay(500); //Time delay
      while(digitalRead(Switch) == HIGH) {} //Stop loop until switch push
      receivedDataB = Serial.readStringUntil('\n'); //If yes, to read them to the sign of the end this line and save in receivedDataB variable
      Serial.print("B: "); //Text display
      Serial.println(receivedDataB.toFloat()); //Data display and convert data to Float
      float result = Rectangle(receivedDataA.toFloat(),receivedDataB.toFloat()); //Counting operation
      Serial.print("Result: "); //Text display
      Serial.println(result); //Result display
      delay(500); //Time delay
      while(digitalRead(Switch) == HIGH) {} //Stop loop until switch push
      Serial.println("Press button Restart for a while if you want to change a figure or wait if you want to count the same object"); //Text display
      delay(3000); //Time delay
      if(digitalRead(Restart) == LOW) { //Push restart switch for to figure define
        digitalWrite(Red, LOW); //Red diode off
        digitalWrite(Green, HIGH); //Green diode on
        Serial.print("Define which figure area do you want to count: "); //Text display
        Figure = Serial.readStringUntil('\n'); //If yes, to read them to the sign of the end this line and save in Figure variable
      }
    }
    while(Figure == "Triangle") { //Write Triangle if you want to count its area
      Serial.println("Triangle"); //Text display
      digitalWrite(Red, HIGH); //Red diode on
      digitalWrite(Green, LOW); //Green diode off
      delay(500); //Time delay
      while(digitalRead(Switch) == HIGH) {} //Stop loop until switch push
      receivedDataA = Serial.readStringUntil('\t'); //If yes, to read them to the sign of the end this line and save in receivedDataA variable
      Serial.print("A: "); //Text display
      Serial.println(receivedDataA.toFloat()); //Data display and convert data to Float
      delay(500); //Time delay
      while(digitalRead(Switch) == HIGH) {} //Stop loop until switch push
      receivedDataH = Serial.readStringUntil('\n'); //If yes, to read them to the sign of the end this line and save in receivedDataH variable
      Serial.print("H: "); //Text display
      Serial.println(receivedDataH.toFloat()); //Data display and convert data to Float
      float result = Triangle(receivedDataA.toFloat(),receivedDataH.toFloat()); //Counting operation
      Serial.print("Result: "); //Text display
      Serial.println(result); //Result display
      delay(500); //Time delay
      while(digitalRead(Switch) == HIGH) {} //Stop loop until switch push
      Serial.println("Press button Restart for a while if you want to change a figure or wait if you want to count the same object"); //Text display
      delay(3000); //Time delay
      if(digitalRead(Restart) == LOW) { //Push restart switch for to figure define
        digitalWrite(Red, LOW); //Red diode off
        digitalWrite(Green, HIGH); //Green diode on
        Serial.print("Define which figure area do you want to count: "); //Text display
        Figure = Serial.readStringUntil('\n'); //If yes, to read them to the sign of the end this line and save in Figure variable
      }
    }
    while(Figure == "Circle") { //Write Circle if you want to count its area
      Serial.println("Circle"); //Text display
      digitalWrite(Red, HIGH); //Red diode on
      digitalWrite(Green, LOW); //Green diode off
      delay(500); //Time delay
      while(digitalRead(Switch) == HIGH) {} //Stop loop until switch push
      receivedDataR = Serial.readStringUntil('\t'); //If yes, to read them to the sign of the end this line and save in receivedDataR variable
      Serial.print("R: "); //Text display
      Serial.println(receivedDataR.toFloat()); //Data display and convert data to Float
      float result = Circle(receivedDataR.toFloat()); //Counting operation
      Serial.print("Result: "); //Text display
      Serial.println(result); //Result display
      delay(500); //Time delay
      while(digitalRead(Switch) == HIGH) {} //Stop loop until switch push
      Serial.println("Press button Restart for a while if you want to change a figure or wait if you want to count the same object"); //Text display
      delay(3000); //Time delay
      if(digitalRead(Restart) == LOW) { //Push restart switch for to figure define
        digitalWrite(Red, LOW); //Red diode off
        digitalWrite(Green, HIGH); //Green diode on
        Serial.print("Define which figure area do you want to count: "); //Text display
        Figure = Serial.readStringUntil('\n'); //If yes, to read them to the sign of the end this line and save in Figure variable
      }
    }
    while(Figure == "Square") { //Write Square if you want to count its area
      Serial.println("Square"); //Text display
      digitalWrite(Red, HIGH); //Red diode on
      digitalWrite(Green, LOW); //Green diode off
      delay(500); //Time delay
      while(digitalRead(Switch) == HIGH) {} //Stop loop until switch push
      receivedDataA = Serial.readStringUntil('\t'); //If yes, to read them to the sign of the end this line and save in receivedDataA variable
      Serial.print("A: "); //Text display
      Serial.println(receivedDataA.toFloat()); //Data display and convert data to Float
      float result = Square(receivedDataA.toFloat()); //Counting operation
      Serial.print("Result: "); //Text display
      Serial.println(result); //Result display
      delay(500); //Time delay
      while(digitalRead(Switch) == HIGH) {} //Stop loop until switch push
      Serial.println("Press button Restart for a while if you want to change a figure or wait if you want to count the same object"); //Text display
      delay(3000); //Time delay
      if(digitalRead(Restart) == LOW) { //Push restart switch for to figure define
        digitalWrite(Red, LOW); //Red diode off
        digitalWrite(Green, HIGH); //Green diode on
        Serial.print("Define which figure area do you want to count: "); //Text display
        Figure = Serial.readStringUntil('\n'); //If yes, to read them to the sign of the end this line and save in Figure variable
      }
    }
  }
}

float Rectangle(float a, float b) { 
  float result = 0;
  result = a * b;

  return result;
}

float Triangle(float a, float h) {
  float result = 0;
  result = (a * h)/2;
 
  return result;
}

float Circle(float r) {
  float result = 0;
  result = 3.141592 * r * r;
 
  return result;
}

float Square(float a) { 
  float result = 0;
  result = a * a;

  return result;
}

 

  • Lubię! 1
  • 3 tygodnie później...
#define trigPin 12
#define echoPin 11
#define Red2 3
#define Red1 4
#define Yellow2 5
#define Yellow1 6
#define Green2 7
#define Green1 8

void setup() {
  Serial.begin(9600); //UART speed transmission set
  pinMode(trigPin, OUTPUT); //Pin that trig is setting as output
  pinMode(echoPin, INPUT); //Pin that echo is setting as input
  pinMode(2, OUTPUT); //Pin that buzzer is setting as output
  pinMode(Red1, OUTPUT); //Diodes pins show the distance by displaying colours
  pinMode(Red2, OUTPUT);
  pinMode(Yellow1, OUTPUT);
  pinMode(Yellow2, OUTPUT);
  pinMode(Green1, OUTPUT);
  pinMode(Green2, OUTPUT);
}

void loop() {
  range(0, 60); //Turn on alarm if in distance 0-60 cm from sensor is any object
  delay(10); //Time delay
}

int distanceMeasure() {
  long time, distance; //Define variables for distance and time 

  digitalWrite(trigPin, LOW); //Turn off trigPin
  delayMicroseconds(2); //Time delay
  digitalWrite(trigPin, HIGH); //Turn on trigPin 
  delayMicroseconds(10); //Time delay
  digitalWrite(trigPin, LOW); //Turn off trigPin

  time = pulseIn(echoPin, HIGH); //Time count
  distance = time/58; //Distance count
  
  return distance;
}

void range(int a, int b) {
  int howFar = distanceMeasure(); //Assignment to howFar variable
  if((howFar > 50) && (howFar < b)) { //Distance between 50-60 cm
    Led1(); //Function call
    Buzz1(); //Function call
  } else if((howFar > 40) && (howFar < 50)) { //Distance between 40-50 cm
    Led2(); //Function call
    Buzz2(); //Function call
  } else if((howFar > 30) && (howFar < 40)) { //Distance between 30-40 cm
    Led3(); //Function call
    Buzz3(); //Function call
  } else if((howFar > 20) && (howFar < 30)) { //Distance between 20-30 cm
    Led4(); //Function call
    Buzz4(); //Function call
  } else if((howFar > 10) && (howFar < 20)) { //Distance between 10-20 cm
    Led5(); //Function call
    Buzz5(); //Function call
  } else if((howFar > a) && (howFar < 10)) { //Distance between 0-10 cm
    Led6(); //Function call
    Buzz6(); //Function call
  } else { //Distance more than 60 cm
    Led7(); //Function call
    Buzz7(); //Function call
  }
}

void Led1() { //Distance between 50-60 cm
  digitalWrite(Green1, HIGH); //Turn on only diode Green1 
  digitalWrite(Green2, LOW);
  digitalWrite(Yellow1, LOW);
  digitalWrite(Yellow2, LOW);
  digitalWrite(Red1, LOW);
  digitalWrite(Red2, LOW);
}
void Led2() { //Distance between 40-50 cm
  digitalWrite(Green1, HIGH); //Turn on diodes Green1 & Green2 
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow1, LOW);
  digitalWrite(Yellow2, LOW);
  digitalWrite(Red1, LOW);
  digitalWrite(Red2, LOW);
}
void Led3() { //Distance between 30-40 cm
  digitalWrite(Green1, HIGH); //Turn on diodes Green1, Green2 & Yellow1 
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Yellow2, LOW);
  digitalWrite(Red1, LOW);
  digitalWrite(Red2, LOW);
}
void Led4() { //Distance between 20-30 cm
  digitalWrite(Green1, HIGH); //Turn on diodes Green1, Green2, Yellow1 & Yellow2 
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red1, LOW);
  digitalWrite(Red2, LOW);
}
void Led5() { //Distance between 10-20 cm
  digitalWrite(Green1, HIGH); //Turn on diodes Green1, Green2, Yellow1, Yellow2 & Red1 
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red1, HIGH);
  digitalWrite(Red2, LOW);
}
void Led6() { //Distance between 0-10 cm
  digitalWrite(Green1, HIGH); //Turn on diodes Green1, Green2, Yellow1, Yellow2, Red1 & Red2 
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red1, HIGH);
  digitalWrite(Red2, HIGH);
}
void Led7() { //Distance more than 60 cm
  digitalWrite(Red1, LOW); //Turn off all diodes
  digitalWrite(Red2, LOW);
  digitalWrite(Yellow1, LOW);
  digitalWrite(Yellow2, LOW);
  digitalWrite(Green1, LOW);
  digitalWrite(Green2, LOW);
}

void Buzz1() { //Distance between 50-60 cm
  digitalWrite(2, HIGH); //Buzzer on
  delay(300); //Interval time between impulses
  digitalWrite(2, LOW); //Buzzer off
  delay(300); //Interval time between impulses
}
void Buzz2() { //Distance between 40-50 cm
  digitalWrite(2, HIGH); //Buzzer on
  delay(150); //Interval time between impulses
  digitalWrite(2, LOW); //Buzzer off
  delay(150); //Interval time between impulses
}
void Buzz3() { //Distance between 30-40 cm
  digitalWrite(2, HIGH); //Buzzer on
  delay(100); //Interval time between impulses
  digitalWrite(2, LOW); //Buzzer off
  delay(100); //Interval time between impulses
}
void Buzz4() { //Distance between 20-30 cm
  digitalWrite(2, HIGH); //Buzzer on
  delay(50); //Interval time between impulses
  digitalWrite(2, LOW); //Buzzer off
  delay(50); //Interval time between impulses
}
void Buzz5() { //Distance between 10-20 cm
  digitalWrite(2, HIGH); //Buzzer on
  delay(35); //Interval time between impulses
  digitalWrite(2, LOW); //Buzzer off
  delay(35); //Interval time between impulses
}
void Buzz6() { //Distance between 0-10 cm
  digitalWrite(2, HIGH); //Buzzer on
}
void Buzz7() { //Distance more than 60 cm
  digitalWrite(2, LOW); //Buzzer off
}

Zadanie 9.3

  • Lubię! 1
  • 2 tygodnie później...

Hej,

w zadaniu 9.3 zauważyłem, że gdy przesuwam obiekt przed czujnikiem odległości to w punkcie gdzie kończy się jeden zakres odległości, np: (howFar > 50) && (howFar < b), a zaczyna się następny (howFar > 40) && (howFar < 50) to zauważyłem, że diody w ogóle się nie świecą (pojawił się tzw. martwy punkt), a gdy przesunę dalej to już się świecą. Taka sytuacja występuje wszędzie gdzie kończy się jeden zakres odległości, a zaczyna następny.

Czy taka sytuacja wynika z błędów w programie, czy czego innego ?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...