HC-SR04 & ultrasonic.h

Тема в разделе "Arduino & Shields", создана пользователем Vetrinus, 5 авг 2015.

  1. Vetrinus

    Vetrinus Гик

    Здравствуйте, уважаемые форумчане!
    Приключилась беда слабо понимаемая, а потому великая и непреодолимая.
    Дано:
    Ардуино уно, HC-SR04, LCD дисплей 2004.
    Задумка такова: Датчик должен отправлять на ардуину данные о расстоянии, которые впоследствии должны быть вывдены на дисплей. В прицнипе, задача выполнена, за исключением одного НО...
    когда расстояние до объекта становится меньше метра, то на дисплее показатели "умножаются на 10". Т.е. при реальном расстоянии, допустим, сантиметров в 20, дисплей показывает 200..
    [​IMG]
    Сорри, под кат спрятать не получилось.
    Вот код:
    Код (Text):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h> // подключаем библиотеки датчика, и дисплея
    #include "Ultrasonic.h"

    Ultrasonic ultrasonic(4, 3);
    LiquidCrystal_I2C lcd(0x27,20,4);
    void setup()
    {
      Serial.begin(9600); //запись для КОМ порта
      lcd.init();
      lcd.backlight();  //надписи на дисплее, подсветка, инициализация
      lcd.setCursor(0,1);
      lcd.print("Dalnost");                
    }
    void loop()
    {
       lcd.setCursor(8, 1);
       float dist_cm = ultrasonic.Ranging(CM);
       lcd.print (ultrasonic.Ranging(CM));
       Serial.println (dist_cm);            //          Вывод для КОМ порта
       delay(1500);
    }
    Метод Ranging
    Код (Text):
    long Ultrasonic::Ranging(int sys)
    {
      Timing();
      distacne_cm = duration /29 / 2 ;
      distance_inc = duration / 74 / 2;
      if (sys)
        return distacne_cm;
      else
        return distance_inc;
    }
    Метод Timing
    Код (Text):
    long Ultrasonic::Timing()
    {
      digitalWrite(Trig_pin, LOW);
      delayMicroseconds(2);
      digitalWrite(Trig_pin, HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig_pin, LOW);
      duration = pulseIn(Echo_pin, HIGH);
      return duration;
    }
    Содержимое библиотеки ultrasonic.h
    Код (Text):
    /*
      Ultrasonic.h - Library for HR-SC04 Ultrasonic Ranging Module.
      Created by ITead studio. Alex, Apr 20, 2010.
      iteadstudio.com
      updated by noonv. Feb, 2011
      http://robocraft.ru
    */

    #ifndef Ultrasonic_h
    #define Ultrasonic_h

    #if defined(ARDUINO) && ARDUINO >= 100
      #include "Arduino.h"
    #else
      #include "WProgram.h"
    #endif

    #define CM 1
    #define INC 0

    class Ultrasonic
    {
      public:
        Ultrasonic(int TP, int EP);
        long Timing();
        long Ranging(int sys);

        private:
        int Trig_pin;
        int Echo_pin;
        long  duration,distacne_cm,distance_inc;
       
    };

    #endif //#ifndef Ultrasonic_h
     
    В конечном итоге, что делать с такими неточностями в работе, мне неизвестно. Может, кто-то сталкивался?
     
  2. vankenshtein

    vankenshtein Нерд

    я не профи а если попробовать так
    Код (Text):
      float dist_cm = ultrasonic.Ranging(CM);
      lcd.print (dist_cm);
      Serial.println (dist_cm);
    а вообще дисплей очищать надо а то с прошлого вывода всякая фигня остается, сам мучался lcd.clear(); Но если в лоопе будет постоянно повторятся то экран моргать будет
     
    Vetrinus нравится это.
  3. Vetrinus

    Vetrinus Гик

    vankenshtein, спасибо, завтра опробую.
    Пришел к выводу, что проблема скрывается где-то в библиотеке ultrasonic.h
    Т.к. COM порт напрямую показывает все верно, а инфа на дисплей выводится через эту библиотеку..
    Завтра буду по битам разбирать код, вполне возможно, реализую все вычисления напрямую в скетче.
     
  4. vankenshtein

    vankenshtein Нерд

    вы в сериал и в дисплей разные значения отправляете
     
  5. Vetrinus

    Vetrinus Гик

    vankenshtein, вот, что идет на дисплей
    Код (Text):
    lcd.print (ultrasonic.Ranging(CM));
    А вот, что в Сериал.
    Код (Text):
    Serial.println (dist_cm);
    Если бы вы смогли подсказать, как вывести данные напрямую из сериала, было бы идеально.
     
  6. vankenshtein

    vankenshtein Нерд

    я же вам написал
    lcd.print (dist_cm);

    но это только предположение
    потом отпишитесь помогло нет
     
  7. Vetrinus

    Vetrinus Гик

    На работу я доберусь только в пятницу. Как проверю, сразу же отпишусь.
     
  8. Vetrinus

    Vetrinus Гик

    Мужик, СПАСИБО,ты даже не представляешь, какое доброе дело сделал!
     
  9. vankenshtein

    vankenshtein Нерд

    Наздоровье))
     
  10. DrProg

    DrProg Вечный нерд

    Код (Text):
    unsigned int getDistance(byte trig, byte ping) { // указать тригерную и приемную ноги
      unsigned int duration = 0;
      digitalWrite(trig, LOW);
      delayMicroseconds(2);
      digitalWrite(trig, HIGH);
      delayMicroseconds(10);
      digitalWrite(trig, LOW);
      duration = pulseIn(ping, HIGH);
      int Distance = duration / 29 / 2;
      return Distance;
    }
     
  11. Vetrinus

    Vetrinus Гик

    Спасибо, но все решилось строкой
    float dist_cm = ultrasonic.Ranging(CM);
    lcd.print (dist_cm);