粗心大意
想在我的自动浇花系统上增加一个温度显示功能,就是读取室温然后显示在屏幕上。
然后手头有一堆各种温度传感器。
- 最常用的LM35
- 能同时测量温湿度的DHT11
- 用的比较广的ds18b20
这些用起来都很方便。
但是发现我的Grove Starter Kit Plus 里有一个温度传感器,套件里的东西都是模块化的,带连线,支持插到对应的口上就可以啦,那么就用它啦。
然后用我不带眼镜的近视眼看了一下模块上的芯片,没太看清楚具体细节,但是看到了LM35几个字。
那么就是小case啦, LM35咱用过无数次啦,so easy
然后编码,编译,运行
什么鬼,怎么出来的是250摄氏度,这是室温!!如果硬件没错、程序没错,现在我已经熟了!!
哪里出错了呢,LM35用起来没啥难度啊。
传感器的输出电压与摄氏温度呈线性关系,0℃时输出为0V,每升高1℃,输出电压增加10mv。
因此根据A/D转换读回来的电压,可以轻易计算出环境温度啊?
这么简单的事情,怎么会错??
LM358不是LM35
于是各种查错,最后实在没办法了,看看套件自带的示例程序吧。
const int pinTemp = A1;
// Define the B-value of the thermistor.
// This value is a property of the thermistor used in the Grove - Temperature Sensor,
// and used to convert from the analog value it measures and a temperature value.
const int B = 3975;
void setup()
{
Serial.begin(9600);
}
void loop()
{
// Get the (raw) value of the temperature sensor.
int val = analogRead(pinTemp);
// Determine the current resistance of the thermistor based on the sensor value.
float resistance = (float)(1023-val)*10000/val;
// Calculate the temperature based on the resistance value.
float temperature = 1/(log(resistance/10000)/B+1/298.15)-273.15;
// Print the temperature to the serial console.
Serial.println(temperature);
// Wait one second between measurements.
delay(1000);
}
怎么这么复杂,还有那个B-value是什么鬼?还有我什么时候用热敏电阻(thermistor)啦?我就用个LM35啊!
等等,让我仔细看看模块。
眼神不行,于是想了个办法,用手机拍照,然后放大看,什么居然是LM358,不是LM35!
这根本不是一个东西呀
LM35是温度传感器
LM358是双运算放大器
模块上还有个米粒大的东西,旁边丝印写着NTC。
原来是用的NTC热敏电阻+LM358做的温度传感器。
所谓的B值:
材料常数(热敏指数) B 值( K )
B 值被定义为:
B=T1*T2/(T2-T1)ln(RT1/RT2)
RT1 : 温度 T1 ( K )时的零功率电阻值。
RT2 : 温度 T2 ( K )时的零功率电阻值。
T1、T2 :两个被指定的温度( K )。
原来我用的是李鬼,不是李逵。
好吧,既然知道是啥,也好用,就不纠结了,直接把代码集成到我的浇花系统里了。
教训
通过这个事情,我觉得自己不能做差不多先生了。还好这次只是把NTC+LM358当成了LM35,没有酿成大祸。如果是接差其它原件,轻则烧坏板卡(Intel Edison这一套1500多元啊),重则酿成火灾或者导致我受伤就惨了,我可以不想做诺贝尔啊