Problem z kodem_czujnik parkowania

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
marcin01035
Młodszy majsterkowicz
Posty: 4
Rejestracja: 19 lis 2019, 11:40

Problem z kodem_czujnik parkowania

Post autor: marcin01035 » 28 lis 2019, 20:21

Cześć, mam problem z kodem do czujnika parkowania. Czujnik działa w oparciu o czujnik ultradźwiękowy HC-SR04, a do jego obsługi wykorzystałem bibliotekę NewPing. Ogólnie wszystko działa, tzn. buzzer, diody oraz wyświetlacz zachowują się poprawnie wraz z zmniejszeniem lub zwiększeniem dystansu. Problem się pojawia w chwili gdy mierzona odległość jest większa od 2m. Na wyświetlaczu pokazuje mi wtedy mierzoną odległość 0 cm. W skrócie zrobiłem następujące przypadki:
I. if(val>0 && val<=10){...}
II. else if(val<=25&&val>10){...}
III. else if(val<=50 && val>25){...}
IV. else if(val<=75&&val>50){...}
V. else if(val<=100&&val>75){...}
VI. else if(val<= MAX_DISTANCE){...}
VII. else{...}
Myślałem, że jeżeli tak je opisze, to będzie działało, niestety przy większej wartości od Maxdistance ( w moim przapadku 2m) nie odpala się 7 przypadek else, tylko inny :/. Może ktoś znajdzie błąd. Należy jakoś inaczej zapisać to z wykorzystaniem jakiejś metody z biblioteki czy jak ? Z góry dziękuje za wszelką pomoc. Poniżej umieszczam swój kod.

Kod: Zaznacz cały


#include <NewPing.h> 

#define TRIGGER_PIN  3  
#define ECHO_PIN     2  
#define MAX_DISTANCE 200

#include <LiquidCrystal.h> 
LiquidCrystal lcd(9, 8, 5, 4, 6, 7);
int Buzzer = 1;
int val=0;
const int green = 13;
const int yellow1 = 12;
const int yellow2 = 11;
const int red = 10;
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

// Creating Characters for Bar Graph
byte Level0[8] = {
        0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b11111,
    0b11111
};
byte Level1[8] = {
        0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b11111,
    0b11111,
    0b11111,
    0b11111
};
byte Level2[8] = {
        0b00000,
    0b00000,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111
};
byte Level3[8] = {
        0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111
};
byte NoLevel[8] = {
        0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000
};
void setup()
{
  lcd.createChar(0, Level0);
  lcd.createChar(1, Level1);
  lcd.createChar(2, Level2);
  lcd.createChar(3, Level3);
  lcd.createChar(4, NoLevel);
  lcd.begin(16, 2); 
  pinMode(Buzzer,OUTPUT); 
  pinMode(green, OUTPUT);
 pinMode(yellow1, OUTPUT);
 pinMode(yellow2, OUTPUT);
 pinMode(red, OUTPUT);
}

void loop()
{
  delay(500); 
  lcd.setCursor(0, 0);
  lcd.print("Distance: ");
  val=sonar.ping_cm();
  lcd.print(val);
  lcd.print("cm    ");
  lcd.setCursor(8, 1);
  lcd.print("********");
  if(val>0 && val<=10)
  {
    digitalWrite(green, HIGH);
    digitalWrite(yellow1, HIGH);
    digitalWrite(yellow2, HIGH);
    digitalWrite(red, HIGH);
    lcd.setCursor(0,0);
    digitalWrite(Buzzer, HIGH);   
    lcd.print("******Stop******");
    lcd.setCursor(0,1);
    lcd.print("****************");
    } 
  
  else if(val<=25&&val>10)
  {
    digitalWrite(green, HIGH);
    digitalWrite(yellow1, HIGH);
    digitalWrite(yellow2, HIGH);
    digitalWrite(red, LOW);
  digitalWrite(Buzzer, HIGH);   
  delay(50);               
  digitalWrite(Buzzer, LOW);    
  delay(50);
  lcd.setCursor(0, 1); 
  lcd.write(byte(0));
  lcd.setCursor(1, 1); 
  lcd.write(byte(0));
  lcd.setCursor(2, 1); 
  lcd.write(byte(1));
  lcd.setCursor(3, 1); 
  lcd.write(byte(1));
  lcd.setCursor(4, 1);
  lcd.write(byte(2));
  lcd.setCursor(5, 1);
  lcd.write(byte(2));
   lcd.setCursor(6, 1);
  lcd.write(byte(3));
  lcd.setCursor(7, 1);
  lcd.write(byte(3));
  
  }
  else if(val<=50&&val>25)
  {
    digitalWrite(green, HIGH);
    digitalWrite(yellow1, HIGH);
    digitalWrite(yellow2, LOW);
    digitalWrite(red, LOW);
  digitalWrite(Buzzer, HIGH);   
  delay(75);               
  digitalWrite(Buzzer, LOW);    
  delay(75);
  lcd.setCursor(0, 1); 
  lcd.write(byte(0));
  lcd.setCursor(1, 1); 
  lcd.write(byte(0));
  lcd.setCursor(2, 1); 
  lcd.write(byte(1));
  lcd.setCursor(3, 1); 
  lcd.write(byte(1));
  lcd.setCursor(4, 1);
  lcd.write(byte(2));
  lcd.setCursor(5, 1);
  lcd.write(byte(2));
   lcd.setCursor(6, 1);
  lcd.write(byte(4));
  lcd.setCursor(7, 1);
  lcd.write(byte(4));

  }
    else if(val<=75&&val>50)
  {
  digitalWrite(green, HIGH);
  digitalWrite(yellow1, LOW);
  digitalWrite(yellow2, LOW);
  digitalWrite(red, LOW);
  digitalWrite(Buzzer, HIGH);   
  delay(100);               
  digitalWrite(Buzzer, LOW);    
  delay(100); 
 lcd.setCursor(0, 1); 
  lcd.write(byte(0));
  lcd.setCursor(1, 1); 
  lcd.write(byte(0));
  lcd.setCursor(2, 1); 
  lcd.write(byte(1));
  lcd.setCursor(3, 1); 
  lcd.write(byte(1));
  lcd.setCursor(4, 1);
  lcd.write(byte(4));
  lcd.setCursor(5, 1);
  lcd.write(byte(4));
  lcd.setCursor(6, 1);
  lcd.write(byte(4));
  lcd.setCursor(7, 1);
  lcd.write(byte(4));
  
  }
    else if(val<=100&&val>75)
  {
    digitalWrite(green, LOW);
    digitalWrite(yellow1, LOW);
    digitalWrite(yellow2, LOW);
    digitalWrite(red, LOW);
  digitalWrite(Buzzer, HIGH);   
  delay(200);               
  digitalWrite(Buzzer, LOW);    
  delay(200); 
lcd.setCursor(0, 1); 
  lcd.write(byte(0));
  lcd.setCursor(1, 1); 
lcd.setCursor(1, 1); 
  lcd.write(byte(0));
lcd.write(byte(0));
  lcd.setCursor(2, 1); 
  lcd.write(byte(4));
  lcd.setCursor(3, 1); 
  lcd.write(byte(4));
  lcd.setCursor(4, 1);
  lcd.write(byte(4));
  lcd.setCursor(5, 1);
  lcd.write(byte(4));
    lcd.setCursor(6, 1);
  lcd.write(byte(4));
  lcd.setCursor(7, 1);
  lcd.write(byte(4));
  }
  
      else if(val<= MAX_DISTANCE)
  {
    digitalWrite(green, LOW);
    digitalWrite(yellow1, LOW);
    digitalWrite(yellow2, LOW);
    digitalWrite(red, LOW);     
    digitalWrite(Buzzer, LOW);    
    lcd.setCursor(0, 1); 
    lcd.write(byte(4));
lcd.write(byte(0));
    lcd.setCursor(1, 1);
    lcd.write(byte(4));
lcd.write(byte(0));
    lcd.setCursor(2, 1);
    lcd.write(byte(4));
    lcd.setCursor(3, 1);
    lcd.write(byte(4));
    lcd.setCursor(4, 1);
    lcd.write(byte(4));
    lcd.setCursor(5, 1);
    lcd.write(byte(4));
    lcd.setCursor(6, 1);
    lcd.write(byte(4));
    lcd.setCursor(7, 1);
    lcd.write(byte(4));
  }

  else
  {
    digitalWrite(green, LOW);
    digitalWrite(yellow1, LOW);
    digitalWrite(yellow2, LOW);
    digitalWrite(red, LOW);         
    digitalWrite(Buzzer, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Distance: SAFE");
    lcd.setCursor(0,1);
    lcd.print("****************");
  }
}

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
Marhef
Złota rączka
Posty: 1188
Rejestracja: 18 lis 2011, 02:18

Re: Problem z kodem_czujnik parkowania

Post autor: Marhef » 29 lis 2019, 09:43

Inny znaczy który?
Jaki zakres pomiarowy ma ten czujnik?
marcin01035
Młodszy majsterkowicz
Posty: 4
Rejestracja: 19 lis 2019, 11:40

Re: Problem z kodem_czujnik parkowania

Post autor: marcin01035 » 29 lis 2019, 15:23

Marhef pisze:
29 lis 2019, 09:43
Inny znaczy który?
Jaki zakres pomiarowy ma ten czujnik?
Inny miałem na myśli, że żaden z powyższych. Wykonuje się tylko początek lupa, czyli wyświetlenie odległości.
Te czujniki mają zakres podobno do 4/5 m.
marcin01035
Młodszy majsterkowicz
Posty: 4
Rejestracja: 19 lis 2019, 11:40

Re: Problem z kodem_czujnik parkowania

Post autor: marcin01035 » 29 lis 2019, 22:46

Wieczorem przysiadłem i zorientowałem się szybko gdzie jest błąd. W 6 casie usunalem w warunkach if "&& val != 0", co oznacza że wartość ta musi być mniejsza max_distance oraz różna od zera.
ODPOWIEDZ

Strony partnerskie: