martes, 16 de octubre de 2012

Negamatik. x10 + Arduino (2)

Para comenzar vamos a tener que conectar el arduino al módulo bidireccional X10 por medio de un cable RJ-11. El esquema de conexión es el siguiente:


Las resistencias del ZCROSS y del RCV son de 10k cada una.

En el arduino tendremos el siguiente código, el cual recibe ordenes del pc por el interfaz Serial del USB, las procesa y se las envía al módulo X10:

/*
NegaMatik.pde

Interface serie para arduino para controlar dispositivo X10 de Marmitek.
Ordenes que recive:

. {CASA|ACCION}

. {A2|1}- //ON

. {A2|2}- //Off

. {A2|INFO}
*/
#include <x10.h>
#include <x10constants.h>

#define ZCROSS_PIN     2               // BLK pin 1 of PSC05
#define RCVE_PIN       3               // GRN pin 3 of PSC05
#define TRANS_PIN      4               // YEL pin 4 of PSC05
#define LED_PIN        13              // for testing

x10 myHouse= x10(ZCROSS_PIN,TRANS_PIN,RCVE_PIN,LED_PIN);// set up a x10 library instance:


String inputString = "";         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete

void setup() {
// initialize serial:
Serial.begin(9600);

//Serial.println("INICIO....");
// reserve 200 bytes for the inputString:
//inputString.reserve(200);
}

void loop() {
// print the string when a newline arrives:
if (stringComplete) {
  Serial.println(inputString);
  procesarOrden(inputString);
 
  // clear the string:
  inputString = "";
  stringComplete = false;
}
}

/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX.  This routine is run between each
time loop() runs, so using delay inside loop can delay
response.  Multiple bytes of data may be available.
*/
void serialEvent() {
while (Serial.available()) {
  // get the new byte:
  char inChar = (char)Serial.read();
  // add it to the inputString:
 
  inputString += inChar;
  // if the incoming character is a newline, set a flag
  // so the main loop can do something about it:
  if (inChar == '-') {
    stringComplete = true;
  }
}
}


void procesarOrden(String cadena){
int pos = cadena.indexOf("{");
String casaUnidad;
char accion;
char casa;
char unidad;
char unidad2;

if(pos>=0){
    int pos2 = cadena.indexOf("|");
    if(pos2>0){

       casaUnidad = cadena.substring(pos+1, pos2);
       casa = casaUnidad.charAt(0);
       unidad = casaUnidad.charAt(1);
       unidad2 = casaUnidad.charAt(2);
     
       pos = pos2;
       pos2 = cadena.indexOf("}");
       if(pos2>0){
           //Serial.println("{ACCION_OK}");
           accion = cadena.substring(pos+1, pos2).charAt(0);
           procesarOrden2(casa, unidad, unidad2, accion);
       }else{
           //Serial.println("{ERR_ACCION}");
       }

}else{

    //Serial.println("{ERR_CASA}");

}
}else{
    //Serial.println("{ERR_ORDEN}");
}

}

void procesarOrden2(char casa, char unidad, char unidad2, char accion) {
  //Serial.println(casa);
  //Serial.println(unidad);
  //Serial.println(accion);
 
  if (accion == '1') {  //ON
       //Serial.println(" on");
       myHouse.write(getHouse(casa), getUnit(unidad, unidad2), 1);
       myHouse.write(getHouse(casa), ON, 1);
     
              // on
 }else if (accion == '2') { // OFF
       //Serial.println(" off");
       myHouse.write(getHouse(casa), getUnit(unidad, unidad2), 1);
       myHouse.write(getHouse(casa), OFF, 1);
    
          // off
 }else{
   myHouse.Check_Rcvr();                       // print out the received command
   myHouse.debug();
   myHouse.reset();
   //Serial.println("hola");

 }
//devolver info


}


byte getUnit(char unidad, char unidad2){
switch(unidad){
 
  case '0':
 
  switch (unidad2) {
    case '1': return UNIT_1;
          break;
    case '2':return UNIT_2;
          break;

case '3':return UNIT_3;
          break;

case '4':return UNIT_4;
          break;

case '5':return UNIT_5;
          break;

case '6':return UNIT_6;
          break;

case '7':return UNIT_7;
          break;

case '8':return UNIT_8;
          break;

case '9':return UNIT_9;
          break;
default: return UNIT_9;
  }
 
  case '1':
  switch(unidad2){
case '0':return UNIT_10;
          break;

case '1':return UNIT_11;
          break;

case '2':return UNIT_12;
          break;

case '3':return UNIT_13;
          break;

case '4':return UNIT_14;
          break;

case '5':return UNIT_15;
          break;

case '6':return UNIT_16;
          break;
    default: return UNIT_16;
 }
 default: return UNIT_16;
}
}


byte getHouse(char casa){
switch (casa) {

case 'A': return HOUSE_A;
            break;
    case 'B': return HOUSE_B;
            break;

case 'C': return HOUSE_C;
            break;

case 'D': return HOUSE_D;
            break;

case 'E': return HOUSE_E;
            break;

case 'F': return HOUSE_F;
            break;

case 'G': return HOUSE_G;
            break;

case 'H': return HOUSE_H;
            break;

case 'I': return HOUSE_I;
            break;

case 'J': return HOUSE_J;
            break;

case 'K': return HOUSE_K;
            break;

case 'L': return HOUSE_L;
            break;

case 'M': return HOUSE_M;
            break;

case 'N': return HOUSE_N;
            break;

case 'O': return HOUSE_O;
            break;

case 'P': return HOUSE_P;
            break;
    default: return HOUSE_K;
 }
}



Continúa aqui...

No hay comentarios:

Publicar un comentario