最新消息:

Arduino+乐高专题┃超声波测距小车(带灯光报警)组装及程序解析

Arduino 少儿编程 2543浏览 0评论

一、实验物品清单

超声波测距小车(带灯光报警功能),由Arduino UNO及扩展板1块、超声波传感器1个、LED流水灯1个、1602液晶显示屏1个、9V电池1个、积木件若干、杜邦线若干组成。

Arduino+乐高专题┃超声波测距小车(带灯光报警)组装及程序解析

正面图

Arduino+乐高专题┃超声波测距小车(带灯光报警)组装及程序解析

侧面图

Arduino+乐高专题┃超声波测距小车(带灯光报警)组装及程序解析

亮绿灯处为Arduino UNO+扩展板

Arduino+乐高专题┃超声波测距小车(带灯光报警)组装及程序解析

超声波传感器,接2、3号数字IO口

Arduino+乐高专题┃超声波测距小车(带灯光报警)组装及程序解析

LED流水灯和1602液晶显示屏

Arduino+乐高专题┃超声波测距小车(带灯光报警)组装及程序解析

9V电池

二、实验说明

搭载9V电池,可以脱离电脑供电,自由行动,通过超声波传感器检测距离,在液晶显示屏上实时显示距离数值,根据距离远近LED流水灯亮的数量不同,>10cm时仅亮1个灯,5-10cm之间时亮4个灯,<5cm时亮8个灯,使用mixly编程。请看下面的视频。

测距演示

三、Mixly模块代码解析

Arduino+乐高专题┃超声波测距小车(带灯光报警)组装及程序解析

Mixly代码

1、先声明一个液晶显示屏,设置设备地址为:0×27;

2、声明一个整数变量:item,用于流水灯亮灯控制

3、声明一个实数变量:csbdis,用于记录超声波传感器返回的距离值;

4、初始化流水灯,将其设置为高电平(灯灭);

5、将超声波传感器返回的距离值赋值给csbdis变量,注意超声波传感器是接在数字IO口的2(Trig)、3(Echo)号管脚上,你在书写程序时请根据你实际接管脚来选择;

6、液晶显示屏初始化,清除屏幕显示;

7、液晶显示屏第一行显示csbdis变量的值,也即距离障碍物的距离值;第二行显示“distance”英文单词提示,这个你可以自定义;

8、接下来三个条件语句,“如果……那么……”,根据超声波传感器的返回值给变量item赋不同的值,这三个条件语句的顺序请注意不要随意调整,为什么请你思考。

9、接下来的循环语句,根据前面的item变量值进行循环,同时控制哪些灯亮起来。请注意LED1-LED8分别接在扩展板数字IO口的5-12管脚上,所以“数字输出管脚”处设置的是i+1管脚。流水灯是低电平触发。

10、最后一个是延时语句,延时的时间长短决定了led灯闪烁的频率快慢以及液晶显示屏刷屏的快慢,这个模块必须有,否则led灯将处于略微亮的状态,亮的不显眼,原因是什么,请你自已去测试吧。

四、Arduino代码解析

下面的代码是由Mixly自动生成的,可以放到Arduino IDE中完美执行。

Arduino+乐高专题┃超声波测距小车(带灯光报警)组装及程序解析

//包含两个库文件,液晶显示屏使用需要的

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

//定义一个整数变量:item,用于流水灯亮灯控制

volatile int item;

//定义一个实数变量:csbdis,用于记录超声波传感器返回的距离值

volatile float csbdis;

//初始化液晶显示屏,请注意设置正确的地址,我的是0×27,你的可能是其他

LiquidCrystal_I2C mylcd(0×27,16,2);

//获取超声波传感器距离的函数,详细解释请见我的另一篇关于超声波传感器的文章

float checkdistance_2_3() {

digitalWrite(2, LOW);

delayMicroseconds(2);

digitalWrite(2, HIGH);

delayMicroseconds(10);

digitalWrite(2, LOW);

float distance = pulseIn(3, HIGH) / 58.00;

delay(10);

return distance;

}

//初始化函数

void setup(){

item = 0;

csbdis = 0;

pinMode(2, OUTPUT);

pinMode(3, INPUT);

mylcd.init();

mylcd.backlight();

}

//循环函数

void loop(){

//因为我的流水灯的8个LED灯分别接在5-12数字IO口上,所以for循环也是5-12,将所有灯设置为关的状态(高电平)

for (int i = 5; i <= 12; i = i + (1)) {

pinMode(i, OUTPUT);

digitalWrite(i,HIGH);

}

//将超声波传感器的返回值赋给csbdis变量

csbdis = checkdistance_2_3();

//液晶显示屏清屏

mylcd.clear();

//设置显示开始位置是第1行第1列

mylcd.setCursor(0, 0);

//设置显示内容为csbdis变量的值mylcd.print(csbdis);

//设置显示开始位置是第2行第1列

mylcd.setCursor(0, 1);

//设置显示内容为:distance,你可以自定义,但注意不能是中文

mylcd.print(“distance”);

//条件判断超声波传感器的返回值,给item标志变量赋值

if (csbdis <= 10) {item = 4;}

if (csbdis < 5) {item = 8;}

if (csbdis > 10) {item = 1;}

//根据item的值,控制流水灯的显示数量,因为流水灯接的是5-12号数字管脚,所以pinMode、digitalWrite里的管脚就可以设置为i+4,这样简化了程序

for (int i = (1); i <= (item); i = i + (1)) {

pinMode(i+4, OUTPUT);

digitalWrite(i+4,LOW);

}

//延时的时间长短决定了led灯闪烁的频率快慢以及液晶显示屏刷屏的快慢,这个模块必须有,否则led灯将处于略微亮的状态,亮的不显眼,原因是什么,请你自已去测试吧。

delay(10);

}

本实验积木由初始化工作室小陈搭建,大陈、小陈第一次合作完成同一个实验,希望能让你有所获。

转自公众号:
初始化工作室

您必须 登录 才能发表评论!