Eccomi qui dopo l'ennesima prova, varistore inserito e nessun cambiamento.
Ho un video dimostrativo 
In questo sketch vengono richiamati 2 timer, uno per pompa h2o e uno per ventole, corrispondono difatti le due icone in alto. La frequenza è di 5 secondi di accensione ogni 10.
Senza carico tutto bene, basta collegare la spina per ottenere una "D" in riga 1,16 e allo sgancio del rele' il disturbo totale. Il motore utilizzato è un motorino da neanche 50W di un aspiratore.
L'hardware usato è lo stesso in uso nel progetto e montato a banco il problema si ripresenta.
Non ci sono i sensori temperatura collegati ed ho utilizzato una sola uscita rele'.
Tristezza infinita..
allego anche il codice
byte simboloTemperatura[8] = //icon for termometer
{
B00100,
B01010,
B01010,
B01110,
B01110,
B11111,
B11111,
B01110
};
byte simboloUmidita[8] = //icon for water droplet
{
B00100,
B00100,
B01010,
B01010,
B10001,
B10001,
B10001,
B01110,
};
byte simboloFan[8] = { //icona ventola
B00000,
B11001,
B01011,
B00100,
B11010,
B10011,
B00000,
B00000
};
byte simboloH2o[8] = { //icona water
B00000,
B01000,
B10101,
B00010,
B01000,
B10101,
B00010,
B00000
};
byte simboloLuce[8] = { //icona sun
B00000,
B10101,
B01110,
B11111,
B01110,
B10101,
B00000,
B00000
};
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
#include "DHT.h"
#include <DS1307RTC.h>
#include "Adafruit_MCP23017.h"
#include <LiquidCrystal.h>
#include <Time.h>
#include <TimeAlarms.h>
#define DHTPIN 7
#define DHTTYPE DHT22
#define ONE_WIRE_BUS 6
DHT dht(DHTPIN, DHTTYPE);
Adafruit_MCP23017 mcp;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire); //28D066A0050000CB
DeviceAddress tH2o = { 0x28, 0xD0, 0x66, 0xA0, 0x05, 0x00, 0x00, 0xCB };
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int fan = 0;
const int light = 1;
const int h2o = 2;
const int air = 3;
const int maintenance = 10;
int fanSeconds = 0; //variabile utilizzata per la misurazione dei minuti trascorsi nel timer ventola
int fanMinute = 0;
int fanJobSec = 0; //variabile per il conteggio dei secondi di lavoro trascorsi nella funzione fan()
int h2oSeconds = 0; //variabile utilizzata per la misurazione dei minuti trascorsi nel timer ventola
int h2oMinute = 0;
int h2oJobSec = 0; //variabile per il conteggio dei secondi di lavoro trascorsi nella funzione pump()
byte lightState; //variabile per riportare lo stato della luce nel void loop()
byte pumpState = 0; //variabile per riportare lo stato della pompa nel void loop()
byte fanState = 0; //variabile per riportare lo stato della ventola nel void loop()
boolean maintMode = LOW;
void setup() {
sensors.begin();
sensors.setResolution(tH2o, 9);
time_t t = now();
setTime(t);
setSyncProvider(RTC.get);
Wire.begin();
lcd.begin(16,2);
dht.begin();
mcp.begin();
/* PROGRAMMAZIONE TIMER ********************************************/
Alarm.alarmRepeat(0,0,0,syncTime); //acquisizione ora da RTC !!! non modificare
Alarm.alarmRepeat(10,30,0,startLight); //accensione luci
Alarm.alarmRepeat (10,35,0,stopLight); //spegnimento luci
Alarm.timerRepeat(10,startFan); //accende ventola, frequenza espressa in secondi 3600sec=1h, durata nella funzione startFan()
Alarm.timerRepeat(10,startPump); //accende ventola, frequenza espressa in secondi 3600sec=1h, durata nella funzione startFan()
/* TERMINE PROGRAMMAZIONE TIMER ************************************/
pinMode(maintenance,INPUT_PULLUP);
mcp.pinMode(fan, OUTPUT);
mcp.pinMode(light, OUTPUT);
mcp.pinMode(h2o, OUTPUT);
mcp.pinMode(air, OUTPUT);
mcp.digitalWrite(fan,LOW);
mcp.digitalWrite(h2o,LOW);
mcp.digitalWrite(air,LOW);
lcd.createChar(1,simboloTemperatura);
lcd.createChar(2,simboloUmidita);
lcd.createChar(3,simboloFan);
lcd.createChar(4,simboloH2o);
lcd.createChar(5,simboloLuce);
lcd.setCursor(0,0);
lcd.print(" Growing System ");
delay(2000);
lcd.clear();
EEPROM.write(1,0); //
lightState = EEPROM.read(1);
if (lightState == 1) {
mcp.digitalWrite(light,HIGH);
lcd.setCursor(9,0);
lcd.write(5);
}
else if (lightState == 0) mcp.digitalWrite(light,LOW);
}
void loop() {
Alarm.delay(200);
time_t t = now();
Alarm.delay(200);
sensors.requestTemperatures();
Alarm.delay(200);
float h = dht.readHumidity();
Alarm.delay(200);
float c = dht.readTemperature();
Alarm.delay(200);
float cH2o = sensors.getTempC(tH2o);
Alarm.delay(200);
lcd.setCursor(0,0);
if (day(t)<10) lcd.print("0");
lcd.print(day(t), DEC);
lcd.print("/");
if (month(t)<10) lcd.print("0");
lcd.print(month(t), DEC);
lcd.setCursor(11,0);
if (hour(t)<10) lcd.print("0");
lcd.print(hour(t), DEC);
lcd.print(":");
if (minute(t)<10) lcd.print("0");
lcd.print(minute(t), DEC);
lcd.setCursor(0,1);
lcd.print(c,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.print(h,1);
lcd.write(2);
lcd.setCursor(13,1);
lcd.print(cH2o,0);
lcd.write(4);
/* ventola,se timer attivo flag=1 accensione */
if (fanState == 1) {
mcp.digitalWrite(fan,HIGH);
Alarm.delay(100);
lcd.setCursor(7,0);
lcd.write(3);
fanJobSec = 5; //tempo di lavoro in secondi
fanSeconds = (second(t)+fanJobSec%60);
fanMinute = (minute(t)+(fanJobSec/60));
if (fanSeconds > 60){
fanSeconds = fanSeconds - 60;
fanMinute ++;
}
if (fanMinute > 60) {
fanMinute = fanMinute - 60;
}
fanState = 2;
} /* ventola, controllo tempi */
if ((fanState == 2)&&(fanMinute == minute(t)&&(second(t)>=fanSeconds))){
mcp.digitalWrite(fan,LOW);
Alarm.delay(100);
lcd.setCursor(7,0);
lcd.print(" ");
fanSeconds = 0;
fanState = 0;
}
/* pompa h2o, se timer attivo flag=1 accensione */
if (pumpState == 1) {
mcp.digitalWrite(h2o,HIGH);
Alarm.delay(100);
lcd.setCursor(8,0);
lcd.write(4);
h2oJobSec = 5; //tempo di lavoro in secondi
h2oSeconds = (second(t)+h2oJobSec%60);
h2oMinute = (minute(t)+(h2oJobSec/60));
if (h2oSeconds > 60){
h2oSeconds = h2oSeconds - 60;
h2oMinute ++;
}
if (h2oMinute > 60) {
h2oMinute = h2oMinute - 60;
}
pumpState = 2;
} /* pompa h2o, controllo tempi */
if ((pumpState == 2)&&(h2oMinute == minute(t)&&(second(t)>=h2oSeconds))){
mcp.digitalWrite(h2o,LOW);
Alarm.delay(100);
lcd.setCursor(8,0);
lcd.print(" ");
h2oSeconds = 0;
pumpState = 0;
}
if(digitalRead(maintenance)==LOW) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" maintenance");
lcd.setCursor(0,1);
lcd.print(" mode");
Alarm.delay(100);
mcp.digitalWrite(h2o,LOW);
mcp.digitalWrite(fan,LOW);
mcp.digitalWrite(light,LOW);
mcp.digitalWrite(air,HIGH);
maintMode = HIGH;
}
while(maintMode==HIGH){
lcd.setCursor(15,1);
lcd.print("!");
Alarm.delay(500);
lcd.setCursor(15,1);
lcd.print(" ");
Alarm.delay(500);
if(digitalRead(maintenance)==HIGH){
maintMode=LOW;
mcp.digitalWrite(air,LOW);
Alarm.delay(100);
lcd.clear();
Alarm.delay(100);
lightState = EEPROM.read(1);
if (lightState == 1) {
mcp.digitalWrite(light,HIGH);
lcd.setCursor(9,0);
lcd.write(5);
}
}
}
}
void syncTime(){
setSyncProvider(RTC.get);
}
void startLight(){
mcp.digitalWrite(light,HIGH);
lcd.setCursor(9,0);
lcd.write(5);
lightState = 1;
EEPROM.write(1,lightState);
}
void stopLight(){
mcp.digitalWrite(light,LOW);
lcd.setCursor(9,0);
lcd.print(" ");
lightState = 0;
EEPROM.write(1,lightState);
}
void startFan (){
fanState = 1;
}
void startPump (){
pumpState = 1;
}
Ciao!