STM32获取北斗gps双模传感器数据+oled显示

GPS模块介绍

GPS模块是基于ATGM336H-5N的高性能BDS/GNSS定位导航模块。模块支持多种卫星导航系统,包括中国的北斗二号和北斗三号全部卫星,美国的GPS,俄罗斯的GLONASS,日本的QZSS,可以同时接收以上卫星导航系统的卫星信号,并且实现联合定位、导航与授时,模块具有高灵敏度、低功耗、低成本等优势,适用于车载导航、手持定位、可穿戴设备。

效果展示

使用注意事项

要将天线放在室外使用,模块上电后大概半分钟就会输出信息

实物图

接线方式

STM32                    GPS
VCC        ------>    VCC
GND        ------>    GND
PA10  <------    TXD

STM32             0.96oled

VCC        ------>    VCC
GND        ------>    GND

PB9          ------>    SDA
PB8          ------>    SCL

主要代码

接受并解析gps的信息

void errorLog(int num)
{
	
	while (1)
	{
	  	printf("ERROR%d\r\n",num);
	}
}

void parseGpsBuffer()
{
	char *subString;
	char *subStringNext;
	char i = 0;
	if (Save_Data.isGetData)
	{
		Save_Data.isGetData = false;
		printf("**************\r\n");
		printf(Save_Data.GPS_Buffer);

		
		for (i = 0 ; i <= 6 ; i++)
		{
			if (i == 0)
			{
				if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
					errorLog(1);	//解析错误
			}
			else
			{
				subString++;
				if ((subStringNext = strstr(subString, ",")) != NULL)
				{
					char usefullBuffer[2]; 
					switch(i)
					{
						case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;	//获取UTC时间
						case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;	//获取UTC时间
						case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;	//获取纬度信息
						case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break;	//获取N/S
						case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;	//获取经度信息
						case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;	//获取E/W

						default:break;
					}

					subString = subStringNext;
					Save_Data.isParseData = true;
					if(usefullBuffer[0] == 'A')
						Save_Data.isUsefull = true;
					else if(usefullBuffer[0] == 'V')
						Save_Data.isUsefull = false;

				}
				else
				{
					errorLog(2);	//解析错误
				}
			}
		}
	}
}

// GPS数据转化单位为度。
double Convert_to_degrees(char* data)
{
	double temp_data = atof(data);
	int degree = (int)(temp_data / 100);
	double f_degree = (temp_data / 100.0 - degree)*100/60.0;
	double result = degree + f_degree;
	return result;
}


void printGpsBuffer()
{
	double f_latitude = 0.0;
	double f_longitude = 0.0;
	
	if (Save_Data.isParseData)
	{
		Save_Data.isParseData = false;
		
		printf("Save_Data.UTCTime = ");
		printf(Save_Data.UTCTime);
		printf("\r\n");

		if(Save_Data.isUsefull)
		{
			Save_Data.isUsefull = false;
			printf("Save_Data.latitude = ");
			// printf(Save_Data.latitude);
			// printf("--");
			f_latitude = Convert_to_degrees(Save_Data.latitude);
			printf("%lf%s", f_latitude, Save_Data.N_S);
			printf("\r\n");

			printf("Save_Data.N_S = ");
			printf(Save_Data.N_S);
			printf("\r\n");

			printf("Save_Data.longitude = ");
			// printf(Save_Data.longitude);
			// printf("--");
			f_longitude = Convert_to_degrees(Save_Data.longitude);
			printf("%lf%s", f_longitude, Save_Data.E_W);
			printf("\r\n");

			printf("Save_Data.E_W = ");
			printf(Save_Data.E_W);
			printf("\r\n");
		}
		else
		{
			printf("GPS DATA is not usefull!\r\n");
		}
		
	}
}

oled代码使用的江协科技代码

江协科技/江科大-STM32入门教程-8.示例程序(OLED驱动函数)、keil的调试模式_oledshownum函数-CSDN博客

完整代码见我的资源

### 回答1: 基于STM32单片机的DHT11温湿度传感器OLED显示程序可以实现以下功能: 首先,需要连接STM32单片机与DHT11温湿度传感器以及OLED显示屏。 然后,编写程序读取DHT11传感器的温湿度数值。可以通过引脚连接和使用相应的库函数来实现数据读取。 接下来,使用OLED显示屏库函数将温湿度数据显示OLED屏幕上。可以在屏幕上创建相应的文本框或者图标来显示温湿度值。可以使用合适的库函数调用,将温湿度数据转换为字符串格式并在屏幕上显示出来。 同时,可以设计一个定时器来定时更新温湿度数据显示。可以设置一个适当的时间间隔来实现数据的定时更新,并使用相应的库函数来控制定时器的启动和停止。 此外,为了增加用户体验,还可以添加一些额外的功能,比如在某个温湿度阈值超过一定值时,显示警告信息或者触发报警器等。 最后,将编写好的程序下载到STM32单片机中进行测试。通过观察OLED显示屏是否能够正确显示温湿度数值,以及数据是否能够定时更新,来验证程序的正确性。 总体来说,基于STM32单片机的DHT11温湿度传感器OLED显示程序需要通过串口和I2C总线连接硬件设备,并使用相应的库函数来读取传感器数据和控制OLED显示屏,以实现温湿度数据的实时显示。 ### 回答2: 基于STM32单片机的DHT11温湿度传感器OLED显示程序可以实现如下功能。 首先,我们需要连接DHT11温湿度传感器STM32单片机的GPIO口。DHT11传感器的信号线接到单片机的输入GPIO口,供电线接到单片机的5V电源口,接地线接到单片机的地线。 接着,需要通过STM32的GPIO口读取DHT11传感器发送的温湿度数据。通过向DHT11传感器发送一个读取请求信号,然后在适当的时间间隔后读取传感器发送的数据,包括温度和湿度值。 接下来,我们需要将读取到的温湿度数据通过I2C或SPI协议发送到连接的OLED显示屏上显示出来。首先,需要初始化I2C或SPI接口,然后将温湿度数据传送到OLED显示屏的适当位置进行显示。可以使用相应的OLED显示屏库函数来帮助实现这一功能。 此外,为了更好地呈现温湿度数据,还可以添加一些额外的功能。例如,可以设置一个温度和湿度的阈值,当温度或湿度超过阈值时,通过OLED显示屏进行警告或提示。还可以添加一个实时钟表显示当前的时间,并将当前温湿度数据显示在时钟表上。 需要注意的是,在编写程序时,应根据单片机型号和开发环境选择相应的库函数和配置参数,确保程序正确运行。 以上是基于STM32单片机的DHT11温湿度传感器OLED显示程序的简要说明。具体的实现细节和代码可以根据具体的需求和硬件平台进行调整和开发。 ### 回答3: 基于STM32单片机的DHT11温湿度传感器OLED显示程序主要实现了以下功能。 首先,我们需要通过STM32单片机与DHT11传感器进行通信。我们可以通过引脚连接和编程设置来实现数据的读取。在程序中,我们需要配置引脚输入/输出模式,并通过适当的延时来与DHT11发送和接收数据。 接下来,我们需要解析从DHT11传感器接收到的数据。DHT11传感器会发送40位二进制数据,其中包含温度和湿度信息。我们可以根据协议来解析这些数据,并将其存储到相应的变量中。 然后,我们需要将解析后的数据通过OLED显示屏进行显示。在STM32单片机中,我们可以使用相应的库函数来控制OLED显示屏。我们需要将温度和湿度信息转换为字符串,并使用适当的字符函数来显示OLED屏幕上。 最后,我们可以通过循环来实现数据的持续更新和显示。以一定的时间间隔读取DHT11传感器数据,并将其显示OLED屏幕上。这样,我们就实现了基于STM32单片机的DHT11温湿度传感器OLED显示程序。 需要注意的是,为了确保程序的正常运行,我们还需要根据实际情况对程序进行优化和调试。这可能包括校准温湿度传感器、处理错误情况和调整程序逻辑等。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值