gestione luci con relè

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???

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

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: Arduino con controllo remoto via HTTP | GianniFavilli.it

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?

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

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 ... :~

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.

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"

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.. :frowning:

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?

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...

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 :frowning:

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?

zuzzurro:
perché in questo modo fa un controllo ogni 60 secondi...

  }

delay(60000);
}

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

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

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è.

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!

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

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...

mentre scrivevi ho messo 2 righe di esempio al post precedente

non mi funziona, mi da sempre MOTION DECETCION... dove sbaglio???

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

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

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 con il relè

}

void loop(){
unsigned long currentMillis = millis();

if (pir.motion_detected()){
previousMillis = currentMillis; //se nel frattempo passa qualcuno il contatore riparte da 60 sec
}
if(currentMillis - previousMillis >= timer)
{
digitalWrite(outPin, LOW); //spengo
Serial.println("No Motion detected");

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

intanto devi togliere l'else e il delay 2000
poi non c'era niente che l'accendeva

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

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

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 con il relè

}

void loop(){
unsigned long currentMillis = millis();

if (pir.motion_detected())
{
digitalWrite(outPin, HIGH); //accendo
previousMillis = currentMillis; //se nel frattempo passa qualcuno il contatore riparte da 60 sec
}
if(currentMillis - previousMillis >= timer)
{
digitalWrite(outPin, LOW); //spengo
Serial.println("No Motion detected");

}

}

non mi resta facile capire così al volo la classe che hai fatto, ma questo funziona di certo facciamo prima :slight_smile:

const int led = 7; 
const int in = 4; 

unsigned long previousMillis = 0;
extern unsigned long timer0_millis;
long timer = 60000;

void setup()
{
 pinMode(led, OUTPUT);
 pinMode(in, INPUT);
 Serial.begin(9600); 
}

void loop()
{
 unsigned long currentMillis = millis();
 
 if (digitalRead(in) == HIGH) 
   {
    digitalWrite(led, 1); 
    previousMillis =  currentMillis; //se nel frattempo passa qualcuno il contatore riparte da 60 sec
   }
  
 if(currentMillis - previousMillis >= timer)
   {
     digitalWrite(led, 0); 
     timer0_millis = 0;     
   }   
 }

mi rimane sempre accesa la lampada... non si spegne mai nemmeno dopo i 60 sec di inattivitià...

OMG, ma quando fai upload dello sketch la lampada si spegne? resta spenta?