给大家推荐一个红外测距程序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++;
}
用除余的方式来替代delay很赞,学习了,非常感谢 很好的创意,可以传到github 上..
页:
[1]