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

jasonsun 发表于 2021-8-15 11:10

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

一个主板,一个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_WIDTH16 //定义示宽度
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:26Y:16的位置显示中文字符凌
display.drawBitmap(37, 0, str_2, 24, 28, 1); //在坐标X:42Y: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++;
}

myself1820 发表于 2021-9-29 23:12

用除余的方式来替代delay很赞,学习了,非常感谢

简简单单的创意 发表于 2021-9-18 12:29

很好的创意,可以传到github 上..
页: [1]
查看完整版本: 给大家推荐一个红外测距程序Arduino