Attuatore lineare e fotocellula

Salve a tutto il forum, ho un progetto in mente che vorrei sviluppare, devo poter aprire e "accostare" una porta finestra per far passare il gatto, ho già un attuatore lineare che tramite arduino e rete apro da una semplice pagina web, ora però vorrei ampliare il progetto e mettere una fotocellula che riaprà la finestra nel caso passa il gatto in modo da non schiacciarlo, inoltre dall'interno e dall'esterno tramite un pir apra la suddetta finestra... senza che debba intervenire personalmente... ho tutto il materiale e ho fatto lo sketch per la prima parte ma aggiungere tutti i sensori e effettuare tutti i controlli per me diventa troppo complesso, mi blocco quando con i vari if then else devo fare più controlli contemporaneamente tipo controlla se il pir rileva movimento e apri la finestra ma se la fotocellula .
Inoltre come fotocellula volevo usare quello che ho a disposizione ovvero fotoresistenza e laser..
Help!!
E grazie per qualsiasi aiuto...

Claudio

inizia con un if alla volta cercando di avere le idee chiare su cosa devi ottenere, quando incontri un problema posti qua il codice così qualcuno ti può aiutare, diversamente dubito che qualcuno possa scriverti e inviarti il codice bello e pronto :wink:

>Claudio71: ... purtroppo, come ti ha detto giustamente "-zef-", purtroppo qui NON funziona così ... :confused:

... qui nessuno scrive software per conto terzi o realizza schemi su ordinazione, ma si aiuta chi viene qui a correggere/ottimizzare il software che lui scrive o gli schemi che lui realizza :slight_smile:

Se non hai mai sviluppato su Arduino, o hai sviluppato molto poco, puoi cominciare con studiare QUESTO proseguire con QUESTO e/o acquistare qualche buon libro (es. QUESTO) ... dopo di che puoi cominciare a scrivere il tuo programma, metterlo qui (... mi raccomando, sempre racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra) e chiedere aiuto sui punti che non ti funzionano o che non capisci. :wink:

Guglielmo

Probabilmente mi sono spiegato male e me ne scuso, ovviamente non chiederei mai che qualcuno mi offra il codice su ordinazione e mi spiace che abbiate pensato questo..
Innanzitutto ho già fatto parte del codice come ho detto e sto cercando di implementare nuovi controlli, mi blocco quando in contemporanea devo fare diversi controlli.
Quando attivo l'attuatore lineare do un delay (15000) per fare si che si apra prima che si stoppi e non so come in questo lasso di tempo controllare se passa il gatto e si stoppi subito.
Come faccio a nidificare le condizioni? è li che mi intreccio e non ho trovato spiegazioni chiare neanche con google.
Già se riuscite a chiarirmi questo sarei un bel passo avanti.
Credo che la soluzione si trovi nel piazzare un if then subito dopo l'attivazione del motore e finchè quest'ultima condizione non si verifica il motore continua ad andare, appena rientro a casa butto giù un pò di codice che non funziona e spero che mi darete qualche dritta.

Grazie

Il problema potrebbe risiedere nell'uso del delay che è bloccante, quindi quando arrivi li il micro non fa null'altro e attende il trascorrere del tempo fissato. Per poter verificare se qualche "evento" accade e quindi interrompere il moto della porta devi eliminare il delay e utilizzare la funzione millis(). Inoltre essendo la fotocellula un dispositivo di sicurezza converrebbe gestirla con un interrupt in modo tale che tu possa effettivamente fermare tutto prima che il gatto faccia una brutta fine

Claudio71:
... Quando attivo l'attuatore lineare do un delay (15000) per fare si che si apra prima che si stoppi e non so come in questo lasso di tempo controllare se passa il gatto e si stoppi subito. ...

... come ti ha detto "fabpolli", il problema è che semplicemente ... NON puoi usare la delay() ... perché durante essa NON puoi fare null'altro, metre tu devi controllare altre cose.

Devi a studiarti come si usa la millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

Grazie gpb01 ora me li guardo già sto guardando la guida Programmare arduino che mi hai segnalato, è un utile base da cui partire, stavo leggendo di millis() praticamente restituisce il tempo trascorso dalla partenza del programma... ora devo capire come questo possa essermi utile nel mio progetto... vi farò sapere.

Claudio71:
... stavo leggendo di millis() praticamente restituisce il tempo trascorso dalla partenza del programma...

NON è questo che ti deve interessare, guarda gli altri link che sono l'applicazione pratica della millis() :wink:

Guglielmo

Si Guglielmo ho capito... mi è utile perchè conta in background e non blocca lo sketch... ho visto anche il discorso degli interrupt non sapevo che i pin 2 e 3 avessero questa funzione aggiuntiva.... credo che posso iniziare a buttare giù qualche altra linea di codice e vediamo che succede.. :o

Se metti qui il tuo codice, ci verrà più semplice aiutarti.
Come già suggerito, prova con una nuova funzione alla volta.

P.S. Povero gatto, la fotocellula in questi casi dovrebbe essere la prima cosa da implementare

Si infatti non lo attivo finchè il gatto non sarà al sicuro.. :wink: ora sto studiando e questi giorni di festa mi metto sotto..

Buonasera e buona Pasqua a tutti, ho avuto un pò di tempo per buttare giù qualche linea di codice che spero di aver allegato in maniera corretta, per ora la fotocellula se non interrotta chiude l'attuatore se interrotta apre, l'attuatore ha i finie corsa che staccano la corrente quindi una volta chiuso tutto si stoppa e il motore lo gestisco con un driver l298n.
Ora vorrei implementare un sensore pir che se rileva un movimento apre tutto l'attuatore e una volta aperto dopo un certo tempo faccia ripartire questo codice per richiudere in automatico..

Che ne dite? per ora avete consigli su come integrare il codice? esempi o altro?

Grazie

#define PIN_LASER 5
#define MOTORE_IN1 6
#define MOTORE_IN2 7
#define LIMITE 500
#define FOTOCELL 0
int LASER;
 
void setup()
{
   pinMode(PIN_LASER,OUTPUT);
   digitalWrite(PIN_LASER,LOW);
   digitalWrite(PIN_LASER,HIGH); 
   Serial.begin(9600);
}
 
void loop()
{
   LASER = analogRead(FOTOCELL);
   delay(500);
   Serial.println(LASER);
   if(LASER < LIMITE)
   {
     digitalWrite(PIN_LASER,LOW); 
     digitalWrite(MOTORE_IN1,HIGH);
     digitalWrite(MOTORE_IN2,LOW);
     digitalWrite(PIN_LASER,HIGH);
   }
   else 
   {
     digitalWrite(MOTORE_IN2,HIGH);
     digitalWrite(MOTORE_IN1,LOW);  
   }
}

secondo me non dovresti fare ripartire il tutto dopo un tot di tempo che il sensore pir ha fatto riaprire l'attuatore ma solo quando questo non rileva più nulla, per fare questo devi solo gestire due condizioni, quindi quando la "fotocellula è interrotta" e contemporaneamente "pir rileva movimento" apre, in qualsiasi altro caso chiude, quindi tradotto basta fare un:

if (fotocellula interrotta) and (Pir rileva movimento) then
   Apre
else
   Chiude

spero di non aver scritto una cavolata colossale :o

Innanzitutto grazie zef ora la cosa comincia a farsi interessante io ho aggiunto nel frattempo il sensore pir ma quasi me ne vergogno auhauhau è proprio brutto come l'ho scritto ma diciamo che in teoria funziona, devo imparare a gestire le funzioni in modo che non reincollo tutto il codice ogni volta ma c'e' tempo.. dunque

#define PIR 2 
#define PIN_LASER 5
#define MOTORE_IN1 6
#define MOTORE_IN2 7
#define LIMITE 500
#define FOTOCELL 0
#define PIR 2 
int LASER;

void setup()
{
   pinMode(PIN_LASER,OUTPUT);
   pinMode(PIR, INPUT );
   digitalWrite(PIN_LASER,LOW);
   digitalWrite(PIN_LASER,HIGH); 
   Serial.begin(9600);
}
 
void loop()
{
 int PIR_Output = digitalRead( PIR );
 if (PIR_Output == HIGH) 
 {
  digitalWrite(MOTORE_IN1,HIGH);//apri
  digitalWrite(MOTORE_IN2,LOW);//apri
  delay (5000);
  LASER = analogRead(FOTOCELL);
   delay(500);
   Serial.println(LASER);
   if(LASER < LIMITE)
   {
     digitalWrite(PIN_LASER,LOW); 
     digitalWrite(MOTORE_IN1,LOW);
     digitalWrite(MOTORE_IN2,HIGH);
     digitalWrite(PIN_LASER,HIGH);
   }
   else 
   {
     digitalWrite(MOTORE_IN2,HIGH);
     digitalWrite(MOTORE_IN1,LOW);  
   }
 }
 else
  
   LASER = analogRead(FOTOCELL);
   delay(500);
   Serial.println(LASER);
   if(LASER < LIMITE)
   {
     digitalWrite(PIN_LASER,LOW); 
     digitalWrite(MOTORE_IN1,HIGH);
     digitalWrite(MOTORE_IN2,LOW);
     digitalWrite(PIN_LASER,HIGH);
   }
   else 
   {
     digitalWrite(MOTORE_IN2,HIGH);
     digitalWrite(MOTORE_IN1,LOW);  
   }
}

cosi facendo sfrutto semplicemente i fine corsa dell'attuatore infatti appena parte il programma comincia a chiudere ma quando tutto è chiuso il motore si ferma, appena il pir rileva si apre per un tot di tempo che permette il passaggio del gatto (i delay sono indicativi in quanto non ho preso i tempi reali) appena il gatto è passato e il pir non rileva l'attuatore si richiude e controlla se il laser viene interrotto (giuro che funziona) ora dato che i pericoli sono quando si richiude vorrei implementare il controllo tramite interrupt e i delay gestiti in background con millis.... e ora continuo a studiare.. :slight_smile:

mi sfugge il significato di spegnere e riaccendere subito dopo il laser?

    digitalWrite(PIN_LASER,LOW);
     digitalWrite(MOTORE_IN1,LOW);
     digitalWrite(MOTORE_IN2,HIGH);
     digitalWrite(PIN_LASER,HIGH);

quando si richiude non devi mettere pause visto che l'attuatore ha i suoi finecorsa non ha importanza per quanto tempo tu invii il comando di chiusura, così facendo se il gatto dovesse ripassare interrompendo il laser o essere rilevato dal pir le condizioni cambiano e il ciclo passa da chiusura ad apertura... mi sembra che stai complicando il tutto inutilmente o forse sono io a semplificare non avendo il tutto davanti agli occhi :confused:

In effetti non lo so.. credo sia un refuso dal programma da cui ho tratto quel pezzo di codice ora vedo che succede se lo tolgo... per i delay che dici di non usare si concordo il fatto è che ora ho allestito in piccolo con un motore dc che fa le veci dell'attuatore per quello è un pò ingombrante e il ritardo mi faceva capire quando cambiava verso.. ma in effetti con i fine corsa posso eliminarli.

Ecco il codice ripulito, non mi riesce di evitare il delay perche' altrimenti la finestra non rimarrebbe mai aperta per un minimo di tempo sto provando ha integrare la funzione millis come mi è stato suggerito ma per ora non mi riesce.
Cosi per il momento funziona che ve ne pare? suggerimenti?

#define PIR 2 
#define PIN_LASER 5
#define MOTORE_IN1 7
#define MOTORE_IN2 6
#define LIMITE 500
#define FOTOCELL 0
#define PIR 2 
int LASER;


void setup()
{
   pinMode(PIN_LASER,OUTPUT);
   pinMode(PIR, INPUT );
   digitalWrite(PIN_LASER,LOW);
   digitalWrite(PIN_LASER,HIGH); 
   Serial.begin(9600);
}
 
void loop()
{
 
 LASER = analogRead(FOTOCELL); 
 int PIR_Output = digitalRead( PIR );
 Serial.print(LASER);
 Serial.print ("  ");
 Serial.println(PIR_Output);
 if ((PIR_Output == HIGH) or (LASER < LIMITE))
   {
    digitalWrite(MOTORE_IN2,LOW);//apri
    digitalWrite(MOTORE_IN1,HIGH);//apri
    delay (250000);
   }
 else 
   {
     digitalWrite(MOTORE_IN2,HIGH);//chiudi
     digitalWrite(MOTORE_IN1,LOW); //chiudi 
   }
}

spero di non attirare l'ira degli esperti, ma visto che durante la pausa non devi fare altro al tuo posto lascerei il delay :blush: :grinning:

-zef-:
spero di non attirare l'ira degli esperti, ma visto che durante la pausa non devi fare altro al tuo posto lascerei il delay

... ho sempre difeso questa tua posizione :slight_smile:

Bisogna sapere come usare la millis(), perché casi in cui NON si deve fare nulla d'altro sono sempre abbastanza rari, ma in tutti gli altri casi, in cui effettivamente NON c'è null'altro da fare, beh ... tanto vale semplificarsi la vita ed usare la delay() :wink:

Guglielmo

in effetti il delay funziona a dovere pero se ci riesco implemento il millis anche per capire bene come funziona, noto il L298N con tensione a 12 volt quando lavora scalda un pochino... ci sono alternative? appena posso mi diverto con Fritzing e posto il circuito cosi mi dite se vanno implementate resistenze o condensatori vari :wink: