基于 Arduino 单片机的家庭健康检测系统设计

编程入门 行业动态 更新时间:2024-10-14 00:24:45

基于 Arduino <a href=https://www.elefans.com/category/jswz/34/1769836.html style=单片机的家庭健康检测系统设计"/>

基于 Arduino 单片机的家庭健康检测系统设计

       

本文介绍一个自己做的项目使用Arduino 单片机,实现温度、湿度、烟雾浓度、血氧测量,并凭借机智云平台实现WIFI 通讯,可以通过网页、手机APP查看实时的数据信息,本文来自己的本科毕业设计,各个门口介绍的都比较详细例如Arduino UNO R3、DHT11 温湿度传感器、 MQ-2 烟雾浓度传感器、MAX30102 血氧模块、OLED 显示屏、ESP8266WIFI 模块,自己做的时候遇到不少困难,网上系统的说明比较少,希望本文可以给大家带来一些帮助。

1.摘要

        伴随着科技的不断进步,生活水平日益提升,越来越多的人意识到家庭健康检测 的重要性。许多健康问题是因为长期身处不适环境所致,为了实现对住房内的温度、 湿度、烟雾浓度和家庭成员的血氧含量进行实时的检测和查看,本文设计一种基于 Arduino UNO R3 单片机的家庭健康检测系统。本设计利用 DHT11 温湿度传感器、 MQ-2 烟雾浓度传感器对住房内的环境进行实时检测,利用 MAX30102 血氧模块检测 人体血氧含量,并使用 OLED 显示屏对检测到的各项数据进行实时显示,此外利用 WIFI 模块与网络连接,可以通过手机 APP 远程检测各个数据信息,当住房内的烟雾 浓度超过设定的阈值时,警报模块里的蜂鸣器会发出警报,提醒开启空气净化,提高 空气质量,可有效的降低火灾的发生。

1 主控模块微控制器的选择

常见的 Arduino 开发板有 Arduino UNO R3、Arduino Mega 2560、Arduino Nano、 Arduino Due、Arduino Yun 等。经过对比分析,本次设计采用 Arduino UNO R3 开发 板。在 Arduino UNO R3 开发板上,使用 Atmega328 单片机作为核心,具有多项功能。 它包含 14 个数字 IO 端口,标号为 0 到 13,其中 6 个端口可用于 PWM 信号输出。 此外,还有 6 个模拟输入端口,标识为 A0~A5,可用于数字信号输入和输出。该设备 还拥有 1 个 16MHz 的晶体振荡器、1 个 USB 接口、1 个 DC 电源插座、1 个 ICSP 头 以及 1 个复位按钮。更多详细参数可以参考下表 4.1 所示。

Arduino UNO R3 是一款非常流行的开源硬件平台,其性能优点如下: 易于学习和使用:Arduino UNO R3 采用非常简单的编程语言和开发环境,使得 初学者也可以很快地上手进行开发。 低成本:Arduino UNO R3 的价格非常实惠,比其他开发板便宜得多,因此可以 说是一款非常经济实惠的开发板。 大量库文件:Arduino UNO R3 具有大量的库文件,可以轻松地完成各种任务, 例如控制各种传感器、执行各种操作等等。 易于扩展:Arduino UNO R3 具有非常灵活的设计,可以通过连接各种扩展板和 模块来扩展其功能。 开放源代码:Arduino UNO R3 是一个完全开源的平台,这意味着用户可以自由 地使用、修改和分享代码。这也使得开发人员更容易找到解决方案,以满足他们的需求。

       简便的调试工具:Arduino UNO R3 具备丰富的调试功能,可帮助开发者快速定 位问题并解决。 综上所述,Arduino UNO R3 作为一款强大的开源硬件平台,具有易于学习、低 成本、大量库文件、易于扩展、开放源代码以及简便的调试工具等优点。这些性能优 点使得 Arduino UNO R3 成为众多开发者和爱好者的首选开发板,并在各种应用领域 得到了广泛的应用。Arduino UNO R3 单片机实物图如图 4.1 所示。

.2 各个模块的电路设计

.2.1 温湿度测量模块电路设计

         本设计温度、湿度的测量使用广州奥松有限公司生产的一款温湿度一体化数字传 感器 DHT11,实物图如下图 4.2。该传感器由数字信号输出,可以有效降低由于干扰 造成的测量误差,有着很高的可靠性和稳定性[12]。封装后的产品为 4 针单排引脚,连 接方便,应用简单。DHT11 数字温湿度传感器核心原件包含 1 个电阻式感湿元件和 1个负温度系数热敏电阻,内置算法芯片通过读取上述两元件的数值,计算出对应的温 度和湿度通过 DOUT 口输出。

        温湿度传感器 DHT11 采用单线双向的串行接口,一次通讯时长 4 毫秒左右,每 次通讯数据传输为 40bit,高位优先,包含 8bit 湿度整形数据、8bit 湿度小数数据、 8bit 温度整形数据、8bit 温度小数数据和 8bit 校验位。

        与 Arduino UNO 单片机使用杜邦线连接,其中 VCC 引脚与单片机的 5V 电压输 出引脚相连;GND 引脚与单片机的 GND 引脚相连;N/A 引脚为空脚,不接置空; DATA 引脚为串行数据引脚的总线,接单片机的数字量 IO 口。 模拟接线如下图 4.3 所示。

2.2 烟雾浓度测量与警报电路设计

        本设计烟雾浓度测量使用 MQ-2 型烟雾传感器,本传感器使用的气敏材料是二 硫化锡,表现为在清洁空气中电导率较低,在烟雾浓度较高时电导率随之上升,同 时内部电路根据二硫化锡的电导率的变化,确定周围环境的烟雾浓度,并通过输出 引脚输出测量数值。

MQ-2 烟雾浓度模块一共有四个引脚和一个阈值调节旋钮,四个引脚分别是 VCC、 GND、DO、AO,前两个引脚为供电端口其中 VCC 端口接+5V 电压,AO 端口是模 拟量输出端,以模拟量的形式输出烟雾浓度的数值,DO 端口有 0V 和 5V1 输出状态, 当烟雾浓度小于预先设定阈值时,DO 端输出+5V;当烟雾浓度大于设定阈值时,DO 端输出 0V,阈值通过调节旋钮设定。MQ-2 烟雾浓度模块如图 4.4 所示。

烟雾浓度警报工作由蜂鸣器、继电器承担,蜂鸣器仅有正极和负极两个引脚,当 两引脚之间存在大于工作阈值的正向电压时,蜂鸣器工作;反之蜂鸣器不工作,继电 器如图所示,一共有六个引脚,分别是 VCC、GND、IN、NO、COM、NC。VCC 和 GND 为驱动引脚,IN 引脚为控制输入端,有高电平输入时 NO 和 COM 两端口导通, NC 和 COM 两端口断开;相反当 IN 引脚有低电平输入时,NO 和 COM 两端口断开, NC 和 COM 两端口导通。蜂鸣器由继电器驱动,MQ-2 模块的 DO 引脚和继电器 IN 引脚相连,继电器 COM 端接+5V 电压,NC 端接蜂鸣器的正极,蜂鸣器的负极接 GND, 烟雾浓度的改变改变 DO 引脚的输出,即可实现当烟雾浓度大于阈值浓度时 COM 端 与 NC 端导通,蜂鸣器工作发出警报,烟雾浓度小于阈值浓度蜂鸣器则不工作。蜂鸣 器如图 4.5 所示。

本部分的连接方式如图 4.6 所示

2.3 血氧测量模块电路设计

本设计的血氧测量使用心率血氧模块 MAX30102,该传感器能够实现血氧和心率 的测量,可以满足设计需求。MAX30102 传感器是一种可以用于测量血氧饱和度𝑆𝑎𝑂2 的设备,其发光部分由红光 LED(660nm)和红外光 LED(880nm)组成。接收部分 包括一个对可见光和红外光敏感的光电二极管和一个环境光消除电路。经过 18 位 ADC 采样转化和数字滤波后,数据将被存储在寄存器中,并通过 I2C 总线传输给外 部 MCU 读取。

为了满足 LED 瞬间大电流的需求,LED 电源与其他部分的电源是独立的。此外, 在电源引脚附近应该加入大电容以减轻对电源电压的影响。为了实现低功耗,AD 转 换和 I2C 总线部分需要较低的电压。光源采用与血液中氧合血红蛋白 HbO2 和血红蛋 白 Hb 有着特定选择的波长,这样就可以把血液的血氧含量的测定转化为对血液中透 光率的测量,透光率由电信号反馈,根据接收反馈的电信号,即可实现对血氧的检测。 如公式(1)

2.4 OLED 显示屏模块电路设计

与 LCD 不同,OLED 无需背光源,功耗较低,非常适合小系统。此外,OLED 还 具有很高对比度、响应速度快等优点,可用于多种面板,使用范围广,结构简单易制 造。OLED 模块可以在 3.3V 或 5V 下工作,并具有多种控制指令,可方便地控制亮 度、开关升压电路等。此外,OLED 还能够显示汉字、ASCII 字符和图案,预留的 4 个 M3 固定孔也方便用户将其固定在机壳上。本设计使用 4 针 096 寸 OLED 显示屏, 如图 4.9 所示。

该模块一共有四个引脚,引脚说明如表 4.3 所示

2.5 WIFI 通信模块电路设计

本设计采用 ESP8266-01SWIFI 通讯模块。该模块由上海乐鑫科技生产,它具有 小巧的体积和低成本的特点,同时 ESP8266-01S 模块支持 802.11b/g/n 协议,可实现 高速无线网络连接,广泛应用于物联网、智能家居、远程控制等领域。ESP8266 有三 种工作模式,分别是 STA 模式、AP 模式和 STA+AP 模式[14]。 本设计使用 STA 模式。STA 模式是指 ESP8266 作为一个客户端连接到一个已经 建立好的 WIFI 网络中,从而实现与外界网络的通信[15]。在这个模式下,ESP8266 只 有一个 IP 地址,无法作为 WIFI 热点。转串口下载器如图 4.11 所示,ESP8266 模块 如图 4.12 所示,

本章小结

本章首先介绍了主控模块控制器的选型,并对所选择的芯片进行了详细介绍。之 后介绍了硬件部分的设计方案,并详细说明了对温湿度模块、烟雾浓度测量与警报电 路模块、血氧显示模块、OLED显示屏模块、WIFI通信模块、等硬件部分的设计。

3、软件原理与设计

1.开发环境介绍

Arduino IDE 是一种用于编写、上传和调试 Arduino 开发板程序,集成开发环境 (IDE)。它提供了一个图形用户界面和一个文本编辑器,使用户可以轻松地编写和修 改 Arduino 代码。此外,Arduino IDE 还提供了一个库管理器,允许用户下载并安装 各种已经编写好的程序库,为用户节省了大量时间和精力。同时它支持多种编程语言, 包括 C++和 Wiring 语言。用户可以使用这些语言编写程序,并通过 USB 接口将程序 上传到 Arduino 开发板中运行。Arduino IDE 还自带了一个串口监视器。总的来说, Arduino IDE 易于使用、灵活且功能强大,是很多电子爱好者和初学者的首选开发环 境。

2 模块程序设计

2.1 温湿度测量模块程序设计

温湿度测量使用到 DHT11 温湿度测量模块,在 Arduino UNO 单片机开发使用此 模块需要包含 dht11 模块的头文件,使用该头文件就可以省去很多繁杂的程序设计, 我们只需要单独下载 dht11 的文件库,然后把文件库放到 libraries 文件下即可。如下 图 5.1 所示

之后我们定义相关变量和数据的输入输出口,本模块单独使用时,串口的波特率, 即串口的数据传输速率设定为每秒 9600 个字符即可。本设计定义单片机 2 号引脚为数字量输入口,使用 read 函数读取输入引脚上的数据,由串口通信函数将数据传输 给串口,通过串口监视器检测是否实现预想功能。

根据模拟实物图连接实物图,将 DHT11 的 1 号引脚接 Arduino 单片机的 VCC; 2 号引脚接单片机 2 号数字 IO 引脚,4 号引脚接 GND,最后将 Arduino 单片机通过 数据线连接在电脑,实物接线图如下图 5.2 所示

#include<dht11.h> //包含头文件
#define DHT11PIN 2 //引脚定义
dht11 DHT11; //传感器定义
int hum; //变量湿度定义
int tem; //变量温度定义
void setup()
{
pinMode(A0,INPUT);
Serial.begin(9600);
}
void loop()
{
Serial.println("\n");
int chk=DHT11.read(DHT11PIN); //温湿度的测量读取
Serial.print("Humidity(%):");
Serial.println(DHT11.humidity); //串口中显示湿度
Serial.print("Temperature(oC):");
Serial.println(DHT11.temperature); //串口中显示温度
delay (1000);
}

打开串口监视器,如下图 5.3 所示,由图可以看到已经测量到室内的温度和湿 度,经过检测可以达到设计要求。

.2.2 烟雾浓度模块程序设计

烟雾浓度测量使用的是 MQ-2 传感器,本传感器是模拟量输出,将模块的输出引 脚接单片机模拟量输入输出引脚 A0,使用 analogRead()函数读取 A0 引脚上的数据信 息,然后利用串口函数将数据传送到串口监视器,即可实现通过串口监视器检测室内 的烟雾浓度[16]。实物图连接时根据虚拟设计图连接,实物图连接如上图 5.4 所示。

MQ-2 模块 VCC、GND 引脚分别接与单片机的 VCC 和 GND 相连,AO 引脚接 单片机的模拟量输入输出口 A0,DO 引脚接继电器的 IN 口,由继电器驱动蜂鸣器, 当烟雾浓度大于设定烟雾阈值浓度时,DO 引脚的输出发生改变,从而改变继电器的 状态,使蜂鸣器工作,烟雾阈值可以通过用螺丝刀调节旋钮改变。 MQ-2 模块的输入为模拟量,直接可以读取,不需要包含特殊的头文件,将模拟 量输出接入 A0 引脚,单片机通过函数读取烟雾浓度。程序代码如下。

void setup()
{
Serial.begin(9600);
}
void loop()
{
int smo;
smo = analogRead(0);//烟雾浓度读取
Serial.print("smoke:");
Serial.println(smo,DEC);//串口显示
delay(100);
}

通过串口监视器观看测量结果,如图 5.5 所示。

2.3 血氧采集模块程序设计

本设计血样采集模块 MAX30102,通过发出红光和红通过测量血液的透光度,从 而测量出血液中的血氧含量,模块通过串口通讯 SDA、SLC 引脚传给开发板,本模 块程序设计时需要包含 Wire、MAX30105 和 heartRate 三个头文件,可以在库文件中 搜索安装,也可以提前下载好后将头文件放在 libraries 文件下,本模块的实际接线图 如下图 5.6 所示。

本设计使用到的 MAX30102 模块的引脚一共有四个,分别是 VCC、GND、SCL 和 SDA,这里为了避免和 OLED 显示屏引脚的冲突,这里 SCL 和 SDA 引脚接在 A4、 A5 引脚。头文件包含 MAX30105、heartRate、Wire 的文件库。编写程序使得在没有 手指按压的时候输出提示 No finger 的提示语,如果血氧模块出了问题,会输出 MAX30105 was not found。部分程序如下所示。

void setup()
{Serial.begin(9600);Serial.println("Initializing...");if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {Serial.println("MAX30105 was not found. Please check wiring/power. ");while (1);}Serial.println("Place your index finger on the sensor with steady pressure.");particleSensor.setup();particleSensor.setPulseAmplitudeRed(0x0A)
particleSensor.setPulseAmplitudeGreen(0);
}

打开串口监视器可以查看测量结果,其程序运行结果如下图 5.7 所示:

图中 IR 便是血氧值,未检测到手指时会在每次输出后给出提示语,提醒需要测 量血氧需要把手指按压在测量传感器上。

2.4 OLED 显示屏模块程序设计

本设计使用的 OLED 显示屏是 0.96 寸四针式,分辨率为 128*64,驱动芯片为 SSD1306,需要在屏幕上显示的数据信息由串口通信 SCL 和 SDA 引脚传输。实物 连接图如下图 5.8 所示

程序需要调用,U8glib 的头文件,需要显示的信息在 draw 函数中编写,使用 u8g 类内函数 drawStr 函数在屏幕上设置提示语和提示语显示的位置坐标,使用类内函数 setPrintPos 函数设定变量数值显示的位置坐标,用类内函数 Print 输出变量数值。程 序如下所示。

void draw()
{//烟雾显示
u8g.setFont(u8g_font_unifont);
u8g.drawStr(20,25,"Smoke:");
u8g.setPrintPos(70,25);
u8g.print(smo);
//温湿度显示
u8g.drawStr(20,40,"Hum:");
u8g.setPrintPos(70,40);
u8g.print(DHT11.humidity);
u8g.drawStr(20,55,"Tem:");
u8g.setPrintPos(70,55);
u8g.print(DHT11.temperature);//血氧显示
u8g.drawStr(20,10,"IR:");
u8g.setPrintPos(50,10);
u8g.print(xue);
}

该模块配合其他传感器模块同时使用,用于显示其他传感器的数值信息。

2.5 WIFI 模块程序设计

无线 WIFI 模块是将本设计测量数据,通过 WIFI 通讯传送到云端,用户可以使 用手机无距离限制的查看数据信息。本设计使用到云端是机智云平台,该平台有配套 的 APP 和调试软件。第一步使用机智云的刷固态软件,将机智云的固态下载到ESP8266 内。如图 5.9 所示是刷固态页面,显示下载完成的提示即可,需要特别注意 的是在固态下载时,IO0 口需要接转串口模块 GND 引脚

下载固态时需要事先下载所需的机智云固态和固态下载软件,可以从机智云官网 中下载,从固态下载软件中寻找到需要烧写进 ESP8266 芯片的固态文件,选择串口 端口,具体端口从电脑设备监视器中查询,本次是 COM3 串口,点击 ASTART 开始 键,开始下载,等待下载完成,拔下串口下载器,固态组件烧写完成。 第二步在机智云平台中创建自己所需要的项目,根据不同的数据类型,创建不同 的数据类型,设定不同的数据点和数据点的数据范围,如图 5.10 所示

在项目基本信息中查看密钥并提前保存,在项目服务中选择 MCU 开发,选择独 立 MCU 开发,硬件选择 ArduinoUNOR3 将提前复制好的密钥粘贴到所需密钥区域 内,让机智云平台自动生成所需程序,图 5.11 所示。

将生成的代码包 Gizwits 放到 Arduino IDE 程序文件 libraries 文件中,如图 5.12 所示,打开 Arduino IDE 应用在实例中便可以找到两个机智云的示例,如图 5.13 所 示,对两个不同的示例文件进行整合便得到我们所需要的 ESP8266 所需要的文件代 码。

第三步进行机智云项目的配网,本步骤需要用到串口调试助手,可以在机智云官 网下载中心中下载安装,配网时用户要与 ESP8266 所连接的电脑连接同一 WIFI,本 设计采用 Airlink 一键配网模式配网,如图 5.14 所示,配网结束后可以实现,使用流 量访问本系统的数据信息,避免了蓝牙连接的距离限制。

配网时,串口选择 CH340 协议串口,波特率为默认值,打开串口,先初始化然 后开启 Airlink 模式,在手机 APP 中使用一键配网,可搜索到自己的项目,如图 5.15 所示。

本章小结

本章首先介绍了软件开发环境,然后概述每个模块程序电路设计的部分,包括温 湿度测量模块程序设计、烟雾浓度模块程序设计、血样采集模块程序设计、OLED 显 示屏模块设计和 WIFI 模块程序设计。

4     综合测试与调试

本设计使用实物进行调试与测试,在面包板上使用多邦线将各个模块相连接,在 面包板上进行实物连接和测试,方便线路的修改与调试。将实物按照实现设计好的原 理图进行连接,如图 6.1 所示,保证连接的正确性,将 Arduino UNO 单片机用数据线 与电脑相接,将事先编写好的程序,编译没有错误后下载到单片机内,需要说明的是 在下载前要先从单片机上拔下 ESP8266 模块,防止发生引脚冲突,而导致下载失败。

按照上图连接实物图如下图 6.2 所示。

2 各个模块的测试与调试

2.1 OLED 显示屏模块测试与调试

本设计用户使用显示模块观察各个传感器的数值信息,其中需要调试部分主要 是调整各个数值,在屏幕上的显示坐标,通过改变显示代码里相应坐标即可,如图6.3 所示。

u8g.setFont(u8g_font_unifont);
u8g.drawStr(20,25,"Smoke:");//烟雾提示语坐标设定
u8g.setPrintPos(70,25);//烟雾数值显示坐标
u8g.print(smo);
u8g.drawStr(20,40,"Hum:");//湿度提示语坐标设定
u8g.setPrintPos(70,40);//湿度数值显示坐标
u8g.print(DHT11.humidity);
u8g.drawStr(20,55,"Tem:");//温度提示语坐标设定
u8g.setPrintPos(70,55);//温度数值显示坐标
u8g.print(DHT11.temperature);
u8g.drawStr(20,10,"IR:");//血氧提示语坐标设定
u8g.setPrintPos(50,10);//血氧数值显示坐标
u8g.print(xue)

 

2.2 WIFI 通讯模块测试与调试

本设计测试 WIFI 通讯是否成功,完成固态安装和配网,将 WIFI 模块接入系统 运行程序,打开手机 APP 进入自己的项目观察数据,由于数据传输由些许延迟,但 数据信息应接近,起伏规律相同,如图 6.4 所示。

2.3 温湿度模块测试与调试

当手指捏住温湿度传感器时,一段时间后期可以看到温度与湿度的值在逐渐上 升,如图 6.5 所示。

2.4 烟雾浓度模块和警报电路测试与调试

当烟雾浓度改变时,可以看到显示器上的烟雾浓度数值的变化,当烟雾浓度超 过阈值浓度时,蜂鸣器会发出警报,如图 6.6 所示

2.5 血氧模块测试与调试

血氧模块上没有手指按压时,血氧数值接近于 0,手指按压血氧模块观察到显 示屏和 APP 页面看到血氧信息,如图 6.7 所示。

本章小结

本章主要对本设计的实物进行了检测与调试。先按照系统的设计方案,将实物图 连接,检查无误后,首先对 OLED 显示模块进行了调试,主要调整数据显示在屏幕上 的位置;其次对 WIFI 通讯进行了调试,主要调整数据点的范围;之后依次对系统进 行了温湿度测量装置调试、烟雾浓度测量与警报装置调试、血氧测量装置调试

附 录

项目程序

//无线通信的初始化
#include <Gizwits.h>
#include <Wire.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(A2, A3); // A2 -> RX, A3 -> TX
Gizwits myGizwits;
#define KEY1 6
#define KEY2 7
#define KEY1_SHORT_PRESS 1
#define KEY1_LONG_PRESS 2
#define KEY2_SHORT_PRESS 4
#define KEY2_LONG_PRESS 8
#define NO_KEY 0
#define KEY_LONG_TIMER 3
unsigned long Last_KeyTime = 0;#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred
int abc=1150;
float xue;
float beatsPerMinute;
long irValue=10;
//温度、湿度、烟雾、屏幕的初始化
#include<U8glib.h>
#include<dht11.h>
dht11 DHT11;
#define DHT11PIN 2
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
int smo;
int hum;
int tem;
unsigned long gokit_time_s(void)
{return millis() / 1000;
}
char gokit_key1down(void)
{unsigned long keep_time = 0;if (digitalRead(KEY1) == LOW){delay(100);
if (digitalRead(KEY1) == LOW){keep_time = gokit_time_s();while (digitalRead(KEY1) == LOW){if ((gokit_time_s() - keep_time) > KEY_LONG_TIMER){Last_KeyTime = gokit_time_s();return KEY1_LONG_PRESS;}} //until open the keyif ((gokit_time_s() - Last_KeyTime) > KEY_LONG_TIMER){return KEY1_SHORT_PRESS;}return 0;}return 0;}return 0;
}
char gokit_key2down(void)
{unsigned long keep_time = 0;if (digitalRead(KEY2) == LOW){delay(100);if (digitalRead(KEY2) == LOW){keep_time = gokit_time_s();while (digitalRead(KEY2) == LOW) //until open the key{if ((gokit_time_s() - keep_time) > KEY_LONG_TIMER){Last_KeyTime = gokit_time_s();return KEY2_LONG_PRESS;}}if ((gokit_time_s() - Last_KeyTime) > KEY_LONG_TIMER){return KEY2_SHORT_PRESS;}return 0;}return 0;}return 0;
}
char gokit_keydown(void)
{char ret = 0;ret |= gokit_key2down();ret |= gokit_key1down();return ret;
}
void KEY_Handle(void)
{/* Press for over than 3 second is Long Press */switch (gokit_keydown()){case KEY1_SHORT_PRESS:mySerial.println(F("KEY1_SHORT_PRESS , Production Test Mode "));myGizwits.setBindMode(WIFI_PRODUCTION_TEST);break;case KEY1_LONG_PRESS:mySerial.println(F("KEY1_LONG_PRESS ,Wifi Reset"));myGizwits.setBindMode(WIFI_RESET_MODE);break;case KEY2_SHORT_PRESS:mySerial.println(F("KEY2_SHORT_PRESS Soft AP mode"));myGizwits.setBindMode(WIFI_SOFTAP_MODE);//Soft AP modebreak;case KEY2_LONG_PRESS:mySerial.println(F("KEY2_LONG_PRESS ,AirLink mode"));myGizwits.setBindMode(WIFI_AIRLINK_MODE);//AirLink modebreak;default:break;}
}
void wifiStatusHandle()
{if(myGizwits.wifiHasBeenSet(WIFI_SOFTAP)){mySerial.println(F("WIFI_SOFTAP!"));}if(myGizwits.wifiHasBeenSet(WIFI_AIRLINK)){mySerial.println(F("WIFI_AIRLINK!"));}if(myGizwits.wifiHasBeenSet(WIFI_STATION)){mySerial.println(F("WIFI_STATION!"));}if(myGizwits.wifiHasBeenSet(WIFI_CON_ROUTER)){mySerial.println(F("WIFI_CON_ROUTER!"));}if(myGizwits.wifiHasBeenSet(WIFI_DISCON_ROUTER)){mySerial.println(F("WIFI_DISCON_ROUTER!"));}if(myGizwits.wifiHasBeenSet(WIFI_CON_M2M)){mySerial.println(F("WIFI_CON_M2M!"));}if(myGizwits.wifiHasBeenSet(WIFI_DISCON_M2M)){mySerial.println(F("WIFI_DISCON_M2M!"));}
}
//wifi 赋值程序
void Wifiwrite()
{
unsigned long varW_temperature = DHT11.temperature;//Add Sensor Data CollectionmyGizwits.write(VALUE_temperature, varW_temperature);unsigned long varW_humidity = DHT11.humidity;//Add Sensor Data CollectionmyGizwits.write(VALUE_humidity, varW_humidity);unsigned long varW_smoke_scope = smo;//Add Sensor Data CollectionmyGizwits.write(VALUE_smoke_scope, varW_smoke_scope);unsigned long varW_blood_oxygen = xue;//Add Sensor Data CollectionmyGizwits.write(VALUE_blood_oxygen, varW_blood_oxygen);
}
//屏幕显示
void draw()
{//烟雾显示
u8g.setFont(u8g_font_unifont);
u8g.drawStr(20,25,"Smoke:");
u8g.setPrintPos(70,25);
u8g.print(smo);
//温湿度显示
u8g.drawStr(20,40,"Hum:");
u8g.setPrintPos(70,40);
u8g.print(DHT11.humidity);
u8g.drawStr(20,55,"Tem:");
u8g.setPrintPos(70,55);
u8g.print(DHT11.temperature);
//血氧显示
u8g.drawStr(20,10,"IR:");
u8g.setPrintPos(50,10);
u8g.print(xue);
}
void Serialwrite()
{
xue=irValue/abc;
if (irValue < 50000)Serial.print(" No finger?");Serial.print("IR(%)=");Serial.println(xue);//温湿度的测量读取
Serial.println("\n");
int chk=DHT11.read(DHT11PIN);
//串口中显示烟雾浓度、温湿度
Serial.print("Humidity(%):");
Serial.println(DHT11.humidity);
Serial.print("Temperature(oC):");
Serial.println(DHT11.temperature);
delay (1000);
//烟雾浓度测量读取
smo = analogRead(A0);
Serial.print("smoke:");
Serial.println(smo);
}
void Blood_chushi()
{Serial.println("Initializing...");// Initialize sensorif (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz 
speed{Serial.println("MAX30105 was not found. Please check wiring/power. ");while (1);}Serial.println("Place your index finger on the sensor with steady pressure.");particleSensor.setup(); //Configure sensor with default settingsparticleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor 
is runningparticleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
}
void Blood_jisuan()
{//心率血氧irValue = particleSensor.getIR();
}
void setup() {mySerial.begin(115200);pinMode(KEY1, INPUT_PULLUP);pinMode(KEY2, INPUT_PULLUP);myGizwits.begin();mySerial.println("GoKit init OK \n");Serial.begin(9600);Blood_chushi();pinMode(A0,INPUT);
}
void loop()
{ 
//血氧计算Blood_jisuan();//串口显示Serialwrite();
//OLED 显示
u8g.firstPage();
do
{draw();
}
while(u8g.nextPage());
delay(500);Wifiwrite();//wifi 赋值KEY_Handle();//key handle , network configurewifiStatusHandle();//WIFI Status HandlemyGizwits.process();
}

更多推荐

基于 Arduino 单片机的家庭健康检测系统设计

本文发布于:2024-02-11 19:39:57,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1682986.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:单片机   检测系统   家庭   健康   Arduino

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!