234 lines
5.4 KiB
C++
234 lines
5.4 KiB
C++
#include "main.hpp"
|
|
|
|
const uint32_t DEVICE_ID = getChipID();
|
|
const String mqttId = "CUS-" + String(DEVICE_ID, HEX);
|
|
int GROUP_ID;
|
|
|
|
TaskTimer globalTimer{0, 10000};
|
|
TaskTimer mqttTimer{0, 5000};
|
|
TaskTimer wifiTimer{0, 5000};
|
|
|
|
#if DEVICE_ROLE == ACTUATOR
|
|
TaskTimer matrixTimer{0, 25};
|
|
TaskTimer displayTimer{0, 1000};
|
|
String currentMessage = "";
|
|
String lastMessage = "";
|
|
extern MD_Parola display;
|
|
#endif
|
|
|
|
extern HTTPClient httpClient;
|
|
String response;
|
|
|
|
#if DEVICE_ROLE == SENSOR
|
|
MQ7Data_t mq7Data;
|
|
BME280Data_t bme280Data;
|
|
GPSData_t gpsData;
|
|
#endif
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin(115200);
|
|
|
|
#ifdef DEBUG
|
|
Serial.println("Iniciando...");
|
|
#endif
|
|
|
|
while(WiFi_Init() != WL_CONNECTED)
|
|
{
|
|
Serial.println("Esperando conexión WiFi...");
|
|
delay(1000);
|
|
}
|
|
MQTT_Init(MQTT_URI, MQTT_PORT);
|
|
|
|
try
|
|
{
|
|
|
|
#if DEVICE_ROLE == SENSOR
|
|
GROUP_ID = getGroupId(DEVICE_ID);
|
|
BME280_Init();
|
|
Serial.println("Sensor BME280 inicializado");
|
|
GPS_Init();
|
|
Serial.println("Sensor GPS inicializado");
|
|
MQ7_Init();
|
|
Serial.println("Sensor MQ7 inicializado");
|
|
#endif
|
|
|
|
#if DEVICE_ROLE == ACTUATOR
|
|
MAX7219_Init();
|
|
Serial.println("Display inicializado");
|
|
writeMatrix(currentMessage.c_str());
|
|
|
|
String url = String(API_URI) + "groups/" + GROUP_ID + "/devices/" + String(DEVICE_ID, HEX) + "/actuators/" + MAX7219_ID + "/status";
|
|
getRequest(url, response);
|
|
MAX7219Status_t statusData = deserializeActuatorStatus(httpClient, httpClient.GET());
|
|
currentMessage = statusData.actuatorStatus;
|
|
#endif
|
|
}
|
|
catch (const char *e)
|
|
{
|
|
Serial.println(e);
|
|
}
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
uint32_t now = millis();
|
|
|
|
#if DEVICE_ROLE == ACTUATOR
|
|
if (now - matrixTimer.lastRun >= matrixTimer.interval)
|
|
{
|
|
if (MAX7219_Animate())
|
|
{
|
|
MAX7219_ResetAnimation();
|
|
}
|
|
matrixTimer.lastRun = now;
|
|
}
|
|
|
|
if (now - displayTimer.lastRun >= displayTimer.interval)
|
|
{
|
|
if (currentMessage != lastMessage)
|
|
{
|
|
writeMatrix(currentMessage.c_str());
|
|
lastMessage = currentMessage;
|
|
#ifdef DEBUG
|
|
Serial.println("Display actualizado");
|
|
#endif
|
|
}
|
|
displayTimer.lastRun = now;
|
|
}
|
|
#endif
|
|
|
|
if (now - globalTimer.lastRun >= globalTimer.interval)
|
|
{
|
|
#if DEVICE_ROLE == SENSOR
|
|
readBME280();
|
|
readGPS();
|
|
readMQ7();
|
|
|
|
#ifdef DEBUG
|
|
printAllData();
|
|
#endif
|
|
|
|
sendSensorData();
|
|
#endif
|
|
globalTimer.lastRun = now;
|
|
}
|
|
|
|
if (now - mqttTimer.lastRun >= mqttTimer.interval)
|
|
{
|
|
MQTT_Handle(mqttId.c_str());
|
|
mqttTimer.lastRun = now;
|
|
}
|
|
}
|
|
|
|
#if DEVICE_ROLE == ACTUATOR
|
|
void writeMatrix(const char *message)
|
|
{
|
|
#ifdef DEBUG
|
|
Serial.println("Escribiendo mensaje: ");
|
|
Serial.print(message);
|
|
#endif
|
|
MAX7219_DisplayText(message, PA_LEFT, 50, 0);
|
|
}
|
|
#endif
|
|
|
|
#if DEVICE_ROLE == SENSOR
|
|
void readMQ7()
|
|
{
|
|
const float CO_THRESHOLD = 100.0f;
|
|
mq7Data = MQ7_Read_Fake();
|
|
}
|
|
|
|
void readBME280()
|
|
{
|
|
bme280Data = BME280_Read();
|
|
}
|
|
|
|
void readGPS()
|
|
{
|
|
gpsData = GPS_Read();
|
|
}
|
|
|
|
void printAllData()
|
|
{
|
|
Serial.println("---------------------");
|
|
|
|
Serial.print("ID: ");
|
|
Serial.println(DEVICE_ID, HEX);
|
|
|
|
Serial.print("Presión: ");
|
|
Serial.print(bme280Data.pressure);
|
|
Serial.println(" hPa");
|
|
Serial.print("Temperatura: ");
|
|
Serial.print(bme280Data.temperature);
|
|
Serial.println(" °C");
|
|
Serial.print("Humedad: ");
|
|
Serial.print(bme280Data.humidity);
|
|
Serial.println(" %");
|
|
|
|
Serial.print("Latitud: ");
|
|
Serial.println(gpsData.lat);
|
|
Serial.print("Longitud: ");
|
|
Serial.println(gpsData.lon);
|
|
|
|
Serial.print("CO: ");
|
|
Serial.println(mq7Data.co);
|
|
Serial.print("D0: ");
|
|
Serial.println(mq7Data.threshold);
|
|
}
|
|
|
|
void sendSensorData()
|
|
{
|
|
const String deviceId = String(DEVICE_ID, HEX);
|
|
|
|
bool gpsValid = gpsData.lat != 0.0f && gpsData.lon != 0.0f;
|
|
bool weatherValid = bme280Data.temperature != 0.0f &&
|
|
bme280Data.humidity != 0.0f &&
|
|
bme280Data.pressure != 0.0f;
|
|
bool coValid = mq7Data.co >= 0.0f;
|
|
|
|
if (!gpsValid || !weatherValid || !coValid)
|
|
{
|
|
#ifdef DEBUG
|
|
Serial.println("❌ Datos inválidos. No se envía el batch.");
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
String json = serializeSensorValue(GROUP_ID, deviceId,
|
|
GPS_ID, BME280_ID, MQ7_ID,
|
|
bme280Data, mq7Data, gpsData);
|
|
|
|
#ifdef DEBUG
|
|
Serial.println("📤 Enviando datos al servidor...");
|
|
#endif
|
|
|
|
postRequest(String(API_URI) + "/batch", json, response);
|
|
|
|
#ifdef DEBUG
|
|
Serial.println("📥 Respuesta del servidor:");
|
|
Serial.println(response);
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
uint32_t getChipID()
|
|
{
|
|
uint32_t chipId = 0;
|
|
for (int i = 0; i < 17; i += 8)
|
|
{
|
|
chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
|
|
}
|
|
#ifdef DEBUG
|
|
Serial.print("Chip ID: ");
|
|
Serial.println(chipId, HEX);
|
|
#endif
|
|
return chipId;
|
|
}
|
|
|
|
int getGroupId(int deviceId)
|
|
{
|
|
String url = String(RAW_API_URI) + "devices/" + String(DEVICE_ID, HEX) + "/my-group";
|
|
getRequest(url, response);
|
|
return deserializeGroupId(httpClient, httpClient.GET());
|
|
} |