Sistema Software
Software nodo terminalLa comunicacion con el servidor MQTT consistirá en recoger los eventos que son enviados por el broker y en el caso de algun evento corresponda con PEATON, se encenderá el led. Además en caso de que el nodo detecte uun peaton emitirá dicho evento.
A continuacion se muestra el código correspondiente al cliente MQTT implementado en los nodos terminales
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#define OUT_LED D4
#define NADA 0
#define PEATON 1
#define COCHE 2
//EDIT THESE LINES TO MATCH YOUR SETUP
#define MQTT_SERVER "192.168.0.5"
//"test.mosquitto.org"
const char* ssid = "Vodafone6717";
const char* password = "MMCDQCPIYODWPL";
//D9 en la parte de arduino y GPIO2 por detras
char* lightTopic = "PASOPEATONES";
int ESTADO_OTHER=NADA;
double instante_ESTADO_OTHER;
///////////////////////////////////////////////////////////////////////////
///////////////////////VARIABLES TIEMPO PEATON////////////////////////////
//////////////////////////////////////////////////////////////////////////
double instante_peaton;
double MAX_PEATON = 4000;
double instante_evento;
double MAX_ENVIO_EVENTO=2000;
double MAX_LED_ENCENDIDO=4000;
///////////////////////////////////////////////////////////////////////////
///////////////////////FUNCIONES Y OBJETOS ESP8266/////////////////////////
//////////////////////////////////////////////////////////////////////////
//Definicion de la funcion callback del cliente MQTT
void callback(char* topic, byte* payload, unsigned int length);
//Funcion que convierte una direccion mac a string
String macToStr(const uint8_t* mac) {
String result;
for (int i = 0; i < 6; ++i) {
result += String(mac[i], 16);
if (i < 5) {
result += ':';
}
}
return result;
}
//VARAIABLES CONEXIÓN A LA RED Y AL SERVIDOR MQTT
WiFiClient wifiClient;
PubSubClient client(MQTT_SERVER, 1883, callback, wifiClient);
void callback(char* topic, byte* payload, unsigned int length) {
/*String topicStr = topic;
Serial.println("Callback update.");
Serial.print("Topic: ");
Serial.println(topicStr);*/
if (payload[0] == 'P') {
ESTADO_OTHER=PEATON;
instante_ESTADO_OTHER=millis();
Serial.println("Evento peaton recibido");
}
}
//FUNCION DE CONEXION A LA RED
void reconnect() {
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Connecting to ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
if (WiFi.status() == WL_CONNECTED) {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientName;
clientName += "esp8266-";
uint8_t mac[6];
WiFi.macAddress(mac);
clientName += macToStr(mac);
if (client.connect((char*) clientName.c_str())) {
Serial.print("\tMTQQ Connected");
client.subscribe(lightTopic);
}
else {
Serial.println("\tFailed.");
abort();
}
}
}
}
//FUNCION DE INICIALIZACION PRINCIPAL
void setup() {
Serial.begin(115200); delay(100);
WiFi.begin(ssid, password);
reconnect();
delay(2000);
///////////////////////////////////////////////////////////////////////////
////////////////////INICIALIZACION EVENTO PEATON///////////////////////////
//////////////////////////////////////////////////////////////////////////
instante_peaton=millis();
pinMode(OUT_LED, OUTPUT);
digitalWrite(OUT_LED,LOW);
instante_evento=millis();
}
int last_state=NADA;
//FUNCION BUCLE PRINCIPAL
void loop() {
if (!client.connected() && WiFi.status() == 3) {
reconnect();
}
client.loop();
////////////ACCIONES POST FUZZY////////////
if(ESTADO!=last_state){
last_state=ESTADO;
Serial.println("Cambio de estado");
if(ESTADO==NADA){
Serial.println("NADA");
}else if(ESTADO==PEATON){
Serial.println("PEATON");
}else if(ESTADO == COCHE){
Serial.println("COCHE");
}
}
double tiempo_evento=millis()-instante_evento;
if(ESTADO==PEATON && tiempo_evento > MAX_ENVIO_EVENTO){
instante_evento=millis();
Serial.println("ENVIO EVENTO");
client.publish(lightTopic, "P");
//emitir peaton
}
if((ESTADO_OTHER==PEATON && ((millis()-instante_ESTADO_OTHER)<MAX_LED_ENCENDIDO))|| ESTADO==PEATON){
digitalWrite(OUT_LED, HIGH);
//Serial.println("ENCENDER LED");
instante_peaton=millis();
}
double tiempo_peaton=millis()-instante_peaton;
if(tiempo_peaton>MAX_PEATON){
//Serial.println("APAGAR LED");
digitalWrite(OUT_LED, LOW);
}
}
<<Anterior
No hay comentarios:
Publicar un comentario