[应用方案] 小型气象站(单电池供电)

[复制链接]
1436|20
 楼主| 643757107 发表于 2019-6-11 22:07 | 显示全部楼层 |阅读模式
455065cffb59b8c525.png 175475cffb5a2adfbb.png
设备具有一定的防水能力,在室外运行期间,偶有小到中雨天气,但并未对设备造成影响
材料
电源:18650电池1节(2000mah)
主控:N76E003单片机
传感器:BMP180气压传感器、BH1750光照度传感器
无线串口模块:LC12S(2.4G)
LDO:XC6204
外壳:3D打印PLA
开发环境:KEIL4

 楼主| 643757107 发表于 2019-6-11 22:08 | 显示全部楼层
 楼主| 643757107 发表于 2019-6-11 22:08 | 显示全部楼层
其中PPG与PPG1为推挽输出,用于给传感器供电,与对IIC总线提供上拉电源。
其中CS1为无线串口模块休眠控制管脚,设置为开漏输出。(特点见下图)
571455cffb5d7d4307.png
 楼主| 643757107 发表于 2019-6-11 22:09 | 显示全部楼层
对于一些常用外设,如果直接连接到单片机供电回路,当然是不理想的,即便是低功耗器件,哪怕有休眠模式,消耗电流也非常厉害的。怎么办呢?
1分开供电:对一些大功率的外围,比如无线通讯模块,可以用一个mos开关控制是否为外设供电,对一些小功率器件,比如运放,存储器可以结合实际最大消耗电流,可以直接使用i/o口输出高电平为芯片供电,i/o一般可以输出 6-20ma,pp模式。当然别忘串一个很小的电阻,10欧,外设的退偶电容不能很大。一个i/o不够可以过个一起供。
让稳压器的输出电压略高于电池电压,这样有外部电源供电的时候就可以不消耗电池了
 楼主| 643757107 发表于 2019-6-11 22:09 | 显示全部楼层
运行逻辑
由上图可知,本次DIY没有任何外部供电(本来想用太阳能的,但因为某些众所周知的问题,放弃了),旨在检验N76E003单片机低功耗运行的能力(此前运行了8天,锂电池电压下降0.04V)。

本次实验依然使用N76E003单片机的定时唤醒功能,50s唤醒一次,一小时开启一次外设,并唤醒无线串口模块发送检测数据。发送完成后关闭所有外设,推挽模式置低,无线串口模块进入睡眠模式。

有关N76E003单片机低功耗处理的知识请看这里N76E003 低功耗(掉电模式&定时唤醒)

结构设计
装配图(外壳还在打印,需要大约八个小时,之后再补充成品图)
780985cffb61090a01.png
底座(全部采用M4螺丝孔)
402355cffb61f74648.png
 楼主| 643757107 发表于 2019-6-11 22:10 | 显示全部楼层
顶盖(两侧凸起为通气孔挡板,防止雨水直接灌入;顶部开孔为BH1750光照传感器用)
377015cffb62ef3445.png
下图为装配完成的实物图,底部由四颗铷铁硼提供吸力,目前安装在空调外机上
865895cffb63f99ab8.png
473195cffb6482339a.png
701425cffb64dcf4ac.png
 楼主| 643757107 发表于 2019-6-11 22:11 | 显示全部楼层
数据分析
91865cffb672f26f8.png
分别是温度,压强,光照强度。通过上面的数据,可以粗略的分析每天的日落日出,以及温度变化。
 楼主| 643757107 发表于 2019-6-11 22:11 | 显示全部楼层
主程序代码
  1. #include "N76E003.h"
  2. #include "Common.h"
  3. #include "Delay.h"
  4. #include "SFR_Macro.h"
  5. #include "Function_define.h"
  6. #include "BMP180.h"
  7. #include "BH1750.h"

  8. #define uint unsigned int
  9. #define uchar unsigned  char

  10. uchar abc[17];//串口发送缓冲
  11. uint WktCount=0;
  12. bit WktFlag=0;

  13. sbit CS1=P0^5;//CS睡眠管脚,开漏输出
  14. sbit PPG=P1^7;//供电管脚,推挽输出
  15. sbit PPG1=P3^0;//同上


  16. int main (void)
  17. {
  18.         int i;
  19.         Set_All_GPIO_Quasi_Mode;
  20.         P05_OpenDrain_Mode;//设置为开漏模式
  21.         P13_OpenDrain_Mode;//设置为开漏模式
  22.         P14_OpenDrain_Mode;//设置为开漏模式
  23.         P17_PushPull_Mode;//推挽输出
  24.         P30_PushPull_Mode;
  25.         //----------I/O口配置----------------
  26.                 CS1=1;//无线模块睡眠
  27.                 PPG=0;//关闭外围器件供电
  28.                 PPG1=0;
  29.                  set_P06;
  30.                    set_P07;//初始化串口   
  31.         //---------I/O口初始化------------                
  32.                 Init_BH1750();//初始化光照传感器  
  33.                 set_ES_1;//开启串口1中断使能
  34.                 InitialUART0_Timer1(9600);
  35.         //----------串口1、串口0配置----------------
  36.                 WKCON =0x07; //预分频配置2048
  37.                 RWK =255-211;//设置为50s定时——72个为一小时
  38.                  set_EWKT;        //使能定时唤醒中断
  39.                 set_WKTR;        //运行定时唤醒功能
  40.         //----------WKT配置------------------------               
  41.                 EA = 1;//开启总中断
  42.                 while(1)
  43.                 {
  44.                         if(WktFlag)//判定是否溢出
  45.                         {
  46.                                 WktCount++;
  47.                                 WktFlag=0;
  48.                                 if(WktCount>=72)//1h发送一次
  49.                                 {
  50.                                                 PPG=1;//推挽输出,给外围器件供电
  51.                                                 PPG1=1;
  52.                                                 CS1=0;//拉低,接地唤醒无线透传模块
  53.                                                 Timer3_Delay100ms(1);

  54.                                                 Init_BMP085();//初始化气压计
  55.                                                 bmp085Convert();
  56.                                                 Timer3_Delay100ms(1);
  57.                                                 EC_BH1750();//转化光照度
  58.                                                 abc[0]=0x54;//T温度
  59.                                                 abc[1]=temperature/100+48;
  60.                                                 abc[2]=temperature%100/10+48;
  61.                                                 abc[3]=0x2e;
  62.                                                 abc[4]=temperature%10+48;
  63.                                                
  64.                                                 abc[5]=0x50;//P气压
  65.                                                 abc[6]=pressure/10000+48;
  66.                                                 abc[7]=pressure%10000/1000+48;
  67.                                                 abc[8]=pressure%1000/100+48;
  68.                                                
  69.                                                 abc[9]=0x4c;//L光照
  70.                                                 abc[10]=(int)BH1750_temp/10000+48;
  71.                                                 abc[11]=(int)BH1750_temp%10000/1000+48;
  72.                                                 abc[12]=(int)BH1750_temp%1000/100+48;
  73.                                                 abc[13]=(int)BH1750_temp%100/10+48;
  74.                                                 abc[14]=(int)BH1750_temp%10+48;
  75.                                                 for(i=0;i<15;i++)
  76.                                                 {
  77.                                                         Send_Data_To_UART0(abc[i]);
  78.                                                 }
  79.                                                 WktCount=0;
  80.                                         }               
  81.                                 ADCCON1 = 0X00;//关闭ADC
  82.                                 clr_BODEN;//关闭欠压检测
  83.                                 set_PD;// 进入掉电模式
  84.                                 PPG=0;//关闭外围器件供电
  85.                                 PPG1=0;
  86.                                 CS1=1;//无线模块进入睡眠
  87.                         }
  88.                 }
  89.         }
  90. //---------定时唤醒中断服务程序--------------
  91. void WakeUp_Timer_ISR (void)   interrupt 17   
  92. {
  93.                 WktFlag=1;
  94.           clr_WKTF;//清除WKT溢出标志位  
  95. }
 楼主| 643757107 发表于 2019-6-11 22:12 | 显示全部楼层
总结
回顾之前那几篇很水的博客(驱动各类传感器的**),可以看出最初我是想把GP2Y1010(灰尘检测)、DHT11(温湿度)、HMC5883(电子罗盘)、光电编码器等都加上去,想测风速与方向(见下图)。后来都因为尺寸和供电问题一一放弃。其次就是缺少一个很好的上位机,接下来的日子重心会放在python和QT的学习上,希望能进入一个新的世界吧。祝大家新年快乐!
689585cffb6bec71e4.png
 楼主| 643757107 发表于 2019-6-11 22:12 | 显示全部楼层
以上转载,原地址看图片上。
dongnanxibei 发表于 2019-6-14 00:00 | 显示全部楼层
看起来不错。
dongnanxibei 发表于 2019-6-14 00:00 | 显示全部楼层
无线是怎么做?
dongnanxibei 发表于 2019-6-14 00:00 | 显示全部楼层
那个无线2.4G是啥
dongnanxibei 发表于 2019-6-14 00:00 | 显示全部楼层
WIFI还是?
dongnanxibei 发表于 2019-6-14 00:05 | 显示全部楼层
作为采集终端非常好。
yiyigirl2014 发表于 2019-6-14 23:46 | 显示全部楼层
可以作为本科生毕业设计了。
 楼主| 643757107 发表于 2019-6-18 11:28 | 显示全部楼层
yiyigirl2014 发表于 2019-6-14 23:46
可以作为本科生毕业设计了。

是的,绝对可以
 楼主| 643757107 发表于 2019-6-18 11:28 | 显示全部楼层
dongnanxibei 发表于 2019-6-14 00:05
作为采集终端非常好。

对,采集很好。
 楼主| 643757107 发表于 2019-6-18 11:29 | 显示全部楼层
 楼主| 643757107 发表于 2019-6-18 11:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3972

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部