因2020疫情影响,国内突然就冒出来一堆做体温计的厂商。。。

硬件平台:nRF52832 + JHM3000

JHM3000是个单线通信的体温传感器芯片,线性度较好,校准后精度可达0.1度。

主要问题是通信是单IO输出,芯片上电后,IO就会不停地输出脉冲信号,需要MCU计算脉宽来解码数据。

每个采样周期为:2.8ms间隔 + 6ms数据传输

相邻两个高脉宽之比决定数据类型,START=3:3, BIT0=5:1, BIT1=1:5
数据样本:91,3,3,1,6,1,5,5,1,1,5,5,1,1,5,1,5,6,1,1,5,6,1,1,5,5,2,1,5,5,1,91,3,4,...
每次采样共1个START+14个BIT数据:S+BBBBBBBBBBBBB

解码数据的时候,需要先找到START数据,然后才开始解析采样数据。

下面是主要源码:

/*
* JHM3000 体温传感器驱动程序
* 每次采样2.8ms + 数据传输6ms
* 单线IO输出,相邻两个高脉宽之比决定数据,START=3:3, BIT0=5:1, BIT1=1:5
* 数据样本:61,4,3,1,5,1,6,5,1,1,6,5,1,1,5,1,5,1,5,6,1,1,5,6,1,5,1,1,6,1,5,
*           91,3,3,1,6,1,5,5,1,1,5,5,1,1,5,1,5,6,1,1,5,6,1,1,5,5,2,1,5,5,1,
*           91,3,4,...
* 每次采样共1个START+14个BIT数据:S+BBBBBBBBBBBBB
* 蒋晓岗<kerndev@foxmail.com>
* 2020.03.06
*/
#include <stdint.h>
#include <stdbool.h>
#include "log.h"
#include "bsp.h"
#include "sdk.h"//判断数据类型,错误返回0, 成功返回1,S位bit=-1,BIT10,BIT1返回1
static int decode_one_bit(uint32_t t1, uint32_t t2, int *bit)
{uint32_t diff;if((t1 + t2) > 10){LOG("t1=%d, t2=%d\r\n", t1, t2);return 0;}if(t1 > t2){diff = t1 - t2;if(diff > t2){*bit = 0;return 1;}}if(t2 > t1){diff = t2 - t1;if(diff > t1){*bit = 1;return 1;}}*bit = -1;return 1;
}//等待管脚电平跳变
static int wait_pin_state(int state, uint32_t timeout)
{uint32_t diff;uint32_t tick;diff = 0;tick = app_timer_cnt_get();timeout = timeout << 5; //1毫秒约等于32个时钟while(diff < timeout){if(nrf_gpio_pin_read(HM3000_PIN_DATA) == state){return 1;}else{app_timer_cnt_diff_compute(app_timer_cnt_get(), tick, &diff);}}return 0;
}//计算高电平时长
static int calc_pulse_width(uint32_t *pw)
{int ret;uint32_t diff;uint32_t tick;ret = wait_pin_state(1, 5);if(!ret){return 0;}tick = app_timer_cnt_get();ret = wait_pin_state(0, 5);if(!ret){return 0;}app_timer_cnt_diff_compute(app_timer_cnt_get(), tick, &diff);*pw = diff;return 1;
}//等待高电平结束
static int wait_for_idle(void)
{return wait_pin_state(0, 5);
}//等待ADC采样开始
//ADC采样有2.5ms高电平
static int wait_for_adc(void)
{int i;int ret;uint32_t pw;for(i=0; i<32; i++){ret = calc_pulse_width(&pw);if(!ret){return 0;}if(pw > 30){return 1;}}return 0;
}//接收一位数据
static int recv_one_bit(int *bit)
{int ret;uint32_t t1;uint32_t t2;ret = calc_pulse_width(&t1);if(!ret){return 0;}ret = calc_pulse_width(&t2);if(!ret){return 0;}return decode_one_bit(t1, t2, bit);
}//接收采样起始信号
static int recv_start_bit(void)
{int ret;int bit;ret = recv_one_bit(&bit);if(!ret){return 0;}return bit == -1;
}//接收采样数据
//数据=1位符号+13位数据
static int recv_adc_data(int *data)
{int i;int bit;int ret;int16_t tmp;tmp = 0;for(i=0; i<14; i++){ret = recv_one_bit(&bit);if(!ret){LOG("drv_hm3000: recv bit%d failed!\r\n", i);return 0;}if(bit < 0){LOG("drv_hm3000: recv bit%d invalid!\r\n", i);return 0;}if(bit){tmp |= 1 << (15 - i);}}//LOG("drv_hm3000: raw=%d\r\n", tmp);*data = tmp >> 2;return 1;
}//采样数据
static int sample_data(int *data)
{int ret;ret = wait_for_idle();if(!ret){LOG("drv_hm3000: wait idle timeout!\r\n");return 0;}ret = wait_for_adc();if(!ret){LOG("drv_hm3000: wait adc timeout!\r\n");return 0;}ret = recv_start_bit();if(!ret){LOG("drv_hm3000: recv start failed!\r\n");return 0;}ret = recv_adc_data(data);if(!ret){LOG("drv_hm3000: recv data failed!\r\n");return 0;}return ret;
}#if 0
//调试数据
static void dump_data(void)
{int i;static uint32_t time[100];for(i=0; i<64; i++){calc_pulse_width(&time[i]);}for(i=0; i<64; i++){LOG("%d,", time[i]);}LOG("\r\n");
}
#endif//读取采样数据
int drv_hm3000_read(int *data)
{//dump_data();//return 0;int ret;//uint8_t sr;//sd_nvic_critical_region_enter(&sr);ret = sample_data(data);//sd_nvic_critical_region_exit(sr);return ret;
}//打开芯片电源
void drv_hm3000_enable(void)
{nrf_gpio_pin_write(HM3000_PIN_PWR, 1);
}//关闭芯片电源
void drv_hm3000_disable(void)
{nrf_gpio_pin_write(HM3000_PIN_PWR, 0);
}//初始化驱动
void drv_hm3000_init(void)
{nrf_gpio_cfg_output(HM3000_PIN_PWR);nrf_gpio_cfg_input(HM3000_PIN_DATA, NRF_GPIO_PIN_NOPULL);nrf_gpio_pin_write(HM3000_PIN_PWR, 0);
}

JHM3000体温传感器驱动相关推荐

  1. 外设驱动库开发笔记13:MLX90614红外温度传感器驱动

    红外温度传感器一般用于非接触式的温度检测.在我们的系统中经常会有这样的需求.所以我们将其设计为通用的驱动库以备复用.这一篇我们将讲述MLX90614红外温度传感器驱动的设计与实现. 1.功能概述 ML ...

  2. ESP8266-Arduino编程实例-PIR(被动红外)传感器驱动

    PIR(被动红外)传感器驱动 1.PIR传感器介绍 被动红外传感器(PIR 传感器)是一种电子传感器,可测量从其视野内的物体辐射的红外 (IR) 光. 单个 PIR 传感器可检测照射在其上的红外辐射量 ...

  3. 体温高会折寿?温州大学学者发现体温比代谢率更会影响寿命,已在小鼠身上验证 | Nature子刊...

    明敏 发自 凹非寺 量子位 | 公众号 QbitAI 体温越高,寿命越短. 这是Nature子刊<Nature Metabolism>上最新发表的一项研究结论. 研究发现,在一定温度范围内 ...

  4. 鹅厂最新数字人,体温36.5℃

    鱼羊 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 今天是国际残疾人日,正巧,也是<国王排名>更新的日子. 这部42岁作者产出的作品,主角波吉正是一名聋哑人,画风不算成熟,却 ...

  5. 余承东:国内用华为P40 Pro+就能拍照测体温,还很精准

    雷刚 发自 凹非寺  量子位 报道 | 公众号 QbitAI 华为年度5G旗舰P40系列已经发布,但仍旧有许多小问号悬而未决. 不过就在欧洲发布会结束后,余承东接受外媒采访,对最受关注的一些问题给出了 ...

  6. 第四章 PX4-Pixhawk-MPU6000传感器驱动解析

    第四章MPU6000传感器驱动解析 Mpu6000是一个3轴加速度和3轴陀螺仪传感器,这一章节我们将对MPU6000这个传感器进行解析,依照这个解析步骤同样可以对L3GD20(3轴陀螺仪).HMC58 ...

  7. 第四章MPU6000传感器驱动解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. 第四章MPU6000传感器驱动解析 Mpu6000是一个3轴加速度和3轴陀螺仪传感器,这一章节我们将对MPU6000这个传感器进行解析,依照这个解 ...

  8. 外设驱动库开发笔记32:HLPM025K3 PM2.5传感器驱动

      现在人们对大气环境及室内环境都比较关注.PM2.5在生活中也是常见的词汇.在有些产品中就要求检测PM2.5的数值.检测PM2.5的手段多种多样,在要求不高时我们通常可以采用激光模块.在这一篇中,我 ...

  9. 外设驱动库开发笔记31:S-Modlue远红外气体传感器驱动

      在气体分析类产品中,我们经常会用到远红外气体传感器.我们就在碳氢类气体成分分析中使用了S-Modlue远红外气体传感器.接下来,我们将讨论S-Modlue远红外气体传感器驱动的设计与实现. 1.功 ...

最新文章

  1. matlab实验是啥,matlab实验心得体会
  2. 获取keras中间层输出、模型保存与加载
  3. oracle 排序的分析函数,Oracle分析函数用法详解
  4. linux系统服务总结之五:用lamp建一个自己的BBS(LINUX环境下)
  5. es6中新增对象的特性和方法
  6. HTTPS|SSL笔记-SSL双向认证成功握手过程(含wireshark分析)
  7. Maven : mvn dependency:copy-dependencies
  8. Java停车场管理系统使用栈和队列任务台程序
  9. 加载不了ajax,简单的jquery ajax内容加载不起作用
  10. 数据库减压--php+mysql+memcached模拟nosql
  11. 【译】Seaborn教程(二)选择配色方案
  12. 《数据资产管理实践白皮书3.0》发布!(附全文下载)
  13. ESN学习笔记——echotorch(1)介绍
  14. 算法复习-Akari Puzzle
  15. 路由token验证和路由守卫~~狂徒李四
  16. image-rendering 像素化图像像素(实验中)
  17. 日常开发记录-'npm' 不是内部或外部命令,也不是可运行的程序 或批处理文件。...
  18. Golang Log日志库
  19. 【EMNLP 2021】SimCSE:句子嵌入的简单对比学习 【CVPR 2021】理解对比学习损失函数及温度系数
  20. 【arXiv2022】GroupTransNet: Group Transformer Network for RGB-D Salient Object Detection

热门文章

  1. 【Scala】学习笔记三——面向对象
  2. 搭建github博客错误汇总
  3. 【动态规划DP】弹簧板
  4. minst手写数字识别(带界面)
  5. BAT 批处理脚本 教程
  6. 使用meb工具在线热备,将单实例切换为主从
  7. Kymeta加入美国陆军装甲旅战斗队试点项目
  8. vue3 watch监听在组件初次加载的时候执行
  9. 基于双曝光与数值计算法全息干涉相位畸变补偿实例分析
  10. 【ML】Apriori算法原理及代码实现