DIY個人智慧家庭閘道器——硬體篇之WIFI燈帶DIY
阿新 • • 發佈:2019-02-16
需要如下配件
1、ESP8266模組
2、燈帶
3、MOS管驅動板,用於驅動點亮燈帶
4、12V電源
5、其他線材、外殼等配件
最後組裝完成
ESP8266部分程式碼如下,除了實現亮和滅的基本控制外,還可以調節燈光亮度,設定漸亮、漸暗、呼吸燈或者閃爍等模式
LOCAL void ICACHE_FLASH_ATTR run_mode(void) { //os_printf("run mode !!!\n"); static uint8 flag = 0; int time = 10+g_speed*5; //disarm timer first os_timer_disarm(&test_timer); switch(g_mode){ case NORMAL_MODE: { break; } case STEP_LIGHT_MODE: { g_duty += 1; if(g_duty > g_max_duty) { g_duty = g_max_duty; g_mode = NORMAL_MODE; } break; } case STEP_DARK_MODE: { g_duty -= 1; if(g_duty <= g_min_duty) { g_duty = g_min_duty; g_mode = NORMAL_MODE; } break; } case STEP_LIGHT_DARK_REPEAT_MODE: { if(flag == 0) { g_duty += 1; if(g_duty >= g_max_duty) { flag = 1; time = 1000; } } else { g_duty -= 1; if(g_duty <= g_min_duty) { g_duty = g_min_duty; flag = 0; time = 500; } } break; } case FLASH_MODE: { if(flag == 0) { g_duty = 0; flag = 1; } else { g_duty = g_max_duty; flag = 0; } break; } default: { g_mode = NORMAL_MODE; break; } } //os_printf("mode:%d g_duty:%d\n", g_mode, g_duty); set_pwm_duty(g_duty); if(g_mode != NORMAL_MODE) { //re-arm timer os_timer_setfn(&test_timer, (os_timer_func_t *)run_mode, NULL); os_timer_arm(&test_timer, time, 0); } } LOCAL void ICACHE_FLASH_ATTR user_udp_recv_cb(void *arg, char *pusrdata, unsigned short length) { char hwaddr[6]; char mac[40] = {0}; char buff[128]; int index = 0; char result[10] = "succeed"; char params_buff[64]; char params_list[10][16] = {0}; int params_count = 0; //uint32 duty = 0; wifi_get_macaddr(STATION_IF, hwaddr); os_sprintf(mac, MACSTR , MAC2STR(hwaddr)); //os_printf("mac:%s\n",mac); os_printf("recv udp data: %s\n", pusrdata); if(get_string(pusrdata,"id", buff)!=0) { return; } //os_printf("id:%s\n", buff); if(os_strncmp(buff, mac,os_strlen(mac)) != 0) { os_printf("%s is not my id %s\n", buff,mac); return; } if(get_string(pusrdata,"cmd", buff)!=0) { return; } if(get_array(pusrdata,"params", params_buff)==0) { os_printf("params:%s\n", params_buff); params_count = parse_params_buff(params_buff, params_list); } if(os_strncmp(buff, "get_state") == 0) { os_printf("get_state\n"); os_sprintf(buff,get_state_json,mac,result,led_on?"on":"off"); } else if(os_strncmp(buff, "set_state") == 0) { os_printf("set_state\n"); if(os_strncmp("on", params_list[0],2) == 0) { set_pwm_duty(g_duty); os_sprintf(buff,set_state_json,mac,result,"on"); os_printf("on\n"); } else if(os_strncmp("off", params_list[0],3) == 0) { set_pwm_duty(0); os_sprintf(buff,set_state_json,mac,result,"off"); os_printf("off\n"); } g_mode = NORMAL_MODE; os_timer_disarm(&test_timer); } else if(os_strncmp(buff, "set_duty") == 0) { os_printf("set_duty\n"); g_duty = atoi(params_list[0]); set_pwm_duty(g_duty); os_sprintf(buff,set_duty_json,mac,result, g_duty); g_mode = NORMAL_MODE; os_timer_disarm(&test_timer); } else if(os_strncmp(buff, "get_duty") == 0) { os_printf("get_duty\n"); os_sprintf(buff,get_duty_json,mac,result,g_duty); } else if(os_strncmp(buff, "set_max_duty") == 0) { os_printf("set_max_duty\n"); g_max_duty = atoi(params_list[0]); os_sprintf(buff,set_max_duty_json,mac,result,g_max_duty); } else if(os_strncmp(buff, "set_mode") == 0) { os_printf("set_mode\n"); uint8 mode, speed; mode = atoi(params_list[0]); if(mode == NORMAL_MODE) { // stop timer os_timer_disarm(&test_timer); } else { speed = atoi(params_list[1]); if( mode != g_mode || speed != g_speed) { g_speed = speed; switch(mode) { case STEP_LIGHT_MODE: { g_max_duty = speed = atoi(params_list[2]); break; } case STEP_DARK_MODE: { g_min_duty = speed = atoi(params_list[2]); break; } case STEP_LIGHT_DARK_REPEAT_MODE: { g_max_duty = speed = atoi(params_list[2]); g_min_duty = speed = atoi(params_list[3]); break; } default: break; } os_timer_disarm(&test_timer); os_timer_setfn(&test_timer, (os_timer_func_t *)run_mode, NULL); os_timer_arm(&test_timer, 10+g_speed*5, 0); } } g_mode = mode; os_sprintf(buff,set_mode_json,mac,result,g_mode); } os_printf("send udp data:%s\n", buff); espconn_sent(&user_udp_espconn, buff, os_strlen(buff)); }