接线

Arduino uno

0

语音模块

3

舵机1

5

舵机2

6

舵机3

7

超声波trig

8

超声波echo

9

舵机4

10

led1

11

led2

12

led3

13

led4

A4

光敏电阻

项目代码

//1:干垃圾;2:湿垃圾;3:有害垃圾;4:可回收垃圾
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <Servo.h>  //加载舵机文件库
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const int trig=7; //超声波触发引脚
const int echo=8; //超声波回馈引脚
float distance; //距离
int lightvalue; //光照强度
Servo servo1; //创建对象:舵机1
Servo servo2; 
Servo servo3; 
Servo servo4; 
const int led1=10;  //小灯泡引脚
const int led2=11;
const int led3=12;
const int led4=13;
boolean dry; //记录垃圾桶盖子开关状态,1为开,0为关
boolean wet;
boolean poisonous;
boolean recyclable;
String st=""; //串口读取的字符数据的字符串变量
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void SuperSoundWaveSetUp()  //超声波初始化 
{
  pinMode(trig,OUTPUT);
  pinMode(echo,INPUT);
}
float SuperSoundWaveDistance()  //超声波测距
{
  //产生1个10us的高脉冲去出发trig
  digitalWrite(trig,LOW);
  delayMicroseconds(2);
  digitalWrite(trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(trig,LOW);
  //检测脉冲宽度,计算距离(厘米)
  distance=pulseIn(echo,HIGH)/58.00;
  delay(1000);
  return distance;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int LightValue() //光敏电阻测光照强度
{
  lightvalue=analogRead(A4);  //光敏电阻接入A4引脚
  return lightvalue;
  delay(1000);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void ServoSetUp() //初始化舵机,servo1.attach(舵机1的信号引脚),舵机需接模拟输出引脚
{
  servo1.attach(3);          
  servo2.attach(5);
  servo3.attach(6);
  servo4.attach(9);
}
void Servo1On()  //舵机1打开干垃圾桶盖子
{
  for (int pos = 80; pos <= 175; pos += 1)  //用for和delay降低其转速,防止盖子被弹开
  {
    servo1.write(pos);
    delay(5);    
  }
}
void Servo1Off()  //舵机1关闭干垃圾桶盖子
{
  servo1.write(80); 
}
void Servo2On()  //舵机2打开湿垃圾桶盖子
{
  for (int pos = 80; pos <= 175; pos += 1) 
  {
    servo2.write(pos);
    delay(5);    
  }
}
void Servo2Off()  //舵机2关闭湿垃圾桶盖子
{
  servo2.write(80); 
}
void Servo3On()  //舵机3打开有害垃圾桶盖子
{
  for (int pos = 80; pos <= 175; pos += 1) 
  {
    servo3.write(pos);
    delay(5);    
  }
}
void Servo3Off()  //舵机3关闭有害垃圾桶盖子
{
  servo3.write(80); 
}
void Servo4On()  //舵机4打开可回收垃圾桶盖子
{
  for (int pos = 80; pos <= 175; pos += 1) 
  {
    servo4.write(pos);
    delay(5);    
  }
}
void Servo4Off()  //舵机4关闭可回收垃圾桶盖子
{
  servo4.write(80); 
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void LedSetUp()  //小灯泡初始化
{
  pinMode(led1, OUTPUT); 
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT); 
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void setup() 
{
  Serial.begin(9600); //设置串口波特率9600
  SuperSoundWaveSetUp();  //超声波初始化
  ServoSetUp(); //舵机初始化
  LedSetUp();  //小灯泡初始化
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void loop() 
{
  st="";
  while(Serial.available() > 0) //当串口缓冲区有数据
  {
    st+=char(Serial.read());  //将缓冲区数据累加读入st
    delay(2);
  }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  if(SuperSoundWaveDistance()<25) //超声波测到的距离小于25厘米
  { 
    Serial.print("超声波测得的距离:");
    Serial.println(SuperSoundWaveDistance());
    if(st.length()>0) //st不为空,即读到了串口缓冲区的数据
    {
      Serial.print("串口接收到的数据:");
      Serial.println(st);
      if(st=="dry001"&&dry==0) //语音模块向串口输出dry001,表示要打开干垃圾桶的盖子,并且此时干垃圾桶的盖子没有打开
      {
        Servo1On();
        dry=1;  //记下干垃圾桶的盖子已打开这个状态
      }
      if(st=="wet002"&&wet==0) 
      {
        Servo2On();
        wet=1;
      }
      if(st=="poisonous003"&&poisonous==0) 
      {
        Servo3On();
        poisonous=1;
      }
      if(st=="recyclable004"&&recyclable==0) 
      {
        Servo4On();
        recyclable=1;
      }
      if(st=="off1234"&&(dry||wet||poisonous||recyclable)) //语音模块向串口输出off1234,表示要关闭已打开的垃圾桶盖子,并且确实有已打开的盖子要关闭
      {   
        if(dry)
        {
          Servo1Off();              
          dry=0;
        }
        if(wet)
        {
          Servo2Off();
          wet=0;
        }
        if(poisonous)
        {
          Servo3Off();
          poisonous=0;
        }
        if(recyclable)
        {
          Servo4Off();
          recyclable=0;
        }
        delay(1000); //确保盖子关闭,防止下达关闭命令后立刻再下达打开命令
      }
    }
  }
  else  //超声波测到的距离大于等于25厘米,关闭已打开的垃圾桶
  {
        if(dry)
        {
          Servo1Off();              
          dry=0;
        }
        if(wet)
        {
          Servo2Off();
          wet=0;
        }
        if(poisonous)
        {
          Servo3Off();
          poisonous=0;
        }
        if(recyclable)
        {
          Servo4Off();
          recyclable=0;
        }
        delay(1000); 
  }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  if(LightValue()<450)  //光敏电阻测到的光照强度小于450,即环境昏暗
  {
    Serial.print("光敏电阻测得的光照强度:");
    Serial.println(LightValue());
    if(!(dry||wet||poisonous||recyclable))  //4个盖子全关时,灯全亮
    {
      digitalWrite(led1, HIGH);
      digitalWrite(led2, HIGH);
      digitalWrite(led3, HIGH);
      digitalWrite(led4, HIGH);
    }
    else  //当有盖子打开时,打开的亮,关闭的灭
    {
      digitalWrite(led1, dry);  //灯的状态与盖子的状态一致,即打开的亮,关闭的灭
      digitalWrite(led2, wet);
      digitalWrite(led3, poisonous);
      digitalWrite(led4, recyclable);
    }  
  }
  else  //光敏电阻测到的光照强度大于等于450,即环境明亮,灯全灭
  {
     digitalWrite(led1, LOW);
     digitalWrite(led2, LOW);
     digitalWrite(led3, LOW);
     digitalWrite(led4, LOW);
  }
}
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐