Pages: [1] 2   Go Down
Author Topic: Accensione apparato 220 V con arduino uno  (Read 3205 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti! Vorrei fare in modo di accendere via web un apparato a 220V:
-come hardware ho un arduino uno e lo shield ethernet
-ho realizzato uno stadio pilota con relè seguendo questo link http://www.ethermania.com/shop/download/MontaggioBloccoRele.pdf
-l' apparato 220 V consuma circa 500mA ed il contatto 250 V sul relè porta 10 A
Ora ho principalmente due problemi:
-la sistemazione del codice (sono solamente riuscito a tirar su un web server smiley)
-l' assorbimento del relè a 5 V è di circa 100 mA, direi decisamente troppi per l' out di arduino, ma posso comunque ovviare con un alimentatore esterno. A questo punto voi giustamente mi direte che cosa ho fatto a fare lo stadio pilota...  smiley-grin
Direi quindi che la scelta migliore sia creare un pulsante on/off su web server che chiamandolo e cliccandoci sopra permetta di aprire o chiudere il contatto tra l' enable ed il +5 V.
In questo modo userei l' ethernet shield per il web server e l' uno per gestire un contatto on/off.
Che ne dite? Sto seguendo la strada giusta?
Qualcuno ha qualche bozza di codice più o meno pronta?
Grazie mille a tutti
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 136
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, la strada che stai seguendo è quella giusta, io ho fatto alcune piccole prove simili a quello che vuoi fare tu.
Ho comprato il solito modulo che hai linkato e collegandolo direttamente ad arduino non hai problemi (almeno a me non ne ha dati).
Io personalmente non ho fatto un webserver ma mi sono messo in ascolto su una porta e invio comandi tramite l'ethernet e in base al comando ricevuto metto a HIGH o LOW il pin a cui ho collegato il relè.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, la strada che stai seguendo è quella giusta, io ho fatto alcune piccole prove simili a quello che vuoi fare tu.
Ho comprato il solito modulo che hai linkato e collegandolo direttamente ad arduino non hai problemi (almeno a me non ne ha dati).
Io personalmente non ho fatto un webserver ma mi sono messo in ascolto su una porta e invio comandi tramite l'ethernet e in base al comando ricevuto metto a HIGH o LOW il pin a cui ho collegato il relè.
Bene, è già qualcosa... Io il modulo l' ho costruito e funziona, ho seguito lo schema per tutto tranne che il relè è differente, non vorrei dipendesse da quello. Comunque nel pomeriggio ricontrollo il circuito.
Saresti cosi gentile, se puoi, di dirmi quanto assorbe il tuo circuito?
Non ho ben capito il discorso dell' invio comandi sulla ethernet... A me servirebbe spegnere questo apparato in caso di necessità, quindi ho pensato ad un web server per semplicità (chiunque lo può fare) e possibilità di utilizzo da smartphone.
Grazie mille
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 136
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, l'assorbimento vedrò di ricavartelo ma attualmente ho arduino impegnato in un altro progettoe quindi passeranno almeno due/tre giorni per poterti far la prova. La soluzione del webserver è sicuramente semplice e accessibile con qualsiasi dispositivo, a me serviva effettuare prove per accedere all'ethernet shield su una porta differente dalla solita 80 (http) per inviare tramite applicazioni appositamente scritte comandi ad arduino. Questo perchè volevo azionare porte e simili da arduino e vorrei criptare le comunicazioni il più possibile con protocolli proprietari in modo da limitare il più possibile la possibilità disnifing e intrusione da parte di persone non autorizzate, se si tratta di accendere/spegnere una lampadina non ci sono problemi, ma se mi aprono la porta di casa...

Ciao
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3280
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Collegare la porta di casa a un comando http non è la cosa più intelligiente da farsi per default, cosi' come un eventuale impianto di allarme. Arduino non supporta una velocità, una memoria sufficiente ad elaborare un complesso programma di cifratura, ti dovrai accontentare di uno piuttosto semplice, ameno che non abbia un server sempre acceso dal quale transitano i comandi
« Last Edit: December 30, 2011, 08:13:32 am by pablos71 » Logged

no comment

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La vedo dura visto che dovrei realizzarlo entro stasera smiley-cry Mi sembra molto strano anche il fatto che con lo stadio pilota assorba 100mA a 4,8 V...
Ora vedrò di tirare insieme un po' di codice.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eccomi qui con il codice. La fonte di ispirazione (trovo doveroso citarla) è questa http://www.ioscripto.it/arduino-accendere-led-via-web/
Code:
#include <SPI.h>
#include <Ethernet.h>
 
/*
Simple Ethernet Test
Arduino server outputs simple text to browser
and controlling LED with simple checkbox
The circuit:
* Arduino Duemilanove
* Arduino Ethernet shield
* Basic FTDI breakout 5V
* LED connected to GND and digital pin 4 via resistor
*/
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 2, 166 }; // ip in lan
byte gateway[] = { 192, 168, 2, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80); //server port
 
int ledPin = 9; // LED pin
char link[]="http://www.dax.it"; //link data
String readString; //string
boolean MICROWAVE_ON = false; //LED status flag
 
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
 
void loop(){
Client client = server.available();
if (client) {
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
        readString.concat(c); //store characters to string
      //if HTTP request has ended
      if (c == '\n' && currentLineIsBlank) {
         Serial.print(readString);
        if(readString.indexOf("L=1") > 0) {//lets check if LED should be lighted
          //led has to be turned ON
          digitalWrite(ledPin, HIGH); // set the LED on
          MICROWAVE_ON = true;
          }else{
          //led has to be turned OFF
          digitalWrite(ledPin, LOW); // set the LED OFF
          MICROWAVE_ON = false;
        }
        // now output HTML data starting with standart header
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        // inizializzo pagina (da togliere se uso ajax)
        client.print("<html><head><title>ARDUINO Controllo accensione via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
        //send first heading
        client.println("<h1>CONTROL by davide@dax</h1>");
        client.println("<hr />");
        client.println("<h1>MICROWAVE Status</h1>");
        client.print("<span>MICROWAVE status: </span>");
 
          if (MICROWAVE_ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:red'>OFF</span>");
          }
        client.print("<h2><a href='/?L=1'>Accendi il ponte</a> | <a href='/?L=0'>Spegni il ponte</a></h2>");
 
        // chiudo pagina da togliere se uso ajax
        client.println("</body></html>");
 
        //clearing string for next read
        readString="";
        //stopping client
        client.stop();
 
        } //if c == /n .... devo capire che significa
    } // if client available
  } // while client connesso
} // if client
} //loop
Tutto funziona regolarmente, quindi chiudo il browser. Quando vado a richiamare la pagina mi mette lo stato su off e devo riaccenderlo! Cosa sbaglio?
Poi vedrò di risolvermi il problema dell' assorbimento del relè...
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 136
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, il problema è nella porzione di codice che valuta il parametro passato al client web
Code:
readString.indexOf("L=1") > 0
Se richiami la pagina senza il parametro va a finire nel ramo else e setta il pin a low e ti spegne il relè.
Una possibile soluzione è quella di modificare il codice in modo che se il parametro non viene passato non fai nulla, se viene passato ad 1 accendi e se viene passato a 0 spegni
Non so se il commento è tuo o meno, ad ogni modo il c=='\n' serve a capire se la lettura del client è arrivata alla linea vuota dell'invio e quindi la trasmisione è terminata, tutte le altre letture vengono concatenate nella variabile stringa readString.
[OT]
Se è lecito chiedere ti vuoi accendere il microonde per arrivare a casa in pausa pranzo con il cibo già caldo?  smiley
[/OT]

Ciao
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L'assorbimento rilevato 100mA è del tutto normale a 5V  P=V X I  a parità di potenza richiesta dalla bobina del Relè, più bassa è la tensione più alta deve essere la corrente (per farlo scattare) se provi un Relè da 12V noterai infatti che assorbe circa 60mA.
Comunque ti occorre un alimentatore esterno mai sovraccaricare le uscite di Arduino o qualsiasi I.C.
Saluti.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, il problema è nella porzione di codice che valuta il parametro passato al client web
Code:
readString.indexOf("L=1") > 0
Se richiami la pagina senza il parametro va a finire nel ramo else e setta il pin a low e ti spegne il relè.
Una possibile soluzione è quella di modificare il codice in modo che se il parametro non viene passato non fai nulla, se viene passato ad 1 accendi e se viene passato a 0 spegni
Non so se il commento è tuo o meno, ad ogni modo il c=='\n' serve a capire se la lettura del client è arrivata alla linea vuota dell'invio e quindi la trasmisione è terminata, tutte le altre letture vengono concatenate nella variabile stringa readString.
[OT]
Se è lecito chiedere ti vuoi accendere il microonde per arrivare a casa in pausa pranzo con il cibo già caldo?  smiley
[/OT]

Ciao
Grazie mille! Traducendo in parole povere io devo fare in modo che chiamando semplicemente l' indirizzo ip lui legga lo stato di quel momento (ovvero non faccia nulla). Forse la cosa migliore sarebbe un terzo if in modo da
L1--> accende
L0--> spegne
parametro vuoto --> non fare nulla
Il mio problema è tradurlo in codice...
Certo che è lecito... Trattasi di ponte radio in caso la frequenza dovesse essere occupata sono in grado di spegnerla immediatamente!
L'assorbimento rilevato 100mA è del tutto normale a 5V  P=V X I  a parità di potenza richiesta dalla bobina del Relè, più bassa è la tensione più alta deve essere la corrente (per farlo scattare) se provi un Relè da 12V noterai infatti che assorbe circa 60mA.
Comunque ti occorre un alimentatore esterno mai sovraccaricare le uscite di Arduino o qualsiasi I.C.
Saluti.
Grazie, ho comunque provedduto a cambiare relè e parallelare l' ingresso a 12 V
Logged

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusa ma tu piloti il rele' con lo schema che hai postato ? quello di ethernia con il transistor ?
se e' cosi' quale e' il problema ? quanto ti assorbe il rele' non ti interessa perche' a pilotarlo c'e' il transistor.
puoi restare sul 5v di arduino lasciando tutto come e' da schema, senza alimentatori esterni o altro
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Offline Offline
Edison Member
*
Karma: 40
Posts: 1957
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Beccati questo codice fatto appost aper te, co tanto di firma con tuo nick.

Il codice ha qualche REM per via di modifiche da uno mio leggermente diverso, però l'ho compilato e funziona.

Ti devi procurare la libreria LED.h

Se non capisci qualche passaggio chiedi.

Code:

#include <LED.h>
#include <SPI.h>
//#include <WString.h>
#include <Ethernet.h>
#include <avr/pgmspace.h>


prog_char string_0[] PROGMEM = "";
prog_char string_1[] PROGMEM = "<tr><td><input type=submit name=b1 value=Rel&egrave;_1></td><td>";
prog_char string_2[] PROGMEM = "<tr><td><input type=submit name=b2 value=Rel&egrave;_2></td><td>";
prog_char string_3[] PROGMEM = "";
prog_char string_4[] PROGMEM = "";
prog_char string_5[] PROGMEM = "";
prog_char string_6[] PROGMEM = "";
prog_char string_7[] PROGMEM = "</form>";
prog_char string_8[] PROGMEM = "<img src='data:image/gif;base64,R0lGODlhEAAQALMAABgDBKyqrHV2dZUCBOnf3X8CBPsCBCIhIvwWFPz9/L27vfbu7BUSE/kSFPwgILS1tCH5BAAAAAAALAAAAAAQABAAAwR5MEnJqp04sSO6eM/BZFwHnECgKMfEmEAjG6c6JhxgOEtCNAYaS2Pi+YDB1KMiiPUIjmCwAFAwY76odEAliJoNAkIa5AK8jIAOuTUvRA812TAwE944ha5cL1DxGgpqAH5+JwQaEwcrgwAMdzgZGysElW83GRobB5wZEQA7'/>";
prog_char string_9[] PROGMEM = "<img src=data:image/gif;base64,R0lGODlhEAAQAKIAAP////f398DAwICAgAAAAAAAAAAAAAAAACwAAAAAEAAQAAADTRiq1L4wtEGHEC2S6sjFyzY0H+aB0ngB7OcRqcoC5Tl5cymot9CWFAKgR9MFhy/dhYO8nD7MoQQDrYykU5O1wYIxXI6ZN3SaISPkTiQBADs= alt=Spento ></td><td>";
prog_char string_10[] PROGMEM = "";
prog_char string_11[] PROGMEM = "";
//prog_char string_11[] PROGMEM = "<meta http-equiv=refresh content=5 >";
prog_char string_12[] PROGMEM = "";
prog_char string_13[] PROGMEM = "";

PROGMEM const char *string_table[] = // change "string_table" name to suit
{
string_0,
string_1,
string_2,
string_3,
string_4,
string_5,
string_6,
string_7,
string_8,
string_9,
string_10,
string_11,
string_12,
string_13,
};

char buffer[400]; // make sure this is large enough for the largest string it must hold

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

String inString = String(35);

Server server(80);

LED led1 = LED(3);
LED led2 = LED(4);


String msg="";
//int tam=0;
int st1=9,st2=9,st3=9,st4=9,st5=9,st6=9;//,st7=9,st8=9;
//--------------------------------------------------

String readString; //string



void setup()
{
Serial.begin(9600);
Ethernet.begin(mac, ip,gateway,subnet);
server.begin();
Serial.println("Serial READY");
Serial.println("Ethernet READY");
Serial.println("Server READY");

  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
//---------------------

}

void loop()
{
 
 

  
//--------------------------Start Client
Client client = server.available();

int led=0;
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 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 (inString.length() < 35) {
inString.concat(c);

}
if (c == '\n' && current_line_is_blank) {
  
/*-------------------------------
  Serial.print(readString);
        if(readString.indexOf("L=1") > 0) {// lettura del valore se il LED si deve accendere
          // il led sarà acceso
          digitalWrite(outPin, HIGH); // accendo il led
          LEDON = true;
          Serial.print("ON pin ");
          Serial.println(outPin);
          }
          else
          {
          //il led sarà spento
          digitalWrite(outPin, LOW); //sengo il led
          LEDON = false;
          Serial.print("OFF pin ");
          Serial.println(outPin); }
//-------------------------------------*/
  

 
//---------------------Luci

if(inString.indexOf("b1")>0){

led1.toggle();
if(led1.getState()) st1=8;
else st1=9;
led=1;

}

if(inString.indexOf("b2")>0){

led2.toggle();
if(led2.getState()) st2=8;
else st2=9;
led=2;

}

/*
if(inString.indexOf("msg")){

strcpy(msg,inString.substring(inString.indexOf("g")+2,inString.indexOf(" H")));
Serial.print("msg: ");
//Serial.println(msg);
}
*/

// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

//client.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"><html lang=\"it\">");
//client.println();
          //Scrivo l'intestazione
          client.println("<html>");
      //   client.println("<META http-equiv=REFRESH content=3; url=/ >");
      //  client.println("<meta http-equiv=\"Refresh\" content=\"2; URL=192.168.1.4>");

          client.println("<style> a:link{font:8pt/11pt arial; color:red} a:visited {font:8pt/11pt verdana; color:blue} body {font:8pt/11pt verdana; color:black; background-color:lightgray} </style>");
          client.println("<div style='width:360px; height:640px;'>"); //risoluzione per nokia 5800 640x360
          client.println("<title>Controllo via Web</title>");
      //    client.println("<meta http-equiv=\"Refresh\" content=\"5; URL=192.168.1.4>");
          client.println("</head>");
          client.println("<body>");
                  
          client.println("<h2>Controllo Remoto Rel&egrave</h2>");
          client.println("<font size= 4><form method=GET>");        
          client.println("<table width=200>");
          
          
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[0]))); // Necessary casts and dereferencing, just copy.
client.println( buffer );
for (int i = 1; i < 3; i++)
{
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy.
client.println( buffer );
switch(i){
          client.println("B");
case 1: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st1]))); client.println( buffer ); break;
case 2: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st2]))); client.println( buffer ); break;
//case 3: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st3]))); client.println( buffer ); break;
//case 4: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st4]))); client.println( buffer ); break;
//case 5: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st5]))); client.println( buffer ); break;
//case 6: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st6]))); client.println( buffer ); break;
//case 7: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[st6]))); client.println( buffer ); break;
}

delay(30);
 
}
client.println("</table>");
client.println("<hr />");
 client.print("<h5>Powered By dax79</h5>");
//--------------------------------------------

//client.println("<br><br><br><br>");

 



 
 

        
//----------------------------------------
            
  

          client.println("</div>");
          client.println("</body>");
          client.println("</html>");        
          
          
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);
inString = "";
readString="";
client.stop();
 }
} //fine
« Last Edit: December 31, 2011, 08:21:40 am by BaBBuino » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusa ma tu piloti il rele' con lo schema che hai postato ? quello di ethernia con il transistor ?
se e' cosi' quale e' il problema ? quanto ti assorbe il rele' non ti interessa perche' a pilotarlo c'e' il transistor.
puoi restare sul 5v di arduino lasciando tutto come e' da schema, senza alimentatori esterni o altro
Si esatto! Ho usato gli stessi componenti tranne ovviamente il relè. Ho controllato l' assorbimento ed ho notato che era di 100mA e quindi ho optato per un parallelo sul 12 V (cambiando il relè).
Sinceramente mi state un po' confondendo smiley-grin
L'assorbimento rilevato 100mA è del tutto normale a 5V  P=V X I  a parità di potenza richiesta dalla bobina del Relè, più bassa è la tensione più alta deve essere la corrente (per farlo scattare) se provi un Relè da 12V noterai infatti che assorbe circa 60mA.
Comunque ti occorre un alimentatore esterno mai sovraccaricare le uscite di Arduino o qualsiasi I.C.
Saluti.
Confermo l' assorbimento più basso con un relè a 12 V. Quindi cosa faccio? Mi avete confuso... smiley-roll
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Beccati questo codice fatto appost aper te, co tanto di firma con tuo nick.

Il codice ha qualche REM per via di modifiche da uno mio leggermente diverso, però l'ho compilato e funziona.

Ti devi procurare la libreria LED.h

Se non capisci qualche passaggio chiedi.
Grazie mille, addirittura codice gratuito! Ora l' apparato è stato messo in servizio, credo che lo riavrò a metà settimana in modo da poter nuovamente giocare con il codice.
Trovata la libreria... Appena riesco a rimetterci le mani ti farò sapere e ti posterò eventuali miei dubbi.
Grazie mille a tutti
Logged

Offline Offline
Edison Member
*
Karma: 40
Posts: 1957
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho rimodificato il codice per levare alcune parti "morte".

Rammenta di modificare gli indirizzi IP del Web Server Arduino e del Gateway, con altri idonei alla tua rete.
Logged

Pages: [1] 2   Go Up
Jump to: