最近想做一个物联网农业监控系统,第一步就是能够学会使用相关的外设,比如温湿度检测,光照强度检测,还有CO2检测等。

这次讲一下光电传感器的使用和代码实现。

1.知识储备:串口使用,ADC采集(此处用的ADC3)。

2.硬件:stm32f103ve开发板+4pin光电传感器+4pin_oled

AO DO VCC GND
模拟电压输出,有两种状态,一般用不到 数字开关量输出,接的开发板的ADC脚 接vcc,3.3~ 5v 接地

3.使用串口讲解:

main.c
uint8_t receivedata[1];
uint16_t ADC_Value = 0;
float ADC_Volt = 0;
uint8_t str_buff[64] = {0}; void Show_date()
{
printf("%.2f",ADC_Volt);
} void Get_ADC_Value()
{
HAL_ADC_Start(&hadc3);
if(HAL_ADC_PollForConversion(&hadc3,10) == HAL_OK)
{
ADC_Value = HAL_ADC_GetValue(&hadc3);
ADC_Volt = (ADC_Value * 3.3)/4096;//单位为10mv
Show_date();
}
} int main(void)
{
/* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */
SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC3_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,(uint8_t *)receivedata,1);//开启串口
/* USER CODE END 2 */ /* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
printf("light:");
Get_ADC_Value();
printf("\r\n");
HAL_Delay(100);
}
/* USER CODE END 3 */
} /* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接收回调函数
{
if(huart ->Instance == USART1 )
{
HAL_UART_Receive_IT (&huart1 ,(uint8_t *)receivedata ,1); }
}
/* USER CODE END 4 */

**因为要使用printf()函数在串口打印输出,所以需要在串口重定向之后才能使用。**

usart.c
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE * f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
return ch;
}

结果:

4.使用OLED 屏幕显示:

四脚的oled,SCLK和SDA在CUBEMX找两个脚置成输出模式即可。

oled的使用网上有教程,请自行移植。

代码:

mian.c
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "gpio.h" /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "oled.h"
#include "stdio.h" uint16_t ADC_Value = 0;
uint16_t ADC_Volt = 0;
uint8_t str_buff[64] = {0}; void Show_start();
void OLED_show_data();
void OLED_disp_data();
void Get_ADC_Value(); void SystemClock_Config(void);
/* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */
SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC3_Init();
/* USER CODE BEGIN 2 */
OLED_Init();
Show_start();
HAL_Delay(1000);
OLED_Clear(); // OLED_show_data(); /* USER CODE END 2 */ /* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
OLED_show_data();
Get_ADC_Value();
}
/* USER CODE END 3 */
} /* USER CODE BEGIN 4 */
void Show_start()
{
OLED_Clear();
OLED_ShowChinese(0,0,0,16);
OLED_ShowChinese(16,0,1,16);
OLED_Refresh();
} void OLED_show_data()
{ OLED_ShowChinese(0,0,2,16);
OLED_ShowChinese(16,0,3,16);
OLED_ShowString(32,0,":",16);
OLED_Refresh();
} void OLED_disp_data()
{
sprintf((char *)str_buff,"%d.%d%d",ADC_Volt/100,(ADC_Volt%100)/10,ADC_Volt%10);
OLED_ShowString(48,0,str_buff,16);
} void Get_ADC_Value()
{
HAL_ADC_Start(&hadc3);
if(HAL_ADC_PollForConversion(&hadc3,10) == HAL_OK)
{
ADC_Value = HAL_ADC_GetValue(&hadc3);
ADC_Volt = ADC_Value * 330/4096;//单位为10mv
OLED_disp_data();
}
} /* USER CODE END 4 */

结果显示:

想要完整工程

链接:https://pan.baidu.com/s/1OP7wtyOTdvw8_M2gYLfXYw提取码:22kh

链接:https://pan.baidu.com/s/1bl3cA8-8uHEv5rSId5UCxg提取码:abdc

本人能力有限,如有不足请指正。

stm32f103ve+光电传感器使用教程+oled(HAL库)的更多相关文章

  1. stm32f103ve+BH1750使用教程+oled(HAL库)

    1.硬件:BH1750模块+oled 2.代码:BH1750是标准的iic协议的外设,我这里单独有iic的文件,之后想要实现多个设备共用一个iic. BH1750.c 1 #include " ...

  2. 【STM32H7教程】第47章 STM32H7的FMC总线基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第47章       STM32H7的FMC总线基础知识和HA ...

  3. 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章       STM32H7的HAL库框架设计学 ...

  4. 【STM32H7教程】第32章 STM32H7的TIM定时器基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第32章       STM32H7的TIM定时器基础知识和H ...

  5. 【STM32H7教程】第29章 STM32H7的USART串口基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第29章       STM32H7的USART串口基础知识和 ...

  6. 【STM32H7教程】第17章 STM32H7之GPIO的HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第17章       STM32H7之GPIO的HAL库API ...

  7. 【STM32H7教程】第16章 STM32H7必备的HAL库API(重要)

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第16章       STM32H7必备的HAL库API(重要 ...

  8. 【STM32H7教程】第61章 STM32H7的MDMA基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第61章       STM32H7的MDMA基础知识和HAL ...

  9. 【STM32H7教程】第59章 STM32H7的DAC基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第59章       STM32H7的DAC基础知识和HAL库 ...

  10. 【STM32H7教程】第57章 STM32H7硬件JPEG编解码基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第57章       STM32H7硬件JPEG编解码基础知识 ...

随机推荐

  1. SqlSugar删除数据

    1.根据实体删除 1.1 强类型实体 需要配置主键 ,根据主键删除需要给实体配置主键,参考文档实体配置 //单个实体 db.Deleteable<Student>(new Student( ...

  2. MiniRBT中文小型预训练模型:结合了全词掩码技术和两段式知识蒸馏技术,加快推理速度

    MiniRBT中文小型预训练模型:结合了全词掩码(Whole Word Masking)技术和两段式知识蒸馏(Knowledge Distillation)技术,加快推理速度 在自然语言处理领域中,预 ...

  3. 【三】分布式训练---单机多卡与多机多卡组网(飞桨paddle2.0+)更加推荐spawn方式!

    1. 单机多卡启动并行训练 飞桨2.0增加paddle.distributed.spawn函数来启动单机多卡训练,同时原有的paddle.distributed.launch的方式依然保留. padd ...

  4. Paddle模型性能分析工具Profiler:定位瓶颈点、优化程序、提升性能

    项目链接,fork一下即可使用 https://aistudio.baidu.com/aistudio/projectdetail/4482932?contributionType=1 Paddle模 ...

  5. Prompt learning 教学[最终篇]:Chatgpt使用场景推荐、优秀学习资料推荐、AI工具推荐

    Prompt learning 教学[最终篇]:Chatgpt使用场景推荐.优秀学习资料推荐.AI工具推荐 1.chatgpt使用场景推荐 各位应该在各种平台看到不少可以尝试使用的场景,我这里仅收录: ...

  6. 2.8 CE修改器:寻找共享代码

    本关我们将学习共享代码,在C语言中角色属性都是以结构体的方式进行存储的,而结构体所存储的信息都是连续性的,这一关我们将会解释如何处理游戏中的共用代码,这种代码是通用在除了自己以外的其他同类型对像上的常 ...

  7. [Go] string、int、int64相互转换

    import "strconv" //先导入strconv包 // string到int int, err := strconv.Atoi(string) // string到in ...

  8. VB6的OfficeMenu控件 - 开源研究系列文章

    这次将原来VB6中喜欢和使用到的OfficeMenu的控件做一个使用介绍. 上次介绍了VB6中的控件引擎,但是那个只针对基本的控件,这个OfficeMenu控件在当时是收费的,笔者找度娘好不容易才下载 ...

  9. Intellij IDEA 中 .properties文件中文乱码

    在别的地方显示正常的 application.properties 文件,放到 idea 中就会有乱码,如下图所示 idea 右下角编码那里还是灰色的,不能更改 解决方法 点开 idea 的 sett ...

  10. Java 运算符 - 除法

    1. 除法运算符 Java中的除法运算符是"/"符号,表示将左侧操作数除以右侧操作数. 2. 整数除法 在Java中,整数除法的结果是一个整数,即只保留除法的整数部分,舍去小数部分 ...