基于arduino的语音控制智能垃圾桶(3)
基于arduino的语音控制智能垃圾桶
·
接线
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);
}
}
更多推荐
所有评论(0)