#include <DHT.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <ArduinoJson.h>
// Definición de pines
#define DHTPIN 4
#define DHTTYPE DHT22
#define TRIGPIN 12
#define ECHOPIN 13
#define BUZZERPIN 27
#define LEDPIN 26
#define POTPIN 34
#define CHIPSELECT 5
// Inicialización de DHT
DHT dht(DHTPIN, DHTTYPE);
// Variables
unsigned long tiempo;
float temperatura;
float humedad;
float distancia;
float umbralAlarma;
// Función para medir distancia
float medirDistancia() {
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
long duration = pulseIn(ECHOPIN, HIGH);
float distance = (duration * 0.0343) / 2;
return distance;
}
void setup() {
Serial.begin(9600);
// Inicialización de pines
pinMode(TRIGPIN, OUTPUT);
pinMode(ECHOPIN, INPUT);
pinMode(BUZZERPIN, OUTPUT);
pinMode(LEDPIN, OUTPUT);
pinMode(POTPIN, INPUT);
// Inicialización de DHT
dht.begin();
// Inicialización de SD
if (!SD.begin(CHIPSELECT)) {
Serial.println("Inicialización de la SD fallida!");
return;
}
Serial.println("SD inicializada.");
}
void loop() {
// Lectura de sensores
temperatura = dht.readTemperature();
humedad = dht.readHumidity();
distancia = medirDistancia();
umbralAlarma = analogRead(POTPIN) / 4095.0 * 100;
tiempo = millis() / 1000;
// Escribir datos en Serial
// Generar JSON
StaticJsonDocument<200> doc;
doc["temperatura"] = temperatura;
doc["humedad"] = humedad;
doc["distancia"] = distancia;
doc["umbralAlarma"] = umbralAlarma;
// Serializar JSON a cadena
String jsonString;
serializeJson(doc, jsonString);
// Imprimir cadena JSON en el monitor serial
Serial.println(jsonString);
// Guardar JSON en archivo
File dataFile = SD.open("datos_ambientales.json", FILE_WRITE);
if (dataFile) {
serializeJson(doc, dataFile);
dataFile.println();
dataFile.close();
}
// Activar alarma si la temperatura supera el umbral
if (temperatura > umbralAlarma) {
digitalWrite(BUZZERPIN, HIGH);
digitalWrite(LEDPIN, HIGH);
} else {
digitalWrite(BUZZERPIN, LOW);
digitalWrite(LEDPIN, LOW);
}
delay(2000);
}