[经验分享] 【短时天气预报系统】indoor装置基本功能实现

ljj3166   2021-6-20 13:35 楼主

周末开撸

整理处理了一下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;

 

大概测了一下待机电流

 

1.jpg

 

 

大约88uA,预料内

不过好在使用了大容量的锂电池

可以充电,苟着用吧

顺道测了一下一次完整屏幕刷新的消耗

 

2.jpg

 

 

0.5mA左右吧

Indoor的装置会不断扫描周边的蓝牙设备

配置的间隔100ms,扫描window时间50ms

算是频率比较高了

 

3.jpg

 

 

Outdoor装置每3分钟广播6s

记录了4indoor装置扫描和显示更新的消耗

平均电流大约是1mA

不太理想

理想中应该和outdoor一起

能够有个时间的同步

其他时间都保持在90uA左右的待机状态

目前还没想到有什么好的办法来进行时间戳的同步

暂时先这样吧

毕竟使用了1200mAh的电池

打个7折,也能够使用超过一个月充电一次

接着苟用

 

界面设计

 

4.jpg

 

1—太阳直射温度(outdoor装置安装在路灯盒中,如果是百叶箱可以看成气温)

2—空气湿度

3—气压值

4—outdoor端上次RSSI范围

5—indoor端电池电量估计

6—最近三十次气压值柱状图

7—预测天气图标

天气图标大概有这几个

5.jpg

 

后面可能会有细节的修改吧

先按这个撸

 

天气数据简要分析

 

 

1s的频率

采集了一次对流天气的气压数据

生成了一个曲线

 

6.jpg

 

 

根据记录的时间

大致划分了一下强对流降雨的过程

大概可以发现,气压的变化趋势

和降雨的情况还是密切相关的

特别是开始下雨那一段

放大后

 

7.jpg

 

 

这一段在10分钟内

气压快速下降了接近130pa

在此之后的曲线中

气压逐渐上升

雨势渐停,天气放晴

上面只是从气压一个维度来观察下雨的情况

气象谚语说:燕子低飞要下雨

很可能还需要考虑湿度

可能气压湿度组合起来效果会更好些

后面再尝试吧

脑海里突然冒出想法

气压湿度预测短时天气

是不是采集好数据搞点机器学习的算法,结果会更准确?

 

先到这

 

 

 

 

 

 

 

 

 

 

 

 

本帖最后由 ljj3166 于 2021-6-20 13:55 编辑
So TM what......?

回复评论 (8)

墨水屏nice,2.13寸的吗

点赞  2021-6-20 17:52

天气预报原理原来是这样的,学习了

点赞  2021-6-20 19:06
引用: dql2016 发表于 2021-6-20 17:52 墨水屏nice,2.13寸的吗

2.9的,好几年前的库存货,功能不全

So TM what......?
点赞  2021-6-20 21:27
引用: sipower 发表于 2021-6-20 19:06 天气预报原理原来是这样的,学习了

拍脑瓜的

So TM what......?
点赞  2021-6-20 21:28

可行性感觉还不错!数据图形也非常容易理解!

点赞  2021-6-21 08:51

7楼 nmg 

举报

点赞  2021-6-21 10:13
引用: w494143467 发表于 2021-6-21 08:51 可行性感觉还不错!数据图形也非常容易理解!

看上去似乎可以,用通用mcu来做,实际可能问题很多

So TM what......?
点赞  2021-6-21 14:53

阿达....

So TM what......?
点赞  2021-6-21 14:56
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复