给大家推荐一个红外测距程序Arduino-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3620|回复: 2

给大家推荐一个红外测距程序Arduino

[复制链接]
回帖奖励 1 金币 回复本帖可获得 1 金币奖励! 每人限 1 次(中奖概率 10%)
发表于 2021-8-15 11:10 | 显示全部楼层 |阅读模式
一个主板,一个Sr04红外探头,一个无缘蜂鸣器,一个OLED显示屏
//显示中英文字符程序
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define LOGO16_GLCD_HEIGHT 16 //定义显示高度
#define LOGO16_GLCD_WIDTH  16 //定义示宽度
const int TrigPin = 2;
const int EchoPin = 3;
// 定义变色灯LED的三个输出接口,这里也可以选用三个led
int beeppin = 8;  // 蜂鸣器的pin
int ledpin = 1;
int i = 0;


//中文:宝    (这就是存储点阵变量,str_1可以修改成自己喜欢的名称,用函数<span style="font-family:Arial, Helvetica, sans-serif;">display.drawBitmap()</span><span style="font-family:Arial, Helvetica, sans-serif;">调用就可以了)</span>
static const unsigned char PROGMEM str_1[] =
{
  0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x10, 0x10, 0x08, 0x1F, 0xFF, 0xFC, 0x10, 0x00, 0x18, 0x30, 0x00, 0x10, 0x30, 0x00, 0x20, 0x00, 0x00,
  0x60, 0x0F, 0xFF, 0xF0, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x60, 0x07, 0xFF, 0x80, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x80, 0x00,
  0x10, 0xC0, 0x00, 0x10, 0xC0, 0x00, 0x10, 0x48, 0x0F, 0xFF, 0xFC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

};
//中文:安
static const unsigned char PROGMEM str_2[] =
{
  0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x08, 0x0F, 0xFF, 0xFC, 0x08, 0x00, 0x18, 0x18, 0x00, 0x10, 0x18, 0x30, 0x20, 0x00, 0x60,
  0x00, 0x00, 0x60, 0x08, 0x00, 0x40, 0x0C, 0x3F, 0xFF, 0xFE, 0x00, 0xC0, 0x80, 0x00, 0x81, 0x80, 0x01, 0x81, 0x00, 0x01, 0x03, 0x00, 0x01, 0x02, 0x00, 0x00, 0xE6, 0x00, 0x00, 0x1C, 0x00, 0x00,
  0x0F, 0x80, 0x00, 0x18, 0xE0, 0x00, 0x60, 0x70, 0x01, 0xC0, 0x18, 0x0E, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00
};


#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup()   {
  Serial.begin(9600);
  pinMode(EchoPin, INPUT);      //设置EchoPin 为输入模式
  pinMode(TrigPin, OUTPUT);     //设置超声波数字IO脚模式,OUTPUT为输出
  pinMode(beeppin, OUTPUT);     //设置蜂鸣器引脚输出模式
  pinMode(ledpin, OUTPUT);
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  // init done
  display.clearDisplay();

  //中文字符显示
  display.drawBitmap(7, 0, str_1, 24, 28, 1); //在坐标X:26  Y:16的位置显示中文字符凌
  display.drawBitmap(37, 0, str_2, 24, 28, 1); //在坐标X:42  Y:16的位置显示中文字符顺
  display.drawBitmap(67, 0, str_3, 24, 28, 1);
  display.drawBitmap(97, 0, str_4, 24, 28, 1);

  //英文字符显示
  display.setTextSize(1);             //设置字体大小
  display.setTextColor(WHITE);        //设置字体颜色白色
  display.setCursor(0, 32);            //设置字体的起始位置
  display.println("Bao'an Primary School");   //输出字符并换行

  display.setTextSize(2);             //设置字体大小
  display.setCursor(4, 48);            //设置字体的起始位置
  display.setTextColor(WHITE); //设置字体黑色,字体背景白色
  display.println(2016360211);          //输出数字并换行

  // display.display();                  //把缓存的都显示
}


void loop()
{
  digitalWrite(TrigPin, LOW);     // 通过Trig/Pin 发送脉冲,触发 HC-SR04 测距,使发出发出超声波信号接口低电平2μs
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH);    // 使发出发出超声波信号接口高电平10μs,这里是至少10μs
  delayMicroseconds(10);
  digitalWrite(ledpin, HIGH);
  digitalWrite(TrigPin, LOW);     // 保持发出超声波信号接口低电平
  int distance = pulseIn(EchoPin, HIGH);   // 读出脉冲时间
  distance = distance / 58;        // 将脉冲时间转化为距离(单位:厘米)
  Serial.println(distance);        //输出距离值
  if (distance < 30)         //当距离<20cm(这个数据可以在超声波测量的范围内随意改,3cm~450cm )
  {
    buzzer1();
  }
  else if (distance <= 50)  //当距离<120cm(这个数据可以在超声波测量的范围内随意改,3cm~450cm )
  {
    buzzer2();
  }
}
//*****************************************************************
void buzzer1()
{
  tone(beeppin, 900);
  delay(300);  //响声间隔300ms 听上去更急促
  noTone(beeppin);
}
void buzzer2()
{
  tone(beeppin, 600);
  delay(500);  //响声间隔500ms 听上去普通
  noTone(beeppin);
}
void buzzer3()  //这里我用了除余的方法,目的是如果处在安全距离,在不用delay的情况下蜂鸣器响声不要那么频繁
{
  if (i % 100 == 1) {
    tone(beeppin, 500);
  }
  else {
    noTone(beeppin);
  }
  i++;
}
发表于 2021-9-29 23:12 来自手机 | 显示全部楼层
用除余的方式来替代delay很赞,学习了,非常感谢
发表于 2021-9-18 12:29 | 显示全部楼层
很好的创意,可以传到github 上..
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:38 , Processed in 0.072601 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表