1. 程式人生 > >DIY個人智慧家庭閘道器——硬體篇之WIFI燈帶DIY

DIY個人智慧家庭閘道器——硬體篇之WIFI燈帶DIY

需要如下配件

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));
}