|
|
各位大神,要用超声波传感器放在船下面去检测船离水面的高度 这是我前人写的检测距离的代码 他为了减小水浪对距离检测的影响,好像用了一个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[50]; // 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[numReadingsUD];
float SignalLengthFalling[numReadingsUD];
float TravelTimeRising[numReadingsUD];
float SignalLengthRising[numReadingsUD];
};
#endif
|
|