STM32F4 WiFi上传温度【ds18b20传感器、网络通信】

news2024/11/16 15:51:54

通过WIFI或GPRS上传温度到云端

本篇博客将介绍如何使用WIFI或GPRS模块将温度数据上传到云端。我们将涵盖连接网络的过程、上传数据的过程以及相关代码。

准备工作

在开始之前,我们需要准备以下材料:

  • STM32F4开发板
  • 温度传感器(例如18B20)
  • WIFI模块或GPRS模块
  • 连接线

接下来,按照以下步骤进行准备:

  1. 温度传感器连接到STM32F4开发板,确保传感器正常工作并能够读取温度数据。
  2. 将WIFI模块或GPRS模块连接到STM32F4开发板,并进行相应的配置。

完成上述准备后,我们可以开始编写代码。

实现过程

根据原理图,我们需要进行一下设置
在这里插入图片描述

  • 配置串口1
  • 配置AHB2
  • DMA2
  • APB2

1.串口初始化

首先,我们需要初始化串口以便与ESP8266进行通信。
在STM32F4上,我们可以使用UART来与ESP8266进行串口通信。以下是一个示例代码片段,用于初始化串口:

修改文件:usart.c


void USART1_Config(void)
{  

	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //串口1时钟使能
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);	// GPIOB时钟
	

GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1); //PB10复用为USART1
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1); //PA11复用为USART1
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PA2-TX
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
   
    //USART3_RX	  PB11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB11
	
	


	USART_InitStructure.USART_BaudRate = 115200;//波特率一般设置为9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	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); //初始化串口	1
  

	USART_Cmd(USART1, ENABLE);                    //使能串口 
	
	//使能接收中断
    
	
	//设置中断优先级
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断 
	TIM2_Init(1000-1,7200-1);			//中断
	USART1_RX_STA=0;		//清零
	TIM_Cmd(TIM2,ENABLE);			//关闭定时器2

}

2. 网络配置

  • 连接服务器
  • 配置网络

在连接WIFI之前,我们需要配置ESP8266的网络参数。以下是一个示例代码片段,用于配置ESP8266的网络参数:

#include "esp8266.h"
#include "string.h"
#include "usart.h"
#include "stm32f4xx.h"
#include "sys1.h" 
#include "delay.h"
#include "stdlib.h"


char flag = 0;
void esp8266_Init(){
	cs_init();
	esp8266_quit_trans();
	esp8266_start_trans();							//esp8266进行初始化
	wifigotcompleteflag=1;
}

//ESP8266模块和PC进入透传模式
void esp8266_start_trans(void)
{
	u8 *str;
	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
	while(esp8266_send_cmd("AT+CWMODE=1","OK",50))
	{
		printf("AT+CWMODE_ERR\r\n");
	}
	printf("AT+CWMODE_OK\r\n");
	//让Wifi模块重启的命令
	while(esp8266_send_cmd("AT+RST","ready",50));
	{
		printf("AT+RST_ERR\r\n");
	}
	printf("AT+RST_OK\r\n");
	delay_ms(1000);         //延时3S等待重启成功
	delay_ms(1000);
	printf("delay_OK\r\n");

	while(esp8266_send_cmd("AT+CWJAP=\"wifi名称\",\"WiFi密码\"","WIFI GOT IP",200))
	{
		printf("WIFI GOT IP_ERR\r\n");
	}
	
	//=0:单路连接模式     =1:多路连接模式
	while(esp8266_send_cmd("AT+CIPMUX=0","OK",30))
	{
		printf("AT+CIPMUX_ERR\r\n");
	}
	
	//建立TCP连接  这四项分别代表了 要连接的ID号0~4   连接类型  远程服务器IP地址   远程服务器端口号
	while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"远程服务器ip\",远程服务器端口号","CONNECT",200))
	{
		printf("AT+CIPSTART_ERR\r\n");
	}
	
	//是否开启透传模式  0:表示关闭 1:表示开启透传
	while(esp8266_send_cmd("AT+CIPMODE=1","OK",200))
	{
		printf("AT+CIPMODE_ERR\r\n");
	}
	
	//透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
	
	while(esp8266_send_cmd("AT+CIPSEND","OK",50))
	{
		printf("AT+CIPSEND_ERR\r\n");
	}
printf("连接服务器完成\r\n");
}


u8 esp8266_quit_trans(void)
{
	u8 result=1;
	u1_printf("+++");
	delay_ms(1000);					//等待500ms太少 要1000ms才可以退出
	result=esp8266_send_cmd("AT","OK",200);//退出透传判断.
	if(result)
		printf("quit_trans failed!");
	else
		printf("quit_trans success!");
	return result;
}


//向ESP8266发送命令
//cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果);1,发送失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART1_RX_STA=0;
	u1_printf("%s\r\n",cmd);	//发送命令
	if(ack&&waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			delay_ms(20);
			if(USART1_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(esp8266_check_cmd(ack))
				{
					
					printf("ack:%s\r\n",(u8*)ack);
					break;//得到有效数据 
				}
					USART1_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
} 


//ESP8266发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果;其他,期待应答结果的位置(str的位置)
u8* esp8266_check_cmd(u8 *str)
{
	char st[20];
	char *strx=0;
	if(USART1_RX_STA&0X8000)		//接收到一次数据了
	{ 
		USART1_RX_BUF[USART1_RX_STA&0X7FFF]=0;//添加结束符
		strx=strstr((const char*)USART1_RX_BUF,(const char*)str);
	
	} 
	
	return (u8*)strx;
}

//向ESP8266发送数据
//cmd:发送的命令字符串;waittime:等待时间(单位:10ms)
//返回值:发送数据后,服务器的返回验证码
u8* esp8266_send_data(u8 *cmd,u16 waittime)
{
	char temp[5];
	char *ack=temp;
	USART1_RX_STA=0;
	u1_printf("%s",cmd);	//发送命令
	if(waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			delay_ms(10);
			if(USART1_RX_STA&0X8000)//接收到期待的应答结果
			{
				USART1_RX_BUF[USART1_RX_STA&0X7FFF]=0;//添加结束符
				ack=(char*)USART1_RX_BUF;
				//printf("ack:%s\r\n",(u8*)ack);
				USART1_RX_STA=0;
				break;//得到有效数据 
			} 
		}
	}
	
	return (u8*)ack;
} 
extern u8 wifigotcompleteflag;

char stehttpbehind[500]=" HTTP/1.1\r\n\
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n\
Accept-Encoding: gzip, deflate\r\n\
Accept-Language: zh-CN,zh;q=0.9\r\n\
Connection: keep-alive\r\n\
Host: 192.168.0.109:8001\r\n\
Upgrade-Insecure-Requests: 1\r\n\
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36\r\n\r\n";

void esp8266_http_send(char *sb){
	char stehttp[600]="GET /";
	strcat((char*)stehttp,sb);
	strcat((char*)stehttp,stehttpbehind);
	u1_printf("%s",stehttp);
	

}
int fflag;
void Wifi_data(char *Wifi_data){
	char sp[20];
	char* Point=NULL;
	if(strstr((const char *)Wifi_data, (const char *)"ctrl=")!=NULL)//接收到设置阈值命令
	{
		Point = strstr((const char *)Wifi_data, (const char *)"ctrl=")+5;
		memcpy(sp, Point, 3);
		fflag=atoi(sp);	
		
	}
	
}
void cs_init(void){
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
 	  sys_gpio_set(GPIOE, SYS_GPIO_PIN7,
                 SYS_GPIO_MODE_OUT, SYS_GPIO_OTYPE_OD, SYS_GPIO_SPEED_MID, SYS_GPIO_PUPD_PU);
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	/* 数据端口输出 */
	
	GPIO_Init(GPIOE, &GPIO_InitStructure);

	GPIO_SetBits(GPIOE, GPIO_Pin_7 );
}

3. 温度上传

温度上传的过程涉及到从温度传感器读取温度值,并将其发送到云端。

在你的已完成的温度获取模块中,可能有相应的函数来读取温度值。以下是一个示例代码片段,用于上传温度值到云端:

	while (1)
	{
	    temperature = ds18b20_get_temperature();
		TEMP_SEND=(float)temperature/10;
		printf("temp:%f",TEMP_SEND);
		
		sprintf(send_string,"temp:%f",TEMP_SEND);
		printf("°´¼ü£º%d",KEYD6);
		u1_printf(send_string);
	}

4.打开网络助手

打开网络调试助手(NetAssist软件)设置为TCP Server

数据将会被上传到这里

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ch0_汇编介绍

1. 汇编作用 1.1 1.2 1.3 2.  机器语言到汇编语言 2.1 2.2 2.3 3.  计算机的组成 3.1 指令和数据是存放在存储器中的, 而计算机包含多种存储器; 但是,在计算机工作的过程中, 指令和数据则必须存放到内存中。 而对于…

代码随想录二刷day41 | 动态规划之 343. 整数拆分 96.不同的二叉搜索树

day41 343. 整数拆分确定dp数组(dp table)以及下标的含义确定递推公式dp的初始化确定遍历顺序举例推导dp数组 96.不同的二叉搜索树确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 34…

【每日一题Day254】LC445两数相加Ⅱ | 链表反转 栈

两数相加Ⅱ【LC445】 给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 可以假设除了数字 0 之外,这两个数字都不会以零开头。 原来是专题模拟 反转链表 2022/11/4 思…

MySQL 记一个调优记录:最大化获取 uid 和 mobile

目录 前言调优过程总结 前言 环境:MySQL 5.6、windows 11 前阵子,有一个 BI 看板跑不起来,每次执行跑了很久,还不一定有结果,急需维护迭代。 经过调试,发现看板的SQL 逻辑中有一个开销非常大的逻辑影响了整…

2 Prometheus 简介

目录 1. 起源 2. Prometheus 架构 2.1 指标收集 2.2 服务发现 2.3 聚合和警报 2.4 查询数据 2.5 服务自治 2.6 冗余和高可用性 2.7 可视化 3. Prometheus数据模型 3.1 指标名称 3.2 标签 3.3 采样数据 3.4 符号表示 3.5 保留时间 4. 安全模型 5. Prometheus生态…

AI会取代程序员吗?这几个事实告诉你真相

人工智能(AI)的迅猛发展引起了许多关于其对各行各业的影响的讨论,其中包括程序员的未来。有人认为,AI的出现可能会使程序员岗位面临消失的风险,因为它们可以自动化编码和解决问题的过程。然而,在我们下结论…

MySQL:UNION的使用

UNION的使用 前言一、合并查询结果二、语法格式:三、UNION操作符四、UNION ALL操作符五、使用 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主! 也许一个人独行,可以走的很快…

全志V3S嵌入式驱动开发(full image制作和资料汇总)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所谓的full image制作,就是制作一个image,上面包含了所有的嵌入式软件、库和配置文件。之前虽然我们也构建了spi-nor、spi-…

AC/DC(二): 整流

一、全波整流电路 全波整流电路可以看作是由两个半波整流电路组合而成,如图1所示, 图1 变压器次级线圈中间引出一个中心抽头,把次级线圈分成两个对称的绕组,从而引出大小相等但极性相反的两个电压VD1、VD2,构成VD1、…

14 MFC多进程

文章目录 创建进程win32子进程内容创建进程传递参数关闭进程通过配置文件读取全部代码 打开进程便利进程 创建进程 分别创建MFC应用程序和Win32应用程序 MFC应用程序界面设置 win32子进程内容 #include <Windows.h> int WINAPI wWinMain(HINSTANCE hInstance, HINSTAN…

分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群。这个分布式服务集群是基于DynamicProxy、WCF和OSGi.NET插件框架实现的。我将从设计思路、目标和实现三方面来描述。 1 设计思路 首先&#xff0c;我来说明一下设计思路。我们先来看看目前OSGi.NET插件…

C++中生成二维码-libqrencode

文章目录 前言libqrencode在qt中调用libqrencode其他 前言 二维码的种类很多。本文仅介绍&#xff0c;如何用C生成QR码(QRcode)。通常而言&#xff0c;我们不需要知道QR码的详细结构&#xff0c;如QrCode的结构原理与实战 | 张展鹏的博客。我们只需要&#xff0c;可以将文本转…

Python——— 字符串

&#xff08;一&#xff09;字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号 ( 或 " ) 来创建字符串。顾名思义&#xff0c;羊肉串是由羊肉做成的串&#xff0c;而字符串就是由字符组成的。 字符串的本质是&#xff1a;字符序列。 2 Python 不支持单字符…

Kafka 小结

Kafka 是由 Linkedin 开发并开源的分布式消息系统&#xff0c;因其分布式及高吞吐率而被广泛使用&#xff0c;现已与 Cloudera Hadoop、Apache Storm、Apache Spark、Flink 集成。 Kafka 使用场景 页面访问量 PV、页面曝光 Expose、页面点击 Click 等行为事件&#xff1b;实时计…

低分辨率图像中目标检测(附论文下载)

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2201.02314.pdf 计算机视觉研究院专栏 作者&#xff1a;Edison_G 超分辨率&#xff08;SR&#xff09;等…

【Openvino03】深入了解OpenVINO™ 工具包与Jupyter Notebooks工程

接上一篇&#xff0c;本篇将以OpenVINO™ 工具包、Jupyter Notebook工具以及OpenVINO™ Notebooks工程为基础&#xff0c;依照构建环境、工具学习、案例学习、实战部署的顺序引导初学者完成从0到1学习人工智能的全过程&#xff0c;希望众多对人工智能感兴趣的开发者&#xff0c…

【多维BFS】ABC308 D

VP的时候居然花了半小时&#xff01; 可恶&#xff01; D - Snuke Maze (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 首先&#xff0c;我们发现到达一个格子之后&#xff0c;下一个格子的字符是确定的 但是&#xff0c;下一个格子到底是哪个是不确定的 下一个格子不…

FreeRTOS源码解析——第一章 整体架构

FreeRTOS源码解析 第一章 FreeRTOS 整体架构 第二章 FreeRTOS 编程规范 第三章 FreeRTOS 内存管理 第四章 FreeRTOS 任务管理 第五章 FreeRTOS 消息队列 第六章 FreeRTOS 软件定时器 第七章 FreeRTOS 信号量 第八章 FreeRTOS 互斥量 第九章 FreeRTOS 任务通知 第十章 FreeRTOS…

算法习题之宏观分层问题

宏观分层 习题1 给定一个正方形矩阵matrix&#xff0c;原地调整成顺时针90度转动的样子习题2 给定一个长方形矩阵matrix&#xff0c;实现转圈打印习题3 给定一个正方形或者长方形矩阵matrix&#xff0c;实现zigzag打印习题4 输入N,在控制台上输出初始边长为N的图案 习题1 给定一…

U盘数据丢失是什么原因?轻松让U盘数据恢复的教程

在数字化时代&#xff0c;我们不可避免地使用各种便携式存储设备&#xff0c;如U盘&#xff0c;来传输和存储重要数据。然而&#xff0c;有时我们可能不小心删除了U盘中的文件&#xff0c;或者格式化了U盘等等而导致数据丢失。这种情况下&#xff0c;你可能会困惑地想知道&…