【短时天气预报系统】indoor装置基本功能实现
[复制链接]
本帖最后由 ljj3166 于 2021-6-20 13:55 编辑
周末开撸
整理处理了一下indoor的基本功能
功耗
Indoor用到了一块eink屏,需要开辟一大块内存
并且需要保持实时状态
为了方便,这里就没采用休眠的方式来降低功耗
而是采用待机的方式
加上没有对这块老旧的eink屏进行电源控制设计
如果采用软件指令使其进入sleep,就无法通过指令唤醒了
所以只能通过软复位的方式
将eink复位待机,然后写入后续的数据
RSL10待机电流大约在30uA左右
eink待机大约在60uA左右
合计大约90uA
看看RSL10的待机代码
Standby模式配置
void Standby_Mode_Configure(struct standby_mode_env_tag *standby_mode_env) {
/* If RTC clock source is XTAL 32 kHz oscillator */
if (RTC_CLK_SRC == RTC_CLK_SRC_XTAL32K) {
/* Enable XTAL32K oscillator amplitude control
* Set XTAL32K load capacitance to 0x38: 22.4 pF
* Enable XTAL32K oscillator */
ACS->XTAL32K_CTRL = (XTAL32K_XIN_CAP_BYPASS_DISABLE |
XTAL32K_AMPL_CTRL_ENABLE |
XTAL32K_NOT_FORCE_READY
| (XTAL32K_CLOAD_TRIM_VALUE << ACS_XTAL32K_CTRL_CLOAD_TRIM_Pos)
| (XTAL32K_ITRIM_VALUE << ACS_XTAL32K_CTRL_ITRIM_Pos) |
XTAL32K_IBOOST_DISABLE |
XTAL32K_ENABLE);
/* Wait for XTAL32K oscillator to be ready */
while (ACS_XTAL32K_CTRL->READY_ALIAS != XTAL32K_OK_BITBAND) {
}
LowPowerClock_Source_Set(0);
}
/* Else: if RTC clock source is RC 32 kHz oscillator */
else if (RTC_CLK_SRC == RTC_CLK_SRC_RC_OSC) {
ACS_VDDC_CTRL->STANDBY_VTRIM_BYTE = ACS_VDDC_CTRL->VTRIM_BYTE;
/* Start the RC oscillator */
Sys_Clocks_Osc32kHz(RC_OSC_ENABLE | RC_OSC_NOM);
/* Read the OSC_32K calibration trim data from NVR4 */
unsigned int osc_calibration_value = 0;
Sys_ReadNVR4(MANU_INFO_OSC_32K, 1, (unsigned
int*) &osc_calibration_value);
/* Use calibrated value for RC clock */
if (osc_calibration_value != 0xFFFFFFFF) {
ACS_RCOSC_CTRL->FTRIM_32K_BYTE = (uint8_t) (osc_calibration_value);
}
/* Delay for 4 ms */
Sys_Delay_ProgramROM(4 * (SystemCoreClock / 1000));
LowPowerClock_Source_Set(1);
/* In us, for typical RCOSC until measurement is obtained. */
RTCCLK_Period_Value_Set(RCCLK_PERIOD_VALUE);
/* Set-up the Audiosink block for frequency measurement */
Sys_Audiosink_ResetCounters();
Sys_Audiosink_InputClock(0, AUDIOSINK_CLK_SRC_STANDBYCLK);
Sys_Audiosink_Config(AUDIO_SINK_PERIODS_16, 0, 0);
/* Enable interrupts */
NVIC_ClearPendingIRQ(AUDIOSINK_PERIOD_IRQn);
NVIC_EnableIRQ(AUDIOSINK_PERIOD_IRQn);
/* Start period counter to start period measurement */
AUDIOSINK_CTRL->PERIOD_CNT_START_ALIAS = 1;
}
/* else: if RTC clock source is external oscillator */
else {
DIO->CFG[EXT_LOW_POWER_CLK_GPIO_NUM] = (DIO_2X_DRIVE |
DIO_LPF_DISABLE |
DIO_NO_PULL |
DIO_MODE_INPUT);
LowPowerClock_Source_Set(1);
/* Clock period in us for external clock */
RTCCLK_Period_Value_Set(EXT_LOW_POWER_CLK_PERIOD_VALUE);
/* Set-up the Audiosink block for frequency measurement */
Sys_Audiosink_ResetCounters();
Sys_Audiosink_InputClock(0, AUDIOSINK_CLK_SRC_STANDBYCLK);
Sys_Audiosink_Config(AUDIO_SINK_PERIODS_16, 0, 0);
/* Enable interrupts */
NVIC_ClearPendingIRQ(AUDIOSINK_PERIOD_IRQn);
NVIC_EnableIRQ(AUDIOSINK_PERIOD_IRQn);
/* Start period counter to start period measurement */
AUDIOSINK_CTRL->PERIOD_CNT_START_ALIAS = 1;
}
standby_mode_env->RTC_clk_src = RTC_CLK_SRC;
/* Update wake-up configuration and control registers */
standby_mode_env->wakeup_cfg = WAKEUP_DELAY_16 |
WAKEUP_WAKEUP_PAD_FALLING |
WAKEUP_DIO3_DISABLE |
WAKEUP_DIO2_DISABLE |
WAKEUP_DIO1_DISABLE |
WAKEUP_DIO0_DISABLE;
/* Update wake-up control and clear previous wake-up events */
standby_mode_env->wakeup_ctrl = PADS_RETENTION_DISABLE |
WAKEUP_DCDC_OVERLOAD_CLEAR |
WAKEUP_PAD_EVENT_CLEAR |
WAKEUP_RTC_ALARM_CLEAR |
WAKEUP_BB_TIMER_CLEAR |
WAKEUP_DIO3_EVENT_CLEAR |
WAKEUP_DIO2_EVENT_CLEAR |
WAKEUP_DIO1_EVENT_CLEAR |
WAKEUP_DIO0_EVENT_CLEAR;
/* Set DMA channel used to save/restore RF registers
* in each standby/wake-up cycle */
standby_mode_env->DMA_channel_RF = DMA_CHAN_SLP_WK_RF_REGS_COPY;
/* Initialize some system blocks for standby mode,
* save RF registers and memory banks*/
Sys_PowerModes_Standby_Init(standby_mode_env);
/* BLE not in standby mode and ready for normal operations */
BLE_Is_Awake_Flag_Set();
}
主循环中空闲时段进入standby
GLOBAL_INT_DISABLE();
BLE_Power_Mode_Enter(&standby_mode_env, POWER_MODE_STANDBY);
GLOBAL_INT_RESTORE();
/* Wait for an event before executing the scheduler again */
SYS_WAIT_FOR_EVENT;
大概测了一下待机电流
大约88uA,预料内
不过好在使用了大容量的锂电池
可以充电,苟着用吧
顺道测了一下一次完整屏幕刷新的消耗
0.5mA左右吧
Indoor的装置会不断扫描周边的蓝牙设备
配置的间隔100ms,扫描window时间50ms
算是频率比较高了
Outdoor装置每3分钟广播6s
记录了4次indoor装置扫描和显示更新的消耗
平均电流大约是1mA
不太理想
理想中应该和outdoor一起
能够有个时间的同步
其他时间都保持在90uA左右的待机状态
目前还没想到有什么好的办法来进行时间戳的同步
暂时先这样吧
毕竟使用了1200mAh的电池
打个7折,也能够使用超过一个月充电一次
接着苟用
界面设计
1—太阳直射温度(outdoor装置安装在路灯盒中,如果是百叶箱可以看成气温)
2—空气湿度
3—气压值
4—outdoor端上次RSSI范围
5—indoor端电池电量估计
6—最近三十次气压值柱状图
7—预测天气图标
天气图标大概有这几个
后面可能会有细节的修改吧
先按这个撸
天气数据简要分析
1s的频率
采集了一次对流天气的气压数据
生成了一个曲线
根据记录的时间
大致划分了一下强对流降雨的过程
大概可以发现,气压的变化趋势
和降雨的情况还是密切相关的
特别是开始下雨那一段
放大后
这一段在10分钟内
气压快速下降了接近130pa
在此之后的曲线中
气压逐渐上升
雨势渐停,天气放晴
上面只是从气压一个维度来观察下雨的情况
气象谚语说:燕子低飞要下雨
很可能还需要考虑湿度
可能气压湿度组合起来效果会更好些
后面再尝试吧
脑海里突然冒出想法
气压湿度预测短时天气
是不是采集好数据搞点机器学习的算法,结果会更准确?
先到这
|