目录

1、组成器件

2、总体方案框图

3、 原理

4、电路连接图

5、代码

6、作品展示

7、总结


1、组成器件

UNO开发板

两个超声波模块

三个舵机

若干根杜邦线

一瓶消毒液

一个可以打开的盒子

面包板。

2、总体方案框图

3、 原理

超声波模块检测距离,然后根据距离判断使得舵机进行转动。

4、电路连接图

 

5、代码

#include <Servo.h>   //servo库
Servo servo;    //创建舵机对象来控制垃圾桶舵机 
Servo myservo;    // 创建舵机对象来控制洗手液舵机 
int trigPin= 5;    
int echoPin = 6;   
int servoPin= 7;
long duration, dist; 
long aver[3];   //定义存放距离的数组
long aver1[3];
 //洗手液
int servopin1= 4;
int trigpin1= 10;    
int echopin1= 11;   
long duration1,distance;
int pos=0;
void setup() {  
  //垃圾桶
   Serial.begin(9600);
    servo.attach(7);//把连接在引脚7上的舵机赋予舵机对其控制
    pinMode(trigPin, OUTPUT);   //要检测引脚上输入的脉冲宽度,需要先设置为输入状态  
    pinMode(echoPin, INPUT);  
    servo.write(0);         //通电时关闭盖子
  //洗手液 
    pinMode(trigpin1, OUTPUT);    
    pinMode(echopin1, INPUT);   
    myservo.attach(4);     // 把连接在引脚9上的舵机赋予舵机对其控制 
    myservo.write(0);         // 将伺服设置为初始0度 
} 
void loop() { 
  //垃圾桶
  for (int i=0;i<=2;i++) {   //平均距离
    digitalWrite(trigPin, HIGH);  //产生一个10us的高脉冲去触发TrigPin
    delayMicroseconds(2);
    digitalWrite(trigPin, LOW);
    delayMicroseconds(5);
    digitalWrite(trigPin, HIGH);
    duration = pulseIn(echoPin, HIGH);  
    dist = (duration/2) / 10;    // 检测脉冲宽度并测算出距离        
    aver[i]=dist;            
    delay(10);              //测量之间的延迟
  }
 dist=(aver[0]+aver[1]+aver[2])/3;    
   delay(1000);
   Serial.println ("垃圾桶测得距离:");
   Serial.println(dist);
    if ( dist<20) {
    //根据需要更改距离
    servo.attach(7);
    delay(1);
    servo.write(90);   
    delay(3000);       
    servo.write(20);    
    delay(1000);      
}
//洗手液
for (int i=0;i<=2;i++) { 
    digitalWrite(trigpin1, LOW);
    delayMicroseconds(2);
    // 将trigpin1设置为高状态10微秒
    digitalWrite(trigpin1, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigpin1, LOW);
    // 读取echopin1,以微秒为单位返回声波传播时间
    duration1= pulseIn(echopin1, HIGH);//pulseIn函数用于读取引脚脉冲的时间长度,脉冲可以是HIGH或LOW。
    //如果是HIGH,函数将先等引脚变为高电平,然后开始计时,一直到变为低电平为止。返回脉冲持续的时间长短, 单位为ms。如果超时还没有读到的话, 将返回0。
    // 计算距离
    distance = (duration1/2) / 10;    //获取距离  检测脉冲宽度并测算出距离
    aver1[i]=distance;            
    delay(10);              //测量之间的延迟
    }
    distance=(aver1[0]+aver1[1]+aver1[2])/3; 
    delay(1000);
    Serial.println("洗手液测得距离:");
    Serial.println(distance);
    if(distance<20)
    { //检查距离小于20cm
       myservo.write(180); 
       delay(1000);
       myservo.write(-180);
       delay(100);
    }          
}

6、作品展示

arduino课程设计

7、总结

本次课程设计我采用了通过超声波模块来控制舵机转动以此来实现垃圾桶的打开和关闭以及洗手液的按压,总体设计比较简单。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐