NRF24L01 + ATmega328P-PU Radio-Sensor (10 / 11 steg)
Steg 10: Modifierade exemplet skiss: led_remote.cpp
Fil: RF24/examples/Usage/led_remote/led_remote.pde
/ * Copyright (C) 2011 J. Coliz
Detta program är fri programvara; Du kan vidaredistribuera det och/eller
ändra den enligt villkoren i GNU General Public License
version 2 som offentliggörs av Free Software Foundation.
*
*
* ändrad 11/7/2015 ST
*
* Använder stift D2 och D3
*
* A2 till GND anger styrelsen som mottagare (LED Board)
*
*
*
*
*
* Exempel LED fjärrkontroll
*
* Detta är ett exempel på hur du använder klassen RF24 för att kontrollera en fjärrkontroll
* bank av lysdioder med knappar på en fjärrkontroll.
*
* På "remote", ansluta valfritt antal knappar eller växlar från
* en arduino pinnen till jord. Uppdatera 'button_pins' för att spegla den
* stift används.
*
* På "led" ombord, ansluta samma antal lysdioder från en
* arduino stift till ett motstånd till jord. Uppdatera "led_pins" för att återspegla
* stiften används. Även ansluta en separat pin för att marken och ändra
* den "role_pin". Detta säger skissen kör på LED styrelsen.
*
* Varje gång ändra knapparna på fjärrkontrollen, hela delstaten
* knappar skickas till ledde styrelsen som visar statusen.
*/
Standard ingress, med modifiering anteckning.
#include
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
Ladda biblioteken
//
Maskinvarukonfigurationen
Ställa in nRF24L01 radio på SPI buss plus stift 7 & 8 (CE & CS)
RF24 radio(7,8);
CE och CSN stift, dessa jag modifierade som jag använder stift 7 och 8 inte 9 och 10.
anger rollen som denna enhet i hårdvara. Ansluta till GND vara "ledde" styrelsen mottagaren
Lämna öppet för att "remote" sändaren
CONST int role_pin = A2;
Jag ändrade Role_pin, som jag skulle vilja använda A0 för ett foto motstånd, men fortfarande behålla vissa kompatibilitet med denna modifierade koden.
Stiften på fjärrkontrollen för knappar
CONST uint8_t button_pins [] = {2,3};
CONST uint8_t num_button_pins = sizeof(button_pins);
Jag bara använder två knappar, mer än tillräckligt för mina ändamål och också kommer att ha några framtida ändamål.
Stiften på styrelsens LED för LED
CONST uint8_t led_pins [] = {2,3};
CONST uint8_t num_led_pins = sizeof(led_pins);
//
Topologi
Enda radio pipe adress för 2 noder kommunicera.
CONST uint64_t pipe = 0xE8E8F0F0E1LL;
//
Rollhantering
//
Ställ in roll. Denna skiss använder samma programvara för alla noder på denna
systemet. Gör så kraftigt förenklar testning. Själva hårdvaran anger
vilken nod som det är.
//
Detta sker genom role_pin
De olika roller som stöds av denna skiss
TypeDef fasttexttypen {role_remote = 1, role_led} role_e;
Debug-vänlig namnen på dessa roller
CONST char * role_friendly_name [] = {"ogiltig", "Remote", "LED Board"};
Rollen som den nuvarande rinnande skissen
role_e roll.
//
Nyttolast
//
uint8_t button_states [num_button_pins];
uint8_t led_states [num_led_pins];
//
Setup
//
void setup(void)
{
//
Roll
//
ställa in PIN-koden roll
pinMode (role_pin, ingång);
digitalWrite(role_pin,HIGH);
Delay(20); Bara för att få en gedigen läsning på roll stift
Läs adress pin, upprätta vår roll
om (digitalRead(role_pin))
roll = role_remote;
annat
roll = role_led;
//
Skriva ut ingress
//
Serial.BEGIN(57600);
printf_begin();
printf("\n\rRF24/examples/led_remote/\n\r");
printf ("roll: % s\n\r",role_friendly_name[role]);
//
Ställa in och konfigurera rf radio
//
radio.BEGIN();
radio.setDataRate(RF24_250KBPS); alternativen är; RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
//
Öppet rör till andra noder för kommunikation
//
Denna enkla skiss öppnas en enda rör för dessa två noder kommunicera
fram och tillbaka. Man lyssnar på den, andra samtalen till den.
om (roll == role_remote)
{
radio.openWritingPipe(pipe);
}
annat
{
radio.openReadingPipe(1,pipe);
}
//
Börja lyssna
//
om (roll == role_led)
radio.startListening();
//
Dumpa konfigurationen för rf enheten för felsökning
//
radio.printDetails();
//
Ställ in knapparna / LED'S
//
Ställa in pull-up motstånd för alla knappar
om (roll == role_remote)
{
int jag = num_button_pins;
While(i--)
{
pinMode(button_pins[i],INPUT);
digitalWrite(button_pins[i],HIGH);
}
}
Slå LED tills vi börjar få nycklar
om (roll == role_led)
{
int jag = num_led_pins;
While(i--)
{
pinMode(led_pins[i],OUTPUT);
led_states [i] = hög;
digitalWrite(led_pins[i],led_states[i]);
}
pinMode(4,OUTPUT);
digitalWrite(4,LOW);
}
}
//
Loop
//
void loop(void)
{
//
Remote roll. Om tillståndet för någon knapp har förändrats, skicka hela delstaten
alla knappar.
//
om (roll == role_remote)
{
Få aktuell status för knappar, och
Testa om det aktuella läget skiljer sig från den förra staten skickade vi
int jag = num_button_pins;
bool olika = false;
While(i--)
{
uint8_t state =! digitalRead(button_pins[i]);
om (statligt! = button_states [i])
{
olika = sant;
button_states [i] = staten.
}
}
Skicka tillståndet för knapparna till LED styrelsen
om (olika)
{
printf ("nu skicka...");
bool ok = radio.write (button_states, num_button_pins);
om (ok)
printf("ok\n\r");
annat
printf("failed\n\r");
}
Försök igen en kort stund
Delay(20);
}
//
LED roll. Får tillståndet för alla knappar, och återspegla i lysdioder
//
om (roll == role_led)
{
om det finns data redo
om (radio.available())
{
Dumpa nyttolasterna tills vi har fått allt
samtidigt (radio.available())
{
Hämta nyttolasten och se om detta var den sista.
radio.Read (button_states, num_button_pins);
Spy det
printf ("fick 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);
Ange en läsa på digital stift 4, till den Läs Blixtindikator ledde, innan du trycker på knappen ändrar läget för de andra två ledde enligt.
För varje knapp, om knappen nu, sedan växla LED
int jag = num_led_pins;
While(i--)
{
om (button_states [i])
{
led_states [i] ^ = hög;
digitalWrite(led_pins[i],led_states[i]);
}
}
}
}
}
}
vim: ai: cin:sts = 2 sw = 2 ft = cpp