为什么我这里需要用到超声波能,本来我想的是一个放在车牌识别哪里,只要测的物体距离小于一定值,就让摄像头开始拍照识别,另外的我想在每个停车位哪里,也装个超声波测距,可以检查当前车位是否有车,这样一来可以方便统计数量,后面还有一些后续的操作还没想清楚
由名称可以知道,超声波传感器可以通过使用超声波来测量距离。传感器头发射超声波并接收从目标反射回来的波。超声波传感器通过测量发射和接收之间的时间来测量到目标的距离。当然,简单来说,超声波传感器是通过使用声波来测量物体的距离的装置。它通过发出特定频率的声波来测量距离,并等待该声波反弹。通过记录在产生的声波和声波反弹之间所花费的时间,可以计算传感器和物体之间的距离。
NodeMCU是一个开源的IoT物联网硬件开发板,由于它支持WIFI功能且使用方法十分类似Arduino开发板,所以近些年获得了越来越多来自全世界的创客朋友们的青睐。NodeMCU尺寸与Arduino Nano类似。它并不是Arduino团队开发的,但是我们也可以使用Arduino IDE 对它进行开发。而且它还有一颗地道的“中国芯”—ESP8266模块。所以无论在性能还有价格上,我们太极创客团队都认为NodeMCU是更值得创客朋友们在物联网开发上花更多的时间来学习和使用的。
作为万物互联的IoT基础,首先物联网控制板的成本不能过高。高昂的物联网控制元件不利于项目成本控制也不利于广大创客爱好者学习和使用它。在这一点上,NodeMCU比树莓派以及Arduino家族的IoT平台等更具优势。
超声波模块原理
因为传感器本身只是把它的“ECHO”引脚保持在高电平,使之持续一段时间,这对应于从发送的波形到接收反射(回波)所花费的这一段时间。
模块发出一阵声波,同时向回声引脚施加电压。
该模块从声波接收反射并从回波引脚消除电压。
在测距的时候,超声波传感器中产生脉冲将数据发送到NodeMCU或任何其它的微控制器。
起始脉冲约为10us,基于距离的PWM信号将为150 us-25us。如果没有障碍物,则NodeMCU生成38us脉冲,以确认没有检测到物体。
在读取HC-SR04测的距离之前,得先了解如何计算距离的,这有一个公式
Distance = 1/2×T×C
其中Distance是距离,T是发射和接收之间的时间,C是声速。
该值乘以1/2,因为T是返回距离的时间
接线
超声波代码
// 定义引脚编号
const int trigPin = 2; //D4
const int echoPin = 0; //D3
// 定义变量
long duration;
int distance;
void setup() {
pinMode(trigPin, OUTPUT); // 将trigPin设置为输出
pinMode(echoPin, INPUT); // 将echoPin设置为输入
Serial.begin(9600); // 启动串行通信
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
//将trigPin设置为HIGH状态10微秒
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 读取echoPin,以微秒为单位返回声波传播时间
duration = pulseIn(echoPin, HIGH);
// 计算距离
distance= duration*0.034/2;
// 打印距离在串行监视器
Serial.print("Distance: ");
Serial.println(distance);
delay(2000);
}
超声波传递信号给后台
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include "stdlib.h"
WiFiClient client;
ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'
// 定义引脚编号
const int trigPin = 2; //D4
const int echoPin = 0; //D3
// 定义变量
long duration;
int distance;
const char *host = "192.168.11.104";//服务器IP
const int httpPort =8090;//端口号
void setup() {
pinMode(trigPin, OUTPUT); // 将trigPin设置为输出
pinMode(echoPin, INPUT); // 将echoPin设置为输入
Serial.begin(9600); // 启动串行通信
Serial.println();
Serial.println();
Serial.print("Connecting to ");
wifiMulti.addAP("FAST_55555", "dyk159357");
wifiMulti.addAP("dyk", "dyk159357"); // 将需要连接的一系列WiFi ID和密码输入这里
Serial.println("Connecting ...");
while (wifiMulti.run() != WL_CONNECTED) { // 尝试进行wifi连接。
delay(250);
Serial.print('.');
}
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n');
Serial.print("Connected to ");
Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称
Serial.print("IP address:\t");
Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
//将trigPin设置为HIGH状态10微秒
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 读取echoPin,以微秒为单位返回声波传播时间
duration = pulseIn(echoPin, HIGH);
// 计算距离
distance= duration*0.034/2;
// 打印距离在串行监视器
Serial.print("Distance: ");
Serial.println(distance);
delay(2000);
if(distance<=5){
wifiClientRequest(1);
Serial.println("send ok");
}
else{
wifiClientRequest(0);
Serial.println("no car");
}
delay(5000);
}
void wifiClientRequest(int sta){
WiFiClient client;
// 将需要发送的数据信息放入客户端请求
String url = "/csb?s="+String(sta);
// 建立字符串,用于HTTP请求
String httpRequest = String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n" +
"\r\n";
Serial.print("Connecting to ");
Serial.print(host);
if (client.connect(host, httpPort)) { //如果连接失败则串口输出信息告知用户然后返回loop
Serial.println(" Sucess");
client.print(httpRequest); // 向服务器发送HTTP请求
Serial.println("Sending request: ");// 通过串口输出HTTP请求信息内容以便查阅
Serial.println(httpRequest);
} else{
Serial.println(" failed");
}
client.stop();
}