Go Down

Topic: gestione luci con relè (Read 24497 times) previous topic - next topic

zuzzurro

Sto sperimentando per la prima volta l'utilizzo del relè con Arduino Uno
nella fattispecie vorrei utilizzare Arduino e questo semplice relè



per accendere e spegnere una lampadina



ho collegato il positivo ai 5v, la massa al GND e il pin IN all'ingresso 9 digitale di Arduino

ho caricato il seguente sketch:


int Relay = 9;

void setup()
{
  pinMode(Relay, OUTPUT);     //Set Pin9 as output
}
void loop()
{
          digitalWrite(Relay, HIGH);   //Turn off relay
          delay(2000);
          digitalWrite(Relay, LOW);    //Turn on relay
          delay(2000);
}



per il momento non ho collegato nessuna lampadina al relè... però pensavo che si accendessero almeno i due micro led che ci sono sulla scheda del relè (Power e on/off)... invece NULLA!

E' normale??? 




pablos71

#1
Jan 12, 2012, 11:14 pm Last Edit: Jan 12, 2012, 11:41 pm by pablos Reason: 1
Ciao zuzzurro, eccoti alle prese con un altro enigma.
Ma non dovevevi mandare indietro la scheda difettosa?

Per quanto riguarda il tuo quesito, bhe no.... non è normale, il led power si dowrebbe accendere, dovresti sentire il tic del relè e il leddino on/off dovrebbe dare segni di vita se hai collegato i pin giusti, prova a fare un ponte tra +5v e l'input della schedina relè, scollegando il pin 9 da arduino, dovresti vedere se scatta il relè. In questo modo vedi se l'alimentazione arriva, se il collegamento è giusto e se il relè funzia.
Per verificare invece la parte arduino metti un led sull'uscita del pin 9 con relativa resistenza (senza relè) e vedi se si accende, nel tuo caso lampeggia ogni 2 secondi. Sicuro di non aver sbagliato qualcosa?

ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

zuzzurro

#2
Jan 12, 2012, 11:49 pm Last Edit: Jan 13, 2012, 12:18 am by zuzzurro Reason: 1
ciao pablos!
manderò indietro la ethernet shield difettosa e mi rimborseranno, ordinerò un Arduino Ethernet così inizierò a fare degli esperimenti in coppia con l'altro che ho già, per il mio futuro impianto di domotica... sempre che "angeli" come te mi daranno una mano a risolvere quei problemini che per me a volte diventano incubi!

Ho scoperto l'inghippo... se lo alimento da solo funziona!

sto cercando di realizzare questo piccolo progetto: http://www.giannifavilli.it/blog/arduino-controllo-remoto-http/

Al momento sto utilizzando:
- Arduino Ethernet
- sensore di temperatura e umidità DHT22
- sensore foresistore ceramico 400mW
- relè con stadio pilota
- niente led per il momento

il tutto funziona anche via web... dopo aver risolto i problemi della scheda ethernet di ieri notte... e aver utilizzato l'Arduino Ethernet (al posto di Arduino + Ethernet shield), ma adesso se io provo ad alimentare oltre ai due sensori anche il relè... evidentemente non c'è abbastanza tensione per farlo funzionare insieme al resto... ti sembra possibile???

In attesa di una soluzione, ho deciso di prendere l'alimentazione da Vin... ovvero direttamente dall'alimentatore esterno (che però è da 9v stabilizzato).... e funziona.... è corretto?


pablos71

visto che hai preso un relè a 5v, alimentarlo con 9v non è propriamente corretto, funzionerà per un po' ma durerà poco, fatti un piccolo stabilizzatore con un 7805 e usa pure i 9v, di schemini ne trovi a fiumi. Questo in via sperimentale, poi dovrai fare delle scelte definitive.
Per la ethernet non hai considerato una cosa ..... il difetto sulle saldature ICSP puo' essere sia da lato ethernet che da lato arduino, verifica meglio, perchè rischi di farti cambiare una scheda e non risolvere

ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

zuzzurro

grazie per i consigli... avendo uno stabilizzatore esterno universale regolabile, per il momento preferisco impostarlo a 5v che poi sono gli stessi che arrivano all'Arduino dal cavo USB... vero?

Per quanto rigarda il progettino di gianni favilli...
una cosetta non funziona a dovere: se utilizzo i comandi ACCENDI e SPEGNI via web per comandare il relè... questi accendo il relè ma istantaneamente quest'ultimo si spegne, perché a fine ciclo in fondo c'è un comando di reset 
readString="";           //clearing string for next read     

Ma non dovrebbe rimanere attivato il relè? ..fino a quando non clicco su SPEGNI e riporto il valore a zero? oppure genera solo un impulso?

Perdonami per la mia vastissima ignoranza ...  :~         

pablos71

#5
Jan 13, 2012, 01:57 am Last Edit: Jan 13, 2012, 02:08 am by pablos Reason: 1
Quote
impostarlo a 5v che poi sono gli stessi che arrivano all'Arduino dal cavo USB... vero?

Si la Usb fornisce 5v, se alimenti con un alimentatore a 5v va bene qualche centinaio di mA però ci vogliono.

Quote
Per quanto rigarda il progettino di gianni favilli...
una cosetta non funziona a dovere: se utilizzo i comandi ACCENDI e SPEGNI via web per comandare il relè... questi accendo il relè ma istantaneamente quest'ultimo si spegne, perché a fine ciclo in fondo c'è un comando di reset
readString="";           //clearing string for next read    

Ma non dovrebbe rimanere attivato il relè? ..fino a quando non clicco su SPEGNI e riporto il valore a zero? oppure genera solo un impulso?

Si dovrebbe rimanere acceso, non ho presente il progetto che dici di gianni favilli... , però a occhio la riga readString=""; svuota solo la variabile pronta per leggere un altra riga altrimenti i caratteri successivi verrebbero aggiunti in coda non più riconosciuti da un eventuale
if "blabla"
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

zuzzurro

ok, hai ragione...

il comando del relè è in questa parte...

//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(outPin, HIGH);   // set the LED on           
            LEDON = true;           
            Serial.print("ON pin ");           
            Serial.println(outPin);           
          }           
          else         
          {           
            //led has to be turned OFF           
            digitalWrite(outPin, LOW); // set the LED OFF           
            LEDON = false;           
            Serial.print("OFF pin ");           
            Serial.println(outPin);         
          }           

          // COSTRUZIONE PAGINA HTML 

...
...
...


In pratrica mi esegue immediatamente i due comand di accensione e sepgnimento di seguito.. :(

zuzzurro

#7
Jan 15, 2012, 12:55 pm Last Edit: Jan 15, 2012, 01:38 pm by zuzzurro Reason: 1
OK, ho risolto era il fotoresistore non ben tarato che rilevava la luce proventiente dal mio display 24" del PC e si spegneva immediatamente.
Ogni volta che spengo le luci si accende il led e scatta il relè.
Non appena riaccendo le luci, si spegne il del e il relè.

Adesso ho collegato il GND e il segnale del relè a stadio plota al led sulla breadboard e vorrei azionare in questo modo il relè che accende o spegne una lampadina 220v.
Dall'altro lato dovrei collegare l'alimentazione 220v e la lampadina ai 3 conttati del relè... come faccio?
Mi aiutate?



paolo_fiorini3

Devi collegare assieme il neutro (filo blu) della lampadina e della spina e poi devi collegare le due fasi ai morsetti del contatto normalmente aperto del relè che nel tuo caso mi sembra che siano il centrale e quello in basso...Uno dei due contatti del relè (quello normalmente chiuso) rimane inutilizzato...

zuzzurro

Graze Paolo!
esperimento riuscito!

Adesso passo al mio vero obiettivo che è quello di fare in modo, utilizzando un PIR, che dopo x secondi di "non movimento nella stanza", spegna la lampadina.

Sto utilizzano questo sensore PIR http://www.robot-italy.com/product_info.php?products_id=1558
L'ho collegato il relè come da istruzioni... funziona ma adesso vorrei che arduino di default accenda la lampadina attraverso il relè e che dopo 60 secondi di inattività la spegna.
Ho trovato questo sketch e ho cercato di adattarlo... ma è evidente che non ho fatto un buon lavoro... perché in questo modo fa un controllo ogni 60 secondi... mentre vorrei che facesse controlli ogni secondo e che solo dopo 60 secondi dall'ultimo movimento spegnesse la luce :(


const unsigned int PIR_INPUT_PIN = 4;  //pin PIR
const unsigned int BAUD_RATE = 9600;
int outPin = 7; // pin relè

class PassiveInfraredSensor{
int _input_pin;

public:

PassiveInfraredSensor(const int input_pin){
_input_pin = input_pin;
pinMode(_input_pin, INPUT);
}

const bool motion_detected() const{
return digitalRead(_input_pin) == HIGH;
}
};

PassiveInfraredSensor pir(PIR_INPUT_PIN);

void setup(){
Serial.begin(BAUD_RATE);
pinMode(outPin, OUTPUT); // out pin relè
digitalWrite(outPin,HIGH); //accendo di default la luce
}

void loop(){



if (pir.motion_detected()){
digitalWrite(outPin, LOW); //spengo relè
Serial.println("No Motion detected");

  } else{
  Serial.println("MOTION DETECTED");
  }
delay(60000);
}


Mi aiutate?

DanielaES


perché in questo modo fa un controllo ogni 60 secondi...
Code: [Select]
  }
delay(60000);
}


Questa parte di codice mette un delay di 60 secondi :)

Quote

mentre vorrei che facesse controlli ogni secondo e che solo dopo 60 secondi dall'ultimo movimento spegnesse la luce :(


Se non sbaglio, e qui interverranno i saggi, l'esempio Blink without Delay contenuto nell'ide ti metterà sulla buona strada.
Devi creare una variabile contatore che conti il tempo da quando il sensore pir non rileva movimento e quando il contatore supera i 60sec fai fare le tue cosine al relè.

zuzzurro

#11
Jan 15, 2012, 09:24 pm Last Edit: Jan 15, 2012, 09:48 pm by zuzzurro Reason: 1
Grazie Daniela,
ho dato un'occhiata all'esempio che hai citato e mi sono reso conto che effettvamente l'utilizzo del delay non è adatto a mio scopo.
D'altra parte però l'esempio usa delle funzioni un po' ostiche per le mie scarsissime conoscenze di programmazione.... HELP!

pablos71

#12
Jan 15, 2012, 11:19 pm Last Edit: Jan 15, 2012, 11:53 pm by pablos Reason: 1
in effetti il delay ti arresta lo sketch, se hai altre cose da fare nel frattempo, tutto resta bloccato, devi usare un millis()

unsigned long previousMillis = 0;
long timer = 60000; //60 sec

loop()
unsigned long currentMillis = millis();
if(sensore rileva persona)  
{
    //accendi la luce
    previousMillis =  currentMillis; //se nel frattempo passa qualcuno il contatore riparte da 60 sec
 }

if(currentMillis - previousMillis >= timer)
             {
              //spegni la luce
             
             }


ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

zuzzurro

ehhhh.... io ho visto l'esempio che ha citato Daniela... ma al momento non sono in grado di utilizzare i mills() per fare quello che vorrei
se qualche buona anima mi potesse aiutare...

pablos71

mentre scrivevi ho messo 2 righe di esempio al post precedente
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Go Up