完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使需要定期唤醒的设备,按下按钮。
我正在尝试实现此功能,但是在组合此功能时遇到了一些问题。按钮将进入睡眠状态,但仅在按下按钮时唤醒。然后它进入睡眠状态并立即醒来几次,然后进入睡眠状态,直到我再次按下按钮。 这个问题有什么解决方案吗? #include "driver/uart.h" #include "gpio.h" #include "osapi.h" #include "user_interface.h" LOCAL os_timer_t taskTimer; LOCAL os_timer_t sleepTimer; void ICACHE_FLASH_ATTR fpm_wakup_cb_func(void) { uint8_t pin_state = GPIO_INPUT_GET(5); os_printf("nnnin wakeup function %dn", system_get_time()); os_printf("pin %dn", pin_state); wifi_fpm_close(); // disable force sleep function // wifi_set_sleep_type(NONE_SLEEP_T); // wifi_fpm_set_sleep_type(NONE_SLEEP_T); app_init(); } void ICACHE_FLASH_ATTR go_to_sleep(void) { os_printf("sleep for 20 sn"); wifi_set_opmode(NULL_MODE); wifi_fpm_set_sleep_type(LIGHT_SLEEP_T); PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5); // PIN_PULLUP_DIS(BUTTON_PIN_MUX); gpio_output_set(0, GPIO_ID_PIN(5), 0, GPIO_ID_PIN(5)); wifi_enable_gpio_wakeup(5, GPIO_PIN_INTR_LOLEVEL); wifi_fpm_open(); wifi_fpm_set_wakeup_cb(fpm_wakup_cb_func); // Set wakeup callback // wifi_fpm_do_sleep(FPM_SLEEP_MAX_TIME); wifi_fpm_do_sleep(20 * 1000000); // Sleep for 300s, then publish again to test // os_printf("sleep done...n"); } 无效 ICACHE_FLASH_ATTR turn_off() { os_printf("going to sleep %dn", system_get_time()); os_printf("disconnecting from wifin"); wifi_station_disconnect(); os_printf("disarming timersn"); os_timer_disarm(&taskTimer); os_timer_disarm(&sleepTimer); os_timer_setfn(&sleepTimer, (os_timer_func_t *)go_to_sleep, NULL); os_timer_arm(&sleepTimer, 1000, 0); } 无效ICACHE_FLASH_ATTR set_turn_off_after(uint8_t秒) { os_printf("turn off after %d secondsn", sec); os_timer_disarm(&taskTimer); os_timer_setfn(&taskTimer, (os_timer_func_t *)turn_off, NULL); os_timer_arm(&taskTimer, sec * 1000, 0); } void ICACHE_FLASH_ATTR app_init(无效) { set_turn_off_after(10); } void ICACHE_FLASH_ATTR user_init(无效) { //tur on the led gpio_init(); PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); gpio_output_set((1 << 4), 0, (1 << 4), 0); uart_init(BIT_RATE_115200, BIT_RATE_115200); uint8_t i; for (i = 0; i < 10; i++) { os_printf("."); os_delay_us(10000); } system_init_done_cb(app_init); } |
|
相关推荐
1个回答
|
|
从您的描述来看,您希望使用ESP8266实现一个功能,即通过按下按钮将设备从睡眠状态唤醒。您提供的代码片段中包含了一些基本的组件,但是可能需要进行一些调整以实现您所需的功能。以下是一些建议和解决方案:
1. 首先,确保您的按钮连接正确。按钮应该连接到ESP8266的一个GPIO引脚,例如GPIO5。同时,确保按钮的另一端连接到地(GND)。 2. 在您的代码中,您需要设置GPIO5为输入模式,并配置内部上拉或下拉电阻。这可以通过以下代码实现: ```c GPIO_DIS_OUTPUT(5); GPIO_AS_INPUT(5); GPIO_PULLUP_DIS(5); GPIO_PULLDOWN_EN(5); ``` 3. 接下来,您需要设置一个定时器,用于在按下按钮时唤醒设备。您可以使用ESP8266的`os_timer_t`结构体来实现这个功能。以下是如何设置定时器的示例: ```c os_timer_disarm(&sleepTimer); os_timer_setfn(&sleepTimer, (os_timer_func_t *)fpm_wakup_cb_func, NULL); os_timer_arm(&sleepTimer, 100, 0); ``` 这里,`fpm_wakup_cb_func`是您的回调函数,当定时器触发时将调用该函数。`100`是定时器的超时时间,单位为毫秒。 4. 在`fpm_wakup_cb_func`函数中,您需要检查按钮的状态。如果按钮被按下(即GPIO5的值为低电平),则唤醒设备。以下是如何实现这个功能的示例: ```c void ICACHE_FLASH_ATTR fpm_wakup_cb_func(void) { uint8_t pin_state = GPIO_INPUT_GET(5); if (pin_state == 0) { // 唤醒设备 system_deep_sleep_set_option(0); system_deep_sleep(0); } } ``` 5. 最后,您需要确保在设备进入睡眠状态之前,定时器已经被正确地设置和启动。这可以通过在设备进入睡眠状态之前调用以下代码实现: ```c os_timer_disarm(&sleepTimer); os_timer_setfn(&sleepTimer, (os_timer_func_t *)fpm_wakup_cb_func, NULL); os_timer_arm(&sleepTimer, 100, 0); ``` 6. 当设备唤醒后,您可能需要重新启动定时器,以便在下一次按下按钮时再次唤醒设备。这可以通过在`fpm_wakup_cb_func`函数的末尾添加以下代码实现: ```c os_timer_arm(&sleepTimer, 100, 0); ``` 通过以上步骤,您应该可以实现按下按钮唤醒ESP8266设备的功能。如果仍然遇到问题,请检查您的硬件连接和代码逻辑,确保一切都按照预期工作。 |
|
|
|
只有小组成员才能发言,加入小组>>
421浏览 6评论
354浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
335浏览 5评论
338浏览 4评论
319浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-25 01:29 , Processed in 0.714743 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号