Ciao ragassi,
allora vi spiego brevemente il mio problema: i luoghi:
-giardino, impianto fotovoltaico, circa a 600 metri da casa.
(arduino uno, serie di relè e sensori, trasmettitore nRF24, attuatore)
-casa con ricevitore dati, display lcd, tasto controllo attuatore, sensori, pompe a batteria).
(arduino mega, display, relè, sensori, ricevitore nRF24, trasmettitore a 315 mhz)
- router adsl che mi mette su server i dati
(arduino uno, ricevitore 315mhz, ethernet shield)
come avrete capito ogni luogo ha il suo arduino e la sua radio, più altri componenti specifici.
il mio scopo è quello di comunicare a distanza bidirezionale tra il capanno e casa con l'NRF24, visualizzare ed intervenire da casa, ed inoltre tra casa ed il router con il 315 mhz pubblicare i dati su internet.
fino alla aggiunta del trasmettitore a 315 mhz tutto funziona perfettamente
appena aggiungo il codice per operare sul trasmettitore a 315 mhz al mega, mi si impianta senza completare nemmeno 1 giro di loop. se invece carico solo la libreria tutto liscio.
l'"impiantaggio" è completo, mi si accende il display nero, nessun segno da seriale, tutto bloccato
possibilità che intravedo (vi prego di darmi la vostra):
1 - virtualwire incompatibile con RF24
2 - seriale a 57600 mi fa impazzire virtualwire(ma non dovrebbe usarlo)
3 - mettere nRF24 anche sull'arduino con la ethernet shield(credo impossibile perchè entrambi necessitano di SPI, e per fare diventare RF24 master o condividere l'SPI penso che servano tre lauree)
4 - ???
vi incollo il codice da paleolitico, risalente a quando i calcolatori avevano gli occhiali di tartaruga sul naso, ed anche molto disordinato.
#include <VirtualWire.h> // trasmettitore a 315
#include <LiquidCrystal.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
RF24 radio(49,53);
const uint64_t pipes[3] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0F3LL };
typedef enum { role_ping_out = 1, role_pong_back } role_e;
const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"};
role_e role;
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
//altra spazzatura tipo inizializzazione di una decina di variabili e quattro array
void setup(void) {
// roba per il trasmettitore a 315 mhz. se la inserisco mi si blocca il tutto
vw_set_tx_pin(TX_DIO_Pin);
/* Set the transmit logic level (LOW = transmit for this
version of module)*/
vw_set_ptt_inverted(true);
/* Transmit at 2000 bits per second */
vw_setup(2000); // Bits per sec
da qui in poi è tutto codice testato, per il setup.....
Serial.begin(57600);
lcd.begin(16, 2);
role = role_pong_back;
printf_begin();
printf("\n\rRF24/examples/pingpair/\n\r");
printf("ROLE: %s\n\r",role_friendly_name[role]);
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.setRetries(15,15);
radio.setPayloadSize(8);
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
radio.openReadingPipe(2,pipes[2]);
radio.startListening();
radio.printDetails();
}
// altra spazzatura per completare il setup......
void loop(void) {
// spazzatura di controllo relè, sensori, attuatori etc......
// la radio trasmette la posizione che il modulo deve assumere - insomma un numero per un attuatore
radio.stopListening();
delay(5);
radio.write( &luce, sizeof(luce));
delay(400);
// la radio ascolta lo stato del campo etc etc etc
radio.startListening();
delay(2000);
while ( radio.available() )
{delay(30);
// Dump the payloads until we've gotten everything
bool done = false;
while (!done)
{
// Fetch the payload, and see if this was the last one.
done =
radio.read( &dato[0], sizeof(dato[0]));
done =
radio.read( &dato[1], sizeof(dato[1]));
// Spew it
// Delay just a little bit to let the other unit
// make the transition to receiver
delay(5);
}
// questo è il codice per il 315 mhz, testato su altra scheda (senza le altre librerie)funziona
/* Temporarily holds the value read */
unsigned int data;
/* The transmit buffer that will hold the data to be
transmitted. */
byte TxBuffer[2];
// aggiungo: il ciclo for sta bene o va prima della definizione del buffer????
for (int i = 0; i < 5; i++) {
data = valori[i];
/* ...and store it as high and low bytes in the transmit
buffer */
TxBuffer[0] = data >> 8;
TxBuffer[1] = data;
/* Send the data (2 bytes) */
vw_send((byte *)TxBuffer, 2);
/* Wait until the data has been sent */
vw_wait_tx(); }