🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **While循环** > 有时你可能需要进行这样的操作:如果某个条件为**true**的话就一直停在那里,直到它由true变成false才继续执行(反过来也可以,开始为false,直到true才继续)。你可以使用while循环来做到这一点。本例向你展示如何使用while循环来校准模拟信号传感器。 在**loop中**,我们读取A0口的值,来给9号引脚上的LED调光。 但是当2号引脚上的按键被按下时,程序就会去执行**calibrate()** 函数(函数名意思叫 校准,这是自己定义的函数)。**calibrate()**会寻找模拟信号的最大、最小值。当你松开按键时,loop()中的其他代码才会继续被执行。 本例所展示的技巧能够让你在环境光线发生明显改变时进行人工校准。 ### **所需硬件** * Arduino板或Genuino板 * 按键或开关 * 光敏电阻或其他模拟信号传感器 * 2个10kΩ电阻 * 面包板 * 连接线 ### **电路** ![图片来自官网](http://img.blog.csdn.net/20160602125218948)  连接模拟信号传感器(例如:光敏电阻) 到A2口,并且加一个10kΩ下拉电阻。连接按键到数字引脚,并且加一个10kΩ下拉电阻。LED和220Ω电阻串接后连接到9号引脚。 ### **原理图** ![图片来自官网](http://img.blog.csdn.net/20160602125154022) ### **代码** ~~~ /* While循环 本例向你展示while()的使用。 当按键被按下时,工程将会启动开始校准。 while循环中获得的传感器数据讲被取最大、最小值,然后对光敏电阻进行校准。 这是校准模拟信号的另一个例子,之前也介绍过一种方法,不过这次重在演示while循环的使用。 电路搭建: * 光敏电阻连接+5V 和A0口 * 10kΩ电阻连接GND和A0口 * LED与220Ω电阻串联,并接到9号引脚 * 按键连接到A2口和+5V * 10KΩ电阻连接到A2口到GND 代码公开。 */ // 常亮定义: const int sensorPin = A2; // 传感器引脚 const int ledPin = 9; // LED引脚 const int indicatorLedPin = 13; // 板载LED引脚 const int buttonPin = 2; // 按键引脚 // 变量: int sensorMin = 1023; // 传感器最小值 int sensorMax = 0; // 传感器最大值 int sensorValue = 0; // 传感器值 void setup() { // 将indicatorLedPin设置为OUTPUT模式: pinMode(indicatorLedPin, OUTPUT); pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { // 当按键被按下时进行校准: while (digitalRead(buttonPin) == HIGH) { calibrate(); } // 关闭LED,标志校准结束 digitalWrite(indicatorLedPin, LOW); // 读取传感器值: sensorValue = analogRead(sensorPin); // 运用最大、最小值来校准传感器值 sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255); // 放置sensorValue超过上下限(正常最小0,最大255) sensorValue = constrain(sensorValue, 0, 255); // 使用sensorValue给LED调光: analogWrite(ledPin, sensorValue); } void calibrate() { // 将LED打开,标示校准过程的开始: digitalWrite(indicatorLedPin, HIGH); // 读取传感器值: sensorValue = analogRead(sensorPin); // 记录最大值 if (sensorValue > sensorMax) { sensorMax = sensorValue; } // 记录最小值 if (sensorValue < sensorMin) { sensorMin = sensorValue; } } ~~~ ### **相关资料** [while()](https://www.arduino.cc/en/Reference/While)  [digitalRead()](https://www.arduino.cc/en/Reference/DigitalRead)  [digitalWrite()](https://www.arduino.cc/en/Reference/DigitalWrite)  [analogRead()](https://www.arduino.cc/en/Reference/AnalogRead)  [analogWrite()](https://www.arduino.cc/en/Reference/AnalogWrite)  [map()](https://www.arduino.cc/en/Reference/Map)  [constrain()](https://www.arduino.cc/en/Reference/Constrain)  [if()](https://www.arduino.cc/en/Reference/If)  [原文链接](http://www.arduino.cc/en/Tutorial/WhileLoop)