Proyecto 2 atmega328p por spi

hola, estoy un poco desorientado de como seguir, aprendo solo estuve buscando varias cosas por google pero no me sacan ciertas dudas con referente al proyecto ya que lo lleve a una complejidad que me sobrepaso, es tanto el esp8266 como la comunicacion spi entre dos arduinos, tanto crear que me lanze de una hacer este proyecto sin saber nada hace alrededor de 2 años me entere lo que era arduino y el mundo relacionado consigo.
imagen de mi primera PCB yo se que se ve desprolija pero me asegure que sus pistas no se puenten con el tester, asi que fea pero funcional.
el codigo basicamente es esto

//#include <SPI.h>                   //libreria comunicaciion SPI
#include <TimeLib.h>               //libreria tiempo
#include <TimeAlarms.h>            // libreria tiempo alarmas
#include <Wire.h>                  // comunicacion I2C libreria
#include "RTClib.h"                // Libreria RTC libre adafruit 
#include <SoftwareSerial.h>        // libreria comunicaccion serial (wifi)
#include "DHT.h"                   // libreria DHT11 adafruit sensor de humedad y temperatura relativa del ambiente 

#define DHTPIN 2                   //defino pin digital 2 
#define DHTTYPE DHT11              //defino tipo de sensor
DHT dht(DHTPIN, DHTTYPE);

SoftwareSerial ESP_8266 =  SoftwareSerial(5, 4);     // RX | TX

RTC_DS1307 rtc;                    //modelos de RTC

char daysOfTheWeek[7][12] = {  "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"};  //nombres para los dias de la semana

String apiKey = "DK59X5DLS04TVFG5";     // cambiar por el canal de THINGSpeak
String ssid="WIFI NAME";    // Wifi network SSID
String password ="WIFI PASSWORD";  // Wifi network password
boolean DEBUG=true;

int Buzzer = 9;                    //Buezzer pin 9 PWNM
int Relay_01 = 6;                  // Relays
int Relay_02 = 7;
int Relay_03 = 8;
const int LM35_A = A0;             //sensor de temperatura onboar
const int LM35_B = A1;
const int FC_28 = A2;              //sensor de humedad relativa del suelo
const int LDR = A3;                //Fotosensor o Fotoresistor

void setup() {
  Serial.begin(57600);             //inicia comunicacion serial PC
  Serial.println("Testeo A");

  dht.begin();                     //inicia DHT11
  //ESP8266.begin(9600);            //inicia ESP8266

  pinMode (Buzzer, OUTPUT);        //pines de salida
  pinMode (Relay_01, OUTPUT);
  pinMode (Relay_02, OUTPUT);
  pinMode (Relay_03, OUTPUT);
  pinMode (LM35_A, INPUT);         //pines de entrada
  pinMode (LM35_B, INPUT);
  pinMode (FC_28, INPUT);
  pinMode (LDR, INPUT);

  if (! rtc.begin()) {                 //inicia RTC en condicion
    Serial.println("RTC no se pudo encontrar");
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC no esta funcionando");
    //rtc.adjust(DateTime(2017, 7, 29, 17, 14, 0)); //ajuste del RTC DS-1307
    //(Año, Mes, Dia, Hora, Minutos, Segundos)

  }
  //Alarm.alarmRepeat(5, 00, 0, Relay0001ON);           //alarmas
  //Alarm.alarmRepeat(8, 00, 0, Relay001ON);
  //Alarm.alarmRepeat(11, 00, 0, Relay01ON);
  //Alarm.alarmRepeat(17, 00, 0, Relay01OFF);
  //Alarm.alarmRepeat(20, 00, 0, Relay001OFF);
  //Alarm.alarmRepeat(23, 00, 0, Relay0001OFF);
  Alarm.alarmRepeat(18, 00, 0, Relay01ON);
  Alarm.alarmRepeat(18, 10, 0, Relay01OFF);
}
void loop() {
  LDRlectura();
  HRdSuelo ();
  LM35_Leyendo ();
  DHT_11Leyendo ();
  Reloj ();
  Alarm.delay(5000);
}
void LDRlectura() {
  const int ValorLDR1 = analogRead (LDR);
  const int ValorLDR2 = analogRead (LDR);
  const int ValorLDR3 = analogRead (LDR);
  const int ValorLDR4 = analogRead (LDR);
  const int ValorLDR5 = analogRead (LDR);
  const int ValorLDR6 = analogRead (LDR);
  const int ValorLDR7 = analogRead (LDR);
  const int ValorLDR8 = analogRead (LDR);
  const int ValorLDR9 = analogRead (LDR);
  const int ValorLDR0 = analogRead (LDR);
  const int ValorLDR = (ValorLDR0 + ValorLDR1 + ValorLDR2 + ValorLDR3 + ValorLDR4 + ValorLDR5 + ValorLDR6 + ValorLDR7 + ValorLDR8 + ValorLDR9) / 10;
  Serial.println("Lectura del LDR");
  Serial.println(ValorLDR);
}
void HRdSuelo() {
  const int HRDS = analogRead (FC_28);
  Serial.println("Lectura de humedad relativa del suelo");
  Serial.println(HRDS);
}
void LM35_Leyendo() {
  const int Temp01 = analogRead (LM35_A);
  const int Temp02 = analogRead (LM35_A);
  const int Temp03 = analogRead (LM35_A);
  const int Temp04 = analogRead (LM35_A);
  const int Temp05 = analogRead (LM35_A);
  const int Temp06 = analogRead (LM35_A);
  const int Temp07 = analogRead (LM35_A);
  const int Temp08 = analogRead (LM35_A);
  const int Temp09 = analogRead (LM35_A);
  const int Temp10 = analogRead (LM35_A);
  const int Temp1 = (Temp01 + Temp02 + Temp03 + Temp04 + Temp05 + Temp06 + Temp07 + Temp08 + Temp09 + Temp10) / 10;
  const int TEMP01 = analogRead (LM35_B);
  const int TEMP02 = analogRead (LM35_B);
  const int TEMP03 = analogRead (LM35_B);
  const int TEMP04 = analogRead (LM35_B);
  const int TEMP05 = analogRead (LM35_B);
  const int TEMP06 = analogRead (LM35_B);
  const int TEMP07 = analogRead (LM35_B);
  const int TEMP08 = analogRead (LM35_B);
  const int TEMP09 = analogRead (LM35_B);
  const int TEMP10 = analogRead (LM35_B);
  const int Temp2 = (TEMP01 + TEMP02 + TEMP03 + TEMP04 + TEMP05 + TEMP06 + TEMP07 + TEMP08 + TEMP09 + TEMP10) + 10;
  Serial.println("Lectura de temperatura ONBOARD");
  Serial.println(Temp1);
  Serial.println("Lectura de temperatura ONBOARD_02");
  Serial.println(Temp2);

}
void DHT_11Leyendo() {
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  //float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) /*|| isnan(f)*/) {
    Serial.println("Fallo al leer el sensor DHT11");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  //float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  //float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humedad: ");
  Serial.print(h);
  Serial.print(" %");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" *C ");
  //Serial.print(f);
  //Serial.print(" *F");
  //Serial.print("Heat index: ");
  //Serial.print(hic);
  //Serial.print(" *C ");
  //Serial.print(hif);
  //Serial.println(" *F");
}
void Reloj () {
  DateTime now = rtc.now();
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print(") ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
}
void Relay01ON () {
  digitalWrite (Relay_01, HIGH);
  Serial.println("Luz Prendida");
}

void Relay01OFF () {
  digitalWrite (Relay_01, LOW);
  Serial.println("Luz Apagada");
}

El arduino B

//#include <SPI.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

int led01= 8;
int led02= 9;
int led03= A4;
int Boton01= A0;
int Boton02= A1;
int Boton03= A2;
int Boton04= A3;

void setup() {
  pinMode(Boton01, INPUT);
  pinMode(Boton02, INPUT);
  pinMode(Boton03, INPUT);
  pinMode(Boton04, INPUT);
  pinMode(led01, OUTPUT);
  pinMode(led02, OUTPUT);
  pinMode(led03, OUTPUT);
  lcd.begin(16, 2);
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print("hello, world!");
}

no se si se comprende pero la idea es que el lcd 16x2 leds y botones esten conectados a mi atmega328 B (esclavo) y El atmega328 A sea el que interactue con los sensores y relays ademas de una comunicacion serial por el conversor USB y WIFI ESP8266.
cuando empece analizar el codigo del esclavo no pude comprender como hacer para el server reciba el dato de los botones asi cambiar de rutina con el relay, y que el esclavo reciba el dato del RTC1307 (por i2c al Server) para mostrarlo en el LCD.
si no se comprende la pregunta diganme

002.jpg

Como comunicas Arduino A con B?

por el momento no estan comunicados, pero seria por SPI
pin 19 SCK (digital 13) a pin 19
pin 18 MISO (digital 12) a pin 17
pin 17 MOSI (digital 11) a pin 18
pin 16 SS (digital 10) a pin 16
estuve trabajando el codigo por lo que ahora es un poco diferente
pero la conducta que quiero lograr seria la misma

y porque por SPI?
Necesitas velocidad, algo especial?

Digo porque tienes antes que nada el simple Serial, lo probaste?

se me ocurrio SPI por que si jajaja, me pareció lo mejor ya que al puerto serial esta el conversor USB.. esto no influye en nada?
lo comunico igual?

Que pasa con SoftwareSerial o con I2C?
Bueno de todos modos tiene que funcionar con SPI.

No hay comunicación SPI en tus códigos.

Esta rutina void LM35_Leyendo() tiene una forma curiosa de promediar valores const int Temp01 = analogRead (LM35_A);, normalmente se hace con ciclos.

Acabo de tenrminar un código, prueba a ver si compila.

#include <SPI.h>                   //libreria comunicaciion SPI
#include <TimeLib.h>               //libreria tiempo
#include <TimeAlarms.h>            // libreria tiempo alarmas
#include <Wire.h>                  // comunicacion I2C libreria
#include "RTClib.h"                // Libreria RTC libre adafruit 
#include <SoftwareSerial.h>        // libreria comunicaccion serial (wifi)
#include "DHT.h"                   // libreria DHT11 adafruit sensor de humedad y temperatura relativa del ambiente 

# define SS        10              // pin Chip Select Arduino A
#define DHTPIN      2              //defino pin digital 2 
#define DHTTYPE DHT11              //defino tipo de sensor
DHT dht(DHTPIN, DHTTYPE);

SoftwareSerial ESP_8266 =  SoftwareSerial(5, 4);     // RX | TX

RTC_DS1307 rtc;                    //modelos de RTC

char daysOfTheWeek[7][12] = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"};  //nombres para los dias de la semana

String apiKey   = "DK59X5DLS04TVFG5";     // cambiar por el canal de THINGSpeak
String ssid     = "WIFI NAME";    // Wifi network SSID
String password = "WIFI PASSWORD";  // Wifi network password
boolean DEBUG   = true;

int Buzzer          = 9;                    //Buezzer pin 9 PWNM
int Relay_01        = 6;                  // Relays
int Relay_02        = 7;
int Relay_03        = 8;
const byte LM35_A  = A0;             //sensor de temperatura onboar
const byte LM35_B  = A1;
const byte FC_28   = A2;              //sensor de humedad relativa del suelo
const byte LDR     = A3;                //Fotosensor o Fotoresistor
int ValorLDR, HRDS, Temp1, Temp2 ;
int h, t;

void setup() {
  Serial.begin(57600);             //inicia comunicacion serial PC
  Serial.println("Testeo A");

  dht.begin();                     //inicia DHT11
  //ESP8266.begin(9600);            //inicia ESP8266

  pinMode (Buzzer, OUTPUT);        //pines de salida
  pinMode (Relay_01, OUTPUT);
  pinMode (Relay_02, OUTPUT);
  pinMode (Relay_03, OUTPUT);
  pinMode (LM35_A, INPUT);         //pines de entrada
  pinMode (LM35_B, INPUT);
  pinMode (FC_28, INPUT);
  pinMode (LDR, INPUT);

  if (! rtc.begin()) {                 //inicia RTC en condicion
    Serial.println("RTC no se pudo encontrar");
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC no esta funcionando");
    //rtc.adjust(DateTime(2017, 7, 29, 17, 14, 0)); //ajuste del RTC DS-1307
    //(Año, Mes, Dia, Hora, Minutos, Segundos)

  }
  Alarm.alarmRepeat(18, 00, 0, Relay01ON);
  Alarm.alarmRepeat(18, 10, 0, Relay01OFF);
  digitalWrite(SS, HIGH);  // ensure SS stays high for now
   // Put SCK, MOSI, SS pins into output mode
  // also put SCK, MOSI into LOW state, and SS into HIGH state.
  // Then put SPI hardware into Master mode and turn SPI on
  SPI.begin ();

  // Slow down the master a bit
  SPI.setClockDivider(SPI_CLOCK_DIV8);
}
void loop() {
  LDRlectura();
  HRdSuelo();
  LM35_Leyendo();
  DHT_11Leyendo();
  // enable Slave Select
  digitalWrite(SS, LOW);    // SS is pin 10

  // send test string
  char buffer[30], str1[6], str2[6];
  sprintf(buffer, "%4d %2d %2d %2d %2d", ValorLDR, Temp1, Temp2, h, t);
  for (const char * p = buffer; c = *p; p++)
    SPI.transfer (c);
  // disable Slave Select
  digitalWrite(SS, HIGH);

  Reloj();
  Alarm.delay(5000);
}
void LDRlectura() {
  int sumaLDR = 0;
  for (byte i=0; i<10; i++) {
      sumaLDR += analogRead(LDR);
  } 
  ValorLDR = sumaLDR/10;
  Serial.println("Lectura del LDR");
  Serial.println(ValorLDR);
}
void HRdSuelo() {
  HRDS = analogRead(FC_28);
  Serial.println("Lectura de humedad relativa del suelo");
  Serial.println(HRDS);
}
void LM35_Leyendo() {
  int sumaTemp1 = 0;
  int sumaTemp2 = 0;

  for (byte i=0; i<10; i++) {
      sumaTemp1 += analogRead(LM35_A);
      sumaTemp2 += analogRead(LM35_B);
  } 
  Temp1 = sumaTemp1/10;
  Temp2 = sumaTemp2/10;
  
  Serial.println("Lectura de temperatura ONBOARD");
  Serial.println(Temp1);
  Serial.println("Lectura de temperatura ONBOARD_02");
  Serial.println(Temp2);

}

void DHT_11Leyendo() {
  h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  //float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) /*|| isnan(f)*/) {
    Serial.println("Fallo al leer el sensor DHT11");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  //float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  //float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humedad: ");
  Serial.print(h);
  Serial.print(" %");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" *C ");
}

void Reloj () {
  DateTime now = rtc.now();
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print(") ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
}

void Relay01ON () {
  digitalWrite (Relay_01, HIGH);
  Serial.println("Luz Prendida");
}

void Relay01OFF () {
  digitalWrite (Relay_01, LOW);
  Serial.println("Luz Apagada");
}

Tiene incorporado el uso de la transferencia SPI
Mañana hago el esclavo

La verdad que no se a que te referís con ciclo (PERDÓN NO SE MUCHO), pero imagino que debe ser algo mucho mas comodo que lo que hice en la rutina LM35_Leyendo(), basándome en lo que se hice un simple promedio de 10 lecturas.
La verdad no ahí palabras para transmitir lo que siento en este momento por ti, espero que le guste que le diga amigo y maestro, (senpai), por cierto mi nombre de pila es Javier. Todavía no mire el código , ahora mismo lo voy a probar en el IDE a ver si copila y esto igual es mas de lo que esperaba, me voy a tomar un tiempo tratando de entenderlo si tengo alguna duda de como lo empleas te pregunto.
Gracias todos mis POST me los contestaste tu, ¡¡gracias otra vez!!

Hice algunas modificaciones al codigo, (que interesante los ciclos), agregue unas llaves a la función FOR y dos constantes INT “c , p” por que no copilaba IDE creo que así lo solucione.
Excluí el SoftwareSerial.h para no hacer desastres por el momento me dedico al mundo del SPI que por lo que veo es mas difícil, al marguen vengo entendiendo mejor el modulo ESP8266 con sus comandos AT. El código quedo así, por el momento del maestro. Me gusta.

#include <SPI.h>                   //libreria comunicaciion SPI
//#include <SoftwareSerial.h>        // libreria comunicaccion serial (wifi)
#include <TimeLib.h>               //libreria tiempo
#include <TimeAlarms.h>            // libreria tiempo alarmas
#include <Wire.h>                  // comunicacion I2C libreria
#include <DS1307RTC.h>
#include "DHT.h"                   // libreria DHT11 adafruit sensor de humedad y temperatura relativa del ambiente 

#define DHTPIN      2              //defino pin digital 2 
#define DHTTYPE DHT11              //defino tipo de sensor
DHT dht(DHTPIN, DHTTYPE);

//SoftwareSerial ESP_8266 =  SoftwareSerial(5, 4);     // RX | TX
# define SS        10                                // pin Chip Select Arduino A

int Buzzer          = 9;                //Buezzer pin 9 PWNM
int Relay_01        = 6;                // Relays
int Relay_02        = 7;
int Relay_03        = 8;
const byte LM35_A  = A0;                //sensor de temperatura onboar
const byte LM35_B  = A1;
const byte FC_28   = A2;                //sensor de humedad relativa del suelo
const byte LDR     = A3;                //Fotosensor o Fotoresistor
int ValorLDR, HRDS, Temp1, Temp2 ;
int h, t, c, p;

void setup() {
  Serial.begin(57600);                             //inicia comunicacion serial PC
  Serial.println("Testeo A");
  dht.begin();                                    //inicia DHT11
  pinMode (Buzzer, OUTPUT);                       //pines de salida
  pinMode (Relay_01, OUTPUT);
  pinMode (Relay_02, OUTPUT);
  pinMode (Relay_03, OUTPUT);
  pinMode (LM35_A, INPUT);                        //pines de entrada
  pinMode (LM35_B, INPUT);
  pinMode (FC_28, INPUT);
  pinMode (LDR, INPUT);
  setSyncProvider(RTC.get);                       // Funcion para sincronizar RTC
  if (timeStatus() != timeSet) {
    Serial.println("Imposible sincronizar RTC");
  }
  else {
    Serial.println("RTC Sincronizado");
  }
  Alarm.alarmRepeat(18, 00, 0, Relay01ON);       //Alarmas
  Alarm.alarmRepeat(18, 10, 0, Relay01OFF);
  Alarm.timerRepeat(60, LDRlectura);
  Alarm.timerRepeat(60, HRdSuelo);
  Alarm.timerRepeat(30, LM35_Leyendo);
  Alarm.timerRepeat(120,  DHT_11Leyendo);

  digitalWrite(SS, HIGH);                        // ensure SS stays high for now
                                                 // Put SCK, MOSI, SS pins into output mode
                                                 // also put SCK, MOSI into LOW state, and SS into HIGH state.
                                                 // Then put SPI hardware into Master mode and turn SPI on
  SPI.begin ();
  SPI.setClockDivider(SPI_CLOCK_DIV8);           // Slow down the master a bit
  //ESP_8266.begin(57600);                       //inicia ESP8266
} 
void loop() {
  if (timeStatus() == timeSet) {
    digitalClockDisplay();
  } else {
    Serial.println("The time has not been set.  Please run the Time");
    Serial.println("TimeRTCSet example, or DS1307RTC SetTime example.");
    Serial.println();
    Alarm.delay(4000);
  }
  digitalWrite(SS, LOW);                                                     // SS is pin 10
  char buffer[30], str1[6], str2[6];                                        // send test string
  sprintf(buffer, "%4d %2d %2d %2d %2d", ValorLDR, Temp1, Temp2, h, t);
  for (const char * p = buffer; c = *p; p++){
  SPI.transfer (c);                                                         // disable Slave Select
  digitalWrite(SS, HIGH);
  }
  Alarm.delay(1000);
}
void LDRlectura() {
  int sumaLDR = 0;
  for (byte i = 0; i < 10; i++) {
    sumaLDR += analogRead(LDR);
  }
  ValorLDR = sumaLDR / 10;
  Serial.print("Lectura del LDR");
  Serial.print(" ");
  Serial.print(ValorLDR);
  Serial.println();
}
void HRdSuelo() {
  HRDS = analogRead(FC_28);
  Serial.print("Humedad Relativa del Suelo");
  Serial.print(" ");
  Serial.print(HRDS);
  Serial.println();
}
void LM35_Leyendo() {
  int sumaTemp1 = 0;
  int sumaTemp2 = 0;
  for (byte i = 0; i < 10; i++) {
    sumaTemp1 += analogRead(LM35_A);
    sumaTemp2 += analogRead(LM35_B);
  }
  Temp1 = sumaTemp1 / 10;
  Temp2 = sumaTemp2 / 10;
  Serial.print("Temperatura ONBOARD");
  Serial.print(" ");
  Serial.print(Temp1);
  Serial.println();
  Serial.print("Temperatura ONBOARD_02");
  Serial.print(" ");
  Serial.print(Temp2);
  Serial.println();
}

void DHT_11Leyendo() {
  h = dht.readHumidity();
  t = dht.readTemperature();
  Serial.print("Humedad Relativa Ambiental: ");
  Serial.print(h);
  Serial.print(" %");
  Serial.println();
  Serial.print("Temperatura Relativa Ambiental: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.println();
}

void digitalClockDisplay() {
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print("/");
  Serial.print(month());
  Serial.print("/");
  Serial.print(year());
  Serial.println();
}

void printDigits(int digits) {
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

void Relay01ON () {
  digitalWrite (Relay_01, HIGH);
  Serial.print("Luz Prendida");
  Serial.println();
}

void Relay01OFF () {
  digitalWrite (Relay_01, LOW);
  Serial.print("Luz Apagada");
  Serial.println();
}
[code]

Arduino-er: Communication betweeen Arduinos using SPI estuve viendo esta pagina pero no comprendo como llega a eso valores en el esclavo