本文是百问网七天物联网智能家居训练营学习笔记,官网链接。
1 增加UDP发送函数
再来回顾下UDP发送的流程:
对于AT指令来说,只是使用的具体指令不同而已。和TCP发送函数非常类似,代码如下:
uint8_t ESP8266_Send_UDP(char *data)
{
char buf[256] = {0};
uint8_t len = strlen(data);
sprintf(buf, "AT+CIPSEND=%d\r\n", len);
if (ESP8266_SendCommand(buf, "OK", 500) == 0)
{
ESP8266_SendCommand(data, "OK", 1000);
return 0;
}
return 1;
}
可以看到代码还是非常简单的。
2 增加手工输入wifi账号和密码的功能
我们可以通过在开机时检测用户按键,如果用户在开机的2秒内按下按键,我们就允许用户通过串口输入wifi名称和wifi密码,然后使用输入的wifi名称和密码进行相关处理,具体的代码如下:
void Key_Update_WIFI(char *cmd, uint16_t time)
{
char ch = 0;
char len = 0;
char ssid_buf[20] = "100ask";
char pwd_buf[20] = "100ask100ask";
char wifi_buf[100] = "AT+CWJAP_DEF=\"";
HAL_Delay(time);
if (Key_GetFlag() == 1)
{
memset(ssid_buf, 0, 20);
printf("Please enter SSID:");
while(ch != '\r')
{
ch = getchar();
if(ch > ' ')
{
printf("%c",ch);
ssid_buf[len] = ch;
len++;
}
}
ch = 0;
len = 0;
memset(pwd_buf, 0, 20);
printf("\r\nPlease enter Password:");
while(ch != '\r')
{
ch = getchar();
if(ch > ' ')
{
printf("%c",ch);
pwd_buf[len] = ch;
len++;
}
}
}
strcat(wifi_buf, ssid_buf);
strcat(wifi_buf, "\",\"");
strcat(wifi_buf, pwd_buf);
strcat(wifi_buf, "\"");
memcpy(cmd, wifi_buf, strlen(wifi_buf));
}
最后,main函数如下:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
MX_NVIC_Init();
uint8_t wifi_data[200] = {0};
uint8_t rx_data[200] = {0};
Key_Update_WIFI((char *)wifi_data, 2000);
USART2_StartRx();
ESP8266_SendCommand("AT+RST", "OK", 500);
HAL_Delay(1000);
ESP8266_SendCommand("AT+CWMODE=1", "OK", 500);
ESP8266_SendCommand((char *)wifi_data, "OK", 5000);
ESP8266_SendCommand("AT+CIPSTART=\"UDP\",\"192.168.1.1\",9999,9999,2", "OK", 500);
ESP8266_SendCommand("AT+CIFSR", "OK", 500);
while (1)
{
if (Key_GetFlag() == 1)
{
ESP8266_Send_UDP("{\"data\":\"doorbell\",\"status\":\"1\"}");
}
if (USART2_Receive(rx_data))
{
if (strstr((char *)rx_data, "\"dev\":\"led\",\"status\":\"0\""))
{
printf("led off\n\r");
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
USART2_ClearBuf();
memset(rx_data, 0, 200);
}
else if (strstr((char *)rx_data, "\"dev\":\"led\",\"status\":\"1\""))
{
printf("led on\n\r");
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
USART2_ClearBuf();
memset(rx_data, 0, 200);
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)