0

Sensores, Central DCC++ y comunicación i2C

Muy buenas a todos!! Ahora que estoy animado con los sensores, y después de explicarlos un poco en la entrada anterior, Sigo haciendo mis pruebas, pero esta vez en la central directamente.

Dependiendo de como este configurada la maqueta, escala y proporciones, podríamos tener otra manera diferente de comunicar los eventos que suceden en la maqueta. Pero en mi caso particular, es una maqueta modular y cada modulo tiene su propio arduino (mínimo). También tras la ultima mudanza la única manera de poner la maqueta es a lo largo teniendo que construir unos bucles de retorno en las puntas. Resumiendo, mi maqueta mide casi 7 metros de largo… cablear todo eso no era una opción. No tenía ya muchas alternativas, una de mis primeras ideas fuer probar la comunicación por IR, y aunque funcionó, no me termino de convencer por varias razones, pero no entraré ahora mismo en ellos.

Al final encontré la solución…El protocolo i2C es algo que esta más que probado y que por el momento y en las pruebas a pequeña escala que he realizado funciona perfectamente, si bien aun tengo que investigar un poco más ya que me da algunos conflictos con la pantalla LCD 16×02 que tengo actualmente.

Basándome en los mismo archivo de recepción de datos para la comunicación que tienen la librería quedarían dos archivos parecidos a estos:

Archivo i2Csensor.h:

#ifndef _I2CSENSOR_h_
#define _I2CSENSOR_h_

#include "DCCpp.h"
#ifdef USE_I2CSENSOR
#include <Wire.h>

#define  CANALI2C   3  // Dirección i2C de escucha
#define  MAX_COMMAND_I2C_LENGTH   30 // Máximo de caracteres

/** Datos asociados al sensorI2c.*/
struct i2cSensor{
  static char wireString[MAX_COMMAND_I2C_LENGTH + 1];
  static bool parse(char *);
  static void process();
  static void init();
}; // TextCommand
#endif
#endif

Y este es el archivo que lee los datos recibidos por i2C y los pasa directamente por el serial o bluetooth el archivo se llama i2cSensor.cpp:

#include "i2Csensor.h"

#ifdef USE_I2CSENSOR
char w;
char i2cSensor::wireString[MAX_COMMAND_I2C_LENGTH+1];

void i2cSensor::init(){
    Wire.begin(CANALI2C); // Direccion 3
    Wire.onReceive(i2cSensor::process); // Configuramos la recepcion como una interrupcion/evento
    Serial.print(F("Cargado Wire en canal "));
    Serial.println(CANALI2C);
}

// TextCommand:process
/////////////////////////////////////////////////////////////////
void i2cSensor::process(){

while (Wire.available()>0) {    // while there is data on the serial line
    w = Wire.read();
    Serial.println(w);
    if (w == '<')         // start of new command
      wireString[0] = 0;
    else if (w == '>')    // end of new command
      parse(wireString);
    else if (strlen(wireString) < MAX_COMMAND_I2C_LENGTH)  // if commandString still has space, append character just read from serial line
      sprintf(wireString, "%s%c", wireString, w); // otherwise, character is ignored (but continue to look for '<' or '>')
  } 
} 
bool i2cSensor::parse(char *com){
  String data = (String)com;
  Serial.println(data);  // Salida a monitor serial para pruebas
  Serial.print(com);     // Salida a monitor serial para pruebas
 
  #ifdef USE_BLUETOOTH  // Manda el comando recibido por Bluetooth
    BLUETOOTH.print("<");
    BLUETOOTH.print(data);
    BLUETOOTH.print(">");
  #endif
}
#endif

Luego hay que añadir los procesos a la linea principal y su «fusible» en el archivo DCCpp.h. Para la linea principal tendremos que añadir en el archivo DCCpp.cpp buscando la función:

void DCCpp::begin()

y añadir las siguientes lineas :

#ifdef USE_I2CSENSOR
	i2cSensor::init();
#endif

y el el mismo archivo dentro de la función:

void DCCpp::loop()

#ifdef USE_I2CSENSOR
		i2cSensor::process();
#endif			

y ahora si, añadimos el «fusible» en el archivo DCCpp.h, situándonos casi al final del archivo:

 #define USE_I2CSENSOR

y al final del archivo:

#ifdef USE_I2CSENSOR
#include "i2Csensor.h"
#endif
////// antes de estas lineas que cierran el archivo
#include "DCCpp.hpp"
#endif

Y bien con esto que es lo que llevo por el momento es la manera de replicar la recepción de los diferentes sensores.

También decir que esto es una especie de «parche» por que la central realmente no se entera de que el sensor esta activado o no, simplemente recibe el sensor y lo manda por Serial o Bluetooth. dando Q o q según estado alto o bajo respectivamente.

Saludos a todos y pronto subiré los esquemas de como va la instalación y si realmente esta dando resultado, Saludos!!!!

(Visitado 35 veces, 1 visitas hoy)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *