Automazione tapparelle problema

Buongiorno a tutti
Come da titolo sto cercando di risolvere un problema legato ad un automazione tapparelle e domotica smart .
Vi spiego il mio problema i motori delle tapparelle sono a tre fili un filo di comando e due fili per l’alimentazione diretta del motore , per far scendere o salire la tapparella il filo comando va collegato alla fase per la discesa e sul neutro per la salita , e per comandare il tutto basta un impulso di 2/3 secondi .
L’attuatore domotico smart funziona che se premo la salita l’uscita resta eccitata per 2 minuti e uguale per la discesa e tutto questo non è compatibile con i motori della tapparella .
La mia idea era quella di poter usare arduino uno per risolvere il problema .
Quando premo un pulsante del comando smart vado ad eccitare un relè e il contatto del relè mi comanda un pin in ingresso su arduino uno che mi attiva un pin in uscita per 3 secondi e poi si riporta in stato zero ,anche se il pin in ingresso continua ad essere in stato uno .
E questo è il mio problema , comando il pin in ingresso e finche lo tengo premuto la mia uscita rimane attiva porto il pin in ingresso a zero e dopo 3 secondi il pin in uscita si porta a zero .
Ovviamente cosi il motore non funziona , qualcuno di voi sa aiutarmi ? Esiste una funzione per non leggere più il pin in ingresso finche non viene rilasciato ?

Ma stai parlando di motori a 230V? … guarda che se è così devo chiudere il thread … REGOLAMENTO, punto 15 e suoi sottopunti !

Spiega bene che cosa devi comandare …

Guglielmo

I motori sono alimentati a 220 v ma io devo controllare una centralina che è alimentata a 12 V .
Quindi il tutto è a bassa tensione , l’uscita della centralina controlla poi il motore

Perfetto! Quindi tu ti interfacci SOLO con la centralina con comandi a bassissima tensione e NON tocchi la parte motori a 230V.     :slight_smile:

Guglielmo

Non vado ad agire sulla parte in tensione 220 V il filo comune esce da una centralina ed è gestito a 12 V .

Si, va bene :slight_smile: … però mi rispieghi bene cosa vorresti che Arduino faccia? Perché non sono sicuro su cosa vorresti …

Difatti, se ho ben capito, tu vorresti che un cambiamento su un pin di INPUT (es. da HIGH a LOW) attivi un altro pin (in OUTPUT) per soli 3 secondi e poi lo lo disattivi anche se il pin di INPUT rimane, ad esempio, a LOW (quindi pulsante tenuto premuto). Dopo di che, quando tu rilasci il pulsante (quindi il pin in ingresso torna HIGH) la cosa può ripetersi.

Giusto?

E se il pulsante lo premi per meno di 3 secondi, l’uscita sempre 3 secondi deve attivarsi?

Guglielmo

Esattamente

Si

E’ quello che vorrei fare

Beh, allora è abbastanza facile, devi usare DUE varibili per il pulsante, uno stato_attuale (quando leggi il pin del pulsante) ed un stato_precedente … ti scrivo per grandi linee quello che devi fare, a te tradurlo in codice :smiley:

Mettiamo che il pin normalmente è HIGH (con una resistenza di pull-up) e che il tuo pulsante, quando è premuto, lo porta LOW … all’inizio, sia stato_attuale che stato_precedente sono HIGH.

Nel loop():

leggi lo stato del pulsante e lo metti in stato_attuale

se (stato_precedente == HIGH) e (stato_attuale == LOW) allora {
   significa che hai premuto il pulsante
   attivi l'uscita
   aspetti 3 secondi
   disattivi l'uscita
   assegni a stato_precedente iil valore di stato_attuale
}

poi devi controllare quando hai rilasciato il pulsante per cui ti chiedi:

se (stato_precedente == LOW) e (stato_attuale == HIGH) allora {
   vuol dire che hai rilasciato il pulsante
   stato_precedente = stato_attuale
}

fine del loop().

In questo modo, per quanto tu tenga premuto il pulsante, nel primo IF non entri più sino a quando non lo rilasci :wink:

Ora traducilo in ‘C’ e metto qui il codice (mi raccomando racchiuso nei tag CODE).

Guglielmo

P.S.: l’ho buttato giù al volo così … spero di non aver commesso errori :wink:

Grazie per il tuo aiuto , adesso provo a metterlo in C , spero di farcela è tutto il giorno che provo :expressionless:
Ma adesso ho una via da seguire , grazie ancora

Dove trovo il tag CODE

#define LED 13 // uso il pin 13 come uscita per ora ci collego un led per prova
#define BUTTON 2 // pulsante collegato al pin 2
unsigned long durata_led = 3000; // aattiva per 3 secondi il led 
void setup () { 
  pinMode(LED, OUPUT); //imposto il pin come uscita 
  pinMode(BUTTON, INPUT);// imposto il pin come ingresso
}
void loop () { 
  val = digitalRead(BUTTON); // legge il valore di ingresso e lo ricorda 
  if (val == HIGH)=(val == LOW); { 
    inizio_led = millis();
    tasto = tasto + 1;
    led = 1;
    if (tasto == 1)
  }
Non so come fare per far si che l'uscita resti attiva 3 secondi 

Emmm … una ripassatina al ‘C’ ? … perché quello che hai scritto NON fa quello che ti ho indicato io, anzi è proprio un’altra cosa … prova a guardare quello che ti ho indicato e guarda quello che hai scritto … :roll_eyes:

Guglielmo

Buongiorno Guglielmo
Il mio linguaggio C è molto arrugginito anzi direi quasi del tutto estinto .
La prima parte prima del loop , è corretta ?

int my_1 = 0;

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(2, INPUT);
}

void loop()
{
  digitalWrite(13, LOW);

  digitalRead(2) - LOW;

  if (digitalRead(2) == HIGH) {
    digitalWrite(13, HIGH);
    delay(3000); // Wait for 3000 millisecond(s)
    if (digitalRead(2) == LOW) {
      digitalWrite(13, LOW);
    } else {
    }
  }
}

Con questo codice il led si accende per tre secondi ma ovviamente se mantengo premuto il pulsante il led rimane accesso :sleepy:

Controlla questo: https://www.arduino.cc/en/Tutorial/BuiltInExamples/StateChangeDetection

Ho provato a modificare il codice consigliato da Paolo , ma il risultato che voglio ottenere è sempre e solo alla seconda pressione del pulsante

Scusa ma perché non traduci in ‘C’ quello che ti ho scritto io all’inizio?

Comincia con:

e poi procedi scrivendo in ‘C’ esattamente quello che ti ho scritto in Italiano io …

Se nella tua mente lo leggi e lo esegui capisci pure come funziona … :roll_eyes:

Guglielmo


#define ledPin 13
#define buttonPin 2
int led = 0;
int val = 0;
int button = 0;
void setup(){
 pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}
void loop(){
  val = digitalRead(buttonPin);
  if (buttonPin == HIGH) if (buttonPin ==LOW){
    digitalWrite(13, HIGH);
    delay(3000);
    
  }
}

`fin qui è corretto ?``

Purtroppo NO … e è proprio sbagliato concettualmente … sicuro di non voler dedicare un po’ più di tempo allo studio?

Io mi fermerei un’attimo, inizierei con lo studiare prima QUESTO poi proseguirei con QUESTO ed, infine, acquisterei qualche buon libro (come QUESTO) … secondo me ti si chiarirebbero parecchie cose :roll_eyes:

Guglielmo

Purtroppo per me sono anni che non uso più un arduino e di conseguenza non ricordo praticamente più nulla , sto leggendo il tuo secondo link il primo non funziona .
Quando dici nel loop
Leggi lo stato del pulsante e lo metti in stato_attuale
L’istruzione da scrivere è
Pin2 = digitalRead (Pin2); ?
Non riesco a capire come fare con , metti in stato_attuale ?