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℃时在设定的角度之间来回旋转;通过电位器控制电机,小风扇旋转的快慢。

大致设计思路:

具体实现源代码:
  1. //引入库文件
  2. \#include <Servo.h>//舵机库,之间要有空格,否则编译时会报错。
  3. \#include <Wire.h> //是I2C通讯的,Arduino和I2C设备通讯使用的(SCLK DIN RCLK)
  4. //以下为函数声明
  5. void zhuan();
  6. void buzhuan();
  7. void chaoshengbo();
  8. void wendu();
  9. //以下为变量声明及初始声明
  10. Servo myservo;//定义舵机变量名
  11. unsigned char jiao;
  12. const int P=A0;//电位器输入引脚
  13. const int U=8;
  14. int sensorValue=0;//电位器电压值
  15. int outputValue=0;
  16. // 设定SR04连接的Arduino引脚
  17. const int TrigPin = 10;
  18. const int EchoPin = 11;
  19. unsigned long distance;
  20. int temp;//温度
  21. int tol;//校对码
  22. int j;
  23. unsigned int loopCnt;
  24. int chr[40] = {0};//创建数字数组,用来存放40个bit
  25. unsigned long time;
  26. \#define pin 2
  27. //以下为主函数部分
  28. void setup() //初始设定
  29. {
  30. myservo.attach(9);//定义舵机接口
  31. Serial.begin(9600);//设定波特率为9600
  32. pinMode(TrigPin, OUTPUT);// 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
  33. pinMode(EchoPin, INPUT);
  34. Serial.println("Ultrasonic sensor:");
  35. buzhuan();
  36. chaoshengbo();
  37. wendu();
  38. }
  39. //以下为循环执行部分
  40. void loop()
  41. {
  42. chaoshengbo();
  43. wendu();
  44. delay(500);
  45. if ((distance<30) || (temp>30))
  46. {
  47. digitalWrite(4, LOW);//红灯灭,代表舵机未旋转
  48. digitalWrite(7, HIGH);//绿灯亮,代表舵机开始旋转
  49. zhuan();
  50. chaoshengbo();
  51. wendu();
  52. delay(500);
  53. }
  54. else if((distance>30) || (temp<30))
  55. {
  56. buzhuan();
  57. chaoshengbo();
  58. wendu();
  59. delay(500);
  60. }
  61. }
  62. //以下为函数定义部分
  63. void zhuan()//定义舵机转
  64. {
  65. myservo.write(jiao);
  66. sensorValue=analogRead(P);
  67. outputValue=map(sensorValue,0,1023,0,255);
  68. analogWrite(U,outputValue);
  69. for(jiao=30;jiao<150;jiao++)
  70. {
  71. myservo.write(jiao);//设置舵机旋转的角度
  72. delay(10);
  73. }
  74. for(jiao=150;jiao>30;jiao--)
  75. {
  76. myservo.write(jiao);//设置舵机旋转的角度
  77. delay(10);
  78. }
  79. }
  80. void buzhuan()//定义舵机不转
  81. {
  82. digitalWrite(TrigPin, LOW);
  83. delayMicroseconds(2);
  84. myservo.write(jiao);
  85. digitalWrite(4, HIGH);
  86. digitalWrite(7, LOW);
  87. sensorValue=analogRead(P);
  88. outputValue=map(sensorValue,0,1023,0,255);
  89. analogWrite(U,outputValue);
  90. myservo.write(jiao);
  91. }
  92. void chaoshengbo()//定义超声波测距
  93. {
  94. // 产生一个10us的高脉冲去触发TrigPin
  95. digitalWrite(TrigPin, LOW);
  96. delayMicroseconds(2);
  97. digitalWrite(TrigPin, HIGH);
  98. delayMicroseconds(10);
  99. digitalWrite(TrigPin, LOW); // 检测脉冲宽度,并计算出距离
  100. //delayMicroseconds(2);
  101. distance = pulseIn(EchoPin, HIGH) / 58.00;
  102. Serial.print("距离:");
  103. Serial.print(distance);
  104. Serial.print("cm");
  105. Serial.println();
  106. }
  107. void wendu()//定义温度测量
  108. {
  109. bgn:
  110. delay(500);
  111. //设置2号接口模式为:输出
  112. //输出低电平20ms(>18ms)
  113. //输出高电平40μs
  114. pinMode(pin,OUTPUT);
  115. digitalWrite(pin,LOW);
  116. delay(20);
  117. digitalWrite(pin,HIGH);
  118. delayMicroseconds(40);
  119. digitalWrite(pin,LOW);
  120. //设置2号接口模式:输入
  121. pinMode(pin,INPUT);
  122. //高电平响应信号
  123. loopCnt=10000;
  124. while(digitalRead(pin) != HIGH)
  125. {
  126. if(loopCnt-- == 0)
  127. {
  128. //如果长时间不返回高电平,输出个提示,重头开始。
  129. Serial.println("HIGH");
  130. goto bgn;
  131. }
  132. }
  133. //低电平响应信号
  134. loopCnt=30000;
  135. while(digitalRead(pin) != LOW)
  136. {
  137. if(loopCnt-- == 0)
  138. {
  139. //如果长时间不返回低电平,输出个提示,重头开始。
  140. Serial.println("LOW");
  141. goto bgn;
  142. }
  143. }
  144. //开始读取bit1-40的数值
  145. for(int i=0;i<40;i++)
  146. {
  147. while(digitalRead(pin) == LOW)
  148. {}
  149. //当出现高电平时,记下时间“time”
  150. time = micros();
  151. while(digitalRead(pin) == HIGH)
  152. {}
  153. //当出现低电平,记下时间,再减去刚才储存的time
  154. //得出的值若大于50μs,则为‘1’,否则为‘0’
  155. //并储存到数组里去
  156. if (micros() - time >50)
  157. {
  158. chr[i]=1;
  159. }else{
  160. chr[i]=0;
  161. }
  162. }
  163. //温度,8位的bit,转换为数值
  164. temp=chr[16]*128+chr[17]*64+chr[18]*32+chr[19]*16+chr[20]*8+chr[21]*4+chr[22]*2+chr[23];
  165. //校对码,8位的bit,转换为数值
  166. tol=chr[32]*128+chr[33]*64+chr[34]*32+chr[35]*16+chr[36]*8+chr[37]*4+chr[38]*2+chr[39];
  167. //输出:温度、湿度、校对码
  168. Serial.print("温度:");
  169. Serial.print(temp);
  170. Serial.println("℃");
  171. }

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

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

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

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