Последовательные ошибки MAX30100 и ESP8266 NodeMCU
Это мой проект последнего года, и по какой-то причине датчик max30100 по умолчанию принимает статические значения после выполнения запроса HTTP post.
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#include <SimpleTimer.h>
#define REPORTING_PERIOD_MS 1000
const char* ssid = "SDsouza";
const char* password = "dsouza@8104045917";
const char* serverName = "http://10.0.0.13/post-sensor-data.php";
String systolic_pressure;
String diastolic_pressure;
String pulse_rate;
String temperature_body;
String BPM;
String SpO2;
PulseOximeter pox;
uint32_t tsLastReport = 0;
SimpleTimer timer;
String sensor_data;
bool Sr;
String machineid = "MR1";
String room_number= "A1";
String bed_number= "1";
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(16,OUTPUT);
WiFi.begin(ssid , password);
Serial.print("Connecting to SSID:");
Serial.print(ssid);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("Connected Successfully!!");
Serial.println(WiFi.localIP());
if(!pox.begin())
{
Serial.println("Failed");
for(;;);
}
else
{
Serial.println("Pox Success");
}
pox.setOnBeatDetectedCallback(onBeatDetected);
//pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
timer.setInterval(1000L , getsendata);
}
void loop() {
// put your main code here, to run repeatedly:
pox.update();
if(millis() - tsLastReport > REPORTING_PERIOD_MS)
{
BPM = pox.getHeartRate();
SpO2 = pox.getSpO2();
Serial.print("Bpm: ");
Serial.println(BPM);
Serial.print("SpO2: ");
Serial.println(SpO2);
tsLastReport = millis();
}
timer.run();
}
void onBeatDetected()
{
Serial.println("Beat Detected");
}
void getsendata()
{
while (Serial.available())
{
sensor_data = Serial.readString();
Sr = true;
int firstcommaindex = sensor_data.indexOf(",");
int secondcommaindex = sensor_data.indexOf(",", firstcommaindex + 1);
int thirdcommaindex = sensor_data.indexOf(",", secondcommaindex + 1);
int fourthcommaindex = sensor_data.indexOf(",", thirdcommaindex + 1);
systolic_pressure = sensor_data.substring(0, firstcommaindex);
diastolic_pressure = sensor_data.substring(firstcommaindex + 1, secondcommaindex);
pulse_rate = sensor_data.substring(secondcommaindex + 1, thirdcommaindex);
temperature_body = sensor_data.substring(thirdcommaindex + 1);
HTTPClient http;
http.begin(serverName);
http.addHeader("Content-Type" , "application/x-www-form-urlencoded");
String httpRequestData = "machine_identifier=" + machineid + "&temp=" + temperature_body + "&hr=" + pulse_rate + "&sys_pressure=" + systolic_pressure + "&dias_pressure=" + diastolic_pressure + "&oxy_lvl=" + SpO2 + "&room_number=" + room_number + "&bed_number=" + bed_number + "";
Serial.print("HTTP Request Data: ");
Serial.println(httpRequestData);
int httpResponseCode = http.POST(httpRequestData);
if(httpResponseCode > 0)
{
Serial.print("HTTP Response Code: ");
Serial.println(httpResponseCode);
}
else
{
Serial.print("Error Code: ");
Serial.println(httpResponseCode);
}
http.end();
}
}
Arduino mega отправляет строку со значениями переменных, равными 0 при запуске. Датчик MAX30100 выполняет свою работу по снятию показаний, однако, как только выполняется запрос HTTP Post, оксиметр по умолчанию принимает свои статические значения и отказывается регистрировать дальнейшие показания.
Выходной сигнал: Это выводится перед HTTP Post
Вывод после HTTP Post
Как только запрос http post при запуске arduino выполнен, или если я снимаю показания с arduino после запуска, оксиметр max30100 перестает работать и отказывается снимать дальнейшие показания или обновлять значения дальше.
Данные отправляются в базу данных mysql, где я буду извлекать их на веб-сайте, используя php js и html css. Эта проблема с оксиметром беспокоит меня уже много дней, и мой проект последнего года приближается. Не мог бы кто-нибудь, пожалуйста, подсказать мне, как решить эту проблему?
Вот библиотека, которую я использую для MAX30100: https://github.com/oxullo/Arduino-MAX30100
1 ответ
Лучший ответ:
Что ж. Наконец-то. Разобрался в этом. После бесчисленных часов поиска в Google и чтения проблем в библиотеке github мне просто нужно было вставить одну строку. resetFifo для сброса модуля после http post и повторного включения его для нормального считывания показаний. Обновленный код:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <Wire.h>
#include "MAX30100.h"
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
MAX30100 maxim;
PulseOximeter pox;
const char* ssid = "SDsouza";
const char* password = "dsouza@8104045917";
const char* serverName = "http://10.0.0.13/post-sensor-data.php";
String systolic_pressure;
String diastolic_pressure;
String pulse_rate;
String temperature_body;
String BPM;
String SpO2;
uint32_t tsLastReport = 0;
String sensor_data;
bool Sr;
String machineid = "MR1";
String room_number= "A1";
String bed_number= "1";
HTTPClient http;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(16,OUTPUT);
WiFi.begin(ssid , password);
Serial.print("Connecting to SSID:");
Serial.print(ssid);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("Connected Successfully!!");
Serial.println(WiFi.localIP());
if(!pox.begin())
{
Serial.print("Failed");
for(;;);
}
else
{
Serial.println("Success");
}
pox.setIRLedCurrent(MAX30100_LED_CURR_50MA);
http.begin(serverName);
}
void loop() {
// put your main code here, to run repeatedly:
pox.update();
if(millis() - tsLastReport > REPORTING_PERIOD_MS)
{
BPM = pox.getHeartRate();
SpO2 = pox.getSpO2();
Serial.print("Bpm: ");
Serial.println(BPM);
Serial.print("SpO2: ");
Serial.println(SpO2);
tsLastReport = millis();
}
while (Serial.available())
{
sensor_data = Serial.readString();
Sr = true;
int firstcommaindex = sensor_data.indexOf(",");
int secondcommaindex = sensor_data.indexOf(",", firstcommaindex + 1);
int thirdcommaindex = sensor_data.indexOf(",", secondcommaindex + 1);
int fourthcommaindex = sensor_data.indexOf(",", thirdcommaindex + 1);
systolic_pressure = sensor_data.substring(0, firstcommaindex);
diastolic_pressure = sensor_data.substring(firstcommaindex + 1, secondcommaindex);
pulse_rate = sensor_data.substring(secondcommaindex + 1, thirdcommaindex);
temperature_body = sensor_data.substring(thirdcommaindex + 1);
String httpRequestData = "machine_identifier=" + machineid + "&temp=" + temperature_body + "&hr=" + pulse_rate + "&sys_pressure=" + systolic_pressure + "&dias_pressure=" + diastolic_pressure + "&oxy_lvl=" + SpO2 + "&room_number=" + room_number + "&bed_number=" + bed_number + "";
Serial.println(httpRequestData);
http.addHeader("Content-Type" , "application/x-www-form-urlencoded");
Serial.print("HTTP Request Data: ");
Serial.println(httpRequestData);
http.POST(httpRequestData);
maxim.resetFifo();
}
}
Этот код работает безупречно, и теперь я могу последовательно считывать данные с arduino, считывать данные с оксиметра и по протоколу http отправлять их в базу данных в обычном режиме и снова повторять эти шаги без каких-либо ошибок.
- Как разделить входящую строку?
- Как публиковать запросы HTTP POST на моем веб-сайте?
- Какова максимальная длина провода для последовательной связи между двумя Arduino?
- Последовательная связь между двумя Arduino (запрос и получение)
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Модуль SIM808: команда определения местоположения GSM (AT+CIPGSMLOC=1,1) дает неверное значение после выполнения команды отправки сообщения (AT+CMGS=+91xxxxxxxx)
- Как правильно получить MIDI с Arduino, с 6n138?
- Подключение NodeMCU для Serial1
Почему вы храните свои числовые значения в строках?, @Majenko
пожалуйста, никаких скриншотов текста... добавьте фактический текст к вашему вопросу, @jsotola