## **模拟信号的校准**
> 本例向你展示校准传感器的一个技巧:在启动时先读取传感器值5秒钟,然后寻找其最大、最小值。校准后的最大、最小值将在map函数有用。
### **所需硬件**
* Arduino板或Genuino板
* LED 模拟信号的传感器(光敏电阻就OK)
* 10kΩ电阻
* 220Ω电阻
* 跳线
* 面包板
* 杜邦线/面包板线
### **电路**
![图片来自官网](http://img.blog.csdn.net/20160510130505441)
模拟信号传感器(例如:电位器/光线传感器等)连接到A2,LED连接到9号引脚。
用220Ω限流电阻串联LED到9号引脚。将光敏电阻一脚连接到5V,另一个脚连接到A0,并加一个10kΩ下拉电阻。
### **原理图**
![图片来自官网](http://img.blog.csdn.net/20160510130532118)
### **代码**
在setup前,你应像这样定义初始的最大最小值:
~~~
int sensorMin = 1023; // 最小值
int sensorMax = 0; // 最大值
~~~
这种方式可能看起来有点初级,先学习下吧。
最开始,你设置一个最小值初始值。如果读取到任何小于它的值,就用这个更小的数字更新最小值。与此类似,最开始,你设置一个最大值初始值,如果读取到任何大它的值,就用这个更大的数字更新最大值。像这样写:
~~~
// 用最初五秒进行校准
while (millis() < 5000) {
sensorValue = analogRead(sensorPin);
// 记录传感器最大值
if (sensorValue > sensorMax) {
sensorMax = sensorValue;
}
// 记录传感器最小值
if (sensorValue < sensorMin) {
sensorMin = sensorValue;
}
}
~~~
通过这种方式,传感器的值就能够被成功映射到一个范围(因为最大、最小值确定了):
~~~
// 将校准结果应用到传感器读取中
sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
~~~
下面是整个代码:
~~~
/*
模拟信号的校准
展示校准传感器的一种方式。在程序执行前五秒时会找到传感器值的最大、最小值。
这种方式可能看起来有点初级,先学习下吧。
最开始你设置一个最大值和最小值的初始值,然后在执行过程中寻找更小的值和更大的值并且不断更新最开始设置的值。
电路搭建:
* 模拟信号传感器(光敏电阻就可以)连接到A0
* LED连接9号引脚到GND
代码是公开的.
*/
// 常量:
const int sensorPin = A0; // 传感器引脚
const int ledPin = 9; // LED引脚
// 变量:
int sensorValue = 0; // 传感器值
int sensorMin = 1023; // 最小值
int sensorMax = 0; // 最大值
void setup() {
// 打开LED以表示校准开始:
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
// 在最初五秒进行校准
while (millis() < 5000) {
sensorValue = analogRead(sensorPin);
// 记录最大值
if (sensorValue > sensorMax) {
sensorMax = sensorValue;
}
// 记录最小值
if (sensorValue < sensorMin) {
sensorMin = sensorValue;
}
}
// 关闭LED表示校准完成
digitalWrite(13, LOW);
}
void loop() {
// 读取传感器:
sensorValue = analogRead(sensorPin);
// 将校准后的最大最小值用进去:
sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
// 防止sensorValue超过范围
sensorValue = constrain(sensorValue, 0, 255);
// 用校准后的值来给LED调光:
analogWrite(ledPin, sensorValue);
}
~~~
相关资料
[while()](https://www.arduino.cc/en/Reference/While)
[millis()](https://www.arduino.cc/en/Reference/Millis)
[constrain()](https://www.arduino.cc/en/Reference/Constrain)
[map()](https://www.arduino.cc/en/Reference/Map)
[If](https://www.arduino.cc/en/Reference/If)
- 说明
- 系统示例文件目录结构及说明
- 01.Basics
- AnalogReadSerial
- BareMinimum
- Blink
- DigitalReadSerial
- Fade
- ReadAnalogVoltage
- 02.Digital
- BlinkWithoutDelay
- Button
- Debounce
- DigitalInputPullup
- StateChangeDetection
- toneKeyboard
- toneMelody
- toneMultiple
- tonePitchFollower
- 03.Analog
- AnalogInOutSerial
- AnalogInput
- AnalogWriteMega
- Calibration
- Fading
- Smoothing
- 04.Communication
- ASCIITable
- Dimmer
- Graph
- Midi
- MultiSerial
- PhysicalPixel
- ReadASCIIString
- SerialCallResponse
- SerialCallResponseASCII
- SerialEvent
- SerialPassthrough
- VirtualColorMixer
- 05.Control
- Arrays
- ForLoopIteration
- IfStatementConditional
- switchCase
- switchCase2
- WhileStatementConditional
- 06.Sensors
- ADXL3xx
- Knock
- Memsic2125
- Ping
- 07.Display
- barGraph
- RowColumnScanning
- 08.Strings
- CharacterAnalysis
- StringAdditionOperator
- StringAppendOperator
- StringCaseChanges
- StringCharacters
- StringComparisonOperators
- StringConstructors
- StringIndexOf
- StringLength
- StringLengthTrim
- StringReplace
- StringStartsWithEndsWith
- StringSubstring
- StringToInt
- 09.USB
- Keyboard
- KeyboardLogout
- KeyboardMessage
- KeyboardReprogram
- KeyboardSerial
- KeyboardAndMouseControl
- Mouse
- ButtonMouseControl
- JoystickMouseControl
- 10.StarterKit_BasicKit (与特定硬件相关,暂无)
- p02_SpaceshipInterface
- p03_LoveOMeter
- p04_ColorMixingLamp
- p05_ServoMoodIndicator
- p06_LightTheremin
- p07_Keyboard
- p08_DigitalHourglass
- p09_MotorizedPinwheel
- p10_Zoetrope
- p11_CrystalBall
- p12_KnockLock
- p13_TouchSensorLamp
- p14_TweakTheArduinoLogo
- p15_HackingButtons
- 11.ArduinoISP(暂无)
- ArduinoISP