Esp8266学习之旅13 动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。(附带demo)




一、前言。


时间年末,真的是越来越忙啦。广东的天气越来越冷了,各位朋友注意保暖~。最近发现创立的QQ群,很多加入都是寥寥所事,为了提高进一步的群人员质量,我决定设置为付费加群,并不是所谓的利益!而是提高群员的素质,我不想看到一个伸手一个拿资料,并不是毫无回报的。但是这里发布的博客对应的Demo都是免费啦!望各位谅解!

                                                            小徐 2018-1-13  17:03

1.1 操作步骤。


图片不清晰,请放大浏览器浏览倍数!关于MQTT和smartConfig不懂,请认真看看我的8266系列博文!


  • 如果您的8266设备第一次配网或者您想改变已经连接的wifi路由,请点击按键,同时手机APP输入账号和密码,点击搜索!

    • 设备配网成功后,红灯灭。否则红灯一直亮!

    • 控制端发送0或1,控制设备开关灯!此灯是绿灯!

    • 本次实验的是webSocket也就是服务器提供的,实现上位机的操作,如果你会安卓开发,可以尝试从我的上几天发布的博客实现Android上位机!


这里写图片描述


1.2 电路图;


  • 其实本博文和我写的这篇 小实战MQTT 是差不多的,只是在MQTT的demo之上加了个smartConfig功能,可以实现不用写死了密码在代码里面!

这里写图片描述


二、部分代码。


  • 2.1 首先我们在user_main()先初始化GPIO口。
    //LED初始化
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15); //选择GPIO15,此GPIO连接是绿灯
    GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 1); //默认GPIO15为高,也就是关灯

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12); //选择GPIO12,此GPIO连接是红灯
    GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0); //默认GPIO12为高,也就是开灯,表示配网不成功!

  • 2.2 在user_main()定义不断轮询是否连接网络的定时器,回调函数 Check_WifiState()。

    os_timer_disarm(&checkTimer_wifistate); //启动定时器前先取消定时器定时
    os_timer_setfn(&checkTimer_wifistate, (os_timer_func_t *) Check_WifiState,
    NULL);  //设置定时器回调函数
    os_timer_arm(&checkTimer_wifistate, 1000, 1);   //启动定时器

  • 2.3 在Check_WifiState() 查询当前网络状态。如果已经连接则关闭红灯!
void Check_WifiState(void) {
    uint8 getState;
    struct ip_info ipConfig;
    wifi_get_ip_info(STATION_IF, &ipConfig);
    getState = wifi_station_get_connect_status();

    //查询 ESP8266 WiFi station 接口连接 AP 的状态
    if (getState == STATION_GOT_IP && ipConfig.ip.addr != 0) {
        os_printf("----- wifi 连接成功! 红灯关闭啦啦!---\r\n");
        GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);

        os_printf("----- wifi 连接成功! 断开定时器啦!---\r\n");
        os_timer_disarm(&checkTimer_wifistate);
        sntp_setservername(0, "pool.ntp.org"); // set sntp server after got ip address
        sntp_init();
        os_timer_disarm(&sntp_timer);
        os_timer_setfn(&sntp_timer, (os_timer_func_t *) sntpfn, NULL);
        os_timer_arm(&sntp_timer, 1000, 1); //1s

    }
}

  • 2.4 同样 在user_main()初始化按键,以及按键的点按回调函数!
    keyInit();

  • 2.5 按键的点按回调函数。
LOCAL void ICACHE_FLASH_ATTR keyShortPress(void) {
    os_printf("---------- 按键触发 ,开始进去SmartConfig配网 \n\n\n-----");
    smartconfig_init();
}

  • 2.6 收到服务器下发数据的处理。
void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len,
        const char *data, uint32_t data_len) {

    MQTT_Client* client = (MQTT_Client*) args;

    //如果接收到指令是1,GPIO15输出为低,也就是LED开灯,同时发布消息,主题是/xuhong/LED/out,信息是LED status is open ...
    if (data[0] == '1') {
        GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 0);
        MQTT_Publish(client, "/xuhong/LED/out", "LED status is open ...",
                strlen("LED status is open ..."), 0, 0);
    }

    //如果接收到指令是0,GPIO15为高,也就是LED关灯,同时发布消息,主题是/xuhong/LED/out,信息是LED status is off ...
    if (data[0] == '0') {
        GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 1);
        MQTT_Publish(client, "/xuhong/LED/out", "LED status is off ...",
                strlen("LED status is off ..."), 0, 0);
    }

}

三、截图。

  • 3.1 配网串口输出截图。

这里写图片描述


这里写图片描述


四、爬坑记录。


    1. 8266遇到开启smartConfig 时候,发现提示 err3,exceed max time value 。解决方法为把NONO_SDK退回到2.1.0版本,可以去乐鑫官网下载,不是GitHub下载!

这里写图片描述


截止今天2018-01-15为止,我已经联系乐鑫官方人员修改Bug,已经修复啦!!GitHub的v2.2.0版本也可以用了。

爬坑的与乐鑫人员的对话记录:https://github.com/espressif/ESP8266_NONOS_SDK/issues/86

本硬件Demo的基于NONOS的V2.1.0版本下载 ,另外基于V2.2.0版本的我也已经弄好,已放置在我的GitHub(下载运行前务必在mqtt_config.h 文件填写您的服务器地址):
http://download.csdn.net/download/xh870189248/10204189

已经适配Android7.0系统的乐鑫8266官方配网签名中文版:
http://download.csdn.net/download/xh870189248/10141647

8266汇总篇,欢迎star:https://github.com/xuhongv/StudyInEsp8266

猜你喜欢

转载自blog.csdn.net/xh870189248/article/details/79052347