Automazione tapparelle problema

stato_attuale = digitalRead(Pin2);

… sperando che su pin2 ci sia una rete RC per fare il debouncing … altrimenti la lettura del pin si complica perché deve farlo da software :roll_eyes:

Guglielmo

Era per rispondere a questa domanda.
Ovvio che tutto la questione è un pelo più complessa di una semplice assegnazione.

Buongiorno a tutti
Ieri in tarda serata dopo aver rinfrescato un po’ il mio C , sono riuscito ad ottenere un piccolo risultato , e sembra funzionare, in serata metterò il codice .
Ovviamente non ho ancora finito, adesso che sono riuscito a creare il codice per un ingresso ed un uscita devo creare un codice per due ingressi e due uscite separate , perché ovviamente la tapparella sale ed è un comando ma deve anche scendere ed è un altro comando separato dal primo .
La storia continua…
Buona giornata a tutti

Buongiorno a tutti
Scusate il ritardo ma è stata una settimana intensa ed ho avuto poco tempo libero da dedicare al mio progetto , il risultato è questo

const byte button=2; // assegna il pin 2 al pulsante

const byte LED=13; // assegna il pin 13 al led

unsigned long Interval = 2000;  // attesa in secondi 
unsigned long prevmillis; 
int buttonState=0;


void setup() {
  
  pinMode(button, INPUT); // assegna il pin come ingresso 
  pinMode(LED, OUTPUT); // assegna il pin come uscita 
  
  
}

void loop() 
{
  buttonState = digitalRead (button);
 if (buttonState == LOW)
 
 
  {
    digitalWrite (LED, LOW);
    prevmillis = millis();
    
   
  }
  else if (millis() - prevmillis <= Interval)
  {
    digitalWrite (LED, HIGH);
  
  }
  else
  digitalWrite (LED, LOW);
 
} or paste code here

Il tutto funziona correttamente , se premo il pulsante e lo mantengo premuto il led si accende e rimane accesso per 2 secondi e poi si spegne anche se il pulsante rimane premuto nel tempo .
Ora arriva il mio secondo dilemma o meglio problema , come usare un altro ingresso e un altra uscita , che quando premo il pulsante 1 accende il led 1 , quando premo il pulsante 2 accende il led 2 , e quando il led 1 è accesso e premo il pulsante 2 il led 1 si deve spegnere e viceversa?

const byte button1 = 2; // assegna il pin 2 al pulsante
const byte button2 = 3;
const byte LED1 = 13; // assegna il pin 13 al led
const byte LED2 = 12;
unsigned long Interval = 2000;  // attesa in secondi 
unsigned long prevmillis; 
unsigned long Interval2 = 2000;  // attesa in secondi 
unsigned long prevmillis2; 
int buttonState1 = 0;
int buttonState2 = 0;

void setup() {
  
  pinMode(button1, INPUT); // assegna il pin come ingresso 
  pinMode(button2, INPUT);
  pinMode(LED1, OUTPUT); // assegna il pin come uscita 
  pinMode(LED2, OUTPUT);
}

void loop() 
{
  
  buttonState1 = digitalRead (button1);
 if (buttonState1 == LOW)
 
  {
    
    digitalWrite (LED1, LOW);
    prevmillis = millis();
     }
  else if (millis() - prevmillis <= Interval)
  {
    
    digitalWrite (LED1, HIGH);
   }
  else
  
  digitalWrite (LED1, LOW);
  delay(100);
  {
 buttonState2 = digitalRead (button2);
 if (buttonState2 == LOW)
  {
    
    digitalWrite (LED2, LOW);
    prevmillis2 = millis();
     }
 else if (millis() - prevmillis2 <= Interval2)
  {
   digitalWrite (LED2, HIGH);
    
   }
  else
   digitalWrite (LED2, LOW);
   delay (100);
 }  
} 

Questa è la soluzione che ho trovato , funziona probabilmente non sarà esteticamente bella ma è funzionale per le mie esigenze

ciao.
ho preso il tuo codice e ho l’ho formattato col ctrl+t dell’ide.
vedi se noti delle differenze

const byte button1 = 2; // assegna il pin 2 al pulsante
const byte button2 = 3;
const byte LED1 = 13; // assegna il pin 13 al led
const byte LED2 = 12;
unsigned long Interval = 2000;  // attesa in secondi
unsigned long prevmillis;
unsigned long Interval2 = 2000;  // attesa in secondi
unsigned long prevmillis2;
int buttonState1 = 0;
int buttonState2 = 0;

void setup() {

  pinMode(button1, INPUT); // assegna il pin come ingresso
  pinMode(button2, INPUT);
  pinMode(LED1, OUTPUT); // assegna il pin come uscita
  pinMode(LED2, OUTPUT);
}

void loop()
{

  buttonState1 = digitalRead (button1);
  if (buttonState1 == LOW)
  {
    digitalWrite (LED1, LOW);
    prevmillis = millis();
  }
  else if (millis() - prevmillis <= Interval)
  {
    digitalWrite (LED1, HIGH);
  }
  else
    digitalWrite (LED1, LOW);

  delay(100);

  {
    buttonState2 = digitalRead (button2);
    if (buttonState2 == LOW)
    {
      digitalWrite (LED2, LOW);
      prevmillis2 = millis();
    }
    else if (millis() - prevmillis2 <= Interval2)
    {
      digitalWrite (LED2, HIGH);
    }
    else
      digitalWrite (LED2, LOW);

    delay (100);
  }
}

Perché visto come l’hai indentato tu ho il sospetto che alcune istruzioni non siano dove ti aspetti.

ciao Fratt
Non vedo differenze dal tuo codice al mio , ma potrei anche aver capito male la tua domanda .
Sto testando il circuito da questa mattina e funziona tutto correttamente , tu hai visto qualche errore nel programma ?

il codice non l’ho toccato, ho cambiato solo l’indentazione.
nella tua versione il delay è indentato come il digitalWrite che lo precede, però mancando le graffe il delay risulta fuori dall’else.
se è voluto allora è ok. se invece ti serve dentro l’else devi mettere le graffe.
tutto qua.

Ho notato che a volte quando rilasciavo un pulsante il led si accendeva per pochi istanti meno di un secondo , mettendo il delay li non ho più questo difetto / errore