物联网国赛LORA模块开发基础教程(通用库)—传感器

LORA模块开发基础教程目录

  1. 物联网国赛LORA模块开发基础教程—开发环境配置
  2. 物联网国赛LORA模块开发基础教程—输出(LED)
  3. 物联网国赛LORA模块开发基础教程—输入(按键)
  4. 物联网国赛LORA模块开发基础教程—OLED屏幕
  5. 物联网国赛LORA模块开发基础教程—传感器
  6. 物联网国赛LORA模块开发基础教程—定时器
  7. 物联网国赛LORA模块开发基础教程—串口收发
  8. 物联网国赛LORA模块开发基础教程—读写内部FALSH
  9. 物联网国赛LORA模块开发基础教程—点对点通信

物联网国赛LORA模块开发基础教程(通用库)—

1.本节内容

1)数字量传感器

  • 火焰传感器
  • 人体红外传感器
  • 单联继电器
  • 双联继电器

在这里插入图片描述

2)模拟量量传感器

  • 光照传感器
  • 温湿度感器
  • 空气质量电器
  • 可燃气体继电器

在这里插入图片描述

2.本节函数

//数字量传感器
//单联继电器
GpioInit( &Relay1, Relay_1, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 ); //GPIO初始化,继电器的引脚是PB2
GpioWrite(&Relay1,1);	//打开继电器1
GpioWrite(&Relay1,0);	//关闭继电器1

//双联继电器
GpioInit( &Relay1, Relay_1, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 ); //GPIO初始化,继电器1的引脚是PB2
GpioInit( &Relay2, Relay_2, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 ); //GPIO初始化,继电器2的引脚是PB0
GpioWrite(&Relay1,1);	//打开继电器第一联
GpioWrite(&Relay1,0);	//关闭继电器第一联
GpioToggle(&Relay1);	//继电器第一联电平翻转
GpioWrite(&Relay2,1);	//打开继电器第二联
GpioWrite(&Relay2,0);	//关闭继电器第二联
GpioToggle(&Relay2);	//继电器第二联电平翻转
//特别提示:要使用继电器必须要在mian.c添加继电器GPIO对象和在mian.c里#define继电器引脚,否则会报错
//mian.c
Gpio_t Relay1;
Gpio_t Relay2;
//mian.c
#define Relay_1                                       PB_2	//继电器1的引脚是PB2
#define Relay_2                                       PB_0	//继电器2的引脚是PB0

//火焰传感器
//方法一
HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);	//火焰传感器的引脚是PA0(ADC0)
//方法二
AdcScanChannel();	//转换ADC数据为电压值
AdcReadCh0();	//获得ADC0电压值
//特别提示:要使用火焰传感器方法一必须要在注释ADC初始化,否则引脚冲突,不能成功读取引脚状态

//人体红外传感器
HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2); //人体红外传感器的引脚是PA2


//模拟量传感器
//光照传感器与空气质量传感器与可燃气体传感器同理
ADCS_Init();	//初始化ADC
AdcScanChannel();	//转换ADC数据为电压值
AdcReadCh0();	//获得ADC0电压值
//特别提示:要使用光照传感器必须要在main.c里#include ADC的头文件以及main函数,否则会报错
//main.c
#include "adc_reader.h"
//main函数
ADCS_Init();	//初始化ADC

3.本节代码

/**
  ******************************************************************************
  * File Name          : main.c
  * Description        : Main program body
  ******************************************************************************
  */
#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"

//选手自行添加头文件
#include "adc_reader.h"
#include "hal_oled.h"
#include <math.h>

//选手自行添加GPIO对象和#define
Gpio_t Relay1;
Gpio_t Relay2;
#define Relay_1                                       PB_2	//继电器1的引脚是PB2
#define Relay_2                                       PB_0	//继电器2的引脚是PB0
/**********************************************************************************************
*函数:void Init( void )
*功能:平台初始化
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void Init() {
    // 开发板平台初始化
    BoardInitMcu();
    BoardInitPeriph();
    keys_init();//按键初始化
    setTimer2Callback(Time2Handler);
    Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
	 
}

/**********************************************************************************************
*函数:void KeyDownHandler( void )
*功能:按钮事件监听
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void KeyDownHandler(void) {
	
}

/**********************************************************************************************
*函数:void handlerPre10Ms( void )
*功能:10毫秒循环
*输入:无
*输出:无
*特殊说明:循环处理总时长300ms
**********************************************************************************************/
void handlerPre10Ms(void) {
    for (int delay = 0; delay < 30; delay++) {
        HAL_Delay(10);
        
    }
}

/**
 * Main application entry point.
 */
uint8_t Oled_Data_Show[10];	//显示字符串
float Light; 
int main( void )
{
    Init();
	
		GpioInit( &Relay1, Relay_1, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 ); //GPIO初始化,继电器的引脚是PB2
		GpioInit( &Relay2, Relay_2, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 ); //GPIO初始化,继电器的引脚是PB2
		OLED_Init();	//Oled屏初始化
		ADCS_Init();	//初始化ADC,使用火焰传感器方法一必须关闭ADC初始化
	
    while( 1 )
    {
			//单联继电器
//			GpioWrite(&Relay1,1);	//打开继电器第一联
//			GpioWrite(&Relay2,1);	//打开继电器第一联
			GpioWrite(&Relay1,0);	//打开继电器第一联
			GpioWrite(&Relay2,0);	//打开继电器第一联
			GpioToggle(&Relay1);		//继电器第一联电平翻转
			GpioToggle(&Relay2);		//继电器第一联电平翻转
//			
//			//火焰传感器
//				//方法一
//			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
//			{
//					GpioWrite(&Led1,0);
//			}
//			else
//			{
//					GpioWrite(&Led1,1);
//			}
//				//方法二
//				AdcScanChannel();	//转换ADC数据为电压值
//				if(AdcReadCh0()>=2)
//				{
//					GpioWrite(&Led1,0);
//				}
//				else
//				{
//					GpioWrite(&Led1,1);
//				}

//			//人体红外传感器
//			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2))
//			{
//					GpioWrite(&Led1,0);
//			}
//			else
//			{
//					GpioWrite(&Led1,1);
//			}

				//光照传感器
				AdcScanChannel();
				//电压值
				sprintf((char*)Oled_Data_Show,":%.2fV",AdcReadCh0());	//返回值就是电压值
//				//流明值(lux)
//				sprintf((char*)Oled_Data_Show,":%.2f lux",(5/2.0)*(AdcReadCh0()*100));	//光照值 = (5/2.0)*(电压值)*100.0)
				OLED_ShowCHinese(16*0,0,29);
				OLED_ShowCHinese(16*1,0,30);
				OLED_ShowString(16*2,0,Oled_Data_Show);
				HAL_Delay(1000);

				//空气质量传感器
//				AdcScanChannel();
//					//电压值
//				sprintf((char*)Oled_Data_Show,":%.2fV",AdcReadCh0());
					//PM2.5(μg/m3)	
					sprintf((char*)Oled_Data_Show,":%.2f μg/m3",(float)pow(10,((0.2552-log10((5/AdcReadCh0()-1)/10))/0.5829)));
//				OLED_ShowCHinese(16*0,0,34);
//				OLED_ShowCHinese(16*1,0,35);
//				OLED_ShowCHinese(16*2,0,36);
//				OLED_ShowCHinese(16*3,0,37);
//				OLED_ShowString(16*3,0,Oled_Data_Show);
//				HAL_Delay(1000);
				
				//可燃气体传感器
//				AdcScanChannel();
//					//电压值
				sprintf((char*)Oled_Data_Show,":%.2fV",AdcReadCh0());
//				sprintf((char*)Oled_Data_Show,":%.2f ppm",(float)pow(10,((1.395-log10((50/AdcReadCh0()-20)/10))/0.465)));
//					//浓度值(ppm)
//				OLED_ShowCHinese(16*0,0,31);
//				OLED_ShowCHinese(16*1,0,32);
//				OLED_ShowCHinese(16*2,0,33);
//				OLED_ShowCHinese(16*3,0,28);
//				OLED_ShowString(16*4,0,Oled_Data_Show);
//				HAL_Delay(1000);
    }
}


4.实验效果

  • 火焰传感器
  • 人体红外传感器
  • 单联继电器
  • 双联继电器
  • 光照传感器
  • 温湿度感器
  • 空气质量电器
  • 可燃气体继电器

5.本节相关知识

1)ADC传感器,计算实际值

(1)光照传感器(单位:lux)

光照值(Lux) = ( 5 / 2.0 ) * ( 电压值 ) * 100.0 )

float Light_Val =   (5/2.0)*(AdcReadCh0())*100.0);

(2)空气质量(单位:μg/m3)

空气质量 = 10 ^ ( ( 0.2552 - lg电压值 ) / 0.5829 );

float Carbon_Monoxide_Val = (float)pow(10,((0.2552-log10(AdcReadCh0()))/0.5829));

(3)可燃气体传感器(ppm)

可燃气体(MMP) = 10 ^ ( ( 1.395- lg( ( 50 / 电压值 - 20 ) / 10 ) ) / 0.465 );

float Combustible_Gas_Val= (float)pow(10,((1.395-log10((50/AdcReadCh0()-20)/10))/0.465));

6.本节资源

百度网盘: 本节源码

7.结束语

上节内容:OLED屏幕

下节内容:定时器

欢迎加入学习交流QQ群

748555394

  • 11
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的蒙学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值