1
0

Add hardware support for GPS, MAX7219, BME280, and MQ7 sensors

- Implemented GPS functionality with initialization and reading latitude and longitude.
- Added MAX7219 display support, including initialization, text display, animation control, and brightness settings.
- Integrated BME280 sensor for reading temperature, pressure, and humidity.
- Developed MQ7 sensor interface for reading gas concentration values.
- Created HTTP client for GET and POST requests.
- Implemented MQTT client for message handling and connection management.
- Added JSON serialization and deserialization functions for sensor and actuator data.
- Established WiFi connection setup for network communication.
This commit is contained in:
Jose
2025-04-25 22:29:57 +02:00
parent 0c09fcd913
commit 51db158354
18 changed files with 441 additions and 303 deletions

View File

@@ -1,24 +0,0 @@
#include "BME280.hpp"
BME280I2C bme;
void BME280_Init()
{
Wire.setPins(21, 22);
Wire.begin();
while(!bme.begin())
{
Serial.println("Could not find BME280 sensor!");
delay(1000);
}
}
bool BME280_Read(float &pressure, float &temperature, float &humidity)
{
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280::PresUnit presUnit(BME280::PresUnit_Pa);
bme.read(pressure, temperature, humidity, tempUnit, presUnit);
return (temperature != 0.0f && pressure != 0.0f);
}

View File

@@ -0,0 +1,35 @@
#include "MAX7219.hpp"
MD_Parola display = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
void MAX7219_Init()
{
display.begin();
display.setIntensity(1); // 0-15
display.displayClear();
}
void MAX7219_DisplayText(const char *text, textPosition_t align, int speed, int pause)
{
display.displayText(text, align, speed, pause, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
}
void MAX7219_StartAnimation()
{
display.displayAnimate();
}
void MAX7219_StopAnimation()
{
display.displayReset();
}
void MAX7219_ClearDisplay()
{
display.displayClear();
}
void MAX7219_SetBrightness(uint8_t brightness)
{
display.setIntensity(brightness);
}

View File

@@ -1,179 +1,179 @@
#include "JsonTools.hpp"
String serializeSensorValue(int sensorId, int deviceId, String sensorType, String unit, int sensorStatus, float temperature, float humidity, float carbonMonoxide, float lat, float lon, long timestamp)
{
DynamicJsonDocument doc(2048);
doc["sensorId"] = sensorId;
doc["deviceId"] = deviceId;
doc["sensorType"] = sensorType;
doc["unit"] = unit;
doc["sesnsorStatuts"] = sensorStatus;
doc["temperature"] = temperature;
doc["humidity"] = humidity;
doc["carbonMonoxide"] = carbonMonoxide;
doc["lat"] = lat;
doc["lon"] = lon;
doc["timestamp"] = timestamp;
String output;
serializeJson(doc, output);
Serial.println(output);
return output;
}
String serializeActuatorStatus (int actuatorId, int deviceId, int status, long timestamp)
{
DynamicJsonDocument doc(2048);
doc["actuatorId"] = actuatorId;
doc["deviceId"] = deviceId;
doc["status"] = status;
doc["timestamp"] = timestamp;
String output;
serializeJson(doc, output);
Serial.println(output);
return output;
}
String serializeDevice(int sensorId, int deviceId, String sensorType, int status, long timestamp)
{
DynamicJsonDocument doc(2048);
doc["sensorId"] = sensorId;
doc["deviceId"] = deviceId;
doc["sensorType"] = sensorType;
doc["status"] = status;
doc["timestamp"] = timestamp;
String output;
serializeJson(doc, output);
Serial.println(output);
return output;
}
void deserializeSensorValue (HTTPClient &http, int httpResponseCode)
{
if (httpResponseCode > 0)
{
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String responseJson = http.getString();
DynamicJsonDocument doc(ESP.getMaxAllocHeap());
DeserializationError error = deserializeJson(doc, responseJson);
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
JsonArray array = doc.as<JsonArray>();
for (JsonObject sensor : array)
{
int sensorId = sensor["sensorId"];
int deviceId = sensor["deviceId"];
String sensorType = sensor["sensorType"];
String unit = sensor["unit"];
int sesnsorStatuts = sensor["sesnsorStatuts"];
float temperature = sensor["temperature"];
float humidity = sensor["humidity"];
float carbonMonoxide = sensor["carbonMonoxide"];
float lat = sensor["lat"];
float lon = sensor["lon"];
long timestamp = sensor["timestamp"];
Serial.println(("Sensor deserialized: [sensorId: " + String(sensorId) + ", deviceId: " + String(deviceId) + ", sensorType: " + sensorType + ", unit: " + unit +", sesnsorStatuts: " + String(sesnsorStatuts) +", temperature: " + String(temperature) +", humidity: " + String(humidity) +", carbonMonoxide: " + String(carbonMonoxide) +", lat: " + String(lat) +", lon: " + String(lon) +", timestamp: " + String(timestamp) + "]").c_str());
}
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
}
void deserializeActuatorStatus (HTTPClient &http, int httpResponseCode)
{
if (httpResponseCode > 0)
{
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String responseJson = http.getString();
DynamicJsonDocument doc(ESP.getMaxAllocHeap());
DeserializationError error = deserializeJson(doc, responseJson);
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
JsonArray array = doc.as<JsonArray>();
for (JsonObject actuator : array)
{
int actuadorId = actuator["actuadorId"];
int deviceId = actuator["deviceId"];
int statuts = actuator["statuts"];
long timestamp = actuator["timestamp"];
Serial.println(("Actuador deserialized: [actuadorId: " + String(actuadorId) +
", deviceId: " + String(deviceId) +
", statuts: " + String(statuts) +
", timestamp: " + String(timestamp) + "]").c_str());
}
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
}
void deserializeDevice (HTTPClient &http, int httpResponseCode)
{
if (httpResponseCode > 0)
{
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String responseJson = http.getString();
DynamicJsonDocument doc(ESP.getMaxAllocHeap());
DeserializationError error = deserializeJson(doc, responseJson);
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
JsonArray array = doc.as<JsonArray>();
for (JsonObject device : array)
{
int sensorId = device["sensorId"];
int deviceId = device["deviceId"];
String sensorType = device["sensorType"];
long timestamp = device["timestamp"];
Serial.println(("Sensor deserialized: [sensorId: " + String(sensorId) +
", deviceId: " + String(deviceId) +
", sensorType: " + sensorType +
", timestamp: " + String(timestamp) + "]").c_str());
}
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
#include "JsonTools.hpp"
String serializeSensorValue(int sensorId, int deviceId, String sensorType, String unit, int sensorStatus, float temperature, float humidity, float carbonMonoxide, float lat, float lon, long timestamp)
{
DynamicJsonDocument doc(2048);
doc["sensorId"] = sensorId;
doc["deviceId"] = deviceId;
doc["sensorType"] = sensorType;
doc["unit"] = unit;
doc["sesnsorStatuts"] = sensorStatus;
doc["temperature"] = temperature;
doc["humidity"] = humidity;
doc["carbonMonoxide"] = carbonMonoxide;
doc["lat"] = lat;
doc["lon"] = lon;
doc["timestamp"] = timestamp;
String output;
serializeJson(doc, output);
Serial.println(output);
return output;
}
String serializeActuatorStatus (int actuatorId, int deviceId, int status, long timestamp)
{
DynamicJsonDocument doc(2048);
doc["actuatorId"] = actuatorId;
doc["deviceId"] = deviceId;
doc["status"] = status;
doc["timestamp"] = timestamp;
String output;
serializeJson(doc, output);
Serial.println(output);
return output;
}
String serializeDevice(int sensorId, int deviceId, String sensorType, int status, long timestamp)
{
DynamicJsonDocument doc(2048);
doc["sensorId"] = sensorId;
doc["deviceId"] = deviceId;
doc["sensorType"] = sensorType;
doc["status"] = status;
doc["timestamp"] = timestamp;
String output;
serializeJson(doc, output);
Serial.println(output);
return output;
}
void deserializeSensorValue (HTTPClient &http, int httpResponseCode)
{
if (httpResponseCode > 0)
{
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String responseJson = http.getString();
DynamicJsonDocument doc(ESP.getMaxAllocHeap());
DeserializationError error = deserializeJson(doc, responseJson);
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
JsonArray array = doc.as<JsonArray>();
for (JsonObject sensor : array)
{
int sensorId = sensor["sensorId"];
int deviceId = sensor["deviceId"];
String sensorType = sensor["sensorType"];
String unit = sensor["unit"];
int sesnsorStatuts = sensor["sesnsorStatuts"];
float temperature = sensor["temperature"];
float humidity = sensor["humidity"];
float carbonMonoxide = sensor["carbonMonoxide"];
float lat = sensor["lat"];
float lon = sensor["lon"];
long timestamp = sensor["timestamp"];
Serial.println(("Sensor deserialized: [sensorId: " + String(sensorId) + ", deviceId: " + String(deviceId) + ", sensorType: " + sensorType + ", unit: " + unit +", sesnsorStatuts: " + String(sesnsorStatuts) +", temperature: " + String(temperature) +", humidity: " + String(humidity) +", carbonMonoxide: " + String(carbonMonoxide) +", lat: " + String(lat) +", lon: " + String(lon) +", timestamp: " + String(timestamp) + "]").c_str());
}
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
}
void deserializeActuatorStatus (HTTPClient &http, int httpResponseCode)
{
if (httpResponseCode > 0)
{
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String responseJson = http.getString();
DynamicJsonDocument doc(ESP.getMaxAllocHeap());
DeserializationError error = deserializeJson(doc, responseJson);
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
JsonArray array = doc.as<JsonArray>();
for (JsonObject actuator : array)
{
int actuadorId = actuator["actuadorId"];
int deviceId = actuator["deviceId"];
int statuts = actuator["statuts"];
long timestamp = actuator["timestamp"];
Serial.println(("Actuador deserialized: [actuadorId: " + String(actuadorId) +
", deviceId: " + String(deviceId) +
", statuts: " + String(statuts) +
", timestamp: " + String(timestamp) + "]").c_str());
}
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
}
void deserializeDevice (HTTPClient &http, int httpResponseCode)
{
if (httpResponseCode > 0)
{
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String responseJson = http.getString();
DynamicJsonDocument doc(ESP.getMaxAllocHeap());
DeserializationError error = deserializeJson(doc, responseJson);
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
JsonArray array = doc.as<JsonArray>();
for (JsonObject device : array)
{
int sensorId = device["sensorId"];
int deviceId = device["deviceId"];
String sensorType = device["sensorType"];
long timestamp = device["timestamp"];
Serial.println(("Sensor deserialized: [sensorId: " + String(sensorId) +
", deviceId: " + String(deviceId) +
", sensorType: " + sensorType +
", timestamp: " + String(timestamp) + "]").c_str());
}
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
}

View File

@@ -1,27 +1,28 @@
#include "RestClient.hpp"
void getRequest(HTTPClient &httpClient, const String url, String &response)
{
httpClient.begin(url);
int httpCode = httpClient.GET();
if (httpCode > 0) {
response = httpClient.getString();
} else {
response = "Error: " + String(httpCode);
}
httpClient.end();
}
void postRequest(HTTPClient &httpClient, const String url, String &payload, String &response)
{
httpClient.begin(url);
httpClient.addHeader("Content-Type", "application/json");
int httpCode = httpClient.POST(payload);
if (httpCode > 0) {
response = httpClient.getString();
} else {
response = "Error: " + String(httpCode);
}
httpClient.end();
#include "RestClient.hpp"
HTTPClient httpClient; // HTTP client object
void getRequest(const String url, String &response)
{
httpClient.begin(url);
int httpCode = httpClient.GET();
if (httpCode > 0) {
response = httpClient.getString();
} else {
response = "Error: " + String(httpCode);
}
httpClient.end();
}
void postRequest(const String url, String &payload, String &response)
{
httpClient.begin(url);
httpClient.addHeader("Content-Type", "application/json");
int httpCode = httpClient.POST(payload);
if (httpCode > 0) {
response = httpClient.getString();
} else {
response = "Error: " + String(httpCode);
}
httpClient.end();
}

View File

@@ -1,33 +1,33 @@
#include <WifiConnection.hpp>
WiFiClient wifiClient;
int setupWifi()
{
Serial.println();
Serial.print("Connecting to ");
Serial.println(SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("Setup!");
if(WiFi.status() == WL_CONNECTED)
{
return 0;
}
else
{
return 1;
}
}
#include <WifiConnection.hpp>
WiFiClient wifiClient;
int setupWifi()
{
Serial.println();
Serial.print("Connecting to ");
Serial.println(SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("Setup!");
if(WiFi.status() == WL_CONNECTED)
{
return 0;
}
else
{
return 1;
}
}

View File

@@ -0,0 +1,34 @@
#include "BME280.hpp"
BME280I2C bme;
void BME280_Init()
{
Wire.setPins(21, 22);
Wire.begin();
BME280I2C::Settings settings(
BME280I2C::OSR::OSR_X1,
BME280I2C::OSR::OSR_X1,
BME280I2C::OSR::OSR_X1,
BME280I2C::Mode::Mode_Forced, // modo forzado
BME280I2C::StandbyTime::StandbyTime_1000ms,
BME280I2C::Filter::Filter_16,
BME280I2C::SpiEnable::SpiEnable_False,
BME280I2C::I2CAddr::I2CAddr_0x76 // dirección I2C del BME280
);
bme.setSettings(settings);
while (!bme.begin());
}
bool BME280_Read(float &pressure, float &temperature, float &humidity)
{
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280::PresUnit presUnit(BME280::PresUnit_Pa);
bme.read(pressure, temperature, humidity, tempUnit, presUnit);
return (temperature != 0.0f && pressure != 0.0f);
}

View File

@@ -0,0 +1,22 @@
#include "GPS.hpp"
TinyGPSPlus gps;
void GPS_Init()
{
Serial.begin(9600);
}
void GPS_Read(float &lat, float &lon)
{
if (gps.location.isValid())
{
lat = gps.location.lat();
lon = gps.location.lng();
}
else
{
lat = 0.0f;
lon = 0.0f;
}
}

View File

@@ -1,5 +1,5 @@
#include "MQ7.hpp"
void MQ7_Init()
{
pinMode(DIGITAL_MQ7, INPUT);

View File

@@ -2,17 +2,70 @@
const uint32_t deviceId = getChipID();
// instances
HTTPClient httpClient;
extern HTTPClient httpClient; // HTTP client object
String response; // HTTP Response
float sensorVolt, sensorValue, RSAir, R0; // MQ7 vars
float temperature, pressure, humidity; // BME280 vars
float lon, lat; // GPS vars
extern MD_Parola display; // Display object
// HTTP Request
String response;
void setup()
{
Serial.begin(9600);
// MQ7
float sensorVolt, sensorValue, RSAir, R0;
Serial.println("Iniciando...");
MQ7_Init();
Serial.println("Sensor MQ7 inicializado");
BME280_Init();
Serial.println("Sensor BME280 inicializado");
GPS_Init();
Serial.println("GPS inicializado");
MAX7219_Init();
Serial.println("Display inicializado");
// BMP280
float temperature, pressure, altitude;
prettyReadBME280();
prettyReadMQ7();
testMatrix();
}
void loop()
{
}
void prettyReadMQ7()
{
Serial.println("Leyendo sensor MQ7...");
MQ7_Read(sensorVolt, RSAir, R0, sensorValue);
Serial.print("\t - Voltaje: "); Serial.print(sensorVolt); Serial.print("V\r\n");
Serial.print("\t - Valor sensor: "); Serial.print(sensorValue); Serial.print("\r\n");
Serial.print("\t - Resistencia aire: "); Serial.print(RSAir); Serial.print("kOhm\r\n");
Serial.print("\t - Resistencia aire: "); Serial.print(R0); Serial.print("kOhm\r\n");
Serial.print("\t - Concentración CO: "); Serial.print(sensorValue); Serial.print("ppm\r\n");
}
void prettyReadBME280()
{
Serial.println("Leyendo sensor BME280...");
BME280_Read(pressure, temperature, humidity);
Serial.print("\t - Presión: "); Serial.print(pressure/100); Serial.print("hPa\r\n");
Serial.print("\t - Temperatura: "); Serial.print(temperature); Serial.print("°C\r\n");
Serial.print("\t - Humedad: "); Serial.print(humidity); Serial.print("%\r\n");
}
void prettyReadGPS()
{
Serial.println("Leyendo GPS...");
GPS_Read(lat, lon);
Serial.print("\t - Latitud: "); Serial.print(lat); Serial.print("\r\n");
Serial.print("\t - Longitud: "); Serial.print(lon); Serial.print("\r\n");
}
void testMatrix()
{
Serial.println("Escribiendo en el display...");
MAX7219_DisplayText("Prueba de texto", PA_LEFT, 100, 500);
}
uint32_t getChipID()
{
@@ -22,28 +75,4 @@ uint32_t getChipID()
chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
}
return chipId;
}
void setup()
{
Serial.begin(9600);
/*// WiFi Connection
if(setupWifi() != 0)
{
Serial.print("Error connecting to WiFi");
}
// test get
getRequest(httpClient, "http://172.20.10.7:8082/api/v1/sensors/1/values", response);
deserializeSensorValue(httpClient, httpClient.GET()); */
BME280_Init();
}
void loop()
{
Serial.println(temperature);
Serial.println(pressure);
}
}