电设:超声波测距

图是随便找了个网站随便画的。

下面是代码,C语言的代码选哪个插入啊问一句?

#include <TimerOne.h>

/********管脚定义********/

const int trig = 13;

const int echo = 12;

const int led = 10;

const int sega = 2;

const int segb = 3;

const int segc = 4;

const int segd = 5;

const int sege = 6;

const int segf = 7;

const int segg = 8;

const int segdp = 9;

const int key0 = 11;

/********参数定义*********/

#define FILTER_N 9

boolean blinkLED = false; // 是否闪烁 LED 的标志

int ledState = LOW; // 用于设置 LED 状态

float distance_cm; // 距离(cm)

int key = -1;

int n[11][8] = {

  {0, 0, 1, 1, 1, 1, 1, 1},

  {0, 0, 0, 0, 0, 1, 1, 0},

  {0, 1, 0, 1, 1, 0, 1, 1},

  {0, 1, 0, 0, 1, 1, 1, 1},

  {0, 1, 1, 0, 0, 1, 1, 0},

  {0, 1, 1, 0, 1, 1, 0, 1},

  {0, 1, 1, 1, 1, 1, 0, 1},

  {0, 0, 0, 0, 0, 1, 1, 1},

  {0, 1, 1, 1, 1, 1, 1, 1},

  {0, 1, 1, 0, 1, 1, 1, 1},

  {1, 0, 0, 0, 0, 0, 0, 0}

};

void timerIsr() {

  if (blinkLED) { // 如果需要闪烁 LED

    ledState = !ledState; // 翻转 LED 的状态

    digitalWrite(led, ledState); // 设置 LED 的状态

  }

}

void setup() {

  // put your setup code here, to run once:

  Serial.begin(9600);

  pinMode(trig, OUTPUT);

  pinMode(echo, INPUT);

  pinMode(led, OUTPUT);

  pinMode(sega, OUTPUT);

  pinMode(segb, OUTPUT);

  pinMode(segc, OUTPUT);

  pinMode(segd, OUTPUT);

  pinMode(sege, OUTPUT);

  pinMode(segf, OUTPUT);

  pinMode(segg, OUTPUT);

  pinMode(segdp, OUTPUT);

  pinMode(key0, INPUT);

  Timer1.initialize(50000); // 设置 Timer1 的定时时间为 500ms

  Timer1.attachInterrupt(timerIsr); // 注册 Timer1 的中断函数

}

void loop() {

  int a, b, c, d;

  float velocity = 345.5302;

  int distance;

  float filterdistance; // 滤波后数据

  if (digitalRead(key0) == 1) {

    key = 0;

  } else {

    key = 1;

  }

  if (key == 0) {

    filterdistance = Filter_Md(velocity); // 中位数滤波

    distance = int((filterdistance + 0.05) * 10);

  } else {

    filterdistance = Filter_Me(velocity); // 均值滤波

    distance = int((filterdistance + 0.05) * 10);

  }  // 这里用了上拉电阻

  /**********串口绘图***********/

  Serial.print(distance_cm);

  Serial.print(",");

  Serial.println(filterdistance);

  delay(10);

  /**********led闪烁***********/

  if (distance_cm < 10.00) {

    blinkLED = true;

  } else {

    blinkLED = false;

    digitalWrite(led, LOW);

  }

  a = distance % 10;       // 小数第一位

  b = distance / 10 % 10;  // 个位

  c = distance / 100 % 10; // 十位

  d = distance / 1000 % 10; // 百位

  /*******数码管循环显示*******/

  for (int pin = 2; pin <= 9; pin++) {

    digitalWrite(pin, n[0][9 - pin]);

  }

  delay(400);

  for (int pin = 2; pin <= 9; pin++) {

    digitalWrite(pin, n[d][9 - pin]);

  }

  delay(400);

  for (int pin = 2; pin <= 9; pin++) {

    digitalWrite(pin, n[c][9 - pin]);

  }

  delay(400);

  for (int pin = 2; pin <= 9; pin++) {

    digitalWrite(pin, n[b][9 - pin]);

  }

  delay(400);

  for (int pin = 2; pin <= 9; pin++) {

    digitalWrite(pin, n[10][9 - pin]);

  }

  delay(400);

  for (int pin = 2; pin <= 9; pin++) {

    digitalWrite(pin, n[a][9 - pin]);

  }

  delay(500);

}

/**************均值滤波***********/

float Filter_Me(float v) {

  int i;

  float filter_sum = 0.0;

  for (int i = 0; i < FILTER_N; i++) {

    digitalWrite(trig, LOW);

    delay(10);

    digitalWrite(trig, HIGH);

    delay(10);

    digitalWrite(trig, LOW);

    distance_cm = pulseIn(echo, HIGH) * (v / 2.0) / 10000.0;

    distance_cm = (int(distance_cm * 100.0)) / 100.0;

    filter_sum += distance_cm;

    delay(1);

  }

  return (filter_sum / FILTER_N);

}

/**********中位数滤波**********/

float Filter_Md(float v) {

  float filter_buf[FILTER_N];

  int i, j;

  float filter_temp;

  for (i = 0; i < FILTER_N; i++) {

    digitalWrite(trig, LOW);

    delay(10);

    digitalWrite(trig, HIGH);

    delay(10);

    digitalWrite(trig, LOW);

    distance_cm = pulseIn(echo, HIGH) * (v / 2.0) / 10000.0;

    distance_cm = (int(distance_cm * 100.0)) / 100.0;

    filter_buf[i] = distance_cm;

    delay(1);

  }

  // 采样值从小到大排列(冒泡法)

  for (j = 0; j < FILTER_N - 1; j++) {

    for (i = 0; i < FILTER_N - 1 - j; i++) {

      if (filter_buf[i] > filter_buf[i + 1]) {

        filter_temp = filter_buf[i];

        filter_buf[i] = filter_buf[i + 1];

        filter_buf[i + 1] = filter_temp;

      }

    }

  }

  return filter_buf[(FILTER_N - 1) / 2];

}

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值