Domotica e interferenze elettromagnetiche

Salve a tutti.
Inauguro il nuovo forum con il seguente quesito
Volevo chiedervi un parere circa un progetto di domotica che sto realizzando con arduino + ethernet shield.
Da arduino mando a un integrato ULN2803 (alimentato a 12V) dei segnali digitali che amplificati
pilotano dei relè bistabili 12 - 220 V (ho usato dei diodi per evitare il problema del ritorno della corrente induttiva
generata dallo stacco della bobina del relè).
Il segnale di pilotaggio dei relè viene spedito tramite una pagina web con dei pulsanti (creati con il codice html).
Fino a qui nessun problema.
Poichè voglio evitare di tenere eccitate le bobine dei relè da 12 -220v , ho deciso di collegare a questi relè dei relè
bistabili da 220 volt.
In pratica con il pulsante web mando un segnale della durata di 40 ms che eccita il relè da 12 - 220 volt che eccita il
bistabile da 220 che accende una lampada o motore o altro carico.
I problemi nascono ora e riguardano la pagina web.
In pratica le cose funzionano ma a volte la pagina non completa il caricamento di se stessa o rimane in fase di trasferimento
oppure appare il seguente messaggio:

La connessione è stata annullata

La connessione al server è stata annullata durante il caricamento della pagina.

  • Il sito potrebbe non essere disponibile o sovraccarico. Riprovare fra qualche momento.

  • Se non è possibile caricare alcuna pagina, controllare la connessione di rete del computer.

  • Se il computer o la rete sono protetti da un firewall o un proxy, assicurarsi che Firefox abbia i permessi per accedere al web.

Reputo questi problemi ai campi elettromagnetici creati dall'inserimento o sgancio del relè bistabile.
Ho utilizzato un filtro LC sia sulla rete di alimentazione dei relè sia sui singoli relè ma senza avere riscontri positivi.
Ho provato ad alimentare l'ULN2803 con delle batterie e usare il portatile senza alimentazione (niente).

Mi manca la schermatura di arduino (lo voglio mettere dentro una scatola di ferro).

Sto sbagliando qualcosa ??
Qualcuno ha qualche suggerimento ??
Mi sta sorgendo il dubbio che arduino sia un bel progettino ma che stringi stringi non sia adatto per cose semi o professionali per quel
che riguarda ad esempio la domotica.

Grazie

Ciao,
due domande:
1- Arduino è alimentata a sufficienza?

2- Per sbloccare Arduino deve resettarlo o fa da sè? Che shield Ethernet stai usando?

Sto usando l'alimentazione da usb del computer.
Non resetto la scheda arduino ma ricarico la pagina web usando l'indirizzo ip che gli ho assegnato (lo uso come server)
La scheda ethernet è quella precedente all'ultima uscita con la schedina della lettura di memoria SD.
Pensi che sia l'alimentazione di arduino ??

uhm e se fosse un'errore nella gestione della connessione internet, e non dettato dai rele ecc..?
codice?

Ho provato con una tensione che non fosse quella fornita dalla USB per alimentare l'arduino ma non ho avuto migliorie.
Ti posto il programma (non ancora completo).
Da considerare che sto usando un sensore della corrente (ad effetto Hall) per leggere la presenza della corrente quando attivo il bistabile n°3.
Tuttavia penso che non sia il programma perchè quando lavoro senza carico (e quindi senza i bistabili) non ho problemi

/*

Current base of transistor is driven from digital pin 8 to ground

Created 1 feb. 2011
By Kempis
*/

#include <Ethernet.h>
#include <WString.h>

#define LED1 7 // 7 driven the transistor
#define LED2 6 // 6 driven the transistor
#define LED3 5 // 5 driven the transistor

byte value;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 70 };
byte gateway[] = { 192, 168, 1, 1 };

String readString = String(35) ;// variabile globale di tipo sting dove catturo i dati prelevati con il metodo GET

Server server(80); //inizializzo arduino

void setup() {

// initialize the digital pin as an output:
Serial.begin(9600); // sets the serial port to 9600
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
Ethernet.begin(mac, ip, gateway);
delay(1000);
}

void loop()
{

Client client = server.available();
if (client) {
// an http request ends with a blank line
boolean current_line_is_blank = true;
while (client.connected()) {
if (client.available()) {

char c = client.read();

if(readString.length() < 35)
{
readString.append(c);
}
// if we"ve gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so we can send a reply
if (c == '\n' && current_line_is_blank) {
// send a standard http response header

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("");
client.println("Output digitali attivabili:");

client.println("");
client.println("");

client.println("
");

client.println("<form name="LED1" method="GET">");
client.println("<input type="submit" name="L1" value="Rele1">");
client.println("Lampada 1 a 220 V");
client.println("
");
client.println("
");
client.println("<input type="submit" name="L2" value="Rele2">");
client.println("Lampada 2 a 220 V");
client.println("
");
client.println("
");
client.println("<input type="submit" name="L3" value="Rele3">");
client.println("Lampada 3 a 220 V ");

client.println("
");
client.println("
");
client.println("");

// ECCITA IL RELE' 1
if (readString.contains("Rele1"))
{
digitalWrite(LED1, HIGH);
delay(40);
digitalWrite(LED1, LOW);

}
// ECCITA IL RELE' 2
if (readString.contains("Rele2"))
{
digitalWrite(LED2, HIGH);
delay(40);
digitalWrite(LED2, LOW);
}
// ECCITA IL RELE' 3
if (readString.contains("Rele3"))
{
digitalWrite(LED3, HIGH);
delay(40);
digitalWrite(LED3, LOW);
delay(100);

// Legge il valore massimo della corrente dal sensore hall
int stato=leggi_con_media();
if (stato>=520)
client.println("La linea 3 e' sotto carico");
else
client.println("Nella linea 3 non c'e' carico");

}
readString ="";

break;
}

if (c == '\n') {
// we"re starting a new line
current_line_is_blank = true;
} else if (c != '\r') {
// we"ve gotten a character on the current line
current_line_is_blank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
client.stop();
}

}

//Legge il valore massimo della corrente con il sensore a effetto hall
int leggi_con_media()
{
int total = 0;
int massimo=0;
for(int t=1;t<=40;t++)
{
int reading = analogRead(0);
if (reading > massimo)
massimo=reading;
delay(1);
}
Serial.println(massimo, DEC);
return massimo;
}

Aggiorno le prove che ho fatto per limitare le interferenze elettromagnetiche che i relè mi procurano nell'apertura e chiusura di un carico.
Ho montato dei diodi in serie (oltre a quello in parallelo con la bobina lato 12 v) e una resistenza da 130 ohm con una capacità da 100 nF in parallelo con la bobina (filtro RC).
Ho collegato anche il grd a una terra (il termosifone).
Ho notato un miglioramento ma ogni tanto (con una frequenza inferiore) si ripresentano gli stessi problemi.
Avete alcuni suggerimenti ??

Grazie

Salve a tutti.
Riporto di nuovo in auge questo problema perchè ho da porvi alcuni quesiti.
In breve ho costruito una scheda a relè che pilota altri relè bistabili (che usano dei triac per ridurre le interferenze elettromagnetiche) usando impulsi della durata di 200 ms.
Per controllare se c'è passaggio di corrente uso dei sensori di corrente ad effetto hall.
Il tutto viene controllato da una scheda arduino+ethernet shield funzionante in modalità web server.
Nella pagina visualizzo 3 pulsanti che mi pilotano i relè e sotto i pulsanti il report dato dai sensori di corrente.
Il problema continuano ad essere le interferenze elettromagnetiche che si generano durante le fasi di commutazione dei reè.
Ho migliorato tantissimo i problemi che avevo all'inizio, tuttavia capita che ogni tanto si ripresentano.
Premetto che il problema non riguarda la scheda arduino (se piloto la scheda relè con comandi in seriale non ho nessun problema) ma la scheda ethernet.
Capita infatti che i led fulld, 100Me link a volte, si spengono nei momenti in cui commuto i relè (per 1-2 secondi) per poi riaccendersi.
Al lato pratico questo mi comporta un ritardo nel caricamento della pagina Web.
Sembra che la scheda si resetti.
Non so se questa può essere una soluzione ma ho provato ad inserire una capacità collegata in serie a una resistenza tra il Gnd e i 5 volt e collegare il pin di uniore tra r e c al'ingresso reset.
Mi sembra di avere ottenuto dei miglioramenti (ripeto mi sembra ma non ne sono tanto sicuro)
Ho l'impressione che si tratti di un problema di massa (che ho comunque collegato a terra) ma che la possibile soluzione sconfini in ambiti poco scientifici....
Qualcuno ha qualche parere in merito?
Grazie

da profano, hai provato a mettere dei diodi tra arduino e i relè (sia alimentazio, gnd che segnali?)

Certo.
Sia nel lato alimentazione che in "controfase" sulle bobine dei relè (per intenderci in parallelo con la bobina dei relè per limitare il ritorno di corrente al momento dell'apertura del contatto).
Inoltre uso l'integrato ULN 2803 adatto al pilotaggio dei carichi induttivi che al suo interno ha già dei diodi.

un'idea potrebbe essere quella di collegare tutte le uscite e anche GND ai pin analogici, registrarne gli stati e fare in modo che si riproduca l'errore, per capire cosa lo causi

sto avendo il tuo stesso problema con un contattore di una pompa! se i relè pilotati sono Finder e vai sul sito trovi degli RC già pronti (vale per quelli in AC) da collegare in parallelo alla bobina! in + fatti un RC (100ohm 0,1uF) da collegare in parallelo ai contatti! così per relè piccoli ho risolto! i diodi servono solo per i relè in DC!

Ho già messo dei filtri RC in parallelo alla bobina dei relè lato DC.
Si tratta di una R=100 ohm e un condensatore da 100nF (ceramico, ma forse era meglio elettrolitico)
Pensavo eventualmente di usare anche delle ferriti (ho usato anche dei varistori nel lato AC allo scopo di limitare le sovratensioni ma senza particolari miglioramenti).
Avete qualche altro suggerimento ?