友情提示:380元/半年,儿童学编程,就上码丁实验室。
一、实验物品清单
超声波测距小车(带灯光报警功能),由Arduino UNO及扩展板1块、超声波传感器1个、LED流水灯1个、1602液晶显示屏1个、9V电池1个、积木件若干、杜邦线若干组成。
正面图
侧面图
亮绿灯处为Arduino UNO+扩展板
超声波传感器,接2、3号数字IO口
LED流水灯和1602液晶显示屏
9V电池
二、实验说明
搭载9V电池,可以脱离电脑供电,自由行动,通过超声波传感器检测距离,在液晶显示屏上实时显示距离数值,根据距离远近LED流水灯亮的数量不同,>10cm时仅亮1个灯,5-10cm之间时亮4个灯,<5cm时亮8个灯,使用mixly编程。请看下面的视频。
测距演示
三、Mixly模块代码解析
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中完美执行。
//包含两个库文件,液晶显示屏使用需要的
#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);
}
本实验积木由初始化工作室小陈搭建,大陈、小陈第一次合作完成同一个实验,希望能让你有所获。
转自公众号:
初始化工作室