一、前言
在物聯網中,有很多場景下都需要用到這種功能,我之所以做這個功能主要是因爲公司正在做一個智能燈項目,而燈最常見的配網方式就是開關電源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燈的驅動廠商,項目沒得進行下去。