comunicazione tra 2 arduino (irrigazione)

salve a tutti, ho aperto un topic simile qualche giorno fa in hardware per farmi aiutare a scegliere come far comunicare un arduino mega (con i vari sensori e relay) e un arduino UNO( con solo un display shield e keypad).
sono arrivato alla conclusione che prenderò una coppia di moduli wireless NRF24L01+ .
Adesso sorge il mio problema: non essendo programmatore( riesco a leggere abbastanza roba da uno sketch, ma non ho quasi idea di come scriverlo), devo configurare questi 2 arduino in modo che il mega lavori indipendentemente ( in base all'orario ecciti i relay corretti) e che invii i vari dati dei sensori, l'orario e appunto cosa stia facendo il "programma" in corso( se è in attesa che scocchi l'ora o no).
L'Uno invece, a distanza, riceverà questi dati e me li mostrerà sul display (16x2). In piu mi piacerebbe poter dare comandi al mega( ad esempio eccita quel relay indipendentemente dall'orario).
Spero di essere stato chiaro.

P.S .. Al momento il mio impianto di irrigazione è già funzionante e gestito dall'arduino UNO (ma devo aggiungerci dei sensori e non ho piu spazio e quindi lo sostituisco con il mega).
dopo provo a dare una sistemata allo sketch e lo carico.

Grazie

ecco qua lo sketch …
è abbastanza chiaro.
per qualsiasi cosa chiedetemi e provo a spegarvi…

vi faccio ugualmente un piccolo riassunto:
Rem1=pulsante che attiva la zona A
Rem2=pulsante che attiva la zona B
entrambi non si interrompono in automatico e quindi vanno ripremuti (in automatico resetta l’arduino)

Rem3=pulsante attiva la routin (è la stessa attivata dall’RTC)
Rem4=interruttore modalità RUN/PAUSE (su pause l’arduino non fa niente, qualsiasi pulsante premuto non va, anche la routin con l’RTC) (su run funziona tutto come la normalità)

il tasto della piscina non l’ho mai collegato ma mi sembra che il comando funzioni

grazie ancora

#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <avr/io.h>
#include <avr/wdt.h>

#define Reset_AVR() wdt_enable(WDTO_2S); while(1) {}

int rele[]    = {2, 3, 4, 5};
int igrometro = 6;
int remoto[]  = {11, 9, 12, 10, 8};
int led[]     = {17, 16, 15, 14};
boolean isOn1;
boolean isOn2;
boolean isOn3;
boolean acceso;
tmElements_t tm;
boolean accendiPiscina;
unsigned long timer;


void setup() {
  acceso = true;  
  isOn1 = false;
  isOn2 = false;
  isOn3 = false;
  accendiPiscina = false;
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
      if (digitalRead(igrometro) == 1)
	Serial.print("terreno secco");
  else
	Serial.print("terreno umido");
}
  
  for(int i = 0; i < 4; i++) {
    pinMode(rele[i], OUTPUT);
    pinMode(remoto[i], INPUT);
    pinMode(led[i], OUTPUT); 
  }
 
  pinMode(igrometro, INPUT);
}

static void rem1()
{
  delay(250);
  if(!isOn1)
  {
	isOn2 = false;
    digitalWrite(led[1], LOW);
    digitalWrite(rele[2], HIGH);
    digitalWrite(rele[1], LOW);
    digitalWrite(rele[0], HIGH);
    digitalWrite(led[0], HIGH);
    isOn1 = true;
  } else{
      digitalWrite(rele[2], LOW);
      digitalWrite(rele[0], LOW);
      digitalWrite(led[0], LOW);
      isOn1 = false;
      digitalWrite(led[3], HIGH);
      delay(1000);
      Reset_AVR();
    }
  delay(250);
  
}

static void rem2()
{
  delay(250);
  if(!isOn2)
  {
	isOn1 = false;
    digitalWrite(led[0], LOW);
    digitalWrite(rele[2], HIGH);
    digitalWrite(rele[0], LOW);
    digitalWrite(rele[1], HIGH);
    digitalWrite(led[1], HIGH);
    isOn2 = true;
  } else{
      digitalWrite(rele[2], LOW);
      digitalWrite(rele[1], LOW);
      digitalWrite(led[1], LOW);
      isOn2 = false;
      digitalWrite(led[3], HIGH);
      delay(1000);
      Reset_AVR();
    }
  delay(250);
}

static void routine()
{
  delay(100);
  int i;
  boolean controlloOn = false;
  digitalWrite(led[1], LOW);
  digitalWrite(rele[1], LOW);
  digitalWrite(led[2], HIGH);
  digitalWrite(rele[2], HIGH);
  
  for(i = 1; i <= 12 && !controlloOn; i++)
  {
	digitalWrite(led[1], LOW);
    digitalWrite(rele[0], HIGH);
	digitalWrite(led[0], HIGH);
	
	timer = millis();
    while(!(millis()-timer >= 165000UL))    //durata
	{
		delay(50);
		if(controllo())
		{
			controlloOn = true;
			break;
		}
    }	
	if(!controlloOn){
	digitalWrite(led[0], LOW);
	digitalWrite(rele[0], LOW);
	digitalWrite(rele[1], HIGH);
	digitalWrite(led[1], HIGH);
	timer = millis();
	while(!(millis()-timer >= 165000UL))      //durata
	{
		delay(50);
		if(controllo())
		{
			controlloOn = true;
			break;
		}
	} 
  digitalWrite(rele[1], LOW);
  digitalWrite(led[1], LOW);
 }
  }

  delay(100);
  END: for(int k = 0; k < 3; k++)
  {
	digitalWrite(led[k], LOW);
	digitalWrite(rele[k], LOW);
  }
  delay(1000);
  if(!controlloOn)
  {
	digitalWrite(led[2], HIGH);
	delay(500);
	digitalWrite(led[2], LOW);
	delay(500);
	digitalWrite(led[2], HIGH);
	delay(500);
	digitalWrite(led[2], LOW);
        digitalWrite(led[3], HIGH);
  }
  delay(100);
  
Reset_AVR();}
		
static boolean controllo()
{
	if (premuto(3))
	{
		delay(100);
		for(int i = 0; i < 4; i++)
		{
			digitalWrite(led[i], LOW);
			digitalWrite(rele[i], LOW);
		}
		acceso = false;
		isOn1 = false;
		isOn2 = false;
		return true;
	}
	acceso = true;
	return false;
}

void loop() {
  controllo();
  
  if (acceso)
  {
	if (premuto(0))
		rem1();
	else
		if (premuto(1))
			rem2();
		else
			if (premuto(2))
				routine();
			else
				/*if (premuto(4))
				{
						accendiPiscina = !accendiPiscina;
						if(accendiPiscina)
							digitalWrite(led[3], HIGH);
						else
							digitalWrite(led[3], LOW);
				}*/
	if (RTC.read(tm))
	{
		if ((tm.Hour == 21) and (tm.Day%2 != 0) and (digitalRead(igrometro) == HIGH)) routine();  //durata totale routin 66min
		if(accendiPiscina) if((tm.Minute == 0) and (tm.Second == 0)) piscina(); // se la routine e' in corso non va
	}						
  }
}

static void piscina()
{
		if(!isOn3)
		{
			digitalWrite(rele[3], HIGH);
			digitalWrite(led[0], HIGH);
			digitalWrite(led[1], HIGH);
			isOn3 = true;
		}
		else
		{
			digitalWrite(rele[3], LOW);
			digitalWrite(led[0], LOW);
			digitalWrite(led[1], LOW);
			isOn3 = false;
		}
}

static boolean premuto(int num)
{
	for (int i = 0; i < 10; i++)
	{
		if (digitalRead(remoto[num]) == LOW)
			return false;
		delay(150);
	}
	delay(1000);
	return true;

}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

Giardinaggio_postato_su_forum.ino (4.78 KB)

Intanto puoi prendere spunto da questo progetto.
--> http://forum.arduino.cc/index.php?topic=81321.0

continuo su questo topic per non aprirne di nuovi.
Finalmente oggi mi sono arrivati i componenti nuovi (1 arduino mega e 2 moduli NRF24L01+), li ho collegati, carico in entrami gli sketch ( uno server e uno client) per provare se la comunicazione funzionava. Scollegato il mega(client) dal pc e collegato ad un' altra fonte di corrente, apro la seriale nell'arduino UNO (server) e mi scrive "init failed".
Ho provato con questa lib.
http://www.airspayce.com/mikem/arduino/RadioHead/

qualcuno può aiutarmi?