DIY小型气象站(单电池供电)——持续更新

目前已低功耗运行91天,设备已停机,不再回传数据,未达到135天目标;

图1:外壳较脏、弹簧垫片看来不是不锈钢的,已经生效了

图2:拧开四颗螺丝后,内部干净无水渍
DIY小型气象站(单电池供电)——持续更新_第1张图片
图3:内部线路完好,更换电池后继续工作

//———————————————————————————————
设备具有一定的防水能力,在室外运行期间,偶有小到中雨天气,但并未对设备造成影响
//———————————————————————————————

材料

电源:18650电池1节(2000mah)
主控:N76E003单片机
传感器:BMP180气压传感器、BH1750光照度传感器
无线串口模块:LC12S(2.4G)
LDO:XC6204
外壳:3D打印PLA
开发环境:KEIL4

电路

DIY小型气象站(单电池供电)——持续更新_第2张图片
其中PPG与PPG1为推挽输出,用于给传感器供电,与对IIC总线提供上拉电源。
其中CS1为无线串口模块休眠控制管脚,设置为开漏输出。(特点见下图)
DIY小型气象站(单电池供电)——持续更新_第3张图片

对于一些常用外设,如果直接连接到单片机供电回路,当然是不理想的,即便是低功耗器件,哪怕有休眠模式,消耗电流也非常厉害的。怎么办呢?
1分开供电:对一些大功率的外围,比如无线通讯模块,可以用一个mos开关控制是否为外设供电,对一些小功率器件,比如运放,存储器可以结合实际最大消耗电流,可以直接使用i/o口输出高电平为芯片供电,i/o一般可以输出 6-20ma,pp模式。当然别忘串一个很小的电阻,10欧,外设的退偶电容不能很大。一个i/o不够可以过个一起供。
让稳压器的输出电压略高于电池电压,这样有外部电源供电的时候就可以不消耗电池了

运行逻辑

由上图可知,本次DIY没有任何外部供电(本来想用太阳能的,但因为某些众所周知的问题,放弃了),旨在检验N76E003单片机低功耗运行的能力(此前运行了8天,锂电池电压下降0.04V)。

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

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

结构设计

装配图(外壳还在打印,需要大约八个小时,之后再补充成品图)
DIY小型气象站(单电池供电)——持续更新_第4张图片
底座(全部采用M4螺丝孔)
DIY小型气象站(单电池供电)——持续更新_第5张图片
顶盖(两侧凸起为通气孔挡板,防止雨水直接灌入;顶部开孔为BH1750光照传感器用)
DIY小型气象站(单电池供电)——持续更新_第6张图片
下图为装配完成的实物图,底部由四颗铷铁硼提供吸力,目前安装在空调外机上
DIY小型气象站(单电池供电)——持续更新_第7张图片
DIY小型气象站(单电池供电)——持续更新_第8张图片
DIY小型气象站(单电池供电)——持续更新_第9张图片

数据分析

DIY小型气象站(单电池供电)——持续更新_第10张图片
分别是温度,压强,光照强度。通过上面的数据,可以粗略的分析每天的日落日出,以及温度变化。

主程序代码

#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "BMP180.h"
#include "BH1750.h"

#define uint unsigned int
#define uchar unsigned  char

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

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


int main (void)
{
	int i;
	Set_All_GPIO_Quasi_Mode;
	P05_OpenDrain_Mode;//设置为开漏模式
	P13_OpenDrain_Mode;//设置为开漏模式
	P14_OpenDrain_Mode;//设置为开漏模式
	P17_PushPull_Mode;//推挽输出
	P30_PushPull_Mode;
	//----------I/O口配置----------------
		CS1=1;//无线模块睡眠
		PPG=0;//关闭外围器件供电
		PPG1=0;
	 	set_P06;
   		set_P07;//初始化串口   
	//---------I/O口初始化------------ 		
		Init_BH1750();//初始化光照传感器  
		set_ES_1;//开启串口1中断使能
		InitialUART0_Timer1(9600);
	//----------串口1、串口0配置---------------- 
		WKCON =0x07; //预分频配置2048
		RWK =255-211;//设置为50s定时——72个为一小时
	 	set_EWKT;	//使能定时唤醒中断
		set_WKTR;	//运行定时唤醒功能
	//----------WKT配置------------------------		
		EA = 1;//开启总中断
		while(1)
		{
			if(WktFlag)//判定是否溢出
			{
				WktCount++;
				WktFlag=0;
				if(WktCount>=72)//1h发送一次
				{
						PPG=1;//推挽输出,给外围器件供电
						PPG1=1;
						CS1=0;//拉低,接地唤醒无线透传模块
						Timer3_Delay100ms(1);

						Init_BMP085();//初始化气压计
						bmp085Convert();
						Timer3_Delay100ms(1);
						EC_BH1750();//转化光照度
						abc[0]=0x54;//T温度
						abc[1]=temperature/100+48;
						abc[2]=temperature%100/10+48;
						abc[3]=0x2e;
						abc[4]=temperature%10+48;
						
						abc[5]=0x50;//P气压
						abc[6]=pressure/10000+48;
						abc[7]=pressure%10000/1000+48;
						abc[8]=pressure%1000/100+48;
						
						abc[9]=0x4c;//L光照
						abc[10]=(int)BH1750_temp/10000+48;
						abc[11]=(int)BH1750_temp%10000/1000+48;
						abc[12]=(int)BH1750_temp%1000/100+48;
						abc[13]=(int)BH1750_temp%100/10+48;
						abc[14]=(int)BH1750_temp%10+48;
						for(i=0;i<15;i++)
						{
							Send_Data_To_UART0(abc[i]);
						}
						WktCount=0;
					}		
				ADCCON1 = 0X00;//关闭ADC
				clr_BODEN;//关闭欠压检测
				set_PD;// 进入掉电模式
				PPG=0;//关闭外围器件供电
				PPG1=0;
				CS1=1;//无线模块进入睡眠
			}
		}
	}
//---------定时唤醒中断服务程序--------------
void WakeUp_Timer_ISR (void)   interrupt 17    
{
		WktFlag=1;
	  clr_WKTF;//清除WKT溢出标志位  
}

总结

回顾之前那几篇很水的博客(驱动各类传感器的文章),可以看出最初我是想把GP2Y1010(灰尘检测)、DHT11(温湿度)、HMC5883(电子罗盘)、光电编码器等都加上去,想测风速与方向(见下图)。后来都因为尺寸和供电问题一一放弃。其次就是缺少一个很好的上位机,接下来的日子重心会放在python和QT的学习上,希望能进入一个新的世界吧。祝大家新年快乐!
DIY小型气象站(单电池供电)——持续更新_第11张图片

你可能感兴趣的:(N76E003)