// -------------------------------------------------------------------------- //
// Libraries.
#include <DHT.h>
#include <ArduinoJson.h>
// DHT22.
const int dhtPin = 15;
DHT dht22(dhtPin, DHT22);
// Ultrasonic sensor.
const int echoPin = 25; const int trigPin = 26;
float readSensorData();
// Potentiometer.
const int potentiometerPin = 34;
// LED.
const int ledPin = 13;
// Buzzer.
const int buzzerPin = 27;
// Thresholds.
float tempMax;
float humdMax = 50.0;
float distanceMax = 120.0;
// Variables.
float temperature; float humidity;
float distance; int alertThreshold;
// -------------------------------------------------------------------------- //
void setup() {
// Begin serial communication at 115200 baud rate.
Serial.begin(115200);
// Set echoPin as input and trigPin as output.
pinMode(echoPin, INPUT); pinMode(trigPin, OUTPUT);
// Potentiometer as input.
pinMode(potentiometerPin, INPUT);
// Led as output.
pinMode(ledPin, OUTPUT);
// Buzzer as output.
pinMode(buzzerPin, OUTPUT);
}
// -------------------------------------------------------------------------- //
void loop() {
// Distance from the ultrasonic sensor.
distance = readDistance();
// Serial.print("Distancia: ");
// Serial.print(distance); Serial.println(" cm");
// Temperature from the DHT sensor.
temperature = dht22.readTemperature();
// Serial.print("Temperatura: ");
// Serial.print(temperature); Serial.println(" °C");
humidity = dht22.readHumidity();
// Serial.print("Humedad: ");
// Serial.print(humidity); Serial.println(" %");
// Potentiometer value.
alertThreshold = analogRead(potentiometerPin);
// Serial.print("Umbral de alerta: "); Serial.println(alertThreshold);
// ------------------------------------------------------------------------ //
tempMax = (alertThreshold / 4095.0) * 80;
bool optimalConditions = true;
// Umbrales de alerta.
if (distance > distanceMax) {
optimalConditions = false;
tone(buzzerPin, 1000);
}
if (temperature > tempMax) {
optimalConditions = false;
tone(buzzerPin, 1500);
}
if (humidity > humdMax) {
optimalConditions = false;
tone(buzzerPin, 2000);
}
// ------------------------------------------------------------------------ //
// LED state.
if (optimalConditions) {
noTone(buzzerPin);
digitalWrite(ledPin, HIGH);
} else {
for (int i = 0; i < 5; i++) {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
}
// Generarate JSON.
generateJSON();
// Delay between readings.
delay(1000);
}
// -------------------------------------------------------------------------- //
float readDistance() {
// Trigger a low signal before sending a high signal.
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Send a 10-microsecond high signal to the trigPin.
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
// Return to low signal.
digitalWrite(trigPin, LOW);
// Measure the duration of the high signal on the echoPin.
unsigned long microsecond = pulseIn(echoPin, HIGH);
// Calculate the distance using the speed of sound (29.00µs per centimeter).
float distance = microsecond / 29.00 / 2;
// Return the calculated distance.
return distance;
}
void generateJSON() {
StaticJsonDocument<200> doc;
doc["Temperatura"] = temperature;
doc["UmbralTemperatura"] = tempMax;
doc["Humedad"] = humidity;
doc["UmbralHumedad"] = humdMax;
doc["Distancia"] = distance;
doc["UmbralDistancia"] = distanceMax;
char jsonBuffer[512];
serializeJson(doc, jsonBuffer);
Serial.println(jsonBuffer);
}
// -------------------------------------------------------------------------- //