1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
| //4.0,test.ino
// 定义DHT11相关参数
DHT dht(DHTPIN, DHTTYPE);
// 全局变量 float temperature; float humidity; int32_t o2; int8_t validO2; int32_t heart; int8_t validHeart;
// WiFi设置 const char* ssid = "WIFI名称"; const char* password = "WIFI密码";
// 接收到命令后上发的响应topic const char* Iot_link_MQTT_Topic_Report = "$oc/devices/设备ID/sys/properties/report"; const char* topic_Commands_Response = "$oc/devices/设备ID/sys/commands/response/request_id=";
// 华为云接入地址 const char* mqttServer = ""; //华为云matt接入hostname // 接入端口 const int mqttPort = ;//输入mqtt接入端口
// MQTT连接参数 const char* clientId = "";//设备MQTTcilentId const char* mqttUser = "";//设备MQTT UserName const char* mqttPassword = "";//设备MQTT Password
// 定义一个安全的WiFi客户端用于MQTTS连接 WiFiClientSecure espClient; // 定义MQTT客户端 PubSubClient client(espClient);
// 手动定义 I2C_SPEED_FAST,如果库中没有定义
MAX30105 particleSensor;
// 避免 BUFFER_SIZE 重复定义,修改为 MY_BUFFER_SIZE
uint32_t irBuffer[MY_BUFFER_SIZE]; uint32_t redBuffer[MY_BUFFER_SIZE];
// 设置u8g2对象,根据实际的OLED型号和I2C地址进行修改 U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 14, /* data=*/ 12, /* reset=*/ U8X8_PIN_NONE);
void setup() { Serial.begin(115200); // 连接WiFi网络 WiFi.begin(ssid, password); Serial.print("Connecting to "); Serial.print(ssid); Serial.println(" ...");
int i = 0; while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print(i++); Serial.print(' '); }
Serial.println(""); Serial.println("Connection established!"); Serial.print("IP address: "); Serial.println(WiFi.localIP());
espClient.setInsecure(); // 忽略SSL证书验证,实际使用建议配置正确证书 client.setServer(mqttServer, mqttPort);
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) { Serial.println("传感器未找到"); while (1); }
byte ledBrightness = 0x1F; byte sampleAverage = 4; byte ledMode = 2; byte sampleRate = 200; int pulseWidth = 411; int adcRange = 4096;
particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); particleSensor.setPulseAmplitudeRed(0x1F); particleSensor.setPulseAmplitudeIR(0x1F);
// 初始化DHT11传感器 dht.begin();
// 初始化OLED u8g2.begin(); u8g2.setFont(u8g2_font_ncenB08_tr); }
void MQTT_Init() { // MQTT服务器连接部分 client.setServer(mqttServer, mqttPort); client.setKeepAlive(120); while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect(clientId, mqttUser, mqttPassword)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(1000); } } }
void MQTT_POST() { char jsonBuf[256]; // 增大缓冲区大小以容纳新属性 // 修改服务ID和属性名,添加温度和湿度属性 sprintf(jsonBuf, "{\"services\":[{\"service_id\":\"01\",\"properties\":{\"heart\":%d,\"o2\":%d,\"tem\":%.2f,\"hum\":%.2f}}]}", heart, o2, temperature, humidity); client.publish(Iot_link_MQTT_Topic_Report, jsonBuf);
Serial.println(Iot_link_MQTT_Topic_Report); Serial.println(jsonBuf); Serial.println("Publish OK!"); }
void displayDataOnOLED() { u8g2.clearBuffer();
// 设置较小的字体,这里假设存在合适的小字体,如u8g2_font_ncenB08_tr u8g2.setFont(u8g2_font_ncenB08_tr);
// 第一行显示“HR”(心率 Heart Rate 的缩写) u8g2.drawStr(0, 10, "HR: "); char heartRateStr[5]; itoa(heart, heartRateStr, 10); u8g2.drawStr(40, 10, heartRateStr); u8g2.drawStr(70, 10, "bpm");
// 第二行显示“SpO₂”(血氧 SpO₂ 的常见表示) u8g2.drawStr(0, 22, "SpO₂: "); char bloodOxygenStr[5]; itoa(o2, bloodOxygenStr, 10); u8g2.drawStr(40, 22, bloodOxygenStr); u8g2.drawStr(70, 22, "%");
// 第三行显示“Tmp”(温度 Temperature 的缩写) u8g2.drawStr(0, 34, "Tmp: "); char temperatureStr[5]; dtostrf(temperature, 4, 1, temperatureStr); u8g2.drawStr(40, 34, temperatureStr); u8g2.drawStr(70, 34, "°C");
// 第四行显示“Hmd”(湿度 Humidity 的缩写) u8g2.drawStr(0, 46, "Hmd: "); char humidityStr[5]; dtostrf(humidity, 4, 1, humidityStr); u8g2.drawStr(40, 46, humidityStr); u8g2.drawStr(70, 46, "%");
u8g2.sendBuffer(); }
void loop() { for (byte i = 0; i < MY_BUFFER_SIZE; i++) { while (particleSensor.available() == false) particleSensor.check();
redBuffer[i] = particleSensor.getRed(); irBuffer[i] = particleSensor.getIR(); particleSensor.nextSample(); }
maxim_heart_rate_and_oxygen_saturation(irBuffer, MY_BUFFER_SIZE, redBuffer, &o2, &validO2, &heart, &validHeart);
// 读取DHT11数据 temperature = dht.readTemperature(); humidity = dht.readHumidity();
// 使用 isnan 检查读取结果是否有效 if (irBuffer[0] > 20000 && validO2 && validHeart && heart > 30 && heart < 250 && o2 > 50 && !isnan(temperature) && !isnan(humidity)) { Serial.print("心率:"); Serial.print(heart); Serial.print(",血氧:"); Serial.print(o2); Serial.print(",温度:"); Serial.print(temperature); Serial.print(",湿度:"); Serial.println(humidity);
if (!client.connected()) { MQTT_Init(); } MQTT_POST();
// 显示数据到OLED displayDataOnOLED(); }
delay(2000); // 每隔2秒上传一次数据 }
|