本帖最后由 海神 于 2022-5-16 15:17 编辑
简介
每当你开车出行到达一个地方需要停车的时候,你是否还在为寻找停车位而烦恼呢?你是否在寻找车位时浪费了太多的时间呢?有了智能停车场,我们就可以快速判断并找到停车场的空缺位置,为自己找到合适的停车位置。 在商场或者办公大楼下的停车场,车位上都会安装一个车位指示灯,用来指示该车位是否有停车,当发现是红灯的时候说明该车位已经被车辆占用,指示灯为绿灯则说明车位是空车位,我们可以通过车位前方的指示灯快速识别空车位,快速找到车位我们才能避免提车浪费太多时间。 而怎样检测车位下是否有车辆占用,实际上大多是采用超声波传感器安装在车位正上方,超声波传感器则是用来测量距离。当下方有车辆时,超声波检测到的距离相比空车位时发生变动。所以我们就可以判断出车位下方存在车辆。 本节我们将超声波传感器连接在WiFiduino中,wifiduino接入网络后后,将检测到的距离数据反馈到云端,再发送到手机APP,这样我们就能知道停车场的具体情况啦。
超声波测距 超声波传感器是利用超声波的特性研制而成的传感器。我们使用的超声波传感器一般会用来测距,相比其他测距传感器有着简单易用、灵敏度高等特点。对于超声波传感器各种特性,超声波检测广泛应用在工业、国防、生物医学等方面。
超声波测距的原理 采用IO触发测距,给至少10us的高电平信号; 模块自动发送8个40KHz的方波,自动检测是否有信号返回; 有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.距离=(高电平时间*声速(340m/s))/2; 具体步骤 首先采用数字引脚给超声波模块的Trig引脚至少10μs的高电平信号,触发SR04模块测距功能; 触发后,模块会自动发送8个40KHz的超声波脉冲,并自动检测是否有信号返回。这步会由模块内部自动完成。 如有信号返回,Echo引脚会输出高电平,高电平持续的时间就是超声波从发射到返回的时间。此时,我们能使用pulseIn() 函数获取到测距的结果,并计算出距被测物的实际距离。
超声波传感器的引脚定义 超声波传感器引脚 | 定义 | vcc | VCC | trig | 发送端 | echo | 接收端 | gnd | GND |
硬件
wifiduino主控器*1 wifiduino传感器扩展板*1 超声波传感器*1 LED灯模块红色*1 LED灯模块绿色*1
软件
blinker app
代码 在该示例代码中,我们采用一个文本控件,将超声波传感器采集到的距离值实时远程的传到blinker app中。 - #define BLINKER_WIFI
- #include <Blinker.h>
- char auth[] = "d8bdba0xxxx";
- char ssid[] = "moxxxxn";
- char pswd[] = "1803808xxxx";
- #define TEXTE_1 "TextKey" //设置文本组件的键名为“TextKey”
- BlinkerText Text1(TEXTE_1); //新建一个文本对象
- const int TrigPin = D5;
- const int EchoPin = D4;
- float cm;
- float distance_read = 0;
- float distance(){
- //发一个10ms的高脉冲去触发TrigPin
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- cm = pulseIn(EchoPin, HIGH) / 58.0; //算成厘米
- cm = (int(cm * 100.0)) / 100.0; //保留两位小数
- return cm;
- }
- void heartbeat() //设置心跳包,59秒发送一次测得的数据,避免服务器的数据资源浪费。
- {
- Text1.print(distance_read);
- }
- void setup()
- {
- Serial.begin(115200);
- BLINKER_DEBUG.stream(Serial);
- BLINKER_DEBUG.debugAll();
- pinMode(LED_BUILTIN, OUTPUT);
- digitalWrite(LED_BUILTIN, LOW);
- Blinker.begin(auth, ssid, pswd);
- Blinker.attachHeartbeat(heartbeat);
- pinMode(TrigPin, OUTPUT);
- pinMode(EchoPin, INPUT);
- }
- void loop()
- {
- Blinker.run();
- distance_read = distance();
- }
复制代码blinker 定制软件界面
点击右上方解锁按键,进入编辑模式,添加一个为文本组件,作为超声波传回数据的显示接口。 将键名修改为程序里定义的“TextKey”,文本默认不显示额外信息。完成编辑,点击右上角的勾号。 然后,我们还可以添加两个帮助显示的文本,达到好的显示效果 。 点击右上角解锁,完成添加组件。
硬件连接
将扩展板堆叠在wifiduino主板上,超声波传感器通过4P连接线连接在扩展板上的4P接口上。 观察现象
检查当正常开启超声波检测后,观察手机app中显示的测距数据,这样就可以远程的实时观察某个距离数据了。
以上实验我们实现了远程的超声波测距。但和我们想要完成的车位警示还有一些区别。当获取距离值后,我们在程序中就可以将数据作为判断,当小于某一数值时,说明车位已被占用,这时候点亮红色LED灯,否则点亮绿色LED 代码
- #define BLINKER_WIFI
- #include <Blinker.h>
- char auth[] = "d8bdba0xxxx";
- char ssid[] = "moxxxxn";
- char pswd[] = "1803808xxxx";
- #define TEXTE_1 "TextKey" //设置文本组件的键名为“TextKey”
- #define RLEDPIN D8 //定义红色LED引脚
- #define GLEDPIN D9 //定义绿色LED引脚
- BlinkerText Text1(TEXTE_1); //新建一个文本对象
- const int TrigPin = D5;
- const int EchoPin = D4;
- float cm;
- float distance_read = 0;
- float distance(){
- //发一个10ms的高脉冲去触发TrigPin
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- cm = pulseIn(EchoPin, HIGH) / 58.0; //算成厘米
- cm = (int(cm * 100.0)) / 100.0; //保留两位小数
- return cm;
- }
- void heartbeat() //设置心跳包,59秒发送一次测得的数据,避免服务器的数据资源浪费。
- {
- Text1.print(distance_read);
- }
- void setup()
- {
- Serial.begin(115200);
- BLINKER_DEBUG.stream(Serial);
- BLINKER_DEBUG.debugAll();
- pinMode(LED_BUILTIN, OUTPUT);
- digitalWrite(LED_BUILTIN, LOW);
- Blinker.begin(auth, ssid, pswd);
- Blinker.attachHeartbeat(heartbeat);
- pinMode(TrigPin, OUTPUT);
- pinMode(EchoPin, INPUT);
- pinMode(RLEDPIN, OUTPUT);
- pinMode(GLEDPIN, OUTPUT);
- }
- void loop()
- {
- Blinker.run(); //与blinker同步数据
- distance_read = distance(); //超声波采集一次数据
- if (distance_read <= 50) { //距离值小于等于50cm时
- digitalWrite(RLEDPIN,HIGH);
- digitalWrite(GLEDPIN,LOW);
- Blinker.delay(1000); //延时1秒
- } else {
- digitalWrite(GLEDPIN,HIGH);
- digitalWrite(RLEDPIN,LOW);
- Blinker.delay(1000);
- }
- }
复制代码
|