flota./proyecto_flota/proyecto_flota.ino

176 lines
5.2 KiB
C++

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>
#include <WiFiEsp.h>
#include <WiFiEspClient.h>
#include <PubSubClient.h>
#include "SoftwareSerial.h"
// mi red de wifi, que en dado caso será la red de wifi de la empresa
#define WIFI_ "familia meneses"
#define WIFI_PASSWORD "pibo182221"
//Nombre o IP del servidor mosquitto
char server[100] = "192.168.0.180";
//Conexión serial para el esp con una comunicación
//serial, pines 15: rx y 16: tx
SoftwareSerial soft(15, 16);
//Contador para el envio de datos
unsigned long lastSend;
int status = WL_IDLE_STATUS;
//Iniciamos el objeto subscriptor del cliente
//con el objeto del cliente
PubSubClient client(espClient);
//se Inicializa el objeto de cliente esp
WiFiEspClient espClient;
// El nomnbre se obtiene en la pagina principal del software
#define ID_Flota "Flota_ID"
WiFiClientSecure client;
const int sensorPIR = 17; // Pin donde está conectada la entrada del sensor PIR
const int luz = 11;// Pin para luz de led.
int conteo = 0;
String mensaje = "";
String conteoString = "";
int PIR = 0;
////Setup////
void setup() {
//Inicializamos la comunicación serial para el log
Serial.begin(115200);
//Iniciamos la conexión a la red WiFi
InitWiFi();
//Colocamos la referencia del servidor y el puerto
client.setServer( server, 1883 );
lastSend = 0;
//Se activa el resistor de PULLUP para la entrada sensor PIR
pinMode(sensorPIR, INPUT_PULLUP);
pinMode(luz, OUTPUT);
pinMode(sensorPIR, INPUT_PULLUP);
pinMode(luz, OUTPUT);
// Intenta conectarse a la red Wifi:
Serial.print("Se conectara a la red wifi... ");
Serial.println(WIFI_);
//Seteo de la red Wifi
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(700);
}
Serial.println("");
Serial.println("Conectado a la red wifi!!!");
Serial.print("Dirección mac: ");
Serial.println(WiFi.macAddress(mac));//Imprimimos la mac de la flota
bot.sendMessage(ID_Chat, "Flota saliendo!!!", "");//Enviamos un mensaje al software que va saliendo la flota
}
void loop() {
//Validamos si el modulo WiFi aun esta conectado a la red
status = WiFi.status();
if(status != WL_CONNECTED) {
//Si falla la conexión, reconectamos el modulo
reconnectWifi();
}
//Validamos si esta la conexión del servidor
if(!client.connected() ) {
//Si falla reintentamos la conexión
reconnectClient();
}
//Creamos un contador para enviar la data cada 2 segundos
if(millis() - lastSend > 2000 ) {
sendDataTopic();
lastSend = millis();
}
client.loop();
}
PIR = digitalRead(sensorPIR);//se lee el estado del sensor PIR
//Si es igual a "1" se cumple la condición
if(PIR == 1){
digitalWrite(luz, HIGH);//Encendemos la luz
Serial.println("Esta saliendo una flota!");
conteo = conteo + 1;//Incremento en el contador de movimientos detectados
conteoString = String(conteo);//se convierte una cadena
mensaje = "Movimiento detectados: " + conteoString;//Concatenamos ambas cadenas
delay(5000);//mantensmos la luz encendida este tiempo
digitalWrite(luz, LOW);//Luego la apagamos
Serial.println("Luz apagada!");
PIR = 0;//Asignamos el valor "0" a la variable PIR para que deje de cumplirse la condición
}
}
void sendDataTopic()
{
Serial.println("sendDataTopic");
// Preparandose la flota
String payload = "Hola desde la flota";
// enviar
char attributes[100];
payload.toCharArray( attributes, 100 );
client.publish( "outTopic", attributes );
Serial.println( attributes );
}
//Inicializamos la conexión a la red wifi
void InitWiFi()
{
//Inicializamos el puerto serial
soft.begin(9600);
//Iniciamos la conexión wifi
WiFi.init(&soft);
//Verificamos si se pudo realizar la conexión al wifi
//si obtenemos un error, lo mostramos por log y denememos el programa
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("El modulo WiFi no esta presente");
while (true);
}
reconnectWifi();
}
void reconnectWifi() {
Serial.println("Iniciar conección a la red WIFI");
while(status != WL_CONNECTED) {
Serial.print("Intentando conectarse a SSID: ");
Serial.println(WIFI_);
//Conectar a red WPA/WPA2
status = WiFi.begin(WIFI_, WIFI_PASSWORD);
delay(500);
}
Serial.println("Conectado a la red WIFI");
}
void reconnectClient() {
//Creamos un loop en donde intentamos hacer la conexión
while(!client.connected()) {
Serial.print("Conectando a: ");
Serial.println(server);
//se Crea una nueva cadena de conexión para el servidor
//e intentamos realizar la conexión nueva
//si la flota no esta registrada se tendra que registar
String clientId = "ESPClient-" + String(random(0xffff), HEX);
if(client.connect(clientId.c_str())) {
Serial.println("[DONE]");
} else {
Serial.print( "[FAILED] [ rc = " );
Serial.print( client.state() );
Serial.println( " : volver a intentar 5 segundos ]" );
delay( 5000 );
}
}
}