一、STM32CubeMX创建工程

  1. 选择STM32F103VE芯片型号

image.png由于传感器有数字量、开关量、模拟量,需要使用ADC进行转换

  1. 配置ADC,选择ADC1通道0

image.png

  1. 串口配置,USART1的设置为:波特率115200bps,8位数据位,1位停止位,无校验位。开启USART1中断使能

image.png

  1. 时钟树配置,将ADC_IN0设置为12位ADC,右对齐

image.png

  1. 构建工程,Keil5开发环境

image.png

  1. PS:本教程采用Clion进行项目开发,构建工程时需要选择STM32CubeIDE

image.png

  1. 工程构建成功后,进入工程时,首先应该编译项目,确保工程构建成功,避免后期调试找不到BUG

image.png

二、获取光照传感器数据

1. 初始化配置

  1. //引用"stdio.h"头文件,为后期串口数据发送到上位机做准备
  2. #include "stdio.h"
  3. //宏定义GPIO,简化代码
  4. #define LED1_ON() HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_RESET)
  5. #define LED1_OFF() HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_SET)
  6. uint16_t voltage,ADC_Collect = 0;
  7. uint8_t str_buff[64];
  8. //串口发送数据
  9. void USART1_Send_Info()
  10. {
  11. sprintf((char *) str_buff, "采样值:%d,电压值:%dV\r\n", ADC_Collect, voltage);
  12. HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
  13. }

2. ADC转换数据用查询,阻塞的方式来实现

  1. uint16_t Get_Voltage(void) {
  2. //启动ADC
  3. HAL_ADC_Start(&hadc1);
  4. // LED1_ON();
  5. //等待ADC采集完成
  6. HAL_ADC_PollForConversion(&hadc1, 10);
  7. //获取ADC采集数据
  8. ADC_Collect = HAL_ADC_GetValue(&hadc1);
  9. //将采集到的数据转换为电压值
  10. voltage = (ADC_Collect * 330) / 4096;
  11. //停止ADC
  12. //LED1_OFF();
  13. HAL_ADC_Stop(&hadc1);
  14. return voltage;
  15. }

3. 观察实验结果

电压随进光量变化而变化,每向上位机发送一次数据LED1闪烁一次
image.png

三、获取温湿度传感器

1. 添加温湿度转换库文件

  • Inc目录下创建temHum.h文件和在Src目录下创建temHum.c文件,并重新加载CMKE文件由此链接新增的库文件
  • 点击下载temHum.h
  • 点击下载temHum.c
  • 如果文件失效请自行复制文档末尾代码

image.png

2. 初始化配置

  • 引用“temHum.h”库文件
  • 新建串口发送函数

    1. void USART1_Send_Info1() {
    2. sprintf((char *) str_buff,"温度:%d℃,湿度:%d%%rh\r\n",tem_num,hum_num);
    3. HAL_UART_Transmit(&huart1, str_buff, sizeof(str_buff), 10000);
    4. }

    3. 启用hal_temHumInit

    image.png

    4.while循环

    1. while (1) {
    2. /*USART1_Send_Info();
    3. Get_Voltage();
    4. HAL_Delay(1000);*/
    5. USART1_Send_Info1();
    6. LED1_ON();
    7. call_sht11(&tem_num,&hum_num);
    8. LED1_OFF();
    9. HAL_Delay(1000);
    10. /* USER CODE END WHILE */
    11. /* USER CODE BEGIN 3 */
    12. }

    5. 观察实验结果

    用手遮挡温湿度传感器,发现数据有所变动,即数据获取成功
    image.png

    四、Keil5工程项目



五、附件下载

**/

/**

  • INCLUDES */

include “temHum.h”

//————————-温度湿度模块IO端口定义———————— //#define HAL_TEMHUM_SCK PB_6 //#define HAL_TEMHUM_SDA PB_7

GPIO_InitTypeDef HAL_TEMHUM_SCK_PIN; GPIO_InitTypeDef HAL_TEMHUM_SDA_PIN;

//stm32 IO操作

define HAL_SHT_SCK_DIR_OUT() SHT_SCK_DIR_OUT() //GpioInit( &HAL_TEMHUM_SCK_PIN, HAL_TEMHUM_SCK, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 1 );//初始化IO口,并输出1

define HAL_SHT_SCK_SET() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET) //GpioWrite( &HAL_TEMHUM_SCK_PIN, 1 )

define HAL_SHT_SCK_CLR() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET) //GpioWrite( &HAL_TEMHUM_SCK_PIN, 0 )

define HAL_SHT_SDA_SET() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET) //GpioWrite( &HAL_TEMHUM_SDA_PIN, 1 )

define HAL_SHT_SDA_CLR() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET) //GpioWrite( &HAL_TEMHUM_SDA_PIN, 0 )

define HAL_SHT_SDA_DIR_OUT() SHT_SDA_DIR_OUT(1) //GpioInit( &HAL_TEMHUM_SDA_PIN, HAL_TEMHUM_SDA, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 1 );//初始化IO口,并输出1

define HAL_SHT_SDA_DIR_IN() SHT_SDA_DIR_IN() //GpioInit( &HAL_TEMHUM_SDA_PIN, HAL_TEMHUM_SDA, PIN_INPUT, PIN_OPEN_DRAIN, PIN_PULL_UP, 1 );//初始化IO口,并输出1

define HAL_SHT_SDA_VAL() HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) //GpioRead( &HAL_TEMHUM_SDA_PIN )

define MCU_SHT_SDA_OUTPUT(n) SHT_SDA_DIR_OUT(n)//GpioInit( &HAL_TEMHUM_SDA_PIN, HAL_TEMHUM_SDA, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, n );//初始化IO口,并输出1

define ACK 1

define noACK 0

define measure_temp 0x03 //测量温度命令

define measure_humi 0x05 //测量湿度命令

define RESET 0x1e //软启动

//————————————数据结构体定义—————————————- typedef union { //保存所测得的温度&湿度值 uint16_t i; float f; } value; //WENSHIDU S;

/**

  • LOCAL FUNCTIONS */

void SHT11_DELAY(uint16_t usec); char write_byte(uint8_t value); char read_byte(uint8_t ack); void transstart(void); char s_measure(uint8_t p_value, uint8_t p_checksum, uint8_t mode); void calc_sth11(float p_humidity,float p_temperature);

define SENSOR_SHT10

//GPIO_InitTypeDef GPIO_InitStruct = {0};

// / GPIO Ports Clock Enable / // HAL_RCC_GPIOE_CLK_ENABLE(); // HAL_RCC_GPIOC_CLK_ENABLE(); // HAL_RCC_GPIOA_CLK_ENABLE(); // HAL_RCC_GPIOB_CLK_ENABLE(); // __HAL_RCC_GPIOD_CLK_ENABLE();

// /Configure GPIO pin Output Level / // HAL_GPIO_WritePin(GPIOE, LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin // |LED6_Pin|LED7_Pin|LED0_Pin|LED1_Pin, GPIO_PIN_SET);

// /Configure GPIO pin Output Level / // HAL_GPIO_WritePin(BUZZ_GPIO_Port, BUZZ_Pin, GPIO_PIN_RESET);

// /Configure GPIO pins : PEPin PEPin PEPin PEPin // PEPin PEPin PEPin PEPin / // GPIO_InitStruct.Pin = LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin // |LED6_Pin|LED7_Pin|LED0_Pin|LED1_Pin; // GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // GPIO_InitStruct.Pull = GPIO_NOPULL; // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

void SHT_SCK_DIR_OUT(void) { GPIO_InitTypeDef GPIO_InitStructure; / Enable GPIOC clock / __HAL_RCC_GPIOB_CLK_ENABLE(); // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  1. GPIO_InitStructure.Pin = GPIO_PIN_6;
  2. GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  3. GPIO_InitStructure.Speed =GPIO_SPEED_FREQ_HIGH;
  4. HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);

// GPIO_SetBits(GPIOB,GPIO_Pin_6); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET); }

void SHT_SDA_DIR_OUT(uint8_t a) { GPIO_InitTypeDef GPIO_InitStructure; / Enable GPIOC clock / __HAL_RCC_GPIOB_CLK_ENABLE();

  1. GPIO_InitStructure.Pin = GPIO_PIN_7;
  2. GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  3. GPIO_InitStructure.Speed =GPIO_SPEED_FREQ_HIGH;
  4. HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
  5. // GPIO_SetBits(GPIOB,GPIO_Pin_6);
  6. a?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);

}

void SHT_SDA_DIR_IN(void) { GPIO_InitTypeDef GPIO_InitStructure; / Enable GPIOC clock / __HAL_RCC_GPIOB_CLK_ENABLE();

  1. GPIO_InitStructure.Pin = GPIO_PIN_7;
  2. GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
  3. GPIO_InitStructure.Speed =GPIO_SPEED_FREQ_HIGH;
  4. HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
  5. // GPIO_SetBits(GPIOB,GPIO_Pin_6);

// HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET)

}

if defined SENSOR_SHT10

void SHT11_DELAY(uint16_t usec) { uint16_t i=8; usec*=2; usec >>= 1;

  1. while (usec--) {
  2. while(i--) {
  3. ;
  4. }
  5. }

}

//初始化温湿度模块 void hal_temHumInit(void) { uint16_t Tem,RH;

  1. //配置HAL_TEMHUM_SCK脚
  2. HAL_SHT_SCK_DIR_OUT();
  3. //配置HAL_TEMHUM_SDA脚
  4. HAL_SHT_SDA_DIR_OUT();
  5. //第一次读温湿度
  6. call_sht11(&Tem, &RH);

}

char write_byte(uint8_t value) { uint8_t i,error=0;

  1. for (i=0x80; i>0; i/=2) {
  2. if (i & value) {
  3. HAL_SHT_SDA_SET();
  4. } else {
  5. HAL_SHT_SDA_CLR();
  6. }
  7. HAL_SHT_SCK_SET();
  8. SHT11_DELAY(1);
  9. HAL_SHT_SCK_CLR();
  10. }
  11. HAL_SHT_SDA_SET();
  12. HAL_SHT_SDA_DIR_IN();
  13. HAL_SHT_SCK_SET();
  14. error=HAL_SHT_SDA_VAL();
  15. HAL_SHT_SCK_CLR();
  16. return error;

}

char read_byte(uint8_t ack) { uint8_t i,val=0;

  1. HAL_SHT_SDA_SET();
  2. HAL_SHT_SDA_DIR_IN();
  3. for (i=0x80; i>0; i/=2) {
  4. HAL_SHT_SCK_SET();
  5. if (HAL_SHT_SDA_VAL()) {
  6. val=(val | i);
  7. }
  8. HAL_SHT_SCK_CLR();
  9. }
  10. MCU_SHT_SDA_OUTPUT(!ack);
  11. HAL_SHT_SCK_SET();
  12. SHT11_DELAY(1);
  13. HAL_SHT_SCK_CLR();
  14. HAL_SHT_SDA_SET();
  15. return val;

}

void transstart(void) { HAL_SHT_SCK_SET(); SHT11_DELAY(1); HAL_SHT_SDA_CLR(); SHT11_DELAY(1); HAL_SHT_SCK_CLR(); SHT11_DELAY(2); HAL_SHT_SCK_SET(); SHT11_DELAY(1);

  1. HAL_SHT_SDA_SET();
  2. SHT11_DELAY(1);
  3. HAL_SHT_SCK_CLR();
  4. SHT11_DELAY(2);
  5. HAL_SHT_SDA_CLR();

}

void connectionreset(void) { uint8_t i; HAL_SHT_SDA_SET(); HAL_SHT_SCK_CLR(); for(i=0; i<9; i++) { HAL_SHT_SCK_SET(); HAL_SHT_SCK_CLR(); } transstart(); }

char s_measure(uint8_t p_value, uint8_t p_checksum, uint8_t mode) { uint8_t error=0; uint16_t i;

  1. connectionreset();
  2. switch(mode) {
  3. case 0 :
  4. error+=write_byte(measure_temp);
  5. break;
  6. case 1 :
  7. error+=write_byte(measure_humi);
  8. break;
  9. default :
  10. break;
  11. }
  12. HAL_SHT_SDA_DIR_IN();
  13. for (i=0; i<6; i++) { //这里的i<x,x和处理器速度相关,具体数值看效果来确定
  14. SHT11_DELAY(10);
  15. if(HAL_SHT_SDA_VAL()== 0) {
  16. break;
  17. }
  18. }
  19. if(HAL_SHT_SDA_VAL()) {
  20. error+=1;
  21. }
  22. *(p_value+1) =read_byte(ACK);
  23. *(p_value)=read_byte(ACK);
  24. *p_checksum =read_byte(noACK);
  25. return error;

} /**

  • 名称 calc_sth11
  • 功能 计算温湿度值
  • 入口参数 float p_humidity ,float p_temperature
    1. 湿度 温度
  • 出口参数 无 */ void calc_sth11(float p_humidity,float p_temperature) { const float C1=-4.0; const float C2=+0.0405; const float C3=-0.0000028; const float T1=+0.01; const float T2=+0.00008; float rh=p_humidity; float t=p_temperature; float rh_lin; float rh_true; float t_C; t_C=t0.01 - 40; rh_lin=C3rhrh + C2rh + C1; rh_true=(t_C-25)(T1+T2rh)+rh_lin; if(rh_true>100) {
    1. rh_true=100;
    } if(rh_true<0.1) {
    1. rh_true=0.1;
    } p_temperature=t_C; p_humidity=rh_true; }

/**

  • 名称 call_sht11
  • 功能 读取SH1x温湿度值
  • 入口参数 void call_sht11(uint16_t tem_val,uint16_t hum_val)
    1. *tem_val:温度存放地址,0.1度分辨率
    2. *hum_val:湿度存放地址,0.1分辨率
  • 出口参数 无 */ void call_sht11(uint16_t tem_val,uint16_t hum_val) { value humi_val,temp_val; uint8_t error = 0,checksum; tem_val=0; hum_val=0; //启动SH1x的湿度测量 error+=s_measure((uint8_t) &humi_val.i,&checksum,1); //启动SH1x的温度测量 error+=s_measure((uint8_t) &temp_val.i,&checksum,0); if(error!=0) {
    1. //测试错误,进行软复位
    2. connectionreset();
    } else {
    1. //测试数据处理
    2. humi_val.f=(float)humi_val.i;
    3. temp_val.f=(float)temp_val.i;
    4. //计算温湿度实际值
    5. calc_sth11(&humi_val.f,&temp_val.f);
    // tem_val=(uint16_t)temp_val.f;//当前温度temp_val.f摄氏度 // hum_val=(uint16_t)(humi_val.f);//湿度扩大100倍,也就是当前相对湿度为“*hum_val”%,单位是%。
    1. //四舍五入
    2. *tem_val=(unsigned int)(((temp_val.f*10)+5)/10);
    3. *hum_val=(unsigned int)(((humi_val.f*10)+5)/10);
    } }

endif

  1. - **temHum.h**文件
  2. ```c
  3. /*************************************************************************************************
  4. Filename:
  5. *****/
  6. #ifndef _TEMHUM_H_
  7. #define _TEMHUM_H_
  8. #include "stm32f1xx.h"
  9. #include <string.h>
  10. #include <stdio.h>
  11. void hal_temHumInit(void);
  12. void call_sht11(uint16_t *tem, uint16_t *hum);
  13. //void connectionreset(void);
  14. #endif /* _HAL_TEMHUM_H_ */