alios things開關5次配網

一、前言

        在物聯網中,有很多場景下都需要用到這種功能,我之所以做這個功能主要是因爲公司正在做一個智能燈項目,而燈最常見的配網方式就是開關電源5次,常見的流程是 “ 開關5次,指示燈閃爍,清除原有熱點信息,進入配網狀態”。

二、代碼

       定時器

       定時器主要有2個任務,第一,當按鍵開關按下後,在一定時間內(3s或5s)如果沒有再次按下,表示不是連按系統正常運行,第二,當連續開關5次後,啓用定時器來控制指示燈閃爍。

void timer_handler(void *arg)        //定時器中斷函數
{
    timescaler++; 
    printf("timescaler = %d\r\n",timescaler);
    if(bringflag == 2)               //value等於3,黃燈閃,進入配網
    {
        led_white_off();
        if(timescaler >= 60){        //60s內不配網,則取消配網
            entertimerflag = 1;
            bringflag = 0;
        }
        if(timescaler%2 == 0){       //燈閃爍
            led_yellow_off();   
        }
        else{
            led_yellow_on();
        }
        
    }
    if(entertimerflag == 1)
    {
        if(timescaler >= 3)          //3s內沒有按下,正常運行
        {
            timescaler = 0;
            entertimerflag = 0;
            hal_timer_stop(&timer1); //停止定時器
            value = 0;               //計數次數歸零
            aos_kv_del("key");
            printf(">>>dingshi aos_kv_set:%d\r\n", aos_kv_set(key, &value, strlen(value), 1));//寫入次數

        }
    }
}
void timer1_init(void) //定時器初始化
{
    int ret=-1;
    timer1.port = 1;//定時器1
    timer1.config.period = 1000000; /* 1s */
    timer1.config.reload_mode = TIMER_RELOAD_AUTO;//自動重裝載
    timer1.config.cb = timer_handler;//定時器中斷函數名

    hal_timer_init(&timer1);
    if (ret == 0) {
        printf("timer1 init successful !\n");
    }

    /* start timer1 */
    ret = hal_timer_start(&timer1);  //啓動定時器
    if (ret == 0) {
        printf("timer1 start successful !\n");
    }
    timescaler = 0;//定時計數
}

讀取flash次數以及次數寫入

int read_and_write_switchs_to_flash(void)
{ 
    int ret = 0;
    ret = aos_kv_get(key, &value, strlen(value));//讀次數
    if (ret != 0)//讀取失敗,出廠第一次開機,裏面沒開始存值
    {
        value=1;
        aos_kv_del(key);
        printf(">>>shibai aos_kv_set:%d\r\n", aos_kv_set(key, &value, strlen(value), 1));
    }
    else  //讀取成功,次數加1
    {
        value++;
        aos_kv_del(key);
        printf(">>>chenggong aos_kv_set:%d\r\n", aos_kv_set(key, &value, strlen(value), 1));
        if(value>3)//進入配網,系統會重啓,爲保證重啓後系統仍然進入配網狀態,保存上一次重啓前的value值
        {
            printf(">>>chongqiflag aos_kv_set:%d\r\n",aos_kv_get("chongqiflag", &chongqiflag, strlen(chongqiflag)));//讀次數
            if(chongqiflag == 1) //配網後,清除熱點信息後,再次配網準備
            {
                value = 3;
                chongqiflag =0;
                aos_kv_del(key);
                printf(">>>dayu5 aos_kv_set:%d\r\n", aos_kv_set(key, &value, strlen(value), 1));
                printf(">>>write flag =: %d\r\n", aos_kv_set("chongqiflag", &chongqiflag, strlen(chongqiflag), 1)); 
            }else{
                value=1;
                aos_kv_del(key);
                printf(">>>dayu5 aos_kv_set:%d\r\n", aos_kv_set(key, &value, strlen(value), 1));
            }
        }
    } 
    printf("value = %d\r\n",value); 
    return value;
}

主程序需要調用的接口

void timer1init_and_Distribution_network(void)
{
    int ret=0;
    if(flag == 1)//每次開機只運行一次
    {
        timer1_init();
        ret = read_and_write_switchs_to_flash();//讀取flash中次數
        Normal_operation_light_mode(ret);
        if(ret>=3)//次數大於進入配網
        {
            printf(">>>read flag =: %d\r\n", aos_kv_get("connflag", &connflag, strlen(connflag)));
            printf("enter reset  connflag = %d\r\n",connflag);
            do_awss_active();
            do_awss_active();
            if(connflag == 1)//如果第一次連不用清除熱點信息,之後再次連接清除之前熱點信息
            {
                do_awss_reset();//清除全部緩存,相當於第一次開機
                chongqiflag =1;
                connflag =0;
                printf(">>>write flag =: %d\r\n", aos_kv_set("connflag", &connflag, strlen(connflag), 1));  
                printf(">>>write flag =: %d\r\n", aos_kv_set("chongqiflag", &chongqiflag, strlen(chongqiflag), 1));   
            }
        }
        flag = 0;
    }
}

三、總結

   對了,此次項目中使用alios things中的kv組件,關於kv組件的使用,大家不會的可以看看。再此次項目中其實比較有價值的功能暫時就是這個了,其實整個項目中總共遇到兩個難點,當時我們使用的是慶科EMW3080模塊,這個模塊當時阿里的在alios things2.1.0上沒有PWM的驅動,不過最後還是解決了,最終實現了開關5次配網、調冷暖色光、調燈光明亮度等,最後還是有些遺憾,公司沒有找到wifi燈的驅動廠商,項目沒得進行下去。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章