duxiaodu 发表于 2016-2-15 20:17:54

超声波传感器 测船离水面的高度

各位大神,要用超声波传感器放在船下面去检测船离水面的高度 这是我前人写的检测距离的代码 他为了减小水浪对距离检测的影响,好像用了一个circular buffer. 我理解不来 谁看懂了能帮我讲讲

#include <Ultrasonic.h> // Made by: Erik

long Time = 0;
static const char IntFalling = 2;
static const char IntRising = 3;
static const char Pulse = 4;
static const unsigned char numReadings = 40;
UltrasonicSensor UltrasonicSensor1(&Pulse, &IntFalling, &IntRising, &numReadings);

float Result = 0;

void setup(){
Serial.begin(115200);
Serial.println("Hello");

// Set interrupt
attachInterrupt(0, TriggerFalling, FALLING);
attachInterrupt(1, TriggerRising, RISING);

Time = millis();
}

void loop(){
if((millis() - Time) >= 25){
    Time = millis();
    Result = UltrasonicSensor1.Read();
    Serial.println(Result);
}
}

void TriggerRising(){
UltrasonicSensor1.TriggerRising();
}
void TriggerFalling(){
UltrasonicSensor1.TriggerFalling();
}

以下是这个编程的头文件Ultrasonic.h
/* Author: Erik
   Date: Februari 2015 to june 2015

*/

#ifndef UltrasonicSensor_V1
#define UltrasonicSensor_V1

class UltrasonicSensor
{
        public:
                UltrasonicSensor(const char*, const char*, const char*, const unsigned char*);
               
                void TriggerRising();
                void TriggerFalling();
                float Read();

        private:
                void CalculateMovingAvarage();
                void ClearVariables();
                void MicroPulse(int);

                volatile bool Running;
                volatile bool TCFRunning;
                volatile bool TCRRunning;
                volatile int TempTime; // Temporary value used for a check
                volatile int TravelTimeInterrupt;
                volatile int StartTime;
                volatile int InterruptCounterFalling;
                volatile int InterruptCounterRising;
               
                const char *Pulse;
               
                //UltrasonicSensor Moving Avarage
                const unsigned char *numReadings;
                static const char numReadingsUD = 3; // Number of readings Up and Down (total number of reflections)
                float readings;        // the readings from the sensor
                int index;                                // the index of the current reading
                float total;                        // the running total
                float MovingAverage;        // The moving average

                //Constants
                static const int RCTime = 1140; // Vibration time in microseconds of the ultrasonic sensor. Do not look for a pulse before this amount of time has passed.
                static const float SpeedOfSound = 330.0 / 10000; // 330m/s / (1000000us * 100)

                //Ultrasonic Advanced Data Collection
                float TravelTimeFalling;
                float SignalLengthFalling;
                float TravelTimeRising;
                float SignalLengthRising;
};
#endif

Ansifa 发表于 2016-2-15 23:38:58

本帖最后由 Ansifa 于 2016-2-16 00:09 编辑

你的代码还没贴完,还差个Ultrasonic.h下面的Ultrasonic.c文件
测试一下下面的代码,超声输出只需要接pin2:
const int TrigPin = 2;
float cm;
void setup()
{
        Serial.begin(9600);
}
void loop()
{
        pinMode(TrigPin, OUTPUT);
        digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
        delayMicroseconds(2);
        digitalWrite(TrigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(TrigPin, LOW);
        pinMode(TrigPin, INPUT);

        cm = pulseIn(TrigPin, HIGH) / 58.0; //将回波时间换算成cm
        cm = (int(cm * 100.0)) / 100.0; //保留两位小数
        Serial.print(cm);
        Serial.print("cm");
        Serial.println();
        delay(1000);
}

duxiaodu 发表于 2016-2-16 18:12:41

Ansifa 发表于 2016-2-15 23:38 static/image/common/back.gif
你的代码还没贴完,还差个Ultrasonic.h下面的Ultrasonic.c文件
测试一下下面的代码,超声输出只需要接pin2 ...

我就接了vcc ground 和 pin2
然后 用这个程序显示的就是00000 啊
怎么用示波器看这个超声波是不是坏掉了?
页: [1]
查看完整版本: 超声波传感器 测船离水面的高度