title: 生产实习
tags: 学习
categories: 学习
id: -2
cover: https://pic1.afdiancdn.com/user/8a7f563c2e3811ecab5852540025c377/common/5bcc1fd0cc7119c390ab4a548a8e795b_w2240_h1260_s2562.jpg
translate_title: production-practice
subtitle: Production Practice
date: 2020-06-29 21:00:00
updated: 2020-06-29 21:00:00
等待更新中 时间为整点定时发布
待同步 取消加密 图片还未上传至图床 视频嵌入还未做好 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个bitunsigned long time;\#define pin 2//以下为主函数部分void setup() //初始设定{myservo.attach(9);//定义舵机接口Serial.begin(9600);//设定波特率为9600pinMode(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的高脉冲去触发TrigPindigitalWrite(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μspinMode(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左右,满足舵机旋转的条件,绿色指示灯常亮。
对应的实际运行情况如下图所示
