最近想做一个物联网农业监控系统,第一步就是能够学会使用相关的外设,比如温湿度检测,光照强度检测,还有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. vue 路由守卫是否携带token

    //整个实例出来 配置路由守卫 const router = new Router({ //这里面是路由配置哈 }) router.beforeEach((to, from, next) => ...

  2. ADB精简安卓系统:基础环境

    KMSID: 80999 是否同步到KM: 是 是否原创: 是 标签: 游戏开发 允许复制: 是 允许评论: 是 允许导出PDF: 是 职业库分类: 游戏-游戏程序 查看权限:网易正式员工-公开, 网 ...

  3. TienChin 运行 RuoYi-Vue3

    在前几篇文章当中,之前使用的是 Vue2,在某一天发现若依提供了 Vue3 的版本,所以这篇文章主要是运行起来,Vue2,迟早要被替代,所以这里采用最先进的 Vue3. 仓库地址:https://gi ...

  4. 三线表制作(word)

    三线表制作 转载:https://blog.csdn.net/zaishuiyifangxym/article/details/81668886

  5. 同时配置github和gitee秘钥

    1.设置用户名和邮箱 git config --global --list 查看全局配置信息 git config --global --list 删除配置:必须删除该设置 git config -- ...

  6. element-ui表格筛选,根据表头属性显示隐藏列

    效果: 步骤: 1.标签上添加要过滤的源数组 <el-table-column label="标签" :filters="filterList" filt ...

  7. ES6学习 第六章 数值的扩展

    前言 本章介绍数值的扩展.新增了很多方法,有些不常用的方法了解即可. 本章原文链接:数值的扩展 进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. ...

  8. Linux中$home和波浪号~

    在Linux中当前用户的主目录可以有三种表示方法,都是等效的[正常不改配置情况下]例如用户名为sy,进入当前用户的主目录/home/sy 输入cd ~ 或输入cd $HOME 或输入cd /home/ ...

  9. 【Unity3D】激光灯、碰撞特效

    1 需求描述 ​ 本文将模拟激光灯(或碰撞)特效,详细需求如下: 从鼠标位置发射屏幕射线,检测是否与物体发生碰撞 当与物体发生碰撞时,在物体表面覆盖一层激光灯(或碰撞)特效 ​ 本文代码见→激光灯.碰 ...

  10. Vue实现简单计算器功能

    知识点: v-model双向绑定 v-on事件绑定 实现效果 源码 <!DOCTYPE html> <html lang="en"> <head> ...