基于STM32f103c8t6与ESP8266的天气时钟

先看结果图,如图所示:

1、硬件准备:如图所示,一个STM32最小系统板,一个esp8266wifi模块,一个oled显示屏以及一个USB转TTL模块即可。

2.注册一个心知天气的账号,心知天气网址https://www.seniverse.com/

申请一个免费的版本以及保存好自己的私钥,如下:

 然后点击产品→天气数据→查看API文档→天气实况→点击API接口文档的天气实况即可看到自己的接口地址,如下:

3. 下载一个XCOM调试助手,用USB转TTL与ESP8266连接到电脑上进行串口AT指令测试(只需要接RX、TX、GND、VCC即可),按照下图进行AT指令测试;

结果如图所示: 4.主循环代码:

	while (1)
	{	 
			if(sec >= 60)
			{
				sec = 0;
				min ++;
			}
			if(min >= 60)
			{
				min = 0;
				hour ++;
			}
			if(hour >= 24)
			{
				hour = 0;
			}
			OLED_ShowNum(0,0,hour,2,16);							//显示小时
			OLED_ShowString(16, 0, ":", 16);
			OLED_ShowNum(24,0,min,2,16);							//显示分钟 
			OLED_ShowString(40, 0, ":", 16);
			OLED_ShowNum(48,0,sec,2,16);							//显示秒 
		
			OLED_ShowCHinese(0, 3, 5);						//天
			OLED_ShowCHinese(18, 3, 6); 					//气
			OLED_ShowString(40, 3, ":", 16);
			OLED_ShowString(60, 3, results[0].now.text, 16);

			OLED_ShowCHinese(0, 6, 9);	 					//温
			OLED_ShowCHinese(18, 6, 10); 					//度
			OLED_ShowString(40, 6, ":", 16);
			OLED_ShowString(60, 6, results[0].now.temperature, 16);
			OLED_ShowCHinese(80, 6, 11); 					//摄氏度

			KeyNum = Key_GetNum();	
			if (KeyNum == 1)
			{
				get_beijing_time();	//获取时间		
				hour = nwt.hour;
				min = nwt.min;
				sec = nwt.sec;
			}		
			else if (KeyNum == 2)
			{
				get_current_weather();//获取天气、温度
			}	
	}

 在此天气时钟的基础上可添加各种外设,让它变成一个完整的项目,例如智能窗户等智能家居的开发,如需完整源码,创作不易,如需完整源码可三连私聊。

调试助手下载链接:http://链接:https://pan.baidu.com/s/1Z13Uf3J-6OctuxALIF9bKA?pwd=y0ha 提取码:y0ha

以下是基于STM32F103C8T6控制ESP8266进行TCP socket通信的示例代码: ```c #include "stm32f10x.h" #include "stdio.h" #include "string.h" // ESP8266串口波特率 #define ESP8266_BAUDRATE 115200 // ESP8266 TCP服务器IP和端口 #define SERVER_IP "192.168.1.100" #define SERVER_PORT 8000 USART_InitTypeDef USART_InitStructure; void USART1_Config(void); void USART1_SendString(char* str); void ESP8266_SendCommand(char* cmd); void ESP8266_WaitResponse(char* response); void ESP8266_ConnectServer(void); int main() { // 初始化USART1串口 USART1_Config(); // 延时等待ESP8266模块启动 for(int i=0; i<1000000; i++); // 连接WiFi网络 ESP8266_SendCommand("AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n"); ESP8266_WaitResponse("OK"); // 连接TCP服务器 ESP8266_ConnectServer(); while(1) { // 向TCP服务器发送数据 USART1_SendString("Hello, world!\r\n"); // 每隔1秒发送一次数据 for(int i=0; i<1000000; i++); } } // 配置串口1 void USART1_Config(void) { // 使能串口1和GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置PA9作为USART1_TX引脚 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置PA10作为USART1_RX引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1参数 USART_InitStructure.USART_BaudRate = ESP8266_BAUDRATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); // 使能USART1 USART_Cmd(USART1, ENABLE); } // 向USART1发送字符串 void USART1_SendString(char* str) { while(*str) { // 等待数据寄存器为空 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 发送一个字符 USART_SendData(USART1, *str++); // 等待数据发送完毕 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } } // 向ESP8266发送AT指令 void ESP8266_SendCommand(char* cmd) { USART1_SendString(cmd); } // 等待ESP8266响应 void ESP8266_WaitResponse(char* response) { char buffer[100]; int index = 0; int len = strlen(response); while(1) { // 等待接收到一个字符 while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); // 读取一个字符 char c = USART_ReceiveData(USART1); // 将字符添加到缓冲区 buffer[index++] = c; // 如果缓冲区已经包含了响应字符串,则退出循环 if(strncmp(buffer+index-len, response, len) == 0) { break; } // 如果缓冲区已满,则清空缓冲区并重新开始读取 if(index == 99) { index = 0; } } } // 连接TCP服务器 void ESP8266_ConnectServer(void) { // 设置为透传模式 ESP8266_SendCommand("AT+CIPMODE=1\r\n"); ESP8266_WaitResponse("OK"); // 连接TCP服务器 char cmd[100]; sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", SERVER_IP, SERVER_PORT); ESP8266_SendCommand(cmd); ESP8266_WaitResponse("CONNECT"); } ``` 在代码中,需要将`SSID`和`PASSWORD`替换为本地WiFi网络的名称和密码,将`SERVER_IP`和`SERVER_PORT`替换为TCP服务器的IP地址和端口号。在主循环中,通过调用`USART1_SendString`函数向TCP服务器发送数据,然后等待1秒钟,然后再次发送数据。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值