sábado, 25 de febrero de 2017

Implementación de un Paso de Peatones con Sensores Inteligentes de Bajo Coste. Parte V

Sistema Software

Software nodo terminal
 La 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