esp 指针 和 sp_服务器

    文章目录

    • 一、前言;
    • 二、站在巨人的肩膀上;
    • 三、按键驱动,长按短按;
    • 四、平滑PWM调光;
    • 五、自定义保存路由器信息,自动重连路由器;
    • 六、其他;
    • 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

    一、前言;


         整理上半年有关于 esp8266 rtos3.0 的一些项目后,发现有几个较为常用的外设封装,看到群里的人还在开发,我也就分享出来了;

         代码基本不是自己敲的,但是很多是加入了自己的元素,以及封装了一下子,使用起来很舒服,博客很多demo自己辛苦整理出来的,我不想有些人伸手党一样地拿去,知识是付费的,也是有人看不惯于是来喷我,呵呵。

         所以,往后的这些博文大家支持的话,点个赞就可以了!有收费的纯属是手工费或脑力费,觉得不值,就 “ALT + F4 ” 关闭网页即可!


    二、站在巨人的肩膀上;


         这句话,我最早应该在大学时候的一本书看到的!讲到的是很多知识和框架都是前辈已经整理好了,并不用自己辛辛苦苦地敲写各种协议,各种封装,这大大提高我们的开发效益;

         打个比方,我们在收割稻谷的时候,传统的都是人工收割,我记得小时候拉着手推车去拉稻谷!现在不一样了,有一条龙服务了,有人专门做稻谷收割机,直接才操作机器就可以了,不用大费心机劳力去收割,这让我们很舒服而且效率很快;

         上面的比方,那些专门做稻谷收割机的人就是 巨人,我们就是站在他们的肩膀上收取稻谷,中间的过程我们不必理会,这使得我们的效率大大提供;当然了,你得付费;

    我们开始学习时候不需要理会底层的东西,先统筹下巨人所研究出来的成功实践,再慢慢细嚼其中的原理精华。


    三、按键驱动,长按短按;


         源代码从官网京东微联工程中提取,我已经整理好成组件,并且下面只分析如何使用:

    1. 首先得初始化拿到句柄,传入参数 GPIO,下降沿触发;
    2. 定义短按回调函数,注意有三个选项:BUTTON_PUSH_CBBUTTON_RELEASE_CBBUTTON_TAP_CB ,注意事项我在代码使用注释提到了。当然,最好你是亲自实践下你就知道了!
    3. 定义长按回调函数,我一般是设置2s长按;

         下面是全部使用代码;


    #define BUTTON_GPIO 4
    
    //短按函数
    static void ButtonShortPressCallBack(void *arg)
    {
        ESP_LOGI(TAG, "ButtonShortPressCallBack  esp_get_free_heap_size(): %d ", esp_get_free_heap_size());
    }
    //长按函数
    static void ButtonLongPressCallBack(void *arg)
    {
        ESP_LOGI(TAG, "ButtonLongPressCallBack  esp_get_free_heap_size(): %d ", esp_get_free_heap_size());
    }
    
    /**
     * @description: 按键驱动
     * @param {type} 
     * @return: 
     */
    void TaskButton(void *pvParameters)
    {
        //定义一个 gpio 下降沿触发
        button_handle_t btn_handle = button_dev_init(BUTTON_GPIO, 1, BUTTON_ACTIVE_LOW);
        // 50ms按钮短按
        // BUTTON_PUSH_CB 表示按下就触发回调函数,如果设置了长按,这个依然会同时触发!
        // BUTTON_RELEASE_CB 表示释放才回调,如果设置了长按,这个依然会同时触发!
        // BUTTON_TAP_CB 此选项释放才回调,如果设置了长按,这个不会同时触发!
        button_dev_add_tap_cb(BUTTON_PUSH_CB, ButtonShortPressCallBack, "TAP", 50 / portTICK_PERIOD_MS, btn_handle);4
        // 设置长按 2s后触发
        button_dev_add_press_cb(0, ButtonLongPressCallBack, NULL, 2000 / portTICK_PERIOD_MS, btn_handle);
    
        vTaskDelete(NULL);
    }

    四、平滑PWM调光;


         PWM平滑调光,也许很多人并不知道什么意思。在照明行业,这个是许多开发者在乎的一种效果,像 esp32 就自带这么一种算法叫做 LEDC,全称是 LED control 顾名思义就是专为 LED控制设计的,具体的大家可以来这里我之前写的博客,或者去官网看看;

         而在 esp8266上实现,需要自己写算法,而乐鑫前期是提供这样的代码方案,到后面就没了;为了在项目 3.0 SDK 上达到这样的效果,我移植旧版的过来,发现并不是很顺利,平滑程度是眼镜看不到,也许是变得太快了;

         所以,我在其算法上加上一些延迟,这个算法怎么加,我们必须知道:当我们从0调节到100是从灭到最亮的过程,一般设置是瞬间到从灭到最亮的,而为了看到平活效果,我们可以把 从灭到最亮中间分成若干段,就是 0到100分成若干段,每一点一点去设置,比如:

    0% --> 15% --> 30% --> 45% --> 65% --> 80% --> 95% --> 100%

         这样我们肉眼起码看到是慢慢在变的,其实在一段一段在设置;

         而重要的是,当亮度越来越小的时候,我们的眼看到的效果是越来越不明显了,所以我在此监听到 在 20%亮度以下,延迟再加大点。

    void user_light_set_duty(uint32_t duty, uint8_t channel)
    {
         if (duty != light_param.pwm_duty[channel])
        {
            pwm_set_duty(channel, duty);
            light_param.pwm_duty[channel] = duty;
            if (duty < 20)
            {
                vTaskDelay(15 / portTICK_RATE_MS);
            }
            else
            {
                vTaskDelay(20 / portTICK_RATE_MS);
            }
        }
    }

         说了这么多理论,我下面写下如何使用,下面有通道设计,以及周期等设计,以及我是默认是5通道,但是你可以自由设置;

    周期越大,平滑调节效果越明显,如果硬件允许,我建议设置为 1000 ;

         头文件定义的方法使用见注释吧;


    //一共设计的通道
    #define PWM_CHANNEL 5
    //周期,同样是深度
    #define PWM_PERIOD 100
    
    #define PWM_0_OUT_IO_NUM 12 //白光 通道0
    #define PWM_1_OUT_IO_NUM 13 //暖光 通道1
    #define PWM_2_OUT_IO_NUM 14 //红色灯 通道2
    #define PWM_3_OUT_IO_NUM 15 //绿色灯 通道3
    #define PWM_4_OUT_IO_NUM 5  //蓝色灯 通道4
    
    /**
     * @description: 平滑设置全部通道
     * @param {type} 
     * @return: 
     */
    void light_set_aim_all(uint32_t cw, uint32_t ww, uint32_t r, uint32_t g, uint32_t b);
    
    /**
     * @description: 平滑设置通道2 红色灯
     * @param {type} 
     * @return: 
     */
    void light_set_aim_r(uint32_t r);
    
    /**
     * @description: 平滑设置通道3 绿色灯
     * @param {type} 
     * @return: 
     */
    void light_set_aim_g(uint32_t g);
    
    /**
     * @description: 平滑设置通道4 蓝色灯
     * @param {type} 
     * @return: 
     */
    void light_set_aim_b(uint32_t b);
    
    /**
     * @description: 平滑设置通道0 白色灯
     * @param {type} 
     * @return: 
     */
    void light_set_aim_cw(uint32_t cw);
    
    /**
     * @description: 平滑设置通道1 暖色灯
     * @param {type} 
     * @return: 
     */
    void light_set_aim_ww(uint32_t ww);

    五、自定义保存路由器信息,自动重连路由器;


         最后一个要分享的是在 esp8266 rtos3.0 上实现自动重连路由器,要知道,在 esp8266 rtos3.0 上并不是像 2.0 一样,当你上次连接成功路由器之后,你下次断电重启设置 station 模式会自动连接路由器。在 esp8266 rtos3.0 上需要自己来保存,不知道以后乐鑫会不会优化一下这个问题;

         所以,有这样的需求,我是自己敲了一个组件出来,简单来说就是提供保存路由器ssid和密码,以及清理路由器ssid和密码,以及自动连接路由器接口;

         相信从头文件大家可以看到如何使用了!我个人建议就是 配网成功后就保存路由器信息,每次重启就调用 routerStartConnect(); 即可,看返回函数是否可以连接路由器,否则进去配网模式;


    /**
     * @description:  自动连接路由器
     * @param {type}  是否成功连接! false:获取ssid失败!true:成功自动连接路由器
     * @return: 
     */
    bool routerStartConnect();
    
    /**
     * @description: 清理wifi路由器连接信息
     * @param {type} 
     * @return: 
     */
    void router_wifi_clean_info(void);
    
    /**
     * @description: 保存路由器信息
     * @param {type} 
     * @return: 
     */
    void router_wifi_save_info(uint8_t *ssid, uint8_t *password);

    六、其他;