Arduino Master - Slave

Ciao a tutti,
avrei una domanda da farvi.

Ho installato nella mia abitazione un Arduino UNO per il controllo e la gestione del solare termico e del riscaldamento.

Ho utilizzato N. 4 sonde DS18B20, N. 1 Modulo 8 Relè collegati a circa 20Mt da Arduino e tutto funziona.
Adesso però dovrei collegare 2 contatti puliti ad Arduino e non ho più fili per farlo, ne posso passarne altri nuovi.

Ho visto in rete che è possibile sfruttare I2C per unire due o più dispositivi.

Avrei intenzione di sfruttare l'Arduino UNO come Master e aggiungere un MEGA come Slave.
Sul Mega andrei a collegare le sonde, i relè e gli altri 2 contatti che mi servono.
Su Arduino UNO dovrei visualizzare su un Display I2C (già presente) 20x4 le temperature delle 4 Sonde.

Ho creato uno schema in PDF, che allego, dove c'è la situazione attuale e quella che vorrei implementare.

Inserisco anche l'attuale programma che è su Arduino UNO.

Mi chiedo se è possibile che lo Slave diventi il controllore di tutte le sonde, dei relè e dei 2 contatti e invii i dati al Master.
Sul Master ho anche 3 selettori che dovranno comunicare allo Slave quello che dovrà fare.

Forse non mi sto spiegando bene ma guardando il disegno in PDF qualcosa in più si può capire.

Grazie

//Automazione Solare Termico con scheda 8 Relè, 4 Sonde DS18B20, Fotoresistenza e PLC Siemens LOGO!
 
/*   Ingressi / Uscite PLC
 *   
 *   Ingresso I1 --->  Calore Bollitore
 *   Ingresso I2 --->  Cronotermostato
 *   Ingresso I3 --->  Stagioni (INVERNO / ESTATE)
 *   Ingresso I4 --->  Forza Calore Bollitore
 *   Uscita   Q1 --->  Elettro Valvola Bollitore 240V
 *   Uscita   Q2 --->  Elettro Valvola Riscaldamento 240V
 *   Uscita   Q3 --->  Caldaia 240V
 *   Uscita   Q4 --->  Pompa Ricircolo 240V
 *   
 *  Il PLC è programmato per eseguire tutte le funzioni solamente se il selettore Stagioni è posizionato su INVERNO. 
 *  Attivando l'Ingresso 1 vengono attivate le uscite Q1 - Q3 - Q4 sul PLC
 *  Attivando l'ingresso 2 vengono attivate le uscite Q2 - Q3 - Q4 sul PLC
 *  Attivando l'ingresso 3 viene abilitata la sequesnza del programma in modalità INVERNO, se l'ingresso è aperto non viene eseguito nessun programma (ESTATE)
 *  Attivando l'ingresso 4 vengono attivate le uscite Q1 - Q3 - Q4 sul PLC
 *  
 *  Come si nota, sia l'ingresso 1 che l'ingresso 4 hanno la stessa funzione ma sono diversamente programmate su Arduino.
 *  L'ingresso 1 viene comandato dall'uscita "calore" di Arduino, mentre l'ingresso 4 viene comandato dall'uscita "forzatura" di Arduino
 *  L'uscita "calore" viene comandata in modo automatico in base alla temperatura del Bollitore (t:<40°C) e al valore di una fotoresistenza (200)
 *  L'uscita "forzatura" viene comandata da un selettore collegato al pin 4 di Arduino, se si vuole forzare il PLC anche se la fotoresistenza supera la soglia di 200
 *  
 */
 
#define fotoresistenza A0
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h> 

LiquidCrystal_I2C lcd(0x3F,20,4); 
int tempo = 5000;             // Tempo attesa ciclo
const int estate = 2;         // Selettore in Estate (Filo Verde)
const int inverno = 3;        // Selettore in Inverno (Filo Bianco)
const int forza = 4;          // Selettore di Forzatura Calore
const int calore = 6;         // Relè 2 Arduino verso Ingresso 1 del PLC (Calore Bollitore)
const int forzatura = 7;      // Relè 3 Arduino verso Ingresso 4 del PLC (Forza Calore Bollitore)
const int stagione = 5;       // Relè 1 Arduino verso Ingresso 3 del PLC (Stagioni)
const int crono = 10;         // Contatto Termosifoni da Cronotermostato
const int termo = 8;          // Relè 4 Arduino verso Ingresso 2 del PLC (Cronotermostato)
const int pompa = 11;         // Relè 5 Arduino verso Ingresso 5 del PLC (Pompa)

// Lettura variabili SELETTORI
int estateState = 0;            
int invernoState = 0; 
int forzaState = 0;
int cronoState = 0;

// Linea dati DS18B20 al pin 9 di Arduino
#define ONE_WIRE_BUS 9

// Imposta la comunicazione oneWire
OneWire oneWire(ONE_WIRE_BUS);

// Passaggio oneWire reference alla Dallas Temperature
DallasTemperature sensors(&oneWire);

void setup(){
  
sensors.begin();
//Configuro la fotoresistenza su A0
pinMode(A0,INPUT);

// Inizializzo LCD
lcd.init();                    
lcd.backlight();

// Configuro i Pin di USCITA
pinMode(calore, OUTPUT);  
pinMode(stagione, OUTPUT);
pinMode(forzatura, OUTPUT);
pinMode(termo, OUTPUT);
      
// Configuro i Pin di INGRESSO
pinMode(estate, INPUT);   
pinMode(inverno, INPUT); 
pinMode(forza, INPUT);
pinMode(crono, INPUT);
 
}

void loop(void){

// Leggo il valore dei selettori
estateState = digitalRead(estate);
invernoState = digitalRead(inverno);
forzaState = digitalRead(forza);
cronoState = digitalRead(crono);

// Invio il comando di lettura delle temperature
sensors.requestTemperatures(); 

if (digitalRead(inverno) == HIGH)
{
  digitalWrite(stagione, HIGH);  //Relè 1 Chiuso, Stato INVERNO Selezionato (in questo stato il PLC svolge tutte le procedure richieste da Arduino)
}
else
{
  digitalWrite(stagione, LOW);   //Relè 1 Aperto, Stato ESTATE Selezionato (in questo stato il PLC non svolge nessuna procedura richiesta da Arduino)
}
// Leggo il valore della fotoresistenza
int fotodiodo = analogRead(fotoresistenza);

/*  
*   Se il selettore Forzatura non è HIGH (quindi non forzato), 
*   le sonde di Temperatura (Caldaia & Solare) leggono valore inferiore o uguale a 40 gradi ed il diodo ha un valore minore di 200, 
*   il Relè 2 (Calore) si commuta in Chiuso.
*   Sonda 2 --> Caldaia 
*   Sonda 3 --> Solare
*/

if (digitalRead(forza) == LOW && sensors.getTempCByIndex(2) <= 40 && sensors.getTempCByIndex(3) <= 40 && digitalRead(estate) == LOW && fotodiodo < 200) 
{
digitalWrite (calore, HIGH); // Relè 2 Chiuso
}
else
{
  digitalWrite (calore, LOW); // Relè 2 Aperto
  
// Se una delle tre dichiarazioni è esatta il Relè commuta in Aperto

if (sensors.getTempCByIndex(2) >= 68 || digitalRead(estate) == HIGH || fotodiodo > 200) 
{
 digitalWrite(calore, LOW);  // Relè 2 Aperto
}

// Se il selettore Forzatura ha valore HIGH attivo la forzatura del riscaldamento
// Se il selettore Forzatura ha valore LOW disattivo la forzatura del riscaldamento

  if (digitalRead(forza) == HIGH && digitalRead(estate) == LOW)
{
  digitalWrite(forzatura, HIGH);  // Relè 3 Chiuso
}
else
{
   digitalWrite(forzatura, LOW);  // Relè 3 Aperto
}

// Se il crono è ON e il selettore è su INVERNO accendo i riscaldamenti

if (digitalRead(crono) == HIGH && digitalRead(inverno) == HIGH)
{
  digitalWrite(termo, HIGH);      // Relè 4 Chiuso
  }
else
{
  digitalWrite(termo, LOW);       // Relè 4 Aperto
  }
  

lcd.setCursor(0, 0); 
lcd.print("Caldaia        "); // Temperatura del Primario Bollitore da 100 LT
lcd.print(sensors.getTempCByIndex(2));
lcd.setCursor(0, 1); 
lcd.print("Solare         "); // Temperatura del Solare Bollitore da 200 LT
lcd.print(sensors.getTempCByIndex(3));
lcd.setCursor(0, 2); 
lcd.print("Mandata        "); // Temperatura della Mandata dalla Caldaia ad Impianto
lcd.print(sensors.getTempCByIndex(1));
lcd.setCursor(0, 3); 
lcd.print("Sicurezza      "); // Temperatura della Mandata dal Pannello Solare al Bollitore da 200 LT
lcd.print(sensors.getTempCByIndex(0));

delay (tempo);
  
  }

}

Arduino Caldaia Casa-Model.pdf (174 KB)

lo sai che i 6 pin analogici (A0-A5) possono essere usati come digitali vero?... :slight_smile:

Una domanda perché è una cosa che non so! :slight_smile:
Ma si può usare il protocollo i2c contemporaneamente con più dispositivi e scopi diversi? A parte che i pin sono già utilizzati non esistono anche conflitti software??
Quindi in questo caso usa i2c per lcd può usarlo anche per altro??

si, si può perchè i vari dispositivi hanno un indirizzo diverso quindi possono ricevere/inviare dati sulla stessa linea (a4-a5 per la UNO)

Prima di mettere un secondo Arduino userei uno piú grande (Arduino MEGA2560) oppure un espansione dei Pin come dei Shift Register o der I2C expander.

Ciao Uwe

Patrick_M:
lo sai che i 6 pin analogici (A0-A5) possono essere usati come digitali vero?... :slight_smile:

Non ho più fili dal punto di connessione Arduino al punto di controllo a 20 Mt.

uwefed:
Prima di mettere un secondo Arduino userei uno piú grande (Arduino MEGA2560) oppure un espansione dei Pin come dei Shift Register o der I2C expander.

Ciao Uwe

Ok, mettere il mega non sarebbe un problema, avrei più porte e quindi più controlli.

Rimane il problema dei 10 fili che sono alla distanza di 20Mt da Arduino.
Se conto quelli necessari per far funzionare il tutto, arrivo a 11

5 Fili solamente per i Relè (considerando alimentazione esterna che è già presente)
1 Filo per le sonde DS18B20
2 Fili per il controllo delle Elettro valvole
1 Filo per la Fotoresistenza
2 Fili per Positivo e Negativo

Totale 11 :cry: