Problema "strano" con relais all'avvio di arduino

Ciao a tutti!

Ho un arduino duemilanove + ethernet sheild + relais.

Ho due domandine…

  1. Come mai quando stacco la USB da arduino e la riattacco, rimane il relais “eccitato” ? poi devo spegnerlo io manualmente andando sulla pagina del webserver arduino
    Avevo pensato di inizializzare il relais in modalità LOW ma niente…
    Per il resto funziona tutto.
#include <string.h>
#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 192, 168, 1, 30 }; 
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };
Server server(80);

String readString; 

boolean PORTONE = false; 
boolean LED2ON = false; 
boolean LED3ON = false; 
 
void setup(){
  
  Ethernet.begin(mac, ip, gateway, subnet);
  
  pinMode(2, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);    
  
  Serial.begin(9600);
              digitalWrite(2, LOW);
  
}
 
void loop(){
  
  Client client = server.available();
  
  if (client) {
    boolean currentLineIsBlank = true;
    
    while (client.connected()) {
      if (client.available()) {  
        char c = client.read();
        readString.concat(c);   
        if (c == '\n' && currentLineIsBlank) {
          Serial.print(readString);
         
         //PORTONE CASA//
         
          if(readString.indexOf("L=1") > 0) {
            digitalWrite(2, LOW);
            delay(500);
            digitalWrite(2, HIGH);
            PORTONE = true;      
          }
       
       /* if(readString.indexOf("L=01") > 0) {
          //led has to be turned OFF
          digitalWrite(2, LOW); // set the LED OFF
          LED1ON = false;
        }*/
        
        
        
       /* if(readString.indexOf("L=2") > 0) {//lets check if LED should be lighted
          //led has to be turned ON
          digitalWrite(7, HIGH); // set the LED on
          LED2ON = true;
          }else{
          //led has to be turned OFF
          digitalWrite(7, LOW); // set the LED OFF
          LED2ON = false;
        }
        if(readString.indexOf("L=3") > 0) {//lets check if LED should be lighted
          //led has to be turned ON
          digitalWrite(8, HIGH); // set the LED on
          LED3ON = true;
          }else{
          //led has to be turned OFF
          digitalWrite(8, LOW); // set the LED OFF
          LED3ON = false;
        }*/
        
        // INIZIO DICHIARAZIONE PAGINA HTML
        
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.print("<html><head><title>ARDUINO Controllo via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
        
        //PORTONE CASA
        client.println("<hr />");
        client.println("<h1>Portone Casa</h1>");
        client.println("
");
        //STAMPA STATO OPERAZIONE
        client.print("<span>ESEGUITO: </span>");
 
          if (PORTONE) {
              client.println("<span style='color:green'>SI</span>");
            }
            else
            {
              client.println("<span style='color:grey'>NO</span>");
          }
        client.print("<h2><a href='/?L=1'>APRI</a>");
        
        client.println("<hr />");
        
        //Secondo led
        client.println("<h1>LED2</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED2ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=2'>ON</a> | <a href='/?L=02'>OFF</a></h2>");
        client.println("<hr />");
        
        //terzo led
         client.println("<h1>LED3</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED3ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=3'>ON</a> | <a href='/?L=03'>OFF</a></h2>");
 
        client.println("</body></html>");
 
        //clearing string for next read
        readString="";
        //stopping client
        client.stop();
 
        } 
    } }
  } 
}

P.S il codice è da sistemare per bene ancora…
L’impulso arriva, funziona… ma l’unico problema è:

Se si dovesse levare la luce a casa mia, giustamente arduino si spegnerà e si riaccenderà appena tornerà la corrente, quindi il relais si ecciterà e si aprirà la porta automaticamente!
Come posso ovviare a tutto ciò?

Ripeto, tutto funziona (per adesso) l’unico problema è staccando e riattaccando l’usb il relais si eccita… e sono costretto a cliccare sul bottone APRI PORTA nella pagina di arduino!
Una volta cliccato, si sistema… come mai avviene ciò?

Se volete posso farvi un video anche … spero mi sia espresso bene!

Grazie a tutti infinitamente

ciao

perchè hai scitto questo?

if(readString.indexOf("L=1") > 0) {
digitalWrite(2, LOW);
delay(500);
digitalWrite(2, HIGH);
PORTONE = true;

dovrebbe in teoria essere

digitalWrite(2, HIGH);
delay(500);
digitalWrite(2, LOW);
PORTONE = true;

In questo modo una volta inviato il comando non lo spegni più
E se ti funzionava vuldire che hai collegato il rele in modo sbagliato, hai usato i contatti NC invece che NA (parlando di relè a riposo)
Controlla queste cose.

ciao

Può sembrarti strano ma... se scrivo al contrario, appena clicco su APRI PORTA il relais si spegne e si riaccende (come se stessi tenendo premuto un bottone)
La mia scheda ha un modo di pensare tutto suo :grin: :fearful:

No non è strano, hai collegato male i contatti del relè, sicuro sicuro :slight_smile:

Hai 3 piedini oltre l'alimentazione NA C NC
Lascia stare il C e sposta il filo da NC a NA

La scheda è la stessa di cui si parla qui:

ovvero a logica inverita.
Pertanto il codice è corretto (in linea di massima).

Se vuoi che i relè siano spenti, quando alimenti Arduino, in setup devi settare il pin HIGH

REP++

@pitusso, Grazie mille per tutto! Adesso funziona benissimo :grin:

Risolto!

EDIT: per sicurezza posto la foto:

http://imagebin.org/178651

Potrebbe anche funzionare, ma tecnicamente non è corretto secondo me, mettere HIGH sul setup è un ripego, inoltre lasci un relè sempre eccitato che si diseccita per 0.5 sec solo quando ti serve, bho fate voi.

Scusa ma mi serve per dare l'impulso al portone di casa, mica lo posso lasciare eccitato sennò mi fonde il portone

Perfetto lascialo così.

pablos71:
Perfetto lascialo così.

non ti riconosco più, spero che non sia per colpa mia :grin:

ahahahhaah minniti sei un mito :slight_smile:

Ma scusate fatemi capire, per logica invertita cosa si intende che su quella scheda quando scrivo
HIGH in realtà ho 0v sull’uscita?

Sto ricollegando tutto ma stavolta lo collego con il proprio cavo! quindi... o giusto.... o giusto!

pablos71:
ahahahhaah mEnniti sei un mito :slight_smile:

Ma scusate fatemi capire, per logica invertita cosa si intende che su quella scheda quando scrivo
HIGH in realtà ho 0v sull'uscita?

In pratica è come se applicassi all'uscita del pin di Arduino una porta inverter, quando dai HIGH ti ritrovi LOW e viceversa; probabilmente sta pilotando un PNP che, come sai, va in conduzione quando la base va a 0.

E allora diciamolo no?? caxxo mi fate sbraitare 2 ore :slight_smile:

:cold_sweat: