HC-SR04 & ultrasonic.h

HC-SR04 & ultrasonic.h

Сообщение vetrinus » 05 авг 2015, 13:10

Здравствуйте, уважаемые форумчане!
Приключилась беда слабо понимаемая, а потому великая и непреодолимая.
Дано:
Ардуино уно, HC-SR04, LCD дисплей 2004.
Задумка такова: Датчик должен отправлять на ардуину данные о расстоянии, которые впоследствии должны быть вывдены на дисплей. В прицнипе, задача выполнена, за исключением одного НО...
когда расстояние до объекта становится меньше метра, то на дисплее показатели "умножаются на 10". Т.е. при реальном расстоянии, допустим, сантиметров в 20, дисплей показывает 200..
Изображение
Сорри, под кат спрятать не получилось.
Вот код:
Код: Выделить всё
#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
Код: Выделить всё
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
Код: Выделить всё
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
Код: Выделить всё
/*
  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


В конечном итоге, что делать с такими неточностями в работе, мне неизвестно. Может, кто-то сталкивался?
vetrinus
 
Сообщения: 2
Зарегистрирован: 05 авг 2015, 12:49
programming: C++, PASCAL

Re: HC-SR04 & ultrasonic.h

Сообщение noonv » 05 авг 2015, 17:56

Как я понял - вас смущает, что разнятся показания в последовательном порту и на LCD.
Этот последний ноль остаётся от вывода предыдущих измерений.
Решение простое - вам нужно добавить очистку экрана:
Код: Выделить всё
lcd.clear();
Аватара пользователя
noonv
Администратор
 
Сообщения: 540
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: HC-SR04 & ultrasonic.h

Сообщение vetrinus » 07 авг 2015, 08:11

Решение проблемы найдено.
Код: Выделить всё
float dist_cm = ultrasonic.Ranging(CM);
lcd.print (dist_cm);

Теперь показания COM порта соответствуют выводимому а дисплее изображению.
vetrinus
 
Сообщения: 2
Зарегистрирован: 05 авг 2015, 12:49
programming: C++, PASCAL


Вернуться в Сенсоры и датчики

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

© 2009-2017 |  О проекте  |  Политика Конфиденциальности  |