#if defined(ESP32)
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
#define DEVICE "ESP32"
#elif defined(ESP8266)
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
#define DEVICE "ESP8266"
#endif
#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>
#include "DHTesp.h"
#include <ESP32Servo.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <WiFi.h>
Servo myservo;
StaticJsonDocument<200> doc2;
StaticJsonDocument<200> doc;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.mqttdashboard.com";
WiFiClient espClient;
PubSubClient client2(espClient);
String m_luces = "";
char buffer2[300];
int status = WL_IDLE_STATUS;
String sr2 = "";
char rec[50];
String inputString = "";
float gf = 0.0, vel = 0.0;
int gi = 0;
bool critica = false;
int distance = 0;
int tempe = 0;
// WiFi AP SSID
#define WIFI_SSID "Wokwi-GUEST"
// WiFi password
#define WIFI_PASSWORD ""
// InfluxDB v2 server url, e.g. https://eu-central-1-1.aws.cloud2.influxdata.com (Use: InfluxDB UI -> Load Data -> Client Libraries)
#define INFLUXDB_URL "https://us-east-1-1.aws.cloud2.influxdata.com"
// InfluxDB v2 server or cloud API authentication token (Use: InfluxDB UI -> Data -> Tokens -> <select token>)
#define INFLUXDB_TOKEN "SXIjP3C1kuOcBZPnwfzXaRd0UqTqyAeGa2M_nolHX3_65LUkXvlq_IAewAlQS5nfnNdVZW0SZJzAcRBS7prVBg=="
// InfluxDB v2 organization id (Use: InfluxDB UI -> User -> About -> Common Ids )
#define INFLUXDB_ORG "EAFIT"
// InfluxDB v2 bucket name (Use: InfluxDB UI -> Data -> Buckets)
#define INFLUXDB_BUCKET "Ejercicio clases com fis"
// Set timezone string according to https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
// Examples:
// Pacific Time: "PST8PDT"
// Eastern: "EST5EDT"
// Japanesse: "JST-9"
// Central Europe: "CET-1CEST,M3.5.0,M10.5.0/3"
#define TZ_INFO "CET-1CEST,M3.5.0,M10.5.0/3"
// InfluxDB client instance with preconfigured InfluxCloud certificate
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);
// Data point
Point sensor("Sensor 1");
int sensorValue = 0;
int i1 = 0;
const int DHT_PIN = 15;
const int DHT_PIN2 = 18;
DHTesp dhtSensor;
DHTesp dhtSensor2;
void setup() {
Serial.begin(115200);
pinMode(13, INPUT);
WiFi.mode(WIFI_STA);
wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
dhtSensor2.setup(DHT_PIN2, DHTesp::DHT22);
Serial.print("Connecting to wifi");
while (wifiMulti.run() != WL_CONNECTED) {
Serial.print(".");
delay(100);
}
Serial.println();
// Add tags
sensor.addTag("device", DEVICE);
timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");
if (client.validateConnection()) {
Serial.print("Connected to InfluxDB: ");
Serial.println(client.getServerUrl());
} else {
Serial.print("InfluxDB connection failed: ");
Serial.println(client.getLastErrorMessage());
}
setup_wifi();
client2.setServer(mqtt_server, 1883);
client2.setCallback(callback);
myservo.setPeriodHertz(50);
myservo.attach(13, 500, 2400);
}
void setup_wifi() {
delay(10); // espera 10 milisegundos
Serial.println(); // Imprime un espacio de linea
Serial.print("Conectando a "); // Imprime la leyenda "Conectando a"
Serial.println(ssid); // Imprime la identificación de la red a al que se conecta
WiFi.begin(ssid, password); // Realiza la conexión a la red configurada usando el password configurado en el encabezado
while (WiFi.status() != WL_CONNECTED) { // Espera mientras se establece la conexión
delay(500); // Espera 500 milisegundos
Serial.print("."); // Imprime en la terminal "." hasta que se logre la conexión
}
Serial.println(""); //Imprime en la terminal un espacio
Serial.println("WiFi connecteda"); //Imprime en la terminal un espacio
Serial.println("dirección IP: "); //Imprime en la terminal "dirección IP: "
Serial.println(WiFi.localIP()); //Imprime en la terminal "dirección IP asignada al microcontrolador
}
void reconnect() { //función para la reconexión
while (!client2.connected()) { //Espera hasta que se establezca la reconexión
Serial.print("Esperando Conexión MQTT...");
if (client2.connect("Cliente_eldehibid")) { //Se conecta como cliente con el nombre ESP8266Cliente
Serial.println("connectada"); //Imprime en la terminal conectado con el cliente
client2.subscribe("Actuadores_eldehibid");
} else { // si no logra conectarse
Serial.print("falla, rc="); //Imprime en la terminal "falla, rc="
Serial.print(client2.state()); //Imprime en la terminal el tipo de falla de conexión (un múmero)
Serial.println("Intento de nuevo en 5 segundos"); //Imprime en la terminal "Intento de nuevo en 5 segundos"
delay(5000); //Espera 5 segundos
}
}
}
void loop() {
// Clear fields for reusing the point. Tags will remain untouched
sensor.clearFields();
Serial.println("Sending data...");
TempAndHumidity data = dhtSensor.getTempAndHumidity();
TempAndHumidity data2 = dhtSensor2.getTempAndHumidity();
delay(2000);
float temper=data.temperature;
float hum=data.humidity;
float hum2=data2.humidity;
sensor.addField("humedad", hum);
sensor.addField("humedadSuelo", hum2);
sensor.addField("temperatura", temper);
Serial.print("Writing: ");
Serial.println(sensor.toLineProtocol());
// If no Wifi signal, try to reconnect it
if ((WiFi.RSSI() == 0) && (wifiMulti.run() != WL_CONNECTED)) {
Serial.println("Wifi connection lost");
}
// Write point
if (!client.writePoint(sensor)) {
Serial.print("InfluxDB write failed: ");
Serial.println(client.getLastErrorMessage());
}
//Wait 10s
Serial.println("Wait 2s");
delay(2000);
if (!client2.connected()) {
reconnect();
}
client2.loop();
data = dhtSensor.getTempAndHumidity();
data2 = dhtSensor2.getTempAndHumidity();
doc["Temp"] = data.temperature;
doc["Hum"] = data.humidity;
doc["Hum2"] = data2.humidity;
char buffer[300];
serializeJson(doc, buffer);
client2.publish("sensores_eldehibid",buffer);
}
void callback(char* topic, byte* payload, unsigned int length) {
sr2 = "";
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
rec[i] = payload[i];
sr2 += rec[i];
inputString = sr2;
}
char msg2[inputString.length()];
Serial.println(msg2);
inputString.toCharArray(msg2, inputString.length() + 1);
StaticJsonDocument<200> doc2;
DeserializationError error = deserializeJson(doc2, msg2);
// Test if parsing succeeds.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
int Pos = sr2.toInt();
Serial.println(Pos);
//int pos=value.toInt();
int pos_esc = map(Pos, 0, 100, 0, 180);
myservo.write(pos_esc);
// if (Pos.equals("setServo")) {
// Serial.println(value);
// Serial.println(method_);
// int val_aux=value.toInt();
// int val = map(val_aux, 0, 100, 0, 180);
// myservo.write(val);
// }
}