等待更新中 时间为整点定时发布

待同步 取消加密 > 图片还未上传至图床 > 视频嵌入还未做好 YouTube 已 OK > 目录在左侧

超声波及温度传感摇摆风扇
所用元件:

UNO R3 开发板 ×1

大面包板 ×1

舵机 ×1

舵机支架 ×1

电位器 ×1

1k 电阻 ×1

USB 数据线 ×1

小风扇 ×1

摇头风扇支架组件 ×1

ULN2003AN 驱动芯片 ×1

三色 LED ×1

鳄鱼夹 ×2

面包线 若干

开发环境:Arduino IDE,Mind+
预期要求:

通过超声波测距和温度传感控制舵机是否旋转,当距离小于 30cm 或温度大于 30℃ 时在设定的角度之间来回旋转;通过电位器控制电机,小风扇旋转的快慢。

大致设计思路:
具体实现源代码:
//引入库文件
\#include <Servo.h>//舵机库,之间要有空格,否则编译时会报错。
\#include <Wire.h> //是I2C通讯的,Arduino和I2C设备通讯使用的(SCLK DIN RCLK)
//以下为函数声明
void zhuan();
void buzhuan();
void chaoshengbo();
void wendu();
//以下为变量声明及初始声明
Servo myservo;//定义舵机变量名
unsigned char jiao;
const int P=A0;//电位器输入引脚
const int U=8;
int sensorValue=0;//电位器电压值
int outputValue=0;
// 设定SR04连接的Arduino引脚
const int TrigPin = 10;
const int EchoPin = 11;
unsigned long distance;
int temp;//温度
int tol;//校对码
int j;
unsigned int loopCnt;
int chr[40] = {0};//创建数字数组,用来存放40个bit
unsigned long time;
\#define pin 2
//以下为主函数部分
void setup() //初始设定
{
myservo.attach(9);//定义舵机接口
Serial.begin(9600);//设定波特率为9600
pinMode(TrigPin, OUTPUT);// 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
pinMode(EchoPin, INPUT);
Serial.println("Ultrasonic sensor:");
buzhuan();
chaoshengbo();
wendu();
}
//以下为循环执行部分
void loop()
{
chaoshengbo();
wendu();
delay(500);
if ((distance<30) || (temp>30))
{
digitalWrite(4, LOW);//红灯灭,代表舵机未旋转
digitalWrite(7, HIGH);//绿灯亮,代表舵机开始旋转
zhuan();
chaoshengbo();
wendu();
delay(500);
}
else if((distance>30) || (temp<30))
{
buzhuan();
chaoshengbo();
wendu();
delay(500);
}
}
//以下为函数定义部分
void zhuan()//定义舵机转
{
myservo.write(jiao);
sensorValue=analogRead(P);
outputValue=map(sensorValue,0,1023,0,255);
analogWrite(U,outputValue);
for(jiao=30;jiao<150;jiao++)
{
myservo.write(jiao);//设置舵机旋转的角度
delay(10);
}
for(jiao=150;jiao>30;jiao--)
{
myservo.write(jiao);//设置舵机旋转的角度
delay(10);
}
}
void buzhuan()//定义舵机不转
{
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
myservo.write(jiao);
digitalWrite(4, HIGH);
digitalWrite(7, LOW);
sensorValue=analogRead(P);
outputValue=map(sensorValue,0,1023,0,255);
analogWrite(U,outputValue);
myservo.write(jiao);
}
void chaoshengbo()//定义超声波测距
{
// 产生一个10us的高脉冲去触发TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW); // 检测脉冲宽度,并计算出距离
//delayMicroseconds(2);
distance = pulseIn(EchoPin, HIGH) / 58.00;
Serial.print("距离:");
Serial.print(distance);
Serial.print("cm");
Serial.println();
}
void wendu()//定义温度测量
{
bgn:
delay(500);
//设置2号接口模式为:输出
//输出低电平20ms(>18ms)
//输出高电平40μs
pinMode(pin,OUTPUT);
digitalWrite(pin,LOW);
delay(20);
digitalWrite(pin,HIGH);
delayMicroseconds(40);
digitalWrite(pin,LOW);
//设置2号接口模式:输入
pinMode(pin,INPUT);
//高电平响应信号
loopCnt=10000;
while(digitalRead(pin) != HIGH)
{
if(loopCnt-- == 0)
{
//如果长时间不返回高电平,输出个提示,重头开始。
Serial.println("HIGH");
goto bgn;
}
}
//低电平响应信号
loopCnt=30000;
while(digitalRead(pin) != LOW)
{
if(loopCnt-- == 0)
{
//如果长时间不返回低电平,输出个提示,重头开始。
Serial.println("LOW");
goto bgn;
}
}
//开始读取bit1-40的数值
for(int i=0;i<40;i++)
{
while(digitalRead(pin) == LOW)
{}
//当出现高电平时,记下时间“time”
time = micros();
while(digitalRead(pin) == HIGH)
{}
//当出现低电平,记下时间,再减去刚才储存的time
//得出的值若大于50μs,则为‘1’,否则为‘0’
//并储存到数组里去
if (micros() - time >50)
{
chr[i]=1;
}else{
chr[i]=0;
}
}
//温度,8位的bit,转换为数值
temp=chr[16]*128+chr[17]*64+chr[18]*32+chr[19]*16+chr[20]*8+chr[21]*4+chr[22]*2+chr[23];
//校对码,8位的bit,转换为数值
tol=chr[32]*128+chr[33]*64+chr[34]*32+chr[35]*16+chr[36]*8+chr[37]*4+chr[38]*2+chr[39];
//输出:温度、湿度、校对码
Serial.print("温度:");
Serial.print(temp);
Serial.println("℃");
}

串口串口显示情况 1,此时温度为 28℃,距离为 275cm 左右,都不满足舵机旋转的条件,红色指示灯常亮。

对应的实际运行情况如下图所示:

串口串口显示情况 2,串口串口显示情况 1,此时温度为 28℃,距离为 5cm 左右,满足舵机旋转的条件,绿色指示灯常亮。

对应的实际运行情况如下图所示