Buongiorno e buon anno,
ho, Arduino dove è presente una sensor shield per facilitare il cablaggio.
Sulla shield sono collegati:
- 3 Selettori in modo Input
- 1 Wire per la DS
- 1 LCD I2C 20x4
- 4 Output per 4 Led ( 3 Verdi e 1 Rosso)
- 1 DHT 11
- 1 Extender BUS I2C
Tramite il cavo di rete a 15 Mt circa mi trovo:
Solo i 4 Relè sono alimentati separatamente, il resto tramite i 5V di Arduino.
Allego lo schema in pdf che è identico al cablaggio, prima ho disegnato e poi l'ho costruito.
Cambia solo la parte dei Relè dove ne ho messi 4 ed ho alimentato esternamente perché in fase di test mi sono accorto che Arduino non ce la faceva ad accendere 2 Relè insieme.
Lo sketch è questo
#include <Adafruit_MCP23017.h>
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
Adafruit_MCP23017 mcp1;
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int Stagione = 5; // Selettore ESTATE/INVERNO collegato ad Arduino
const int Forza = 6; // Selettore SU per Forzare acqua calda (Collegato ad Arduino)
const int mcp_calore = 11; // Relè 2 collegato a MCP23017 (Filo Bianco)
const int mcp_stag = 10; // Relè 1 collegato a MCP23017 (Filo Verde)
const int mcp_forza = 12; // Relè 3 Selettore SU Forzatura calore collegato a MCP23017 (Filo Rosso)
const int mcp_forzato = 13; // Relé 4 Forzato collegato a MCP23017
const int ledforzato = 8; // Se forzato accende LED Rosso collegato ad Arduino
const int mcp_bollitore = 15; // Elettro Valvola Linea Bollitore collegato a MCP23017 con cottatto pulito
const int mcp_termo = 9; // Elettro Valvola Linea Riscaldamento collegato a MCP23017 con cottatto pulito
const int Clima = 3; // Termostato Ambiente per Riscaldamento Abitazione collegato ad Arduino
const int ledtermo = 9; // Led Verde Stato Elettrovalvola Riscaldamento Abitazione collegato ad Arduino
const int ledboll = 10; // Led Verde Stato Elettrovalvola Bollitore collegato ad Arduino
const int ledblu = 4; // Led Blu Stato Stagione, acceso su Inverno collegato ad Arduino
// Lettura Stato dei SELETTORI collegati ad Arduino
int statoForza = 0;
int statoStagione = 0;
int statoClima = 0;
int statomcp_bollitore = 0;
int statomcp_termo = 0;
// Linea dati DS18B20 al pin 7 di Arduino
#define ONE_WIRE_BUS 7
// Dichiaro il Pin del DHT e il modello DHT11
#define DHTPIN 2
#define DHTTYPE DHT11
// Imposta la comunicazione oneWire per comunicare con un dispositivo
OneWire oneWire(ONE_WIRE_BUS);
// Passaggio oneWire reference alla Dallas Temperature
DallasTemperature sensors(&oneWire);
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Wire.begin();
digitalWrite(SDA, 0);
digitalWrite(SCL, 0);
mcp1.begin(0);
sensors.begin();
dht.begin();
lcd.init();
lcd.backlight();
// Configuro i Pin USCITA
mcp1.pinMode(mcp_calore, OUTPUT); // Relè 2 su MCP23017
mcp1.pinMode(mcp_stag, OUTPUT); // Relè 1 su MCP23017
mcp1.pinMode(mcp_forza, OUTPUT); // Relè 3 su MCP23017
mcp1.pinMode(mcp_forzato, OUTPUT); // Relé 4 su MCP23017
pinMode(ledforzato, OUTPUT); // Led ROSSO Forzatura su Arduino
pinMode(ledtermo, OUTPUT); // Led VERDE Valvola Termosifoni su Arduino
pinMode(ledboll, OUTPUT); // Led VERDE Valvola Bollitore su Arduino
pinMode(ledblu, OUTPUT); // Led Verde Stagione Inverno
// Configuro i Pin INGRESSO
pinMode(Forza, INPUT_PULLUP); // Selettore SU per Forzatura su Arduino
pinMode(Stagione, INPUT_PULLUP); // Selettore SU per Inverno, GIU per Estate su Arduino
pinMode(Clima, INPUT_PULLUP); // Ingresso per Riscaldamento Ambiente da Termostato su Arduino
mcp1.pinMode(mcp_bollitore, INPUT); // Stato Elettrovalvola Linea Bollitore su MCP23017
mcp1.pinMode(mcp_termo, INPUT); // Stato Elettrovalvola Linea Riscaldamento su MCP23017
}
void loop(void) {
statoForza = digitalRead(Forza);
statoStagione = digitalRead(Stagione);
statoClima = digitalRead(Clima);
statomcp_bollitore = digitalRead(mcp_bollitore);
statomcp_termo = digitalRead(mcp_termo);
// Lettura Dallas
sensors.requestTemperatures();
// Lettura DHT11
float t = dht.readTemperature();
/*
Chiedo se lo stato del Selettore Stagione su Arduino è su INVERNO per abilitare la Modalità INVERNO
Se il selettore è in INVERNO invio su MCP23017 la richiesta di CHIUDERE il Relé 1
Altrimenti il Relé 1 rimane aperto se lo stato era ESTATE
*/
if (digitalRead(Stagione) == LOW)
{
mcp1.digitalWrite(mcp_stag, LOW);
digitalWrite(ledblu, LOW);
}
else
{
mcp1.digitalWrite(mcp_stag, HIGH);
digitalWrite(ledblu, HIGH);
}
/* Controllo il riscaldamento dell'abitazione tramite un termostato esterno alimentato a pile.
Il contatto del termostato è collegato direttamente ad Arduino sul Pin "Clima" con la PULL UP configurata per risparmio cablaggi.
Funziona solamente se è INVERNO
*/
if (digitalRead(Clima) == LOW && digitalRead(Stagione) == HIGH)
{
mcp1.digitalWrite(mcp_calore, HIGH);
}
else
{
mcp1.digitalWrite(mcp_calore, LOW);
}
if (sensors.getTempCByIndex(2) <= 50 && sensors.getTempCByIndex(3) <= 50 && digitalRead(Clima) == LOW)
{
mcp1.digitalWrite(mcp_forzato, HIGH);
}
if (sensors.getTempCByIndex(2) >= 68 || digitalRead(Clima) == HIGH)
{
mcp1.digitalWrite(mcp_forzato, LOW);
}
mcp1.digitalWrite(mcp_forza, digitalRead(Forza));
digitalWrite(ledforzato, digitalRead(Forza));
digitalWrite(ledtermo, mcp1.digitalRead(mcp_termo));
digitalWrite(ledboll, mcp1.digitalRead(mcp_bollitore));
/*
Nel Display 20x4 visualizzo le varie temperature,
Caldaia sta per la temperatura dello stadio alto del Bollitore
Solare sta per lo temperatura dello stadio basso del Bollitore
Mandata sta per la temperatura dell'acuqa nel circuito del riscaldamento
Ambiente sta per la temperatura dell'ambiente misurata dal DHT11 installato su Arduino
*/
lcd.setCursor(0, 0);
lcd.print("Caldaia "); // Temperatura del Primario Bollitore da 100 LT
lcd.print(sensors.getTempCByIndex(0));
lcd.print((char)223);
lcd.setCursor(0, 1);
lcd.print("Solare "); // Temperatura del Solare Bollitore da 200 LT
lcd.print(sensors.getTempCByIndex(1));
lcd.print((char)223);
lcd.setCursor(0, 2);
lcd.print("Mandata "); // Temperatura della Mandata dal Pannello Solare al Bollitore da 200 LT
lcd.print (sensors.getTempCByIndex(2));
lcd.print((char)223);
lcd.setCursor(0, 3);
lcd.print("Ambiente "); // Temperatura dell'abitazione
lcd.print(t);
lcd.print((char)223);
}
Non ho inserito nessun tempo perché mi dava problemi con gli Extender, si bloccava la comunicazione anche mettendo un delay di 500
Ciao Fabio
Pannello Arduino_1-Model.pdf (111 KB)