LORA模块开发基础教程目录
- 物联网国赛LORA模块开发基础教程—开发环境配置
- 物联网国赛LORA模块开发基础教程—输出(LED)
- 物联网国赛LORA模块开发基础教程—输入(按键)
- 物联网国赛LORA模块开发基础教程—OLED屏幕
- 物联网国赛LORA模块开发基础教程—传感器
- 物联网国赛LORA模块开发基础教程—定时器
- 物联网国赛LORA模块开发基础教程—串口收发
- 物联网国赛LORA模块开发基础教程—读写内部FALSH
- 物联网国赛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.本节资源
百度网盘: 本节源码