Paso 10: Modifica el bosquejo de ejemplo: led_remote.cpp
Archivo: RF24/examples/Usage/led_remote/led_remote.pde
/*Copyright (C) 2011 J. Coliz This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. * * * modified 11/7/2015 ST * * Using pins D2 and D3 * * A2 to GND sets board as receiver (LED Board) * * * * * * Example LED Remote * * This is an example of how to use the RF24 class to control a remote * bank of LED's using buttons on a remote control. * * On the 'remote', connect any number of buttons or switches from * an arduino pin to ground. Update 'button_pins' to reflect the * pins used. * * On the 'led' board, connect the same number of LED's from an * arduino pin to a resistor to ground. Update 'led_pins' to reflect * the pins used. Also connect a separate pin to ground and change * the 'role_pin'. This tells the sketch it's running on the LED board. * * Every time the buttons change on the remote, the entire state of * buttons is sent to the led board, which displays the state. */
Preámbulo de la norma, con nota de modificación.
#include #include "nRF24L01.h" #include "RF24.h" #include "printf.h"
Las bibliotecas de la carga
// // Hardware configuration // Set up nRF24L01 radio on SPI bus plus pins 7 & 8 (CE & CS) RF24 radio(7,8);
CE y CSN el perno asignaciones, estos he modificado como utilizo los pines 7 y 8 no 9 y 10.
// sets the role of this unit in hardware. Connect to GND to be the 'led' board receiver // Leave open to be the 'remote' transmitter const int role_pin = A2;
He modificado el Role_pin, como me gustaría usar A0 de una fotorresistencia, pero mantienen cierta compatibilidad con este código modificado.
// Pins on the remote for buttons const uint8_t button_pins[] = { 2,3 }; const uint8_t num_button_pins = sizeof(button_pins);
Estoy usando sólo dos botones, más que suficiente para mis propósitos y también tienen algún propósito futuro.
// Pins on the LED board for LED's const uint8_t led_pins[] = { 2,3}; const uint8_t num_led_pins = sizeof(led_pins);
// // Topology // Single radio pipe address for the 2 nodes to communicate. const uint64_t pipe = 0xE8E8F0F0E1LL;
// // Role management // // Set up role. This sketch uses the same software for all the nodes in this // system. Doing so greatly simplifies testing. The hardware itself specifies // which node it is. // // This is done through the role_pin // The various roles supported by this sketch typedef enum { role_remote = 1, role_led } role_e; // The debug-friendly names of those roles const char* role_friendly_name[] = { "invalid", "Remote", "LED Board"}; // The role of the current running sketch role_e role; // // Payload //
uint8_t button_states[num_button_pins]; uint8_t led_states[num_led_pins];
// // Setup //
void setup(void) { // // Role // // set up the role pin pinMode(role_pin, INPUT); digitalWrite(role_pin,HIGH); delay(20); // Just to get a solid reading on the role pin // read the address pin, establish our role if ( digitalRead(role_pin) ) role = role_remote; else role = role_led;
// // Print preamble //
Serial.begin(57600); printf_begin(); printf("\n\rRF24/examples/led_remote/\n\r"); printf("ROLE: %s\n\r",role_friendly_name[role]);
// // Setup and configure rf radio //
radio.begin();
radio.setDataRate(RF24_250KBPS); // options are; RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
// // Open pipes to other nodes for communication //
// This simple sketch opens a single pipes for these two nodes to communicate // back and forth. One listens on it, the other talks to it.
if ( role == role_remote ) { radio.openWritingPipe(pipe); } else { radio.openReadingPipe(1,pipe); }
// // Start listening //
if ( role == role_led ) radio.startListening();
// // Dump the configuration of the rf unit for debugging //
radio.printDetails();
// // Set up buttons / LED's //
// Set pull-up resistors for all buttons if ( role == role_remote ) { int i = num_button_pins; while(i--) { pinMode(button_pins[i],INPUT); digitalWrite(button_pins[i],HIGH); } }
// Turn LED's ON until we start getting keys if ( role == role_led ) { int i = num_led_pins; while(i--) { pinMode(led_pins[i],OUTPUT); led_states[i] = HIGH; digitalWrite(led_pins[i],led_states[i]); } pinMode(4,OUTPUT); digitalWrite(4,LOW); } }
// // Loop //
void loop(void) { // // Remote role. If the state of any button has changed, send the whole state of // all buttons. // if ( role == role_remote ) { // Get the current state of buttons, and // Test if the current state is different from the last state we sent int i = num_button_pins; bool different = false; while(i--) { uint8_t state = ! digitalRead(button_pins[i]); if ( state != button_states[i] ) { different = true; button_states[i] = state; } }
// Send the state of the buttons to the LED board if ( different ) { printf("Now sending..."); bool ok = radio.write( button_states, num_button_pins ); if (ok) printf("ok\n\r"); else printf("failed\n\r"); }
// Try again in a short while delay(20); }
// // LED role. Receive the state of all buttons, and reflect that in the LEDs //
if ( role == role_led ) { // if there is data ready if ( radio.available() ) { // Dump the payloads until we've gotten everything while (radio.available()) { // Fetch the payload, and see if this was the last one. radio.read( button_states, num_button_pins );
// Spew it printf("Got buttons\n\r"); digitalWrite(4,HIGH); delay(20); digitalWrite(4,LOW); delay(30); digitalWrite(4,HIGH); delay(20); digitalWrite(4,LOW); delay(30); digitalWrite(4,HIGH); delay(20); digitalWrite(4,LOW);
Indicar una lectura en el pin digital 4, a parpadear el indicador de lectura led, antes de cambiar el estado de los otros dos led según la prensa del botón.
// For each button, if the button now on, then toggle the LED int i = num_led_pins; while(i--) { if ( button_states[i] ) { led_states[i] ^= HIGH; digitalWrite(led_pins[i],led_states[i]); } } } } } } // vim:ai:cin:sts=2 sw=2 ft=cpp