|
【TI首届低功耗设计大赛】空气温湿度记录仪汇总
[复制链接]
经过半个月的制作空气温湿度记录仪的制作也算告一段落了,这个东西的作用就是在设定好的时间自动测量记录环境的温度和湿度,说来也很简单,只要利用FR5969内置的RTC设置中断,然后读取外部传感器的读数再写入FRAM记录就可以了,并有oled显示当前状态,可以通过UART上传数据到电脑。说来惭愧,本人一直忙于找工作等琐事,之前又在外面接了很多设计的活,忙的不可开交,截止今天没能实现所有的功能,不过还是将当前进度发上来作为总结。 这个东西曾经用AVR给导师做过一个,导师拿着去做建筑数据测量,续航时间实在是捉鸡。而且反应速度并不好。这次在FR5969上重制,做到现在的感觉就是IAR+TI驱动库实在是不如energia好用,光是运行速度energia就比驱动库高了很多,驱动库为了可读性牺牲了不少性能。以及AM2312这个传感器真的好坑,第一天调试好了,第二天一开机就又不行了,调整半天时序也不行,加上拉电阻才解决,结果第三天开机又不行了,再去翻说明,改短了唤醒信号解决了问题,结果呵呵,第四天又读不出来了,光调这传感器就搞了一个多星期,总结一下要想用这传感器需要的条件:1、单总线上必须接上拉电阻,至少3k欧。2、单总线的启动信号手册上写的是0.8ms到20ms,实测1ms才能保证稳定,拉低时间长了传感器会鬼畜。3、所有数据接收完成后,引脚必须配置成推挽输出高电平状态,如果配置成pullup input,无法让传感器恢复休眠。4、传感器上电后至少等5秒再读第一组数据,虽然手册上写的是2秒。5、两组数据读取间隔至少4秒,虽然手册上写的是2秒。6、如遇到其他问题不要相信手册,动脑子想可能的原因并调试解决。 这传感器用的简直心塞死了,一开始老老实实用AM2302或者sht11之类的就好了。。。。。。
目前的运行效果就是这样了。。。
手按上去,湿度暴增。
如果你想作死用这个传感器,我把源码放上来,如果按我刚才写的步骤做,能稳定运行个好几天:
- <font face="微软雅黑" size="3">#define AM2321_SDA GPIO_PORT_P3,GPIO_PIN4
- double DHT22_H;
- double DHT22_T;
- unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; }
- unsigned char read_dht22_dat()
- {
- unsigned char i = 0;
- unsigned char result=0;
- for(i=0; i< 8; i++){
- while(!(GPIO_getInputPinValue(AM2321_SDA)));
- __delay_cycles(280);
- if(GPIO_getInputPinValue(AM2321_SDA))
- result |=(1<<(7-i));
- while(GPIO_getInputPinValue(AM2321_SDA));
- }
- return result;
- }
- void read_dht22()
- {
- unsigned char dht22_dat[5];
- unsigned char dht22_in;
- unsigned char i;
- GPIO_setAsOutputPin(AM2321_SDA);
- GPIO_setOutputHighOnPin(AM2321_SDA);
- __delay_cycles(5000);
- GPIO_setOutputLowOnPin(AM2321_SDA);
- __delay_cycles(16000);
- GPIO_setOutputHighOnPin(AM2321_SDA);
- GPIO_setAsInputPin(AM2321_SDA);
- __delay_cycles(560);
- dht22_in=GPIO_getInputPinValue(AM2321_SDA);
- if(dht22_in){
- DHT22_H=99.0;
- DHT22_T=00.0;
- return;
- }
- __delay_cycles(640);
- dht22_in = GPIO_getInputPinValue(AM2321_SDA);
- if(!dht22_in){
- DHT22_H=00.0;
- DHT22_T=99.0;
- return;
- }
- while(GPIO_getInputPinValue(AM2321_SDA));
- for (i=0; i<5; i++){
- dht22_dat[i] = read_dht22_dat();}
- GPIO_setAsInputPin(AM2321_SDA);
- unsigned char dht11_check_sum = dht22_dat[0]+dht22_dat[1]+dht22_dat[2]+dht22_dat[3];
- if(dht22_dat[4]!= dht11_check_sum)
- {
- DHT22_H=99.9;
- DHT22_T=99.9;
- return;
- }
- DHT22_H=makeWord(dht22_dat[0], dht22_dat[1])*0.1;
- int sign = 1;
- if (dht22_dat[2] & 0x80)
- {
- dht22_dat[2] =dht22_dat[2] & 0x7F;
- sign = -1;
- }
- DHT22_T=sign*makeWord(dht22_dat[2], dht22_dat[3])*0.1;
- GPIO_setAsOutputPin(AM2321_SDA);
- GPIO_setOutputHighOnPin(AM2321_SDA);
- }</font>
复制代码 运行时候直接read_dht22();一下就好了==b
然后是oled部分的详情在这里https://bbs.eeworld.com.cn/thread-453136-1-1.html
虽然比赛截止到今天,但是这个东西我还会继续做下去,尤其是oled的显示代码,现在只能实现字符和图像显示,还不能像u8glib那样直接画线什么的,可能是自己写也可能是移植u8glib之类的。。。。
FR5969还是很不错的,如果能便宜点,我很乐意重写自己的库,现在这个性价比想用在产品里成本太高了。。。
|
|