需要的硬件:wemos,超声波模块(HC—SR04),舵机(sg90),杜邦线若干,小垃圾桶
型号:SG90 | 重量13克 角度90度-180度通用 |
---|---|
红色电压 粽色地线 橙色是信号线 | |
厂家给出的技术数据: | 尺寸:21.5mmX11.8mmX22.7mm重量:9克 |
无负载速度: | 0.12秒/60度(4.8V) |
堵转扭矩: | 1.2-1.4公斤/厘米(4.8V) |
使用温度: | -30~~+60摄氏度 |
死区设定: | 7微秒 |
工作电压: | 4.8V-6V |
attach | 连接舵机 (自带库仅9/10脚有效) |
---|---|
write | 角度控制 |
writeMicroseconds() | 更精准的角度控制 (um级) |
read() | 读上一次舵机转动角度 |
attached() | 检查舵机及是否连接控制板上 |
detach() | 断开舵机连接,使接口 (9/10脚) 可做PWM输出 |
#include //包含舵机的头文件
#define PIN_SERVO D5 //定义一个舵机引脚
Servo myservo; //给自己的舵机起一个名字
myservo.attach(PIN_SERVO);//连接舵机
myservo.write(30); //舵机转动的角度
/*************对舵机的基础控制**************/
#define servo D5 //定义舵机引脚
#include //调出舵机函数
Servo sssss;//定义一个舵机的名称
void setup() {
sssss.attach(servo);//连接上舵机
}
void loop() {
sssss.write(0);
delay(1000);
sssss.write(180);
delay(1000);
}
超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有4个引脚:VCC(正极)、Trig(触发Echo (回应)、GND (接地),
在超声波块的触发脚位输入10微秒以上的高电位,即可发射超声波,发射超声波之后,与接收到传回的超声波之前,“响应”脚位呈现高电位。因此,程序可从“响应”脚位的高电位脉冲持续时间,换算出被测物的距离。
关于距离中除以58的说明:
58也很好理解,声音在干燥、摄氏 20度的空气中的传播速度大约为343米/秒,合34.300厘米/秒。或者,我们作一下单位换算,34300除以1,000,000厘米/微秒。即为: 0.0343厘米/微秒,再换一个角度,1/ (0.0343 厘米/微秒)即: 29.15 微秒/厘米,这就意味着,每291.5微秒表示10CM的距离。1厘米就是29.15微秒。但是发送后到接收到回波,声音走过的是2倍的距离呀。听以实际距离就是1厘米,对应58.3微秒。实际上整个测距过程是测的发出声波到收到回波的时间,你的程序里的第一个distance实际是时间us。所以换成距离cm,要除以58。当然除以58.3可能更确。所以程序中用 pulseln(EcoPin, HIGH)/ 58.00获取测得的距离。
#define Echo D5 //吸收
#define Tirg D6 //发射,,给一个10us的高电平,触发
unsigned long dis;//unsigned的作用是:声明无符号的整数类型。
/**写一个检测高电平触发时间*/
unsigned long init_time()
{
digitalWrite(Tirg,HIGH);
delayMicroseconds(10);
digitalWrite(Tirg,LOW);
return pulseln(Echo,HIGH);
}
void setup(){
pinMode(Echo,INPUT);
pinMode(Tirg,OUTPUT);
Serial.begin(115200);
}
void loop(){
/*我感觉这个是换算起来比较麻烦的一个
dis = init_time()/58;*/
/还有一种计算方法就是,路程 =时间 * 速度(340m/s),,,2dis = time * 340m/s,这个时间是微秒,所以换算得0.017
dis = init_time()*0.017;
Serial.print(dis);
Serial.println("cm"); //字符要加引号
delay(1200);//写一个延迟
}
#define Echo D7 //接收
#define Tirg D6 //发射,,给一个10us的高电平,触发
unsigned long dis;//unsigned的作用是:声明无符号的整数类型。
/*************对舵机的基础控制**************/
#define servo D5 //定义舵机引脚
#include //调出舵机函数
Servo sssss; //定义一个舵机的名称
/**写一个检测高电平触发时间*/
unsigned long init_time()
{
digitalWrite(Tirg,HIGH);
delayMicroseconds(10);
digitalWrite(Tirg,LOW);
return pulseIn(Echo,HIGH);
}
/***************************/
void setup(){
pinMode(Echo,INPUT);
pinMode(Tirg,OUTPUT);
sssss.attach(servo);//连接上舵机
Serial.begin(115200);
}
void loop(){
dis = init_time()*0.017;
/*通过串口打印出来显示*/
Serial.print(dis);
Serial.println("cm"); //字符要加引号
/**************************************/
if(dis<10)
{
sssss.write(30);
delay(2000);
sssss.write(180);
}else
{
sssss.write(180);
}
}
到了此部分呢,本节内容已经结束,但是如果还想在此基础上有所进阶,,可以在试试连上WiFi,用手机端控制垃圾桶的开关,哈哈哈哈,祝你好运!!!
#include
/*****WiFi部分******/
char *ssid = "WiFi名称"; //自己家的wifi
char *passwd = "WiFi密码";
int port = 8888; //端口号
WiFiServer server(port); //设置服务器端口号
/*****超声波*******/
#define Echo D7 //吸收
#define Tirg D6 //发射,,给一个10us的高电平,触发
unsigned long dis;//unsigned的作用是:声明无符号的整数类型。
/*************对舵机的基础控制**************/
#define servo D5 //定义舵机引脚
#include //调出舵机函数
Servo sssss; //定义一个舵机的名称
/******wiff部分*******/
void init_wifi_sta()
{
WiFi.mode(WIFI_STA); //设置STA模式
WiFi.begin(ssid,passwd); //连接网络
while(WiFi.status() != WL_CONNECTED) //等待连接
{
Serial.print(".");
delay(500);
}
Serial.println(WiFi.localIP()); //通过串口打印wemos的ip地址
}
/**写一个检测超声波高电平触发时间*/
unsigned long init_time()
{
digitalWrite(Tirg,HIGH);
delayMicroseconds(10);
digitalWrite(Tirg,LOW);
return pulseIn(Echo,HIGH);
}
/***************************/
void setup(){
pinMode(Echo,INPUT);
pinMode(Tirg,OUTPUT);
sssss.attach(servo);//连接上舵机
Serial.begin(115200);
init_wifi_sta();
server.begin(); // 启动服务器
}
void loop(){
char cmd;
dis = init_time()*0.017;
/*实际中不需要打印出来也*/
Serial.print(dis);
Serial.println("cm"); //字符要加引号
/***********近距离感应部分*************/
if(dis<10)
{
sssss.write(30);
delay(2000);
sssss.write(180);
}else
{
sssss.write(180);
}
/***********wifi控制部分*********/
WiFiClient client = server.available(); // 服务器初始化
while(client.connected()) // 等待客户端连接
{
while(client.available()>0)//有数据到来,类似Serial.available()
{
cmd = client.read(); //读取数据
Serial.print(cmd);
switch(cmd){
case '1':
sssss.write(30);
break;
case '0':
sssss.write(180);
break;
}
}
}
}
链接:示例视频