relè che si attivi solo per 1 secondo

Ciao tutti, Provo a spiegarle il mio problema.. Le colle poliuretaniche che uso per lavoro, catalizzano meglio e molto più velocemente in presenza di umidità... Ma entro certi livelli... ne troppa... ne poca. Per questo motivo volevo creare una stanza apposita in cui ricreare determinate condizioni. Ho con molta fatica creato un piccolo sketch che attiva un relè quando l'umidità scende sotto il 60% e un altro relè che aziona un estrattore quando supera l'80%. Fin qui tutto bene.. Mi arriva l'umidificatore... e scopro che non posso assolutamente accenderlo e spegnerlo con un relè, questo perchè e' presente un pulsante... che, se premuto per un istante accende l'umidificatore.. se premuto per 5 secondi attiva una sorta di illuminazione a led rgb. Se collego i piedini dell'interruttore al relè... accende solo l'illuminazione... (il rele resta attivo fino al modificarsi della percentuale di umidità) ma non lo fa partire..quindi non ci sarà nessuna variazione nella percentuale di umidità... Mi servirebbe che il relè scattasse solo per 1 secondo e poi si disattivasse, in modo da attivare l'umidificatore e non le luci.. Ho cercato ovunque, ma purtroppo non ho trovato nulla di simile. Qualche consiglio ?

Vi ringrazio anticipatamente !!

Roberto

Perchè non metti il programma, così possiamo dirti dove sbagli

rfin: Qualche consiglio ?

Parecchi ... ma c'è molto da "studiare" ... :D

Vista la tua presentazione e le tue, bonariamente consentimi, praticamente nulle conoscenze di Arduino, prima di tutto puoi cominciare con studiare QUESTO proseguire con QUESTO e acquistare qualche buon libro (es. QUESTO) :)

Presa confidenza con l'ambiente e DOPO aver studiato quei documenti (e magari provato piccoli esempi sui vari argomenti), quando ti sentirai pronto, potrai affrontare il passo successivo ... la "terribile" :D :D :D funzione millis() che ti servirà per fare, appunto, quanto chiedi ...

Dovrai studiare bene prima QUI, poi QUI, QUI e QUI e tutti gli articoli che sono in QUESTA pagina ...

... alla fine di tutta questa fatica e di tutto questo "studiare" vedrai che ti sarà molto più chiara sia la programmazione di Arduino che ... la soluzione del tuo problema :)

Guglielmo

P.S.: nota che ho usato il verbo "studiare" e NON "leggere" dato che l'argomento NON permette la semplice lettura, ma richiede studio e tante prove pratiche sui singoli argomenti :)

eccolo…
lo sketch non è sbagliato… semplicemente fa un’altra cosa… attiva e disattiva correttamente dei relè…

const int valore_limite = 660; 

//sensore DHT11 :
#include "DHT.h"
#define DHTPIN 12     
#define DHTTYPE DHT11   
DHT dht(DHTPIN, DHTTYPE);


//I2C LCD:
#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 

// LCD I2C address
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 


void setup()
{

// PIN 10 al relè - IN1
 pinMode(10, OUTPUT);

// PIN 11 al relè - IN2
 pinMode(11, OUTPUT);


//I2C LCD
Serial.begin(9600);
 lcd.begin(20,4);
 Serial.println("umidificatore");
 
// Avvio sensore DHT11  
 dht.begin();
}


void loop()
{

// umidità e temperatura dal sensore DHT11
int h = dht.readHumidity();
int t = dht.readTemperature();

// Misura la temperatura e se maggiore di 40 gradi attiva relè per accendere la ventola
if (h <= 60 )
  digitalWrite (10, HIGH); // Attiva Relè 1
else
  digitalWrite (10, LOW); // Spegni Relè 1
delay (2000);

if (h >= 80 )
  digitalWrite (11, HIGH); // Attiva Relè 2
else
  digitalWrite (11, LOW); // Spegni Relè 2
delay (2000);

 Serial.print("Temp: ");
 Serial.print(t);
 Serial.print("C, Umid: ");
 Serial.print(h);
 Serial.println("%");



lcd.setCursor(0, 0);
lcd.print("Temperatura: ");
lcd.print(t);
lcd.print("C");
 

lcd.setCursor(0,1);
lcd.print("Umidita': ");
lcd.print(h);
lcd.print("%");

}
[code]

Hai ragione Guglielmo, purtroppo però ho un lavoro che mi impegna per la maggior parte della giornata.. non avendo le basi, sono costretto a chiedere aiuto. Se qualcuno qui mi chiedesse "come incollo un tranciato di ebano con dell'alluminio?" cercherei di spiegarglielo nel modo più semplice in modo da essergli d'aiuto, non credo che gli direi di studiarsi la chimica (per imparare tutti i tipi di collanti esistenti), di studiare metallurgia (per capire quante e quali leghe di alluminio esistono e quale è la loro struttura molecolare) e di approfondire riguardo le tipologie di legnami (per capire se l'ebano è la miglior scelta da incollare all'alluminio) :o) Semplicemente gli direi.. "usa sull'alluminio un primer per colle viniliche bi-componente, ed una volta indurito usa una colla vinilica bi-componente :o) Purtroppo ho preso la mia strada professionalmente parlando, non credo diventerò mai un "professore" in questo settore, devo solo risolvere un problema, speranzoso che qualcuno possa aiutarmi. E questo non è sintomo di poca voglia di imparare.. prova ne è che lo sketck che ho postato funziona.. o meglio funzionerebbe con un umidificatore che preveda semplicemente un on/off... e non un colorato sistema di illuminazione attivabile dallo stesso pulsante :o) In qualsiasi caso, seguirò il tuo consiglio e quando ne avrò il tempo, cercherò di approfondire utilizzando i link da te postati ! Grazie ancora ! :o)

Due cose …

1. in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo.

2. Prova a rileggere il punto 16.1 e, principalmente, 16.13 del REGOLAMENTO e capirai il senso della mia risposta … :wink:

Guglielmo

Guglielmo visto che l'utente non è interessato a imparare l'uso di arduino ma solo a risolvere un problema, si può proporre una soluzione.

Forse basta una variabile stato e un delay(1000).

La variabile stato assume valori 1 e 0, a 1 esegue a zero no.

byte stato=1;


void setup(){

}

 void loop(){

      if(condizione attiva rele==vera && stato==1){

           stato=0;// Esegue un unica volta, da solo un impulso al rele

           digitalWrite(rele,HIGH);
           deley(1000);
           digitalWrite(rele,LOW);

     }


     if(condizione attiva rele==falsa)// Ad esempio cambio di umidità
           stato=1; // Predispongo per nuovo processo 
   
}

Buongiorno torn24, Intanto grazie per l'aiuto ! Non ho mai detto di non voler imparare, anzi... Ti faccio un esempio.. il tuo codice, dubito che potrò usarlo con un semplice copia e incolla nel mio... Sarò obbligato ad imparare per poterlo usare, dovrò adattarlo, capirlo ecc ecc. Il tuo aiuto, mi porterà inevitabilmente ad imparare qualcosa :) Non vorrei assolutamente passare per uno scansafatiche che vuole la pappa pronta... Forse mi sono espresso male nel messaggio precedente. Se mi faccio male ad una gamba e chiedo un aiuto per fare le scale.. ciò non esclude che io non faccia anche riabilitazione per poi tornare a farle da solo ! Quindi .. ti ringrazio !! E fra poco... Mi metterò a studiarlo..

Ho modificato il codice con uno più semplice! Mi sembrava inutilmente complicato :slight_smile:
Quindi prendi in considerazione quello con il delay();

Arrivato in ufficio e guardato il codice…

Torn24, questa soluzione la avevo già provata, purtroppo (probabilmente sbaglio io con “stato”) crea un loop che continua a far scattare il relè ogni secondo.
Al cambio di stato (al raggiungimento dell’umidità desiderata) si disattiva correttamente (ma con il 50% di possibilità che si disattivi lasciando l’umidificatore in funzione).Puoi ripostare il codice che usava millis ? anche se più complicato vorrei studiarmi anche quello :o)

Ho cancellato quel codice :) Ma avrebbe avuto lo stesso problema e adesso ti spiego!

Abbiamo una condizione che da un impulso di un secondo al relé, che lo fai con delay() o con millis() possiamo considerarlo indifferente. Adesso se la condizione che attiva il relé è sempre vera all'ora ripeterà l'impulso in continuazione. Per questo ti ho mostrato un esempio con variabile stato, io eseguo l'impulso e variabile stato vale zero, per cui la condizione non è più vera e esegue un unico impulso. Poi a un certo punto del processo stato deve ritornare a 1, sei tu a sapere quando. Credo che sia la strada giusta da seguire :) :) ;)

Ok… sarebbe la strada giusta se non ci fosse l'incognita di quando disattiva l'umidificatore… purtroppo, come dicevo.. ci sono il 50% delle possibilità che, il "loop" di attacca e stacca della durata di un secondo, si verifichi quando l'umidificatore è in funzione. In questo caso, lui, continuando a funzionare saturerebbe l'ambiente. anche inserendo un "controllo, in cui se viene superata una certa percentuale di umidità, lui ripete l'azione, avrei sempre quel famoso 50% di possibilità che si ripeta il problema. a questo punto, la soluzione più logica è.... trovare un umidificatore che si attivi con un semplice on/off…. in questo caso andrebbe bene anche il codice che avevo già creato… Credo che anche i più bravi qui, non possano risolvere il problema.. abbiamo a che fare con le probabilità, non con la semplice programmazione... sarebbe come fare un qualcosa che predica l'uscita del solo rosso alla roulette.. Ma forse…. mi sbaglio...

Ma perché questo? Non esiste una condizione al verificarsi della quale l’umidificatore deve spegnersi? E non sarebbe sufficiente esplicitarla? Ma in primo luogo come lo spengo?

Il problema non è come spegnerlo….
Se l’umidificatore avesse un semplice on/off sarebbe semplice, basterebbe usare questo codice per accenderlo e spegnerlo…

if (h <= 85 )
digitalWrite (11, HIGH);// Accende umidificatore

else
   digitalWrite (11, LOW); // Spegne umidificatore
delay (100);

Ma, se rileggi sopra… non è cosi’. per accenderlo serve che, quando

if (h <= 85 )
digitalWrite (11, HIGH);// Accende umidificatore

Lo stato HIGH duri solamente per un secondo… altrimenti l’umidificatore, non si accende… ma passa alla configurazione delle inutili variazioni di colore ottenute attivando la sua inutile illuminazione interna a led rgb…

Beh, ma il problema più grande é proprio sapere come si spegne. É simile all'accensione? É diverso? Ci penserà il programma poi a farlo, ma prima di tutto va capito come si fa. Ho pensato ad un codice del tipo

if (condizionediaccensione==vera)
{
digitalWrite (rele, 1);
delay (1000);
digitalWrite (rele, 0);
//e così si accende, da tua premessa "serve che per accenderlo lo stato HIGH duri 1 secondo. Qui ve ne saranno tanti che durano un secondo ciascuno
}
if (condizionedispegnimento==vera)
{
//inserire qui modo per spegnere umidificatore
}

Come vedi i problemi sono: 1) in quale condizione si feve spegnere? 2) vome si spegne quel dannato coso?

Se invece servisse la macchina a stati basterebbe mettere

if (condizionediaccensione==vera && stato==sideveaccendere)
{
//parte (nota) di accensione
stato=sidevespegnere
}
if (condizionedispegnimento==vera && stato==sidevespegnere)
{
//parte per spegnerlo
stato==sideveaccendere;
}

Mi scuso se non é formattato. Ma lo ho scritto adesso al voli

Grazie Silente, Dopo pranzo do un occhiata ai codici, comunque si deve spegnere una volta superato l'85% di umidità e per spegnerlo, come per l'accensione, basta che il rele' scatti per un secondo. In pratica, scatta per un sec e lo accende, scatta per un sec e lo spegne.. un po come gli interruttori con rele' passo passo che si usano sulle scale...

Ok, grazie. Allora il primo "codice" é errato. Fa sapere

ho fatto un po di prove.... niente da fare... :(

Puoi postare il codice?
Niente nel senso che hai errori? Malfunxionamenti?