Skip to content

Instantly share code, notes, and snippets.

@klalle
Last active May 24, 2016 11:29
Show Gist options
  • Save klalle/0084363be41e378d8697 to your computer and use it in GitHub Desktop.
Save klalle/0084363be41e378d8697 to your computer and use it in GitHub Desktop.
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h" //Activate for NRF-debug (printf_begin(); in setup() followed by radio.printDetails();)
#define CE_PIN 9
#define CSN_PIN 10
//
// Hardware configuration
//
// Set up nRF24L01 radio on SPI bus plus pins 9 & 10
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
// Radio pipe addresses 1 node to communicate.
//const uint64_t Address = 0xAABBCC22LL; //5-byte address "LL" is for long (if more than one node:)
//const uint64_t pipes[2] = { 0xAABBCC11LL, 0xAABBCC22LL }; //Pipes 1-5 must share the first 4 bytes. Only the least significant byte should be unique!
const uint64_t pipes[3] = { 0xBABBCCDD00LL, //Writing pipe (not used)
0xAABBCCDD11LL, //Meter A's writing pipe
0xAABBCCDD22LL //Meter B's writing pipe
}; //First letter is address to energ-meter
float ReadData[3] = {0, 0, 0};
uint8_t TempStatus;
uint8_t CH;
uint8_t data[2];
void setup(void)
{
Serial.begin(57600);
//printf_begin();
Serial.println("Start: ");
//
// Setup and configure rf radio
radio.begin();
//
//********* Optional settings for nrf below see: http://maniacbug.github.io/RF24/classRF24.html
//
// increase the delay between retries & # of retries
radio.setRetries(15,15);
// reduce the payload size. (3 floates = 3*4=12 Bytes)
radio.setPayloadSize(12);
//Set speed of transmission (250kbps only works on the "+"-version!!! slower increases range!
radio.setDataRate(RF24_250KBPS);
//Set Power Amplifier (PA) level to high to increase range!
radio.setPALevel(RF24_PA_HIGH);
//Awesome feature that lets us send a package in return when receiving something without changing to transmitter!
radio.enableAckPayload();
//
//********* End of optional settings*********
//
//Addresses has to be set last!
//radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
radio.openReadingPipe(2,pipes[2]);
//Start listening for incoming data
radio.startListening();
//
// Dump the configuration of the rf unit for debugging
//
//read_register(CONFI); //read out the status register to decide which channel that's transmitting data //change RF24.h in libraries (remove "public:", "protected:" and change "private:" to "public:) to use this function!
//Serial.println(radio.get_status(),BIN);
//Serial.println(radio.read_register(RF_SETUP),BIN);
Serial.println("Type: 2:3 to change the intervall of meter 2 to ~3s");
//radio.writeAckPayload( 1, &AverageMax, sizeof(AverageMax) );
//radio.writeAckPayload( 2, &AverageMax, sizeof(AverageMax) );
}
void loop(void)
{
// if data is received to the nRF
if ( radio.available() )
{
// Dump the payloads until we've gotten everything
bool done = false;
while (!done)
{
Serial.println(" ");
//Serial.println(radio.get_status(),BIN);
// read out the status register to decide which channel that's transmitting data
//change RF24.h in libraries (remove "public:", "protected:" and change "private:" to "public:) to use this function!
CH = 0;
CH = ((radio.get_status() & 0b00001110) >> 1); //extract bit 1-3 (the channels) to CH and move them one step to right to get it in decimal
// Fetch the payload, and see if this was the last one.
done = radio.read( ReadData, sizeof(ReadData) );
//Print out details
Serial.print("Energy meter: ");
Serial.println(CH);
//When meter reads 0W it sometimes shows ~6000W
if(ReadData[2]<4000){
Serial.print(ReadData[0],0);
Serial.println(" V");
Serial.print(ReadData[1],1);
Serial.println(" W");
Serial.print(ReadData[2],2);
Serial.println(" W-Max");
}
else{
Serial.print(ReadData[0],0);
Serial.println(" V");
Serial.print(0.0,0);
Serial.println(" W");
}
delay(20);
//Reset STATUS-register:
//radio.write_register(STATUS, _BV(RX_DR) | _BV(TX_DS) | _BV(MAX_RT) );
}
}
}
//Interrupt ocures whenever you type anything in the serial-monitor.
//To change the data sending interval of an energy meter, in the serial monitor type:
//2:3
//to change the channel 2-energy meter to ~3s interval.
void serialEvent() {
while (Serial.available()) {
// Reads the the bytes until it reaches an non-integer value ":"
int CH = Serial.parseInt();
byte skipp = Serial.read();
int AverageMax = Serial.parseInt();
if(Serial.available()==false && CH >0 && CH < 6 && AverageMax >0 && AverageMax <10000){
// Add an ack packet for the next time around
radio.writeAckPayload( CH, &AverageMax, sizeof(AverageMax) );
Serial.print("Intervall on meter: ");
Serial.print(CH);
Serial.print(" will change to: ~");
Serial.print(AverageMax);
Serial.println("s on next transmission!");
}
else{
while (Serial.available()) {
skipp = Serial.read();
}
Serial.println("Wrong format! Type: 2:3 to change the intervall of meter 2 to ~3s");
}
}
}
// vim:cin:ai:sts=2 sw=2 ft=cpp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment