Interruttore automatico - Risolto

Buongiorno a tutti, in una scatolina 9 x 7 cm ho inserito un circuito con un relè, un riduttore di tensione ed un radar.
Il programma (AT85) è:

/*
   File:    Cortile_Pier_04
   Date:    19/07/2025
   Version: 4.0
   Arduino IDE Version: 1.8.19
   RWCL-0516
   Processore ATTINY 85/13
   Alimentazione max 40 V
*/

int rcwlPin = 2;              //RCWL-0516 OUT -> Attiny85 o Attiny13
int ledRele = 3;
unsigned long count_time = 0;
unsigned long att_time = 3000;

void setup() {
  pinMode (rcwlPin, INPUT);  //Define rcwlPin as INPUT
  pinMode (ledRele, OUTPUT);  //Define ledPin as OUTPUT
  count_time = millis();
}

void loop() {
  int value = digitalRead(rcwlPin); //Read rcwlPin value
  delay(100);
  if (value > 0) {
    digitalWrite(ledRele, HIGH);
    delay(100);
    count_time = millis();
  } else if ((value == 0) && (( millis() - att_time) <  count_time)) {
    digitalWrite(ledRele, LOW);
    delay(100);
  }
}

Lo schema del circuito è:

Il programma dovrebbe attivare il relè in presenza di un muovimento, invece ottengo un lampeggio continuo di 3 sec.

Non sono riuscito a trovare errori nel programma; è possibile che lo scatto del relè (meccanico) attivi il radar?

Anticipatamente grazie per ogni suggerimento.

Saluti
Enrico

Quale sensore radar?

PS/ usa HIGH e LOW per confrontare il valore restituito da digitalRead()

Fatto.
Il risultato NON cambia.

Sembrerebbe invece funzionare l'aumento del primo delay da 100 a 1000. Probabilmente il passaggio da HIGH a LOW non è immediato. Purtroppo ho potuto provarlo solo a 9V; domani proverò utilizzando 12V.

Il radar utilizzato è questo.

Grazie della risposta.
Enrico

La questione è se quel relè è optoisolato

E se l'alimentatore è adeguato

Inoltre le condizioni non sono ottimali

Usa un "if value" invece di un "if value >0"
E nel else if non serve testare di nuovo value: se sei nello else vale 0 per forza

Ricordiamoci che High e low sono solo macro che puntano a 1 e 0

Usare HIGH e LOW serve per la leggibilità e la coerenza.

Cosa vedete se provate questo codice?

const byte rcwlPin = 2;              // RCWL-0516 OUT -> Attiny85 o Attiny13
const byte ledRele = 3;

void setup() {
  pinMode(rcwlPin, INPUT);
  pinMode(ledRele, OUTPUT);
}

void loop() {
  digitalWrite(ledRele, digitalRead(rcwlPin));
}

Quando il sensore RCWL-0516 rileva un movimento, l’uscita va su HIGH per circa 2 secondi. In questo codice, tale uscita viene letta in tempo reale e copiata direttamente sul pin ledRele.

Quindi si dovrebbe vedere il LED o il relè collegato al pin 3 attivarsi per circa 2 secondi ogni volta che viene rilevato un movimento, per poi spegnersi automaticamente.

non sempre

➜ può essere un tipo formale

Utilizzo questi relè.

Grazie, quindi basterà aumentare il deley a 2000 per sicurezza!!

Ora mi spiego anche perchè negli altri utilizzi impostati con il radar il tempo effettivo risultava essere superiorenanquello impostato!

Grazie & saluti a tutti.

Lana caprina...

Sempre 0 e 1 sono

Direi che non ci siamo
Cerca relè optoisolati

Esatto, ma mi ci vuole un ciclo if in quanto desidero un ulteriore ritardo.

Trovati! (e ordinati)

No, ora sono tipi enumerati che possono essere implicitamente promossi a 0 e 1.

Questo può avere la sua importanza, cfr

La cosa migliore in questo caso è usare un approccio basato su macchina a stati.

Ho un tutorial in inglese sull’argomento.

2 Likes

UCAS

Ufficio complicazioni affari semplici

Andrà a finire che coi tipi il C++ ci si strozzera

1 Like

Provato, ieri funzionava, oggi, ripete più volte il lampeggio (ca. 2 sec acceso
, poi spento) anche in assenza di muovimento.

Sto pensando di eliminare lo AT85 (vista la latenza della variazione della "nessun muovimento"), che ne pensate?

Perchè dovrebbe essere optoisolato? Avrei degli optoisolatori CNY74-2 o dei PC897 (se ho letto bene) potrebbero essere utilizzati? e come?

Saluti
Enrico

Se usate l’ATTiny85 solo per trasmettere il segnale del RCWL-0516, allora in effetti potete farne a meno. Potete anche scegliere la durata dell’attivazione sostituendo il condensatore presente sulla scheda.

Grazie.

Risolto.

Il mio errore era di considerare il limite di rilevabilità del muovimento di ca 7 mt (come da letteratura!!) invece vi sono degli alberi a ca 12 / 15 mt ed il sensore rilevavav il muovimento delle foglie dovuto al vento!!

Grazie a tutti,

Enrico