Following the instructions in that post can only receive data, but cannot be used to send data. After much searching, I could not find any working instructions.
So after much frustration, and some trial and error, this is my working schematic and sketch for communicating between two trinkets using nrf24l01+ with only 3 pins.
I am new to arduinos, and this is the second sketch I have ever written, so if you figure out a better way of doing this, please share it with the world, and let me know so I can delete this post.
I am not an engineer and do not understand how any of this works, so if you have any questions, I probably will not be able to answer them.
As this is a test sketch, there's a lot of blinking lights, disable the flash_color() calls as necessary.
I've already disabled a few of my earlier testing blinks, and my test is currently running as I type this, one blinking yellow as the sending loop runs, and the other blinking green as it receives the expected test value.
My modified schematic - CE is connected to CSN instead of VCC.
My full circuit:
Edit these functions in Mirf85.cpp:
void Nrf24l::ceHi(){
//digitalWrite(cePin,HIGH);
}
void Nrf24l::ceLow(){
//digitalWrite(cePin,LOW);
}
void Nrf24l::csnHi(){
PORTB |= (1<<PINB2); // SCK->CSN HIGH
delayMicroseconds(64); // allow csn to settle
}
void Nrf24l::csnLow(){
PORTB &= ~(1<<PINB2); // SCK->CSN LOW
delayMicroseconds(8); // allow csn to settle
}
#include <spi85.h>
#include <mirf85.h>
#include <mirfhardwarespidriver85.h>
#include <adafruit_neopixel.h>
#define PIN 4
Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800);
uint32_t c_red = strip.Color(255, 0, 0);
uint32_t c_green = strip.Color(0, 255, 0);
uint32_t c_blue = strip.Color(0, 0, 255);
uint32_t c_yellow = strip.Color(255, 255, 0);
uint32_t c_magenta = strip.Color(255, 0, 255);
uint32_t c_cyan = strip.Color(0, 255, 255);
#define SEND 0
#define GET 1
#define WHICH 0 //change between 1 and 0 for each trinket
void setup(){
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
if (WHICH == GET) {
Mirf.setRADDR((byte *)"test1");
Mirf.setTADDR((byte *)"test2");
} else {
Mirf.setRADDR((byte *)"test2");
Mirf.setTADDR((byte *)"test1");
}
//Although this example sketch only sends one way, I found with later experiments that this circuit can be used to send data both ways, so I've included the reverse "test2" here.
Mirf.payload = sizeof(byte); //1
Mirf.channel = 80;
Mirf.config();
strip.begin();
strip.show();
}
void loop(){
uint8_t nrfStatus;
nrfStatus = Mirf.getStatus();
nrfStatus = Mirf.getStatus();
if((byte)nrfStatus == 14) flash_color(c_blue); //blue means okay
else flash_color(c_magenta); //magenta means very bad
if (WHICH == GET) get_it();
else send_it();
delay(100);
}
void send_it(){
byte v = 3;
flash_color(c_yellow); //yellow indicates the loop is running
Mirf.send(&v);
while( Mirf.isSending() ) {
// flash_color(c_green); //green once is good, continuous green is bad
}
}
void get_it() {
byte c;
if( Mirf.dataReady() ) {
Mirf.getData((byte *)&c);
if (c == 3) {
flash_color(c_green); //green means good
} else {
flash_color(c_red); //red means very bad
}
} else {
// flash_color(c_yellow); //yellow means nothing is happening
}
}
void flash_color(uint32_t color) {
strip.setPixelColor(0, color);
strip.show();
delay(200);
strip.setPixelColor(0, strip.Color(0, 0, 0));
strip.show();
delay(200);
}