Датчик расстояния+Расширитель GPIO портов от Амперки

Тема в разделе "Arduino & Shields", создана пользователем sadboy2004, 28 сен 2017.

  1. sadboy2004

    sadboy2004 Нуб

    Привет, мне нужна помощь:
    Суть такова, мне нужно сделать чтобы пищалка пищала на частоте 1000 если какой то объект подносится к датчику расстояния F ближе чем на 75 сантиметров, на частоте 500 к датчику U, на частоте 255 к датчику D, и просто издает звуки если ни одно из условий не выполняется. Но есть проблема... пищалка пищит всегда и в мониторе последовательного порта-ничего.
    Изображения подключений https://drive.google.com/open?id=0B6q3FqDap-ybRWptcXlqcHRyTTQ
    upload_2017-9-28_10-48-2.png
    Код (C++):
    #include <Wire.h>

    #include <GpioExpander.h>

    GpioExpander adio(42);

    int trigPin = 11;
    int echoPin = 12;  
    int p = 3;
    long durationF, cmF, durationU, cmU, durationD, cmD;

    void setup() {
      Wire.begin();

      Serial.begin (9600);
     
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
     
      adio.pinMode(4, OUTPUT);
      adio.pinMode(5, INPUT);
     
      adio.pinMode(8, OUTPUT);
      adio.pinMode(7, INPUT);
     
      pinMode(10, OUTPUT);
    }

    void loop()
    {

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

      pinMode(echoPin, INPUT);

      adio.digitalWrite(4, LOW);
      delayMicroseconds(5);
      adio.digitalWrite(4, HIGH);
      delayMicroseconds(10);
      adio.digitalWrite(4, LOW);

      adio.pinMode(5, INPUT);

      adio.digitalWrite(8, LOW);
      delayMicroseconds(5);
      adio.digitalWrite(8, HIGH);
      delayMicroseconds(10);
      adio.digitalWrite(8, LOW);

      adio.pinMode(7, INPUT);


        durationF = pulseIn(echoPin, HIGH);

        cmF = (durationF/2) / 29.1;

        durationU = pulseIn(5, HIGH);

        cmU = (durationU/2) / 29.1;
        durationD = pulseIn(7, HIGH);

        cmD = (durationD/2) / 29.1;

    if (durationF<4365)
    {
      tone(p,1000);
    }

    if (durationU<4365)
    {
      tone(p,500);
    }

    if (durationD<4365)
    {
      tone(p,255);
    }

    else if (durationF>=4365)
    {
      tone(p, 0);
    }

    else if (durationU>=4365)
    {
      tone(p, 0);
    }

    else if (durationD>=4365)
    {
      tone(p, 0);
    }

    Serial.print(cmF);
    Serial.print(" cm forward ");


    Serial.print(cmU);
    Serial.print(" cm upward ");

    Serial.print(cmD);
    Serial.print(" cm down ");

    Serial.println();

    delay(250);
    }
     
     
  2. b707

    b707 Гуру

    Возьмите учебник Си и посмотрите, как правильно ставить скобки вокруг If... else if....else.
     
  3. sslobodyan

    sslobodyan Гик

    В вашем скетче смешались в кучу кони-люди.
    1. При работе с датчиками расстояния (я так понимаю это ультразвуковые?) надо давать импульс и считывать длительность эха одного датчика за раз. А затем посылать импульс другого датчика и слушать его эхо. А вы посылаете сразу все три импульса. Но ведь первая pulseIn будет ждать прихода эха или до таймаута, при этом до следующих pulseIn дело еще не дошло.
    2. С ифами таки бардак :)