Mega: supporto nRF24, rf315, lcd contemporaneo

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(); }

la virtualwire va in casino con qualche altra libreria?

a parte tutto, vedo un'incongruenza

LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

i pin 12 e 11 sono usati dalla SPI, sposta quelli del LCD su 9, 8

10/11 anche su mega2650?
io usavo con successo i pin attorno al 50 mi pare....
e poi... non capisco come l'aggiunta della radio sul 31 mi dia fastidio all'SPI del RF24.....

Sorry... non ci avevo fatto caso che era una Mega

io non ho capito perchè (e senza levarti il merito - enorme - che hai avuto, ma forse nemmeno tu), ma spostando i pin 12, 11 dell'lcd ai 26 e 28 funziona tutto.
non so perchè, davvero.
l'11 la radio non lo prende, perchè non è l'spi.
la radio AM a 315 usa il 31.
forse ci sarà qualcosa di default della libreria virtualwire che metteva qualche up all'11/12...cmq grazie, è perfetto ora!