用户工具

站点工具


learing:examples:calibration

差别

这里会显示出您选择的修订版和当前版本之间的差别。


learing:examples:calibration [2023/06/07 04:23] (当前版本) – 创建 - 外部编辑 127.0.0.1
行 1: 行 1:
 +====== Calibration(校准) ======
 +
 +<WRAP left round info 65%>
 +这个例子展示了校准传感器输入的方法。控制器在程序开始后的前五秒读取传感器数据,记录读取到的最大最小值。这些前五秒读取到的数据定义了读取数据的最大最小期望值。
 +</WRAP>
 +
 +<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>
 +
 +
 +看起来好像反过来了,实际上,把最小值设置的很大,这样你读取到的数都是比最小值低,然后就把读取到的数据设置为新的最小值。同样的,把最大值设置的很小,读取到的都比设置的值大,再将它作为新的最大值。
 +
 +<code cpp>// 前五秒校准
 + while (millis() < 5000) {
 +   sensorValue = analogRead(sensorPin);
 +
 +   // 记录最大值
 +   if (sensorValue > sensorMax) {
 +     sensorMax = sensorValue;
 +   }
 +
 +   // 记录最小值
 +   if (sensorValue < sensorMin) {
 +     sensorMin = sensorValue;
 +   }
 + }
 +</code>
 +
 +
 +
 +这样的话,读取到的任何数据都被用来映射到最大最小值的范围。
 +
 +<code cpp>// apply the calibration to the sensor reading
 +sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
 +
 +
 +</code>
 +完整的代码如下
 +
 +<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, HIGH);
 +
 +  // 前五秒进行校准
 +  while (millis() < 5000) {
 +    sensorValue = analogRead(sensorPin);
 +
 +    // 记录最大值
 +    if (sensorValue > sensorMax) {
 +      sensorMax = sensorValue;
 +    }
 +
 +    // 记录最小值
 +    if (sensorValue < sensorMin) {
 +      sensorMin = sensorValue;
 +    }
 +  }
 +
 +  // 校准结束的信号
 +  digitalWrite(13, LOW);
 +}
 +
 +void loop() {
 +  //读取传感器值
 +  sensorValue = analogRead(sensorPin);
 +
 +  //应用校准值
 +  sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
 +
 +  // 避免传感器值超出校准范围
 +  sensorValue = constrain(sensorValue, 0, 255);
 +
 +  // 使用校准值点亮熄灭LED
 +  analogWrite(ledPin, sensorValue);
 +}</code>
 +</WRAP>