Programa para el Chivato. Arduino sketch for Chivato.

Esto no es un tutorial de manejo de Arduino de los sensores y componentes que hacen funcionar el Chivato. Para ello existe en la red un amplio repertorio de tutoriales y documentación, que pueden dar respuesta a las dudas que te surjan al revisar este programa. Solo es una explicación básica de su estructura y funcionamiento.

Para bajarse el diseño para montar su protoboard de pruebas y el programa completo.

DESCARGAR


DEFINICIÓN DE LIBRERÍAS Y VARIABLES: Las 4 librerías utilizadas son: RF24Network, RF24 y SPI para controlar la transmisión del transceptor nRF24L01+ Y FastLED.h para controlar el Neopixel de 8 Leds, encargado de emitir el aviso luminoso.

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <FastLED.h>

Se define el número del Leds del Neopixel. Se crea la instancia para su gestión. Se activa el pin del Arduino Nano para su gestión. Inicializa la tabla con los 8 colores predefinidos de aviso.

// NEOPIXEL
// 
#define NUM_LEDS 8
// Array de Leds
CRGB leds[NUM_LEDS];
// Arduino pin usado para datos.
#define DATA_PIN 7

unsigned int scaleColor[8][3] =
{
  { 255, 0, 0 },     // 0 ROJO
  { 255, 164, 032 }, // 1 NARANJA
  { 255, 255, 0 },   // 2 AMARILLO
  { 0, 255, 0 },     // 3 VERDE
  { 0, 255, 255 },   // 4 CIAN
  { 0, 0, 255 },     // 5 AZUL
  { 255, 0, 255 },   // 6 MAGENTA
  { 255, 255, 255 }  // 7 BLANCO
};

Se asigna el pin de control para el sensor de presencia PIR. Se inicializa los valores para controlar su estado.

// PIR
//
const int SwPresencia = 8;
int estado = 0;
unsigned int EstadoBascula[] = {99, 99, 99, 99, 99};
//
// NRF24L01 +
//
int EstadoCarga = 0;
int NumeroCelda = 0;
int ColorSalida = 0;
int TipoAlarma = 0;

Se detalla la conexión de pines entre el Arduino Nano y el nRF24L01+. Se crea una instancia de la radio, indicando los pines de control. Utiliza RF24Network para la gestión de la comunicación. Inicializa este nodo como 00. Asigna el canal de comunicación “25” para recibir del correspondiente Neoted la siguiente información: El nodo que le llama, si esta activo o no, el color asignado para avisar, y lo que tiene que hacer el chivato.

// USO PARA LIBRERIA NRF24.
//
//   ARDUINO NANO      nRF24L01 +     ARDUINO NANO
//
//        --      |   IRQ * * MISO  |     12
//        11      |  MOSI * * SCK   |     13
//        10      |   SCN * * CE    |     9
//       3.3V     |   VCC * * GND   |     GND
//
RF24 radio(9, 10);

RF24Network network(radio);
const uint16_t this_node = 00;
//const uint16_t other_node = 01;
int RFCanal = 25;

struct payload_t {
  unsigned long payload_t_node;
  unsigned long payload_t_activo;
  unsigned long payload_t_color;
  unsigned long payload_t_tipo;
};

SETUP. Se activa pin de sensor PIR como entrada. Se ajusta la transmisión a 250 Kb por segundo. Se activa el canal de transmisión definido anteriormente. Se inicializa el Neopixel.

///// SETUP
//
void setup() {

  Serial.begin(57600);

  pinMode (SwPresencia , INPUT);

  //
  SPI.begin();
  radio.begin();

  radio.setDataRate(RF24_250KBPS);
  boolean result = radio.setDataRate(RF24_250KBPS);

  if (result) {
    Serial.println("cambio setDataRate");
  }
  else {
    Serial.println("error");
  }

  radio.setChannel(RFCanal);

  network.begin( this_node );
  Serial.print("node address: ");
  Serial.print(this_node);
  Serial.print("channel: ");
  Serial.println(RFCanal);


  //Inicializar NEOPIXEL
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
}

LOOP. Realiza la lectura del nRF24L01+. Se obtiene el estado del PIR.  Si esta activado, ilumina el led correspodiente del Neopixel, asociado al Neoted correspodiente.

//
///// LOOP
//
//
void loop() {

  Lectura_basculas();

  estado = digitalRead(SwPresencia);
  delay(30);
      
  if (estado > 0) {

        for(int g=0;g<5;g++){
          if (EstadoBascula[g] != 99){
            Ilumina_led(g + 4, EstadoBascula[g]);
          }
        }

  } else {

        for (int id = 2; id <= NUM_LEDS; id++) {
          Apaga_led(id);
        }
        Apaga_led(1);
        EstadoCarga = 0; NumeroCelda = 0; ColorSalida = 0; TipoAlarma = 0;
  }


}

Revisa continuamente la transmisión. Si existe comunicación carga en la tabla dependiendo de tipo de aviso, los valores para iluminar el Neopixel.

void Lectura_basculas() {

 network.update();
 
  if ( network.available() ) {

    Ilumina_led(1, 0);
    
    RF24NetworkHeader header;
    payload_t payload;
    network.read(header, &payload, sizeof(payload));

    NumeroCelda = (int) payload.payload_t_node;
    EstadoCarga = (int) payload.payload_t_activo;
    ColorSalida = (int) payload.payload_t_color;
    TipoAlarma = (int) payload.payload_t_tipo;

    Serial.println(" ******************");
    Serial.print(" N.Celda: ");
    Serial.print(NumeroCelda);
    Serial.print(" EstadoCarga: ");
    Serial.print(EstadoCarga);
    Serial.print(" Color: ");
    Serial.print(ColorSalida);
    Serial.print(" Tipo Alarma: ");
    Serial.println(TipoAlarma);

    // Carga en la tabla el estado de la bascula


      if ((EstadoCarga == 0 && TipoAlarma == 1) || (EstadoCarga == 1 && TipoAlarma == 0)) {

          EstadoBascula[NumeroCelda-1] = ColorSalida;
          Serial.print("Posicion :");
          Serial.print(NumeroCelda-1);
          Serial.print(" Guardo el color: ");
          Serial.println(EstadoBascula[NumeroCelda-1]);

      }else{

         EstadoBascula[NumeroCelda-1] = 99;
      }

      

    } else {

      Apaga_led(1);

    }

}

Enciende el led correspondiente del Neopixel con el color asignado en el Neoted.

void Ilumina_led(int nLed, int nColor) {

  nLed--;
  leds[nLed].setRGB( scaleColor[nColor][0], scaleColor[nColor][1], scaleColor[nColor][2]);
  FastLED.show();
  delay(30);

}

Apaga el Neopixel.

void Apaga_led(int xLed) {

  xLed--;
  leds[xLed].r = 0;
  leds[xLed].g = 0;
  leds[xLed].b = 0;
  FastLED.show();
  delay(30);
}

En próximo artículo se describe los sensores y componentes electrónicos necesarios para su montaje.

COMPONENTES ELECTRÓNICOS.

Si necesitas ampliar información sobre Arduino recomiendo visitar Aprendiendo Arduino.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

Subir ↑

A %d blogueros les gusta esto: