Boas
Estou aqui com um problema em transmitir dados de um kastduino para outro através de um NRFL01.
O código que tenho no emissor é o seguinte:
* NO DE DOMOTICA v0.01
*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
//
// Configuração do NRF24L01
//
RF24 radio(10,9); // Define o RF24L01 radio em bus SPI bus mais os pinos 10 (CE) & 9 (CSN)
unsigned int payload[2];
unsigned int no_id=4; //alterar o numero do no aqui
unsigned int carga_media;
void setup(void)
{
Serial.begin(57600);
analogReference(INTERNAL);
printf_begin();
//printf("\n\rRF24/examples/GettingStarted/\n\r");
printf("DOMOTICA SERVER v0.01\n\r");
printf("\n\r");
radio.begin();
radio.setChannel(101);
radio.setAutoAck(true);
radio.setDataRate(RF24_250KBPS);
radio.setPayloadSize(16); // define tamanho máximo da var a transmitir
radio.setRetries(15,15); //define n de tentativas e tempo entre elas
//falta definir a potência de emissão
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; // Radio pipe addresses for the 2 nodes to communicate.
radio.openReadingPipe(1,pipes[0]); // abre o pipe para receber
radio.openWritingPipe(pipes[1]); // abre o pipe para enviar
radio.printDetails(); //Mostra os detalhes do radio
printf("ID do nó\n\r", no_id);
printf("\n\r");
radio.startListening(); // inicia a escuta
radio.stopListening(); // Necessario para comecar a enviar dados
printf("\n\rA escuta ...\n\r");
printf("\n\r");
pinMode(8, OUTPUT);
digitalWrite(8, LOW);
}
void loop(void)
{
// Faz 20 leituras a bateria
carga_media=0;
for(int i=1;i<21;i++){
carga_media=carga_media+analogRead(A0);
}
delay(20);
radio.powerUp(); //necessario devido ao power down no fim do loop
payload[1]=no_id;
payload[2]=carga_media/20;
Serial.print("Enviando... ");
bool ok = radio.write( payload , sizeof(payload));
if (ok)
{
Serial.print("ok ");
digitalWrite(8, HIGH);
delay(1);
digitalWrite(8, LOW);
Serial.print("ID ");
Serial.print(payload[1]);
Serial.print(" Bateria ");
Serial.println(payload[2]);
}
else
{
Serial.println("Erro na transmissão !!!");
}
radio.powerDown(); // coloca o radio em stand-by
delay(5000); // espera 5 segundos
}
O código que tenho receptor é o seguinte:
/* SERVIDOR DE DOMOTICA v0.01
*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
//
// Configuração do NRF24L01
//
RF24 radio(10,9); // Define o RF24L01 radio em bus SPI bus mais os pinos 10 (CE) & 9 (CSN)
unsigned int payload[2];
void setup(void)
{
Serial.begin(57600);
printf_begin();
//printf("\n\rRF24/examples/GettingStarted/\n\r");
printf("DOMOTICA SERVER v0.01\n\r");
printf("\n\r");
radio.begin();
radio.setChannel(101);
radio.setAutoAck(true);
radio.setDataRate(RF24_250KBPS);
radio.setPayloadSize(16); // define tamanho máximo da var a transmitir
radio.setRetries(15,15); //define n de tentativas e tempo entre elas
//falta definir a potência de emissão
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; // Radio pipe addresses for the 2 nodes to communicate.
radio.openReadingPipe(1,pipes[1]); // abre o pipe para receber
radio.openWritingPipe(pipes[0]); // abre o pipe para enviar
radio.printDetails(); //Mostra os detalhes do radio
printf("ID do server\n\r");
printf("\n\r");
radio.startListening(); // inicia a escuta
printf("\n\rA escuta ...\n\r");
printf("\n\r");
pinMode(8, OUTPUT);
digitalWrite(8, LOW);
}
void loop(void)
{
if ( radio.available() )
{
//payload_t payload;
radio.read( payload, sizeof(payload) );
Serial.print(sizeof(payload));
// Print the ID of this message. Note that the message
// is sent 'big-endian', so we have to flip it.
Serial.print("ID ");
Serial.print(payload[1]);
Serial.print(" Bateria ");
Serial.println(payload[2]);
//printf("#%05u ID ",flip_endian(payload.id)); // mostra o id do emissor
//printf("%s Bateria ",payload.bstatus); // mostra o estado da bateria
//printf("\n\r");
digitalWrite(8, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1); // wait for a second
digitalWrite(8, LOW); // turn the LED off by making the voltage LOW
}
}
//
// Helper functions
//
// Change a big-endian word into a little-endian
uint16_t flip_endian(uint16_t in)
{
uint16_t low = in >> 8;
uint16_t high = in << 8;
return high | low;
}
No entanto o resultado que obtenho no receptor é:
4ID 3 Bateria 2577
4ID 4 Bateria 3639
4ID 2 Bateria 3719
4ID 3 Bateria 7476
4ID 4 Bateria 8547
4ID 2 Bateria 8628
Alguém me consegue explicar qual o problema ?
A mim parece-me que isto acontece quando é "descodificado" o payload[2] no receptor, porque no lado do emissor tudo é emitido como deve de ser.
A referência interna do atmega também não está a funcionar, talvez devido à falta do condensador entre o ARef e o GND referido pelo senso.