Programa para el Neoted. Arduino sketch for Neoted.

Esto no es un tutorial de manejo de Arduino de los sensores y componentes que hacen funcionar el Neoted. Para ello existe en la red un amplio repertorio de tutoriales y documentación, que puede dar respuesta a las dudas que pueda surgir 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 HX711 para controlar el amplificador de señal de la Celda de Carga.

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

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 el nodo del Chivato como 00. Asigna el canal de comunicación “25” para transmitir al Chivato 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.

////////////////////////////////////////////////////////////////////////////////////////////////7
// 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 master_node = 00;

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;
};

Detalla la conexión de pines entre Arduino Nano y el amplificador HX711, encargado de leer la celda de carga.

///////////////////////////////////////////////////////////////////////////
// LOAD CELL & AMPLIFIER HX711
//
//
//  CELDA CARGA            HX711           ARDUINO NANO.
//     ROJO              E+ | GND              GND
//     NEGRO             E- | DT               3 (A0 - 14)
//     VERDE             A- | SCK              2 (A1 - 15)
//     BLANCO            A+ | VCC              5V
//
#define DOUT 14
#define CLK 15

HX711 balanza(DOUT, CLK);
// Precisión para activar la celda 40grm.
float calibration_factor = -7050;

unsigned long value = 0;

int peso_int = 0;

Define la tabla con los valores que se utiliza para mostrar el número del Neoted en el display de 7 segmentos.

//////////////////////////////////////////////////////////////////////////
// DISPLAY 7 SEGMENTOS.
//
byte  Digit[10][7] =
{
  { 0, 0, 0, 1, 0, 0, 0 },     // 0
  { 0, 1, 1, 1, 1, 1, 0 },     // 1
  { 1, 0, 0, 0, 1, 0, 0 },     // 2
  { 0, 0, 1, 0, 1, 0, 0 },     // 3
  { 0, 1, 1, 0, 0, 1, 0 },     // 4
  { 0, 0, 1, 0, 0, 0, 1 },     // 5
  { 0, 0, 0, 0, 0, 0, 1 },     // 6
  { 0, 1, 1, 1, 1, 0, 0 },     // 7
  { 0, 0, 0, 0, 0, 0, 0 },     // 8
  { 0, 0, 1, 0, 0, 0, 0 }      // 9
};

const int pin_inicial_led = 2;

Asigna los pines de entrada analógica del Arduino Nano, para la lectura de los potenciómetros.

///////////////////////////////////////////////////////////////
// SELECCION COLOR
//
const int SwColor = A3;
unsigned long vcolor = 0;
//
// SELECCION TIPO CHIVATO
//
const int SwChivato = A4;
unsigned long vchivato = 0;
//
// SELECCION NUMERO BASCULA
//
const int SwBascula = A5;
unsigned long vbascula = 0;
//

SETUP. El bucle for asigna los pines de salida del Display de 7 segmentos y el pin para el punto del Display. Se ajusta la transmisión a 250 Kb por segundo. Se activa el canal de transmisión definido anteriormente. Se calibra el HX711, para recibir las lecturas de la celda de carga.

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

  for (int i = pin_inicial_led; i < 9; i++) {
    pinMode(i, OUTPUT);
  }

  pinMode(16, OUTPUT); // PUNTO DISPLAY

  Off_Number();

  Serial.begin(57600);
  Serial.println("INICIALIZANDO CELDA Y TRANSMISION");

  // AJUSTE DE TRANSMISION
  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);
  //
  // CALIBRAR LOAD CELL
  //
  balanza.set_scale(calibration_factor);
  balanza.set_offset(8421804);
  balanza.tare(200);

  delay(200);

  Serial.println("OK LISTA PARA PESAR");

}

LOOP. Realiza la lectura de los potenciómetros. Si el valor del número de Neoted ha cambiado, asigna este número como nodo de comunicación emisor.  Revisa continuamente la transmisión. Si el Neoted tiene algo sobre él, apaga el display con el número. Chequea la comunicación y transmite la información.

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

  long vbascula_new = Read_Bascula();
  long vcolor_new = Read_Color();
  long vchivato_new = Read_Chivato();

  if (vbascula != vbascula_new) {
    vbascula = vbascula_new;
    network.begin( vbascula );
    Serial.print("node address: ");
    Serial.println(vbascula);
  }

  if (vcolor != vcolor_new) {
    vcolor = vcolor_new;
  }

  if (vchivato != vchivato_new) {
    vchivato = vchivato_new;
  }

  network.update();

  float peso = balanza.get_units(10);
  unsigned peso_int = (int) peso;

  if (peso_int > 0) {
    value = 1;
    Serial.println("ENCENDIDO");
    Serial.println(peso_int);
    Off_Number();
  } else {
    value = 0;
    Serial.println("APAGADO");
    Serial.println(vbascula);
    Display_Number(vbascula);
  }

  Serial.print("ENVIANDO... ");
  Serial.print(" Báscula: ");
  Serial.print(vbascula);
  Serial.print(" Apagado/Encendido: ");
  Serial.print(value);
  Serial.print(" Color: ");
  Serial.print(vcolor);
  Serial.print(" Tip.Chivato ");
  Serial.println(vchivato);

  payload_t payload = { vbascula, value, vcolor, vchivato };

  RF24NetworkHeader header(/*to node*/ master_node);

  bool ok = network.write(header, &payload, sizeof(payload));

  if (ok) {
    Serial.println("OK. COMUNICACION.");
  } else {
    Serial.println("NO COMUNICACION / NO ACTIVO EL PIR....");
  }

  delay(1000);
}

Visualiza el número en el display. Si el tipo de advertencia es:  “Avisar cuando me lo lleve”, enciende el punto del display.

/////////////////////////////////////////////////////////////////////////////////////////////
void Display_Number(long N) {
  int Nn = N;
  for (int i = pin_inicial_led; i < 9; i++) {
    digitalWrite(i, Digit[Nn][i - pin_inicial_led]);
  }
  if (vchivato == 0) {
    digitalWrite(16, 1);
  } else {
    digitalWrite(16, 0);
  }
}

Apaga el display de 7 segmentos.

////////////////////////////////////////////////////////////////////////////////////////////
void Off_Number() {
  for (int i = pin_inicial_led; i < 9; i++) {
    digitalWrite(i, 1);
  }
  digitalWrite(16, 1);
}

Selecciona hasta 8 colores de aviso.

///////////////////////////////////////////////////////////////////////////////////////////
uint16_t Read_Color() {
  unsigned long vvalor =  map(analogRead(SwColor), 0, 1023, 0, 8);
  if (vvalor == 8) {
    vvalor = 7;
  }
  return vvalor;
}

Selecciona el tipo de advertencia “Avisar si me lo dejo” o “Avisar cuando me lo lleve”.

//////////////////////////////////////////////////////////////////////////////////////////
uint16_t Read_Chivato() {
  unsigned long vvalor =  map(analogRead(SwChivato), 0, 1023, 0, 2);
  if (vvalor == 2) {
    vvalor = 1;
  }
  return vvalor;
}

Asigna el número de Neoted dentro de la casa o negocio.

/////////////////////////////////////////////////////////////////////////////////////////
uint16_t Read_Bascula() {
  unsigned long vvalor =  map(analogRead(SwBascula), 0, 1023, 1, 6);
  if (vvalor == 6) {
    vvalor = 5;
  }
  return vvalor;
}

En próximo artículo se describe el programa que gestiona el “Chivato” y los sensores y componentes electrónicos necesarios para su montaje.

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: