Здравствуйте, уважаемые форумчане! Приключилась беда слабо понимаемая, а потому великая и непреодолимая. Дано: Ардуино уно, HC-SR04, LCD дисплей 2004. Задумка такова: Датчик должен отправлять на ардуину данные о расстоянии, которые впоследствии должны быть вывдены на дисплей. В прицнипе, задача выполнена, за исключением одного НО... когда расстояние до объекта становится меньше метра, то на дисплее показатели "умножаются на 10". Т.е. при реальном расстоянии, допустим, сантиметров в 20, дисплей показывает 200.. Сорри, под кат спрятать не получилось. Вот код: Код (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 В конечном итоге, что делать с такими неточностями в работе, мне неизвестно. Может, кто-то сталкивался?
я не профи а если попробовать так Код (Text): float dist_cm = ultrasonic.Ranging(CM); lcd.print (dist_cm); Serial.println (dist_cm); а вообще дисплей очищать надо а то с прошлого вывода всякая фигня остается, сам мучался lcd.clear(); Но если в лоопе будет постоянно повторятся то экран моргать будет
vankenshtein, спасибо, завтра опробую. Пришел к выводу, что проблема скрывается где-то в библиотеке ultrasonic.h Т.к. COM порт напрямую показывает все верно, а инфа на дисплей выводится через эту библиотеку.. Завтра буду по битам разбирать код, вполне возможно, реализую все вычисления напрямую в скетче.
vankenshtein, вот, что идет на дисплей Код (Text): lcd.print (ultrasonic.Ranging(CM)); А вот, что в Сериал. Код (Text): Serial.println (dist_cm); Если бы вы смогли подсказать, как вывести данные напрямую из сериала, было бы идеально.
Код (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; }