// Temperatura
// frecuencia cardiaca
// presion arterial
// saturacion de oxigeno
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <random>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// VARIABLES DEL WIFI
String ssid = "Wokwi-GUEST";
String password = "";
// VARIABLES DE LA LCD
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
int cont_mostrar = 1;
// const String code = "0011";
// const String code = "0012";
const String code = "0013";
int p_on_off = 2;
int p_temp = 15;
int p_freq_card = 4;
int p_oxigen = 32;
int p_pres_art = 27;
int cont_json = 1;
String server_url = "https://iot.aelehn.com/api/readings";
void setup() {
Serial.begin(9600);
pinMode(p_on_off, INPUT);
Wire.begin();
lcd.init();
lcd.backlight();
connect_wifi();
}
void loop() {
int on_off = digitalRead(p_on_off);
if (on_off) {
float temp = getTemperature();
int freq_card = getFrecuenciaCardiaca();
float level_oxin = getLevelOxigen();
int dis = getDiastolica();
int sis = getSistolica();
String press_art = String(sis);
press_art += "/";
press_art += String(dis);
if (cont_mostrar == 1) {
write_lcd_two_row("Temperatura: ", String(temp) + " C");
cont_mostrar++;
}
else if (cont_mostrar == 2) {
write_lcd_two_row("PPM: ", String(freq_card));
cont_mostrar++;
}
else if (cont_mostrar == 3) {
write_lcd_two_row("SP02: ", String(level_oxin) + " %");
cont_mostrar++;
}
else if (cont_mostrar == 4) {
write_lcd_two_row("Presion arterial: ", String(press_art));
cont_mostrar = 1;
cont_json++;
}
if (cont_json == 2) {
cont_json = 1;
// Enviar json
HTTPClient http;
// Iniciar la conexión HTTP
http.begin(server_url);
// Establecer el tipo de contenido como application/json
http.addHeader("Content-Type", "application/json");
http.addHeader("Accept", "application/json");
// http.addHeader("x-secret-key", secret_key);
// Crear un objeto JSON y agregar datos
StaticJsonDocument<200> jsonDocument; // Cambia el tamaño según tus necesidades
jsonDocument["temperature"] = String(temp);
jsonDocument["frequencyCardiac"] = String(freq_card);
jsonDocument["pressureSistolic"] = String(sis);
jsonDocument["pressureDiastolic"] = String(dis);
jsonDocument["oxygenSaturation"] = String(level_oxin);
jsonDocument["code"] = String(code);
// Serializar el objeto JSON a un String
String postData;
serializeJson(jsonDocument, postData);
int httpResponseCode = http.POST(postData);
Serial.println(httpResponseCode);
if (httpResponseCode >= 200 && httpResponseCode < 300) {
Serial.println("HTTTP OK");
}
else {
Serial.println("HTTTP ERROR");
}
http.end();
}
}
else {
write_lcd_two_row("Dispositivo", "Apagado");
}
// String temp = getPresionArterial();
delay(1000);
}
// Genera un número aleatorio entre un rango
float randomInRange(float minVal, float maxVal) {
static std::random_device rd;
static std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(minVal, maxVal);
return dis(gen);
}
// Retorna la temperatura en grados Celsius (rango simulado: 36.0 - 37.5 °C)
float getTemperature() {
return randomInRange(36.0, 37.5);
}
// Retorna la frecuencia cardíaca (rango simulado: 60 - 100 ppm)
int getFrecuenciaCardiaca() {
return randomInRange(60, 100);
}
// Retorna los niveles de oxígeno (rango simulado: 95 - 100%)
float getLevelOxigen() {
return randomInRange(95, 100);
}
// Retorna la presión arterial (rango simulado: 120/80 mmHg)
String getPresionArterial() {
int sistolica = static_cast<int>(randomInRange(110, 130));
int diastolica = static_cast<int>(randomInRange(70, 90));
return String(sistolica) + "/" + String(diastolica);
}
int getSistolica() {
int sistolica = static_cast<int>(randomInRange(110, 130));
return sistolica;
}
int getDiastolica() {
int diastolica = static_cast<int>(randomInRange(70, 90));
return diastolica;
}
// -------------------------------
void connect_wifi() {
int cont = 0;
write_lcd("Conectando ...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED && cont <= 10) {
delay(1000);
// Serial.print(".");
// cont++;
}
if (WiFi.status() == WL_CONNECTED) {
write_lcd("Conectado !!!");
delay(3000);
// write_lcd_two_row("AccessTrace ", "Manager");
}
}
// FUNCIONES LCD
void clear_lcd () {
lcd.clear();
}
void write_lcd(String msg) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(msg);
}
void write_lcd_two_row(String msg, String msg2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(msg);
lcd.setCursor(0, 1);
lcd.print(msg2);
}
// Send data