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