用户工具

站点工具


learing:examples:calibration

Calibration(校准)

这个例子展示了校准传感器输入的方法。控制器在程序开始后的前五秒读取传感器数据,记录读取到的最大最小值。这些前五秒读取到的数据定义了读取数据的最大最小期望值。

MangoII

硬件要求

OCROBOT控制器
LED
模拟传感器如光敏电阻
10K欧姆电阻
220欧姆电阻
面包板
连接线
导线

并联一个220欧姆的限流电阻和LED到数字口9,连接光敏电阻一端到+5V,另一端接到模拟口A0,然后用10K欧姆电阻接GND。

代码

设置初始值

int sensorMin = 1023;        // 最小值
int sensorMax = 0;           // 最大值

看起来好像反过来了,实际上,把最小值设置的很大,这样你读取到的数都是比最小值低,然后就把读取到的数据设置为新的最小值。同样的,把最大值设置的很小,读取到的都比设置的值大,再将它作为新的最大值。

// 前五秒校准
 while (millis() < 5000) {
   sensorValue = analogRead(sensorPin);
 
   // 记录最大值
   if (sensorValue > sensorMax) {
     sensorMax = sensorValue;
   }
 
   // 记录最小值
   if (sensorValue < sensorMin) {
     sensorMin = sensorValue;
   }
 }

这样的话,读取到的任何数据都被用来映射到最大最小值的范围。

// apply the calibration to the sensor reading
sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

完整的代码如下

/*
  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);
}
learing/examples/calibration.txt · 最后更改: 2017/04/07 10:03 (外部编辑)