这里会显示出您选择的修订版和当前版本之间的差别。
— | learing:examples:calibration [2023/06/07 04:23] (当前版本) – 创建 - 外部编辑 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== Calibration(校准) ====== | ||
+ | |||
+ | <WRAP left round info 65%> | ||
+ | 这个例子展示了校准传感器输入的方法。控制器在程序开始后的前五秒读取传感器数据,记录读取到的最大最小值。这些前五秒读取到的数据定义了读取数据的最大最小期望值。 | ||
+ | </ | ||
+ | |||
+ | <WRAP left round box 100%> | ||
+ | ===== MangoII ===== | ||
+ | |||
+ | ==== 硬件要求 ==== | ||
+ | |||
+ | |OCROBOT控制器| | ||
+ | |LED| | ||
+ | |模拟传感器如光敏电阻| | ||
+ | |10K欧姆电阻| | ||
+ | |220欧姆电阻| | ||
+ | |面包板| | ||
+ | |连接线| | ||
+ | |导线| | ||
+ | |||
+ | 并联一个220欧姆的限流电阻和LED到数字口9,连接光敏电阻一端到+5V,另一端接到模拟口A0,然后用10K欧姆电阻接GND。 | ||
+ | |||
+ | ==== 代码 ==== | ||
+ | |||
+ | 设置初始值 | ||
+ | |||
+ | |||
+ | <code cpp>int sensorMin = 1023; // 最小值 | ||
+ | int sensorMax = 0; // 最大值 | ||
+ | </ | ||
+ | |||
+ | |||
+ | 看起来好像反过来了,实际上,把最小值设置的很大,这样你读取到的数都是比最小值低,然后就把读取到的数据设置为新的最小值。同样的,把最大值设置的很小,读取到的都比设置的值大,再将它作为新的最大值。 | ||
+ | |||
+ | <code cpp>// 前五秒校准 | ||
+ | while (millis() < 5000) { | ||
+ | | ||
+ | |||
+ | // 记录最大值 | ||
+ | if (sensorValue > sensorMax) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | // 记录最小值 | ||
+ | if (sensorValue < sensorMin) { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | 这样的话,读取到的任何数据都被用来映射到最大最小值的范围。 | ||
+ | |||
+ | <code cpp>// apply the calibration to the sensor reading | ||
+ | sensorValue = map(sensorValue, | ||
+ | |||
+ | |||
+ | </ | ||
+ | 完整的代码如下 | ||
+ | |||
+ | <code cpp>/* | ||
+ | Calibration | ||
+ | */ | ||
+ | |||
+ | // 常量 | ||
+ | const int sensorPin = A0; // pin that the sensor is attached to | ||
+ | const int ledPin = 9; // pin that the LED is attached to | ||
+ | |||
+ | // 变量: | ||
+ | int sensorValue = 0; // the sensor value | ||
+ | int sensorMin = 1023; // minimum sensor value | ||
+ | int sensorMax = 0; // maximum sensor value | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | // 点亮LED作为校准期间的信号 | ||
+ | pinMode(13, OUTPUT); | ||
+ | digitalWrite(13, | ||
+ | |||
+ | // 前五秒进行校准 | ||
+ | while (millis() < 5000) { | ||
+ | sensorValue = analogRead(sensorPin); | ||
+ | |||
+ | // 记录最大值 | ||
+ | if (sensorValue > sensorMax) { | ||
+ | sensorMax = sensorValue; | ||
+ | } | ||
+ | |||
+ | // 记录最小值 | ||
+ | if (sensorValue < sensorMin) { | ||
+ | sensorMin = sensorValue; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // 校准结束的信号 | ||
+ | digitalWrite(13, | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // | ||
+ | sensorValue = analogRead(sensorPin); | ||
+ | |||
+ | // | ||
+ | sensorValue = map(sensorValue, | ||
+ | |||
+ | // 避免传感器值超出校准范围 | ||
+ | sensorValue = constrain(sensorValue, | ||
+ | |||
+ | // 使用校准值点亮熄灭LED | ||
+ | analogWrite(ledPin, | ||
+ | }</ | ||
+ | </ | ||