[开发板与模块] 【ESK32-30519 + ESK32-21001测评】5、人体额温报警系统-完成篇

[复制链接]
 楼主| sky.sun.zz 发表于 2022-9-22 15:24 | 显示全部楼层 |阅读模式
<
本帖最后由 sky.sun.zz 于 2022-9-23 10:22 编辑

【ESK32-30519 + ESK32-21001测评】5、基于HT32F54253的人体额温报警系统

    本工程是这次评测活动过程的单独评测结果的综合,利用ESK32-30519 + ESK32-21001硬件资源组成了基于HT32F54253的人体额温报警系统。
硬件资源:
bff9564071931843526daa2155e924b6
软件资源:
BFTM定时器
LEDC数码管代码库
TKL触摸按键代码库
Buzzer蜂鸣器代码
DVB_LED代码库
USART代码库

实现功能:人体红外测温报警系统。
通过USART串口读取温度传感器数据;
4位LED数码管显示人体温度值。两位整数+1位小数,平时末位数码管显示摄氏度“c”,进入设置模式时末位数码管显示“-”;
4只触摸按键用于设定报警温度的阈值:PD1进入设置模式,PD2退出设置模式,PD3增加报警阈值,PD4减少报警阈值;
当超温时,蜂鸣器声响报警,红色LED亮起报警。
HT32F54235代码库的特点:
1、HT32F54235的LEDC功能使得用户无需关注底层函数就能方便驱动LED数码管;
2、触摸按键克服了普通触点按键寿命短的毛病。
3、蜂鸣器的代码调用非常简单,音频的频率、时长、占空比、次数等在函数调用时一目了然,简单方便。

c0a914b1edf71809a11853ec43fc494d
主要代码
  1. int main(void){

  2. GPIO_Configuration();
  3. LEDC_Configuration();
  4. BFTM_Configuration();
  5. TKL_Configuration();
  6. gURRx_Ptr = gRx_Buffer;
  7. HT32F_DVB_LEDInit(HT_LED1);
  8. HT32F_DVB_LEDInit(HT_LED2);
  9. HT32F_DVB_LEDInit(HT_LED3);
  10. UxART_Configuration();
  11. Buzzer_Fun1();
  12. HT32F_DVB_LEDInit(HT_LED1);
  13. HT32F_DVB_LEDInit(HT_LED2);
  14. HT32F_DVB_LEDInit(HT_LED3);
  15. HT32F_DVB_LEDOn(HT_LED1);
  16. HT32F_DVB_LEDOn(HT_LED3);
  17.         
  18.   while (1){
  19. UxART_RxTest();
  20.   if(gIsUpdateChar)
  21.     {
  22.         if(Flag.SetupStatus==1)
  23.                 LEDC_Disp(Alarm_Value);        
  24.         else                        
  25.                 LEDC_Disp(Temperature);
  26.       gIsUpdateChar = FALSE;
  27.     }
  28.                
  29.     Touch_Key_Main_Function();
  30.    
  31.     if(!TKL_Is_Standby())
  32.     {
  33.      #if (1)
  34.       if(TKL_Is_KeyScanCycle()){
  35.         for(u8 i=0;i<28;i++)
  36.                 {
  37.          if(TKL_Is_KeyPress(i))
  38.                  {
  39.                 switch(i)
  40.                 {
  41.                 case 16:        
  42.                 {
  43.                 while(TKL_Is_KeyPress(16))
  44.                          {Touch_Key_Main_Function();
  45.                 }
  46.                         Flag.SetupStatus=0;
  47.                         break;
  48.                 case 17:
  49.                 {
  50.                 while(TKL_Is_KeyPress(17))
  51.                         {
  52.                         Touch_Key_Main_Function();
  53.                         }
  54.                         Flag.SetupStatus=1;
  55.                         break;
  56.                         }                                                                                case 22:
  57.                 {        
  58.                          KeyData = TKL_Get_AllKeyState();
  59.                         while(TKL_Is_KeyPress(22))
  60.                         {
  61.                         Touch_Key_Main_Function();
  62.                         }
  63.                         keyPress= (TKL_Get_AllKeyState());
  64.                         TKL_Is_KeyPress(22)==SET;
  65.                         if(keyPress!=SET)
  66.                         {
  67.                         if(Flag.SetupStatus==1)
  68.                         {
  69.                                 if(Alarm_Value>280)
  70.                                 Alarm_Value--;
  71.                         }
  72.                         }
  73.                 break;
  74.                 }
  75.                 case 23:
  76.                 {        
  77.                 while(TKL_Is_KeyPress(23))
  78.                 {
  79.                 Touch_Key_Main_Function();
  80.                 }
  81.                   if(Flag.SetupStatus==1)
  82.                         {
  83.                         if(Alarm_Value<480)
  84.                          Alarm_Value++;
  85.                         }
  86.                 break;        
  87.                 }
  88.                 default:        break;
  89.                 }
  90.                 break;
  91.                                          }
  92.                                 }

  93.         KeyData = TKL_Get_AllKeyState();
  94.                                                 
  95.         if(KeyData & (1<<0)){  
  96.          
  97.         }
  98.         else
  99.         
  100.          
  101.         }
  102.       }
  103.      #endif
  104.     }
  105.   }
  106. }
  1. void GPIO_Configuration(void)
  2. {
  3.     CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  4.     CKCUClock.Bit.AFIO  = 1;
  5.     CKCUClock.Bit.PA    = 1;
  6.     CKCU_PeripClockConfig(CKCUClock, ENABLE);
  7.     CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  8.     CKCUClock.Bit.AFIO  = 1;
  9.     CKCUClock.Bit.PA    = 1;
  10.     CKCU_PeripClockConfig(CKCUClock, ENABLE);

  11.   AFIO_GPxConfig(HTCFG_LEDC_SEG0_GPIO_ID, HTCFG_LEDC_SEG0_AFIO_PIN, AFIO_FUN_LEDC);
  12.   AFIO_GPxConfig(HTCFG_LEDC_SEG1_GPIO_ID, HTCFG_LEDC_SEG1_AFIO_PIN, AFIO_FUN_LEDC);
  13.   AFIO_GPxConfig(HTCFG_LEDC_SEG2_GPIO_ID, HTCFG_LEDC_SEG2_AFIO_PIN, AFIO_FUN_LEDC);
  14.   AFIO_GPxConfig(HTCFG_LEDC_SEG3_GPIO_ID, HTCFG_LEDC_SEG3_AFIO_PIN, AFIO_FUN_LEDC);
  15.   AFIO_GPxConfig(HTCFG_LEDC_SEG4_GPIO_ID, HTCFG_LEDC_SEG4_AFIO_PIN, AFIO_FUN_LEDC);
  16.   AFIO_GPxConfig(HTCFG_LEDC_SEG5_GPIO_ID, HTCFG_LEDC_SEG5_AFIO_PIN, AFIO_FUN_LEDC);
  17.   AFIO_GPxConfig(HTCFG_LEDC_SEG6_GPIO_ID, HTCFG_LEDC_SEG6_AFIO_PIN, AFIO_FUN_LEDC);
  18.   AFIO_GPxConfig(HTCFG_LEDC_SEG7_GPIO_ID, HTCFG_LEDC_SEG7_AFIO_PIN, AFIO_FUN_LEDC);

  19.   AFIO_GPxConfig(HTCFG_LEDC_COM0_GPIO_ID, HTCFG_LEDC_COM0_AFIO_PIN, AFIO_FUN_LEDC);
  20.   AFIO_GPxConfig(HTCFG_LEDC_COM1_GPIO_ID, HTCFG_LEDC_COM1_AFIO_PIN, AFIO_FUN_LEDC);
  21.   AFIO_GPxConfig(HTCFG_LEDC_COM2_GPIO_ID, HTCFG_LEDC_COM2_AFIO_PIN, AFIO_FUN_LEDC);
  22.   AFIO_GPxConfig(HTCFG_LEDC_COM3_GPIO_ID, HTCFG_LEDC_COM3_AFIO_PIN, AFIO_FUN_LEDC);
  23.   }
  1. void BFTM_Configuration(void)
  2. {
  3.    CKCU_SetPeripPrescaler(CKCU_PCLK_BFTM0, CKCU_APBCLKPRE_DIV2);
  4.     CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
  5.     CKCUClock.Bit.BFTM0 = 1;
  6.     CKCU_PeripClockConfig(CKCUClock, ENABLE);
  7.    BFTM_SetCompare(HT_BFTM0, (SystemCoreClock >> 10));
  8.    BFTM_SetCounter(HT_BFTM0, 0);
  9.    BFTM_IntConfig(HT_BFTM0, ENABLE);
  10.    BFTM_EnaCmd(HT_BFTM0, ENABLE);
  11.   NVIC_EnableIRQ(BFTM0_IRQn);
  12. }
  1. void LEDC_Configuration(void)
  2. {
  3.   LEDC_InitTypeDef LEDC_InitStruct;
  4.   CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  5.   CKCUClock.Bit.LEDC       = 1;
  6.   CKCU_PeripClockConfig(CKCUClock, ENABLE);
  7.   LEDC_InitStruct.LEDC_ClockSource    = LEDC_SRC_PCLK;                                                  LEDC_InitStruct.LEDC_ClockPrescaler = HTCFG_LEDC_CLOCK_PRESCAL - 1;  
  8.   LEDC_InitStruct.LEDC_DutyClockNumber = HTCFG_LEDC_DUTY_CLOCK_NUMBER;
  9.   LEDC_InitStruct.LEDC_COMxEN = HTCFG_LEDC_COM1EN | HTCFG_LEDC_COM2EN |\
  10.                                 HTCFG_LEDC_COM3EN | HTCFG_LEDC_COM4EN;   /* Enable COMx

  11.   LEDC_InitStruct.LEDC_DeadTime = 0;
  12.   LEDC_Init(&LEDC_InitStruct);   
  13.   LEDC_SetPolarityMode(HTCFG_LEDC_COM1POL | HTCFG_LEDC_COM2POL | HTCFG_LEDC_COM3POL | HTCFG_LEDC_COM4POL,
  14.                        LEDC_SEG0POL | LEDC_SEG1POL | LEDC_SEG2POL | LEDC_SEG3POL |\
  15.                        LEDC_SEG4POL | LEDC_SEG5POL | LEDC_SEG6POL | LEDC_SEG7POL,
  16.                        COMMON_CATHODE);

  17.   LEDC_IntConfig(ENABLE);  
  18.   NVIC_EnableIRQ(LEDC_IRQn);
  19.   LEDC_Cmd(ENABLE);  
  20. }
  1. void UxART_Configuration(void)
  2. {
  3.     CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  4.     CKCUClock.Bit.AFIO                   = 1;
  5.     CKCUClock.Bit.HTCFG_UART_RX_GPIO_CLK = 1;
  6.     CKCUClock.Bit.HTCFG_UART_IPN         = 1;
  7.     CKCU_PeripClockConfig(CKCUClock, ENABLE);
  8.    GPIO_PullResistorConfig(HTCFG_UART_RX_GPIO_PORT, HTCFG_UART_RX_GPIO_PIN, GPIO_PR_UP);
  9.    AFIO_GPxConfig(HTCFG_UART_TX_GPIO_ID, HTCFG_UART_TX_AFIO_PIN, AFIO_FUN_USART_UART);
  10.    AFIO_GPxConfig(HTCFG_UART_RX_GPIO_ID, HTCFG_UART_RX_AFIO_PIN, AFIO_FUN_USART_UART);
  11.     USART_InitTypeDef USART_InitStructure = {0};
  12.     USART_InitStructure.USART_BaudRate = 9600;
  13.     USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;
  14.     USART_InitStructure.USART_StopBits = USART_STOPBITS_1;
  15.     USART_InitStructure.USART_Parity = USART_PARITY_NO;
  16.     USART_InitStructure.USART_Mode = USART_MODE_NORMAL;
  17.     USART_Init(HTCFG_UART_PORT, &USART_InitStructure);
  18.    NVIC_EnableIRQ(HTCFG_UART_IRQn);
  19.    USART_IntConfig(HTCFG_UART_PORT, USART_INT_RXDR, ENABLE);
  20.    USART_TxCmd(HTCFG_UART_PORT, ENABLE);
  21.    USART_RxCmd(HTCFG_UART_PORT, ENABLE);
  22.   NVIC_EnableIRQ(HTCFG_UART_IRQn);
  23.   USART_IntConfig(HTCFG_UART_PORT, USART_INT_RXDR, ENABLE);
  24.   USART_TxCmd(HTCFG_UART_PORT, ENABLE);
  25.   USART_RxCmd(HTCFG_UART_PORT, ENABLE);
  26. }
  1. void UxART_RxTest(void)
  2. {
  3. uint8_t i;
  4.   uint16_t temp;
  5.         uint16_t CRC;
  6.         CRC=0x00;        
  7.   if (gURRx_Length >= 6)
  8.   {
  9.                 for(i=0;i<5;i++)
  10.                 CRC +=gRx_Buffer;
  11.                 CRC &=0x00ff;
  12.                 if(CRC==gRx_Buffer[5])
  13.                 {
  14.                         temp=gRx_Buffer[3]<<8;
  15.                         temp |=gRx_Buffer[4];
  16.                         Temperature=BCD2HEX(temp);
  17.                 }
  18.     gURRx_Length = 0;
  19.   }
  20. }

  1. void LEDC_Disp(uint16_t data)
  2. {
  3.         DiapBuf[0]=NumberChar[data%1000/100];
  4.         DiapBuf[1]=NumberChar[data%100/10]|0x02;
  5.         DiapBuf[2]=NumberChar[data%10];
  6.         if(Flag.SetupStatus==1)
  7.                         DiapBuf[3]=0x40;
  8.                 else
  9.                 {
  10.                         DiapBuf[3]=0x68;
  11.                         if(Alarm_Value<Temperature)
  12.                                 Buzzer_Fun1();
  13.                                 HT32F_DVB_LEDOn(HT_LED1);
  14.                                 HT32F_DVB_LEDOff(HT_LED2);                        
  15.                                 HT32F_DVB_LEDOn(HT_LED3);
  16.                                 
  17.                 }
  18.         
  19.         LEDC_SetData(HTCFG_LEDC_COM_D1, DiapBuf[0]);
  20.   LEDC_SetData(HTCFG_LEDC_COM_D2, DiapBuf[1]);
  21.   LEDC_SetData(HTCFG_LEDC_COM_D3, DiapBuf[2]);
  22.   LEDC_SetData(HTCFG_LEDC_COM_D4, DiapBuf[3]);
  23. }
  1. void Buzzer_Fun1(void)
  2. {
  3. HT32F_DVB_LEDOn(HT_LED2);
  4. HT32F_DVB_LEDOff(HT_LED1);
  5. HT32F_DVB_LEDOff(HT_LED3);
  6. Buzzer_Init(0);
  7. Buzzer_Start(4, 3000, 150, 50);
  8. while (Buzzer_IsFinish() == FALSE);
  9. }


视频(这个视频链接一直弄不起来,管管有空帮忙看看我哪里操作错误

https://v.youku.com/v_show/id_XNTkwMzU2Mzk5Ng==.html?firsttime=30[/media

[media=x,500,375][/media]

    合泰的ESK32-30519 + ESK32-21001套件以其丰富的硬件和软件资源,为用户提供了一个方便实用的开发平台,使得开发者能以较短的时间开发出经济实用的好产品。
感谢21IC,感谢合泰提供这次难得的锻炼机会。





iamrookie 发表于 2022-9-23 15:43 | 显示全部楼层
楼主
视频没看到,想看看演示效果。
上传的代码可直接点选复制,这要如何做到? 要上传啥档案格式?

 楼主| sky.sun.zz 发表于 2022-9-23 19:16 | 显示全部楼层
本帖最后由 sky.sun.zz 于 2022-9-25 19:58 编辑
iamrookie 发表于 2022-9-23 15:43
楼主
视频没看到,想看看演示效果。
上传的代码可直接点选复制,这要如何做到? 要上传啥档案格式?

视频请用左键拉选链接复制,然后在浏览器的地址栏里点击右键,然后粘贴:
https://v.youku.com/v_show/id_XNTkwMzU2Mzk5Ng==.html?firsttime=30

[media=x,800,375][/media]
代码点击复制后,在你的编辑页面点击右键然后粘贴。
要上传word文件,需要打开上传窗口的高级选项,工具栏的最右下角的图标就是上传键。

无标题.png

eltonchang2001 发表于 2022-9-26 10:42 | 显示全部楼层
本帖最后由 eltonchang2001 于 2022-9-26 10:44 编辑

楼主的测温探头用何厂牌型号? 数位式吗? 有经过黑体校正过?
測溫探頭.PNG
 楼主| sky.sun.zz 发表于 2022-9-26 13:31 | 显示全部楼层
eltonchang2001 发表于 2022-9-26 10:42
楼主的测温探头用何厂牌型号? 数位式吗? 有经过黑体校正过?

向一个朋友索取的,不知道厂家,应该是有黑体校验的,测试人体温度能正确显示36-37°。只知道发送数据是USART方式,应该是数位式的。
eltonchang2001 发表于 2022-9-26 15:29 | 显示全部楼层
本帖最后由 eltonchang2001 于 2022-9-27 09:05 编辑

合泰也有推出「数字型的红外线测温模块」,通讯接口是 IIC、PWM 或 IO 输出
淘宝买得到样品,【淘宝优惠卷大放送】倍易创新电子商务(厦门)有限公司 - - 21ic电子技术开**坛
基础应用就是额温枪,扩展应用:测奶宝、关心健康鼠标、温控红外线理疗灯、电吹筒、电烤箱、洪干机、电冰箱、等.

紅1.PNG
紅2.PNG
紅3.PNG
紅4.PNG
Henryko 发表于 2022-10-4 19:58 | 显示全部楼层
用word上传就行了
 楼主| sky.sun.zz 发表于 2022-10-4 20:32 | 显示全部楼层
Henryko 发表于 2022-10-4 19:58
用word上传就行了

用WORD上传试过了,视频还是链接不上。谢谢
fentianyou 发表于 2022-10-9 22:04 | 显示全部楼层
测量人体的红外测温传感器有哪些              
claretttt 发表于 2022-10-9 22:19 | 显示全部楼层
非接触式传感器受空间局限性较小。
mattlincoln 发表于 2022-10-9 22:37 | 显示全部楼层
测量人体的红外测温传感器有哪些  
chenqianqian 发表于 2022-10-10 07:24 来自手机 | 显示全部楼层
额温很多时候都测不准
beacherblack 发表于 2023-1-5 13:07 | 显示全部楼层
可以使用ds18b20吗              
abotomson 发表于 2023-1-5 14:33 | 显示全部楼层
这个精度非常高吗?              
sesefadou 发表于 2023-1-5 15:40 | 显示全部楼层
怎么对测量的温度进行矫正呢?              
 楼主| sky.sun.zz 发表于 2023-1-5 16:52 | 显示全部楼层
sesefadou 发表于 2023-1-5 15:40
怎么对测量的温度进行矫正呢?

查表修正就可以了
rosemoore 发表于 2023-1-5 17:24 | 显示全部楼层
这个模块为什么是串口的模块呢?              
 楼主| sky.sun.zz 发表于 2023-1-5 17:26 | 显示全部楼层
来的时候就是串口模块
everyrobin 发表于 2023-1-6 17:37 | 显示全部楼层
之前用过这个ok,感觉离得远点就不准确了。
jimmhu 发表于 2023-1-9 17:26 | 显示全部楼层
是否会收到外部信号的干扰呢?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

732

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部