mirror of
https://gitee.com/beecue/fastbee.git
synced 2025-12-18 00:45:55 +08:00
342 lines
9.4 KiB
C
342 lines
9.4 KiB
C
/******************************************************************************
|
||
* 作者:kerwincui
|
||
* 时间:2021-06-08
|
||
* 邮箱:164770707@qq.com
|
||
* 源码地址:https://gitee.com/kerwincui/wumei-smart
|
||
* author: kerwincui
|
||
* create: 2021-06-08
|
||
* email:164770707@qq.com
|
||
* source:https://github.com/kerwincui/wumei-smart
|
||
******************************************************************************/
|
||
#include "button.h"
|
||
#include "common.h"
|
||
#include "smart_config.h"
|
||
#include "led.h"
|
||
#include "wifi.h"
|
||
#include "http_server.h"
|
||
#include "native_ota.h"
|
||
#include "mqtt.h"
|
||
#include "lwip_sntp.h"
|
||
#include "nvs_storage.h"
|
||
|
||
|
||
static const char* TAG = "button";
|
||
bool is_open=false;
|
||
|
||
//单击开关按钮(回调函数)
|
||
static void button_single_click_cb(void* arg)
|
||
{
|
||
ESP_EARLY_LOGI(TAG, "tab switch button\n");
|
||
if(relay_status==1)
|
||
{
|
||
close_relay();
|
||
relay_status=0;
|
||
}else{
|
||
open_relay();
|
||
relay_status=1;
|
||
}
|
||
write_relay_status();
|
||
|
||
// mqtt发布状态
|
||
if(is_wifi_offline==0 && wifi_status==1 ){
|
||
publishStatus();
|
||
}
|
||
}
|
||
|
||
//长按开关按钮
|
||
static void button_long_press_start_cb(void* arg)
|
||
{
|
||
ESP_LOGI(TAG, "begin smargconfig\n");
|
||
//蓝灯闪烁
|
||
led_rgb_blink(0,0,255,2,0,0,0,0);
|
||
//智能配网
|
||
smart_config_start();
|
||
|
||
}
|
||
|
||
// 连续短按开关按钮
|
||
static void button_press_repeat_cb(void *arg)
|
||
{
|
||
ESP_LOGI(TAG, "BUTTON_PRESS_REPEAT[%d]", iot_button_get_repeat((button_handle_t)arg));
|
||
uint8_t num=iot_button_get_repeat((button_handle_t)arg);
|
||
ESP_LOGI(TAG, "press repeat num: %d\n",num);
|
||
|
||
switch (num)
|
||
{
|
||
case 7:
|
||
ESP_LOGI(TAG, "native ota...\n");
|
||
led_rgb_blink(255,0,0,2,0,0,0,0);
|
||
native_ota_start();
|
||
break;
|
||
case 6:
|
||
//打开/关闭雷达
|
||
led_rgb_blink(0,0,255,2,0,6,0,0);
|
||
is_radar=is_radar==1 ? 0:1;
|
||
write_is_radar();
|
||
break;
|
||
case 5:
|
||
//遥控清码
|
||
ESP_LOGI(TAG, "rf clear code ...\n");
|
||
led_rgb_blink(0,0,255,2,0,5,0,0);
|
||
is_rf_clear=1;
|
||
rf_clear_code();
|
||
break;
|
||
case 4:
|
||
//遥控学习
|
||
ESP_LOGI(TAG, "rf learning... \n");
|
||
led_rgb_blink(0,0,255,2,0,4,0,0);
|
||
is_rf_learn=1;
|
||
rf_learn();
|
||
break;
|
||
case 3:
|
||
if(is_ap!=1){
|
||
// 打开ap
|
||
ESP_LOGI(TAG, "open access point \n");
|
||
is_ap=1;
|
||
ap_start();
|
||
}else{
|
||
//重启
|
||
device_restart();
|
||
}
|
||
break;
|
||
case 2:
|
||
ESP_EARLY_LOGI(TAG, "switch light \n");
|
||
light_status=light_status==0?1:0;
|
||
led_status();
|
||
write_light_status();
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
// mqtt发布状态
|
||
if(is_wifi_offline==0 && wifi_status==1 ){
|
||
publishSetting();
|
||
publishStatus();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
void button_start()
|
||
{
|
||
printf("before btn init, heap: %d\n", esp_get_free_heap_size());
|
||
|
||
//初始化继电器引脚
|
||
gpio_pad_select_gpio(IO_RELAY);
|
||
gpio_set_direction(IO_RELAY,GPIO_MODE_OUTPUT);
|
||
|
||
//初始化按键
|
||
button_config_t cfg = {
|
||
.type = BUTTON_TYPE_GPIO,
|
||
.gpio_button_config = {
|
||
.gpio_num = IO_SWITCH_BUTTON,
|
||
.active_level = 0,
|
||
},
|
||
};
|
||
button_handle_t gpio_btn = iot_button_create(&cfg);
|
||
if(NULL == gpio_btn) { ESP_LOGE(TAG, "Button create failed"); }
|
||
iot_button_register_cb(gpio_btn, BUTTON_SINGLE_CLICK, button_single_click_cb); //短按
|
||
iot_button_register_cb(gpio_btn, BUTTON_LONG_PRESS_START, button_long_press_start_cb); //长按
|
||
iot_button_register_cb(gpio_btn, BUTTON_PRESS_REPEAT, button_press_repeat_cb); //连续短按
|
||
}
|
||
|
||
|
||
|
||
|
||
/************************************* begin RF接收信号 ***************************************/
|
||
|
||
static void process_rf_func(uint8_t function){
|
||
if(function==1){
|
||
//打开关闭继电器
|
||
ESP_LOGI(TAG, "switch relay\n");
|
||
if(relay_status==0){
|
||
open_relay();
|
||
relay_status=1;
|
||
}else if(relay_status==1){
|
||
close_relay();
|
||
relay_status=0;
|
||
}
|
||
write_relay_status();
|
||
}else if(function==2){
|
||
//打开关闭灯
|
||
ESP_LOGI(TAG, "switch light\n");
|
||
light_status=light_status==0?1:0;
|
||
led_status();
|
||
}else if(function==3){
|
||
//打开关闭雷达
|
||
ESP_LOGI(TAG, "switch radar\n");
|
||
if(is_radar==0){
|
||
is_radar=1;
|
||
}else if(is_radar==1){
|
||
is_radar=0;
|
||
}
|
||
write_is_radar();
|
||
}else if(function==4){
|
||
//打开关闭报警
|
||
ESP_LOGI(TAG, "switch alarm\n");
|
||
if(is_alarm==0){
|
||
is_alarm=1;
|
||
}else if(is_alarm==1){
|
||
is_alarm=0;
|
||
}
|
||
write_is_alarm();
|
||
}else if(function==5){
|
||
ESP_LOGI(TAG, "smart config\n");
|
||
if(is_smart_config==0){
|
||
ESP_LOGI(TAG, "begin smargconfig\n");
|
||
// wifi_mqtt_stop();
|
||
is_smart_config=1;
|
||
//蓝灯闪烁
|
||
// led_rgb_blink(0,0,255,2,0,0,0,0);
|
||
//智能配网
|
||
smart_config_start();
|
||
}else{
|
||
is_smart_config=0;
|
||
ESP_LOGI(TAG, "device restart\n");
|
||
device_restart();
|
||
|
||
}
|
||
}
|
||
|
||
// mqtt发布状态
|
||
if(is_wifi_offline==0 && wifi_status==1 ){
|
||
publishStatus();
|
||
publishSetting();
|
||
}
|
||
}
|
||
|
||
//RF接收任务
|
||
static void rf_receiver_task(void *arg) {
|
||
ESP_LOGI(TAG, "begin rf receiver");
|
||
// uint32_t gpio_num = (uint32_t) arg;
|
||
while(true)
|
||
{
|
||
if(gpio_get_level(IO_RF_RECEIVER_A)==1)
|
||
{
|
||
process_rf_func(rf_one_func);
|
||
}else if(gpio_get_level(IO_RF_RECEIVER_B)==1)
|
||
{
|
||
process_rf_func(rf_two_func);
|
||
|
||
}else if(gpio_get_level(IO_RF_RECEIVER_C)==1)
|
||
{
|
||
process_rf_func(rf_three_func);
|
||
}else if(gpio_get_level(IO_RF_RECEIVER_D)==1)
|
||
{
|
||
process_rf_func(rf_four_func);
|
||
}
|
||
vTaskDelay(pdMS_TO_TICKS(250));
|
||
}
|
||
}
|
||
|
||
void rf_receiver_start(void)
|
||
{
|
||
// 初始化射频引脚
|
||
gpio_pad_select_gpio(IO_RF_RECEIVER_D);
|
||
gpio_pad_select_gpio(IO_RF_RECEIVER_C);
|
||
gpio_pad_select_gpio(IO_RF_RECEIVER_B);
|
||
gpio_pad_select_gpio(IO_RF_RECEIVER_A);
|
||
gpio_pad_select_gpio(IO_RF_LEARN_KEY);
|
||
|
||
gpio_set_direction(IO_RF_RECEIVER_D,GPIO_MODE_INPUT);
|
||
gpio_set_direction(IO_RF_RECEIVER_C,GPIO_MODE_INPUT);
|
||
gpio_set_direction(IO_RF_RECEIVER_B,GPIO_MODE_INPUT);
|
||
gpio_set_direction(IO_RF_RECEIVER_A,GPIO_MODE_INPUT);
|
||
gpio_set_direction(IO_RF_LEARN_KEY,GPIO_MODE_OUTPUT);
|
||
|
||
// gpio_set_pull_mode(IO_RF_RECEIVER_D,GPIO_PULLDOWN_ONLY);
|
||
// gpio_set_pull_mode(IO_RF_RECEIVER_C,GPIO_PULLDOWN_ONLY);
|
||
// gpio_set_pull_mode(IO_RF_RECEIVER_B,GPIO_PULLDOWN_ONLY);
|
||
// gpio_set_pull_mode(IO_RF_RECEIVER_A,GPIO_PULLDOWN_ONLY);
|
||
|
||
|
||
//创建接收信号任务
|
||
xTaskCreate(rf_receiver_task, "rf_receiver_task", 2048, (void*) IO_RF_RECEIVER_A, 10, NULL);
|
||
|
||
}
|
||
|
||
/************************************* end RF接信号 ***************************************/
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/************************************* begin 雷达感应 ***************************************/
|
||
|
||
//雷达感应任务
|
||
static void radar_sense(void *arg) {
|
||
ESP_LOGI(TAG, "begin radar sense");
|
||
uint16_t num=0;
|
||
while(true){
|
||
if(is_radar==1 && is_alarm==1){
|
||
if(gpio_get_level(IO_RADAR_OUT)==1){
|
||
if(relay_status==0) {
|
||
relay_status=1;
|
||
open_relay();
|
||
light_status=1;
|
||
led_rgb_blink(255,0,0,100,0,0,3,500); //红灯闪烁
|
||
}
|
||
}
|
||
else{
|
||
//超过指定时间后关闭
|
||
if(relay_status==1 && num >5*radar_interval){
|
||
relay_status=0;
|
||
close_relay();
|
||
light_status=0;
|
||
led_status();
|
||
num=0;
|
||
}
|
||
num++;
|
||
}
|
||
} else if(is_radar==1) {
|
||
if(gpio_get_level(IO_RADAR_OUT)==1){
|
||
if(relay_status==0) {
|
||
relay_status=1;
|
||
open_relay();
|
||
light_status=1;
|
||
led_status();
|
||
}
|
||
}
|
||
else{
|
||
//超过指定时间后关闭
|
||
if(relay_status==1 && num >5*radar_interval){
|
||
relay_status=0;
|
||
close_relay();
|
||
light_status=0;
|
||
led_status();
|
||
num=0;
|
||
}
|
||
num++;
|
||
}
|
||
}
|
||
vTaskDelay(pdMS_TO_TICKS(200));
|
||
}
|
||
|
||
}
|
||
|
||
// void radar_cds_enable(void){
|
||
// gpio_set_level(IO_RADAR_CDS,1);
|
||
// }
|
||
|
||
// void radar_cds_disable(void){
|
||
// gpio_set_level(IO_RADAR_CDS,0);
|
||
// }
|
||
|
||
void radar_start(void){
|
||
// 初始化射频引脚
|
||
gpio_pad_select_gpio(IO_RADAR_OUT);
|
||
gpio_set_direction(IO_RADAR_OUT,GPIO_MODE_INPUT);
|
||
gpio_set_pull_mode(IO_RADAR_OUT, GPIO_PULLDOWN_ONLY);
|
||
|
||
// gpio_pad_select_gpio(IO_RADAR_CDS);
|
||
// gpio_set_direction(IO_RADAR_CDS,GPIO_MODE_INPUT_OUTPUT);
|
||
// gpio_set_pull_mode(IO_RADAR_OUT, GPIO_PULLUP_ONLY);
|
||
|
||
xTaskCreate(radar_sense,"radar_sense", 2048,NULL,10,NULL);
|
||
}
|
||
|
||
|
||
/************************************* end 雷达感应 ***************************************/ |