Stm32_标准库_11_ADC_光敏热敏传感器_测数值

news2024/11/26 22:28:29

在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可

在这里插入图片描述
由于温度传感器的测量范围是-20 ~ 105摄氏度,所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数

函数1:

uint16_t AD_Getvailue(uint8_t ADC_Channel){//获取信息
	      /*在规则组列表第一个位置,写入通道0这个通道*/
	   ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);
	   ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发转换
	   while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//等待转换完成
	   return ADC_GetConversionValue(ADC1);//读取数据
}

在获取模拟电压函数最开始写入通道函数方便接入GPIO_1或GPIO_0

函数2:

uint8_t Length(uint16_t num){
	  uint8_t length = 0;
	  if(num == 0) return (uint8_t) 1;
	  while(num > 0){
		   num = num / 10;
		   length = length + 1;
	  }
	  return length;
}

求无符号数字的长度函数,方便后续清屏

函数3:

uint8_t SignedNum_Length(int32_t num){
	      uint8_t length = 1;//符号位占1位
	      if(num == 0) return (uint8_t) 1;
	      if(num < 0) num = - num;
	      while(num > 0){
					   num = num / 10;
					   length = length + 1;
				}
	      return length;
}

求有符号数字的长度重点考虑到符号也要占一位

函数4:

int32_t Reality_Tmperature(uint16_t Vout){//获取实际温度
	   double T = 0;//获取的实际温度
	  
	   T = -0.0423 * Vout + 105 + 0.5;//模拟电压转实际温度公式
	   
		 return (int32_t) T;
		 
}

获取实际温度的公式,重点讲输入的模拟电压Vout转换成日常用的摄氏度

除此之外还将库函数输出OLED带符号位的函数也做了修改

在这里插入图片描述
函数:

void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{
	uint8_t i;
	uint32_t Number1;
	Length = Length - 1;
	if (Number >= 0)
	{
		OLED_ShowChar(Line, Column, '+');
		Number1 = Number;
	}
	else
	{
		OLED_ShowChar(Line, Column, '-');
		Number1 = -Number;
	}
	for (i = 0; i < Length; i++)							
	{
		OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');
	}
}

由于此函数在写入带符号数字时是不考虑符号的额外长度的所以为了更好配合SignedNum_Length(int32_t num);函数所以我对其也进行了修改

完整代码如下:

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"

GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct;


void AD_Init(void){//初始化AD
	   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC1的时钟
	   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟
	   RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC模块工作时钟 72 / 6 = 12MHZ
	   
	   /*配置GPIO口*/
	   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
	   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
	   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	   GPIO_Init(GPIOA, &GPIO_InitStruct);
	   
	   /*在规则组列表第一个位置,写入通道0这个通道*/
	   //ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
	
	   /*结构体初始化ADC*/
	   ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换
	   ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
	   ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发方式,不使用外部触发,即软件触发
	   ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//ADC工作模式为独立模式
	   ADC_InitStruct.ADC_NbrOfChannel = 1;//通道数目
	   ADC_InitStruct.ADC_ScanConvMode = DISABLE;//非扫描
	   ADC_Init(ADC1, &ADC_InitStruct);
		 
		 //开启ADC电源
		 ADC_Cmd(ADC1, ENABLE);
		 
		 /*给ADC校准*/
		 ADC_ResetCalibration(ADC1);//复位校准
		 while(ADC_GetResetCalibrationStatus(ADC1) == SET);//返回ADC1复位校准状态
		 ADC_StartCalibration(ADC1);//开始校准
		 while(ADC_GetCalibrationStatus(ADC1) == SET);//等待校准完成
}
 
uint16_t AD_Getvailue(uint8_t ADC_Channel){//获取信息
	      /*在规则组列表第一个位置,写入通道0这个通道*/
	   ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);
	   ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发转换
	   while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//等待转换完成
	   return ADC_GetConversionValue(ADC1);//读取数据
}
uint8_t Length(uint16_t num){
	  uint8_t length = 0;
	  if(num == 0) return (uint8_t) 1;
	  while(num > 0){
		   num = num / 10;
		   length = length + 1;
	  }
	  return length;
}

uint8_t SignedNum_Length(int32_t num){
	      uint8_t length = 1;//符号位占1位
	      if(num == 0) return (uint8_t) 1;
	      if(num < 0) num = - num;
	      while(num > 0){
					   num = num / 10;
					   length = length + 1;
				}
	      return length;
}
uint16_t Reality_ADLight(uint16_t ADCnum){//获取光照强度
	  return 100 - ADCnum / 40;
}


int32_t Reality_Tmperature(uint16_t Vout){//获取实际温度
	   double T = 0;//获取的实际温度
	  
	   T = -0.0423 * Vout + 105 + 0.5;//模拟电压转实际温度公式
	   
		 return (int32_t) T;
		 
}

void OLED_Tmperature_Printf(uint8_t line, uint8_t col ,int32_t num, uint8_t length){
	   if(num == 0){
			 OLED_ShowNum(line, col, num, length);
		 }
		 else{
			    OLED_ShowSignedNum(line, col, num, length);
		 }
}

 
int main(void){
	 
	OLED_Init();//初始化OLED
	AD_Init();
	
	while(1){
		    uint16_t num  = AD_Getvailue(ADC_Channel_0);
		    uint16_t num1 = Reality_ADLight(num); 
		    uint16_t NUM =  AD_Getvailue(ADC_Channel_1);
		    int32_t NUM1 =  Reality_Tmperature(NUM);
		    
		  
		    OLED_ShowString(1, 1, "ADO:");
		    OLED_ClearLocation(1, Length(num) + 3);//"ADO:"长度为3所以要加3
        OLED_ShowNum(1, 5, num, Length(num));
		    OLED_ShowString(2, 1, "LUX:");
		    OLED_ClearLocation(2, Length(num1) + 3);
		    OLED_ShowNum(2, 5, num1, Length(num1));
		
		     
		     OLED_ShowString(3, 1, "wendu:");
		     OLED_ShowNum(3, 7, NUM, Length(NUM));
		     OLED_ClearLocation(3, Length(NUM) + 6);
		    OLED_Tmperature_Printf(4, 1, NUM1, SignedNum_Length(NUM1));
		    OLED_ClearLocation(4, SignedNum_Length(NUM1));
		
		    Delay_ms(300);
			 
	}
}

效果:

在这里插入图片描述

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

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

相关文章

C# PortraitModeFilter (人物图片)背景模糊

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Windows.Forms; us…

python文本转语音

概述 目前有文本转语音的技术&#xff0c;可以用在配音领域&#xff0c;我个人因为一些需求&#xff0c;所以开始寻找这方面的资源&#xff0c;目前各大平台&#xff0c;比如腾讯&#xff0c;讯飞&#xff0c;阿里&#xff0c;百度等都有这样的API服务&#xff0c;我个人是是使…

Multi Scale Supervised 3D U-Net for Kidney and Tumor Segmentation

目录 摘要1 引言2 方法2.1 预处理和数据增强2.2 网络的体系结构2.3 训练过程2.4 推理与后处理 3 实验与结果4 结论与讨论 摘要 U-Net在各种医学图像分割挑战中取得了巨大成功。一些新的、带有花里胡哨功能的架构可能在某些数据集中在使用最佳超参数时取得成功&#xff0c;但它们…

力扣-463.岛屿的周长

Idea 注意观察&#xff0c;每一个完整的方块&#xff0c;边长都是加4&#xff0c;一旦这个方块有其他的方块相邻的话&#xff0c;那么这两个方块总边长就要减少2. 因此我们遍历二维数组的时候&#xff0c;判断岛屿方块的上面还有左方是否有相邻即可 class Solution { public:in…

Linux 64位 C++协程池原理分析及代码实现

导语 本文介绍了协程的作用、结构、原理&#xff0c;并使用C和汇编实现了64位系统下的协程池。文章内容避免了协程晦涩难懂的部分&#xff0c;用大量图文来分析原理&#xff0c;适合新手阅读学习。 GitHub源码 1. Web服务器问题 现代分布式Web后台服务逻辑通常由一系列RPC请…

算法村开篇

大家好我是苏麟从今天开始我将带来算法的一些习题和心得体会等等...... 算法村介绍 我们一步步地学习算法本专栏会以闯关的方式来学习算法 循序渐进地系统的学习算法并掌握大部分面试知识 , 期待和大家一起进步 . 索大祝大家学有所成 , 前程似锦.

PyCharm运行Nosetests并导出测试报告

1. Pycharm运行Nosetests PyCharm可以使用两种方法&#xff0c;运行Nosetests测试文件&#xff1a; 1) 图形用户界面GUI a) 在PyCharm中&#xff0c;选中测试文件&#xff0c;如Tests/test_demo.py b) 鼠标右键选择Run Nosetests in test_demo.py即可执行测试 注1&#xff…

【大数据Hive】hive select 语法使用详解

目录 一、前言 二、Hive select 完整语法树 三、Hive select 操作演示 3.1 数据准备 3.1.1 创建一张表 3.1.2 将数据load加载到t_usa_covid19表 3.1.3 再创建一张分区表 3.1.4 使用动态分区插入数据 3.2 select 常用语法 3.2.1 查询所有字段或者指定字段 3.2.2 查询…

【数据库系统概论】第七章数据库设计

7.1数据库设计概述 数据库设计定义是什么&#xff1f; 数据库设计(database design)&#xff1a;数据库设计是指对于一个给定的应用环境&#xff0c;构造(设计)优化的数据库逻辑模式和物理结构&#xff0c;并据此建立数据库及其应用系统&#xff0c;使之能够有效地存储和管理…

【排序算法】详解冒泡排序及其多种优化稳定性分析

文章目录 算法原理细节分析优化1优化2算法复杂度分析稳定性分析总结 算法原理 冒泡排序(Bubble Sort) 就是从序列中的第一个元素开始&#xff0c;依次对相邻的两个元素进行比较&#xff0c;如果前一个元素大于后一个元素则交换它们的位置。如果前一个元素小于或等于后一个元素…

RootSIFT---SIFT图像特征的扩展

RootSIFT是论文 Three things everyone should know to improve object retrieval - 2012所提出的 A Comparative Analysis of RootSIFT and SIFT Methods for Drowsy Features Extraction - 2020 当比较直方图时&#xff0c;使用欧氏距离通常比卡方距离或Hellinger核时的性能…

分析智能平台VMware Greenplum 7 正式发布!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

芯片学习记录TLP104

TLP104 芯片介绍 引脚信息 引脚1阳极3阴极4GNDGND5输出6VCC5V&#xff08;4.5~30&#xff09; 推荐使用条件 *此项目表示操作范围&#xff0c;而不是建议的操作条件。 注&#xff1a;建议的操作条件作为设计指南&#xff0c;以获得预期的性能设备。此外&#xff0c;每个项目…

HTML5播放 M3U8的hls流地址

在HTML5页面上播放M3U8的hls流地址 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>视频播放</title> <script src"https://cdn.jsdelivr.net/npm/hls.jslatest"></script> &…

Spring6注解管理Bean

文章目录 过程搭建子模块spring6-ioc-annotation使用注解定义 BeanAutowired注入①场景一&#xff1a;属性注入②场景二&#xff1a;set注入③场景三&#xff1a;构造方法注入④场景四&#xff1a;形参上注入⑤场景五&#xff1a;只有一个构造函数&#xff0c;无注解⑥场景六 A…

Vue3 + Quasar系列-代码配置以及报错汇总记录(不断更新中)

1. Vue3 Quasar系列-代码配置打包去掉hash后缀 去掉hash https://quasar.dev/quasar-cli-vite/developing-pwa/configuring-pwa 2. Vue3 Quasar改变主题背景 quasar的样式和其他的框架修改不太一样&#xff0c;需要我们使用动态的方式来进行变更&#xff0c;一般来说有两…

计算机毕业设计 高校实习信息发布网站的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

宝塔使用腾讯COS存储实现自动备份服务器网站数据图文教程

一、进入宝塔安装腾讯COS 点击设置打开后需要配置以下cos参数 二、腾讯云创建COS存储桶 选择私有读写&#xff0c;其他默认就行 三、创建访问密钥 四、配置宝塔中腾讯COS相关设置 很多人是配置错误导致无法正常链接cos region为cos存储桶所属地域 Bucker为存储桶名称 五、…

力扣-461.汉明距离

Method 1 直接比较x&#xff0c;y二进制中的每一位&#xff0c;如果不同则cnt加一&#xff0c;并且x&#xff0c;y每次右移一位 class Solution { public:int hammingDistance(int x, int y) {int cnt 0;while(x > 0 && y > 0) {if((x & 1) ! (y & 1)…

MySQL 2023 MySQL Summit 大会感受,我们距离MySQL 新技术越来越远

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群&#xff0c;群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;…