gestione luci con relè

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

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

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

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

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?

funziona se metto if (digitalRead(in) == LOW)… però al mimino movimento il PIR riaccende la lampadina

Io vorrei che funzionasse in modo tale che l’accensione dell lampadina rimanga manuale attraverso il pulsante classico (ecco perché avevo impostato di default digitalWrite(outPin,HIGH):wink:
mentre l’Arduino provveda solo a spegnerla automaticamente dopo 60 sec di inattività nella stanza.

ahhhhhhh .....scusa, avevo capito male, pensavo che il pir dovesse accenderla come servizio di cortesia e spegnerla dopo un po' di inattività capito, mmm ci devo pensare un attimo

ma il pulsante diciamo manuale entra in arduino? perchè se non ci entra la vedo dura la realizzazione pratica

hai un relè sempre chiuso che si apre dopo 60 sec ok e poi chi la riaccende? se il contatto del rele si trova in serie alla lampada una volta aperto ... chi lo richiude che è comandato da arduino? il tuo interruttore manuale non l'accenderà più perchè il relè lo tiene spento

nella pratica io vorrei utilizzare i normali pulsanti Vimar da muro per accendere le luci di una stanza, poi siccome mia moglie non spegne mai una luce in qualsiasi stanza in cui entra... vorrei che Arduino le spegnesse al posto mio dopo x secondi di inattività nella stanza.

è fattibile?

si usando 2 deviatori uno quello a muro e uno il tuo relè nel cassetto a parete devi avere un interruttore a 3 fili (deviatore) se ne hai 2, devi aggiungere 1 filo e cambiare il frutto vimar, ma poi lo schema elettrico lo sai fare?