NB-IOT采集温湿度案例
作者:互联网
最终效果及试题
所用文件
代码参考
main.c部分代码参考
/**
******************************************************************************
* 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 "sht3x.h"
int huxi = 0, key3IsPressed = 0, key4IsPressed = 0;
/**********************************************************************************************
*函数:void Init( void )
*功能:平台初始化
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void Init() {
// 开发板平台初始化
BoardInitMcu();
BoardInitPeriph();
keys_init();//按键初始化
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}
/**********************************************************************************************
*函数:void KeyDownHandler( void )
*功能:按钮事件监听
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void KeyDownHandler(void) {
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == 0){
huxi = !huxi;
HAL_Delay(10);
key3IsPressed = 0;
key4IsPressed = 0;
while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == 0);
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0){
huxi = 0;
HAL_Delay(10);
key3IsPressed = 1;
key4IsPressed = 0;
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0);
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == 0){
huxi = 0;
HAL_Delay(10);
key3IsPressed = 0;
key4IsPressed = 4;
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == 0);
}
}
/**
对GPIO引脚的初始化
key2-4引脚分别为PC_13,PB_1,PB_5
led2 -> PB_8
**/
void GPIOInit(){
//HAL_GPIO_Init
GPIO_InitTypeDef init;
//PC_13的配置
init.Pin = GPIO_PIN_13;
init.Mode = GPIO_MODE_INPUT;
init.Pull = GPIO_NOPULL;
init.Speed = GPIO_SPEED_FREQ_HIGH;
//GPIO_InitTypeDef *取的是地址可以用&符号取
HAL_GPIO_Init(GPIOC, &init);
//开启使能
__HAL_RCC_GPIOC_CLK_ENABLE();
//PB_1的配置
init.Pin = GPIO_PIN_1;
//GPIO_InitTypeDef *取的是地址可以用&符号取
HAL_GPIO_Init(GPIOB, &init);
//开启使能
__HAL_RCC_GPIOB_CLK_ENABLE();
//PB_5的配置
init.Pin = GPIO_PIN_5;
//GPIO_InitTypeDef *取的是地址可以用&符号取
HAL_GPIO_Init(GPIOB, &init);
//开启使能
__HAL_RCC_GPIOB_CLK_ENABLE();
//PB_8的配置
init.Pin = GPIO_PIN_8;
init.Mode = GPIO_MODE_OUTPUT_PP;
//GPIO_InitTypeDef *取的是地址可以用&符号取
HAL_GPIO_Init(GPIOB, &init);
//开启使能
__HAL_RCC_GPIOB_CLK_ENABLE();
}
void ShowTemHumInfo(){
float t, h;
call_sht11(&t, &h);
//温度
OLED_ShowNum(104,2,t,2,16);
if(t < 10){
//清空后面无用数字
OLED_ShowString(112, 2, (unsigned char *)"");
}
//湿度
OLED_ShowNum(80,4,h,2,16);
if(h < 10){
//清空后面无用数字
OLED_ShowString(88, 4, (unsigned char *)"");
}
//其实如果你已经确定传感数值长度为2的话可以不用考虑极端情况
}
void Delay_US(int i){
while(i--){
for(int j = 10; j > 0; j--);
}
}
/**
* Main application entry point.
*/
int main( void )
{
Init();
OLED_Init();
SHTXX_Init();
GPIOInit();
/**量程 温度-10~60°C
湿度 0-100%RH **/
OLED_ShowString(8, 2, (unsigned char *)"Temperature:");
OLED_ShowString(8, 4, (unsigned char *)"Humidity:");
while( 1 )
{
KeyDownHandler();
ShowTemHumInfo();
if(huxi){
for(int i = 0; i < 500; i++){
if(i % 100 == 0) KeyDownHandler();
Delay_US(i);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
Delay_US(500 - i);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
}
KeyDownHandler();
for(int i = 0; i < 500; i++){
if(i % 100 == 0) KeyDownHandler();
Delay_US(i);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
Delay_US(500 - i);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
}
}
else if(key3IsPressed) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
else if(key4IsPressed) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
}
}
标签:HAL,PIN,温湿度,NB,IOT,GPIOB,init,GPIO,void 来源: https://www.cnblogs.com/godshadow/p/16394629.html