controllo motore serranda garage con arduino

Ciao a tutti,

sono nuovo del forum e mi sto appassionando alla piattaforma Arduino, ho iniziato a scrivere uno sketch per comandare un motore per serranda garage e devo dire che sono arrivato a buon punto.

ho settato i pin di uscita di salita e di discesa, ho impostato i relativi pulsanti (salita manuale, discesa manuale, pulsante automatico su/giu, con un solo pulsante e le fotocellule).

il codice per 3/4 già è funzionantemi manca solo di settare il pulsante che poi andranno collegate le fotocellule non so come sbloccare il comando delay().

mi spiego meglio postando il codice.

int pulsante;
  int luce=0;
  int manualesu;
  int manualegiu;
  int fotocellula;
  
void setup() 
{                
pinMode(13, OUTPUT);        //motore su
pinMode(10, OUTPUT);        //motore giu
pinMode(11, INPUT);         //pulsante automatico (radiocomando)
pinMode(7, INPUT);          //pulsante manuale su
pinMode(8, INPUT);          //pulsante manuale giu
pinMode(9, INPUT);          //FOTOCELLULA
}

void loop() 
{
pulsante=digitalRead(11);
if ((pulsante==HIGH) and  (luce==0)) 
{
digitalWrite(10, LOW);
digitalWrite(13, HIGH);
delay(18000);
digitalWrite(13, LOW);
luce=1;
}
else if ((pulsante==HIGH) and (luce==1)) 
{
digitalWrite(13, LOW);
digitalWrite(10, HIGH);
delay(18000);
digitalWrite(10, LOW);
luce=0;
}
    manualesu=digitalRead(7);
    if (manualegiu==LOW) 
    {
      digitalWrite(13, HIGH);
    }
    else if (manualesu==LOW)
    {
      digitalWrite(13, LOW);
    }
    else

ah i pulsanti manuali su/giu hanno anche una funzione di sicurezza che se premuti, per sbaglio, contemporaneamente, non succede il patatrac.

ringrazio già anticipatamente tutti coloro che parteciperanno al post.

Saluti da Attilio

Ps, sto cercando di capire la funzione millis() per evitare di usare il delay() ma non ci ho capito granchè.

mi scuso per il codice incompleto, ahah la fretta, ecco il codice completo

int pulsante;
   int luce=0;
   int manualesu;
   int manualegiu;
   int fotocellula;
   
void setup() 
{                
 pinMode(13, OUTPUT);        //motore su
 pinMode(10, OUTPUT);        //motore giu
 pinMode(11, INPUT);         //pulsante automatico (radiocomando)
 pinMode(7, INPUT);          //pulsante manuale su
 pinMode(8, INPUT);          //pulsante manuale giu
 pinMode(9, INPUT);          //FOTOCELLULA
}

void loop() 
{
 pulsante=digitalRead(11);
 if ((pulsante==HIGH) and  (luce==0)) 
 {
 digitalWrite(10, LOW);
 digitalWrite(13, HIGH);
 delay(18000);
 digitalWrite(13, LOW);
 luce=1;
 }
 else if ((pulsante==HIGH) and (luce==1)) 
 {
 digitalWrite(13, LOW);
 digitalWrite(10, HIGH);
 delay(18000);
 digitalWrite(10, LOW);
 luce=0;
 }
     manualesu=digitalRead(7);
     if (manualegiu==LOW) 
     {
       digitalWrite(13, HIGH);
     }
     else if (manualesu==LOW)
     {
       digitalWrite(13, LOW);
     }
     else
     {
       digitalWrite(13, HIGH);
     }

      manualegiu=digitalRead(8);
      if (manualesu==LOW) 
     {
       digitalWrite(10, HIGH);
     }
     else if (manualegiu==LOW)
     {
       digitalWrite(10, LOW);
     }
     else
     {
       digitalWrite(10, HIGH);
     }
}

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Infatti nel tuo codice appare una faccina.

int pulsante;
    int luce=0;
    int manualesu;
    int manualegiu;
    int fotocellula;
    
void setup() 
{                
  pinMode(13, OUTPUT);        //motore su
  pinMode(10, OUTPUT);        //motore giu
  pinMode(11, INPUT);         //pulsante automatico (radiocomando)
  pinMode(7, INPUT);          //pulsante manuale su
  pinMode(8, INPUT);          //pulsante manuale giu
  pinMode(9, INPUT);          //FOTOCELLULA
}

void loop() 
{
  pulsante=digitalRead(11);
  if ((pulsante==HIGH) and  (luce==0)) 
  {
  digitalWrite(10, LOW);
  digitalWrite(13, HIGH);
  delay(18000);
  digitalWrite(13, LOW);
  luce=1;
  }
  else if ((pulsante==HIGH) and (luce==1)) 
  {
  digitalWrite(13, LOW);
  digitalWrite(10, HIGH);
  delay(18000);
  digitalWrite(10, LOW);
  luce=0;
  }
      manualesu=digitalRead(7);
      if (manualegiu==LOW) 
      {
        digitalWrite(13, HIGH);
      }
      else if (manualesu==LOW)
      {
        digitalWrite(13, LOW);
      }
      else
      {
        digitalWrite(13, HIGH);
      }

       manualegiu=digitalRead(8);
       if (manualesu==LOW) 
      {
        digitalWrite(10, HIGH);
      }
      else if (manualegiu==LOW)
      {
        digitalWrite(10, LOW);
      }
      else
      {
        digitalWrite(10, HIGH);
      }
 }

ah mannaggia a me la fretta mi fa sempre brutti scherzi ;D vi ringrazio ancora.Mi sto scimunendo con la funzione millis(), qualcuno ha provato a spiegarmela ma non ci ho capito granchè, se riesco a capire come funziona riuscirei a fare qualcosa uffa...

questo è quanto ho provato a fare ma non fa ciò che dico io, poi arriva ad un certo punto e si blocca del tutto il pulsante.
Dov’è che sbaglio ???

void setup() 
{                
  pinMode(13, OUTPUT);        //motore su
  pinMode(10, OUTPUT);        //motore giu
  pinMode(11, INPUT);         //pulsante automatico (radiocomando)
  pinMode(7, INPUT);          //pulsante manuale su
  pinMode(8, INPUT);          //pulsante manuale giu
  pinMode(9, INPUT);          //FOTOCELLULA
  
  tempo=18000;

}

void loop() 
{
  if (digitalRead(11)==HIGH){
    delay(100);
    conteggio = millis();
    digitalWrite(13,LOW);
    if ((tempo >= (millis()- conteggio))&&(digitalRead(11)==HIGH)){
      digitalWrite(13,LOW);
      delay(100);
    }
  }
if (tempo <= (millis()- conteggio)){
  digitalWrite(13,HIGH);
}

{

      manualesu=digitalRead(7);
      if (manualegiu==LOW) 
      {
        digitalWrite(13, HIGH);
      }
      else if (manualesu==LOW)
      {
        digitalWrite(13, LOW);
      }
      else
      {
        digitalWrite(13, HIGH);
      }
 
       manualegiu=digitalRead(8);
       if (manualesu==LOW) 
      {
        digitalWrite(10, HIGH);
      }
      else if (manualegiu==LOW)
      {
        digitalWrite(10, LOW);
      }
      else
      {
        digitalWrite(10, HIGH);
      }
}
 }

Nessuno riesce a spiegarmi il comando millis() come devo utilizzarlo? :confused:

nin riesco a capire dove stà l'errore, per favore non c'è nessuno che potrebbe aiutarmi a capire il millis()

Negli esempi integrati trovi BlinkWhitoudDelay. Capito quello hai capito tutto :)