百问网七天物联网课程学习笔记——智能台灯程序框架

百问网七天物联网课程学习笔记——智能台灯程序框架,第1张

通过百问网的七天物联网智能家居实战训练的课程,我完成了基于UDP的智能台灯项目的实现。本文来讲述一下程序的整体框架。
1.首先要配置好ESP8266,根据乐鑫官方提供的使用手册对8266进行初始化,连接网络。对GPIO、UART进行初始化,并打开中断。
ESP8266_SendCommand(“AT+RST”, “OK”, 500);
HAL_Delay(800);
ESP8266_SendCommand(“AT+CWMODE=1”, “OK”, 500);
ESP8266_SendCommand((char *)wifi_data, “OK”, 5000); ESP8266_SendCommand(“AT+CIPSTART=“UDP”,“192.168.50.230”,9999,9999,2”, “OK”, 500);
ESP8266_GetIP();
2.编写循环里的程序,检测按键flag,以及接受UDP数据。
if (Key_GetFlag())
{
ESP8266_Send_UDP(“{“data”:“doorbell”,“status”:“1”}”);
}
//收到UDP数据
if (USART2_Receive(rx_data))
{
//printf(“%s\r\n”, rx_data);
if (strstr((char *)rx_data, "“dev”:“led”,“status”:“0"”))
{
printf(“led off\r\n”);
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\r\n”);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
USART2_ClearBuf();
memset(rx_data, 0, 200);
}
3.编写中断程序:包括外部中断和串口中断
外部中断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == KEY_Pin)
{
key_flag = 1;
}
}
串口中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef huart)
{
usart_rx_buf[rx_len%200]= rx_data;
rx_len++;
HAL_UART_Receive_IT(&huart2, (uint8_t
)&rx_data, 1);
}
4.编写发送数据函数

//向ESP8266发送数据
uint8_t ESP8266_SendCommand(char *cmd, char *reply, uint16_t timeout)
{
//1.保存传入的指令
char buf[256] = {0};
strcat(buf, cmd); //strcpy
//2.处理AT指令(添加换行)
if (strstr(buf, “\r\n”) == 0)
{
strcat(buf, “\r\n”);
}
//3.清理前面接收的buf
USART2_ClearBuf();
//4.发送数据
USART2_Transmit((uint8_t *)buf, strlen(buf), 500);
//5.接收数据
memset(buf, 0, 256); //buf清空
while(timeout != 0) //超时控制
{
if (USART2_Receive((uint8_t *)buf)) //接收数据
{
//检查结果
if (strstr(buf, reply))
{
printf(“%s Send ok!\r\n”, cmd);//发送成功
return 0;
}
else
{
timeout–;
HAL_Delay(1);
}
}
}
printf(“%s Send error!\r\n”, cmd);//发送失败
return 1;
}
//ESP8266发送UDP数据
uint8_t ESP8266_Send_UDP(char *data)
{
//1.准备发送的指令 AT+CIPSEND=len
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, “SEND OK”, 1000); //发送数据
return 0;
}
return 1;
}
程序框架如上所述。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/872424.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存