Arduino, uscita digitale con duty cycle variabile moooolto lento.

usane altri meno costosi, non sono bellissimi ma sono pure a colori :)

formatting link

Reply to
Franco Af
Loading thread data ...

Il 12/01/2022 21:05, alfio ha scritto:

Ciao alfio, sono giunto alla fine, se non mi vengono in mente altre modifiche :-)

capire come cambiare l'uscita da invertita a diretta, per ora non ci sto capendo una mazza, ovvero, ho paura a fare delle modifiche a vanvera senza capirle :-)

class myPwm { unsigned long lastChange; unsigned period,duty,tOn,tOff; unsigned pin; bool inverted; public: myPwm ( unsigned p,bool i=false ) { pin = p; inverted=i; period =

1000; SetDuty( 0 ); }; void SetPeriod( unsigned p ) { period = p; SetDuty( duty ); } void SetDuty ( int d ); void Setup ( void ) { digitalWrite( pin,inverted ); lastChange = millis(); }; void Loop ( void ); }; void myPwm::SetDuty ( int d ) { duty = constrain( d,0,100 ); tOn = (unsigned long)duty*period/100; tOff = period-tOn; }; void myPwm::Loop ( void ) { bool pinOn = digitalRead( pin )==( inverted ? LOW : HIGH ); unsigned long nextChange = lastChange+( pinOn ? tOn : tOff ); if( millis()>=nextChange ) { lastChange = nextChange; digitalWrite( pin,pinOn ? ( tOff ? inverted : !inverted ) : ( tOn ? !inverted : inverted ) ); } }

myPwm pwmResistenza( releResistenza,true ); // pin uscita, true=invertito cioe' LOW=rele' acceso

forse basta cambiare quest'ultima istruzione e mettere false al posto di true? Comunque non capisco :-) Ringrazio per l'aiuto.

--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

Credo che tu debba semplicemente invertire il valore che inserisci nel digitalWrite.

digitalWrite (pin, pinOn? (tOff? inverted : !inverted) : (tOn? !inverted : inverted) );

digitalWrite (pin, !(pinOn? (tOff? inverted : !inverted) : (tOn? !inverted : inverted)) );

Reply to
LAB

"Drizzt do'Urden" ha scritto nel messaggio news:sujcft$1pfe$ snipped-for-privacy@gioia.aioe.org...

true=invertito

di

non capisco, non capisco... e poi ci azzecchi al primo colpo, come e' sta storia ? :-)

Reply to
alfio

Il 16/02/2022 21:38, alfio ha scritto:

Solo fortuna :-D era l'unica istruzione "semplice" per me, se fosse stata una modifica diversa non ci sarei arrivato e comunque non ho capito il funzionamento della parte di programma che hai scritto, mi piacerebbe compendere la

comprenderne il funzionamento :-)

Ringrazio anche LAB per l'aiuto, chiarameente anche la sua modifica non la comprendo :-)

Ho chiuso la macchinetta, in attesa di trovare un materiale per coibentare la caldaia, ora funziona bene, Grazie ancora :-)

--

http://www.avg.com
Reply to
Drizzt do'Urden

Il 16/02/2022 21:38, alfio ha scritto:

Sono ancora qua, ci ho smanettato un po ma non riesco a fare una modifica, praticamente se si accende la macchinetta da freddo, con i parametri (Setduty e Setperiod) che vanno bene per mantenere la temperatura al

invece metto i parametri per raggiungere la temperatura da freddo poi non riesce a mantenerla. Avevo pensato di usare un "if" per cambiare i parametri quando la

del genere? Grazie :-)

class myPwm { unsigned long lastChange; unsigned period,duty,tOn,tOff; unsigned pin; bool inverted; public: myPwm ( unsigned p,bool i=false ) { pin = p; inverted=i; period =

1000; SetDuty( 0 ); }; void SetPeriod( unsigned p ) { period = p; SetDuty( duty ); } void SetDuty ( int d ); void Setup ( void ) { digitalWrite( pin,inverted ); lastChange = millis(); }; void Loop ( void ); }; void myPwm::SetDuty ( int d ) { duty = constrain( d,0,100 ); tOn = (unsigned long)duty*period/100; tOff = period-tOn; }; void myPwm::Loop ( void ) { bool pinOn = digitalRead( pin )==( inverted ? LOW : HIGH ); unsigned long nextChange = lastChange+( pinOn ? tOn : tOff ); if( millis()>=nextChange ) { lastChange = nextChange; digitalWrite( pin,pinOn ? ( tOff ? inverted : !inverted ) : ( tOn ? !inverted : inverted ) ); } }

myPwm pwmResistenza( releResistenza,false ); // pin uscita, false=azione diretta, true=azione inversa

void setup() { Serial.begin(9600); Serial2.begin(9600); //seriale Nextion

pinMode(inSwitch, INPUT); //ingresso switch acqua calda analogReference( INTERNAL2V56 ); //usa il reference di 2.56V per

pwmResistenza.Setup(); pwmResistenza.SetPeriod( 6000 ); //periodo di lavoro ON/OFF in millisecondi lavora con pwmResistenza.SetDuty // che determina la percentuale di ON sul tempo riga 126 }

void loop() {

// MAPPATURA TEMPERATURA *******************************

temperatura = map(analogRead(intemperatura), 186, 566, 150, 19); //mappa il segnale proveniente dal LMT85

if (statovapore==0) // questo serve alla partenza del micro per

{ settemp = settempcaffe; }

// TERMOSTATO************************

pwmResistenza.SetDuty( 6.5*( settemp-temperatura ) ); // modificare

pwmResistenza.Loop(); // coefficiente da moltiplicare per la differenza fra set e variabile

la percentuale di ON sul tempo di pwmResistenza.SetPeriod(xxxx) in mS riga 106

--

http://www.avg.com
Reply to
Drizzt do'Urden

Il 27/02/2022 15:28, Drizzt do'Urden ha scritto:

A forza di provare ci sono riuscito, anche se non completamente, volevo che si modificassero i due parametri SetDuty e SetPeriod, sono riuscito solo con SetDuty ma mi basta, ora partendo da zero rallenta molto verso la fine e quando mancano 3 gradi si velocizza, devo dire che

rispetto al set, sono molto soddisfatto :-)

In pratica ho creato una variabile int setduty che ho sostituito al valore di Duty

pwmResistenza.SetDuty( 6.5*( settemp-temperatura ) );

diventa

pwmResistenza.SetDuty( setduty*( settemp-temperatura ) );

e ho aggiunto

if ((settemp-temperatura) Sono ancora qua, ci ho smanettato un po ma non riesco a fare una modifica,

--

http://www.avg.com
Reply to
Drizzt do'Urden

Il 27/02/2022 16:39, LAB ha scritto:

Ho tolto il suo termostato meccanico e ho usato un LMT85 che va da -55 a

questo ho reso il conrollo lento all'inizio, poi si velocizza una volta

stabile attorno al set.

--

http://www.avg.com
Reply to
Drizzt do'Urden

"Drizzt do'Urden" ha scritto nel messaggio news:svg53e$6vf$ snipped-for-privacy@gioia.aioe.org...

ottimo!

pero' ripensandoci, sarebbe stato meglio usare un controllo PID, come un

vero termo regolatore, e googlando mi e' venuto fuori questo:

formatting link
ff/

Reply to
alfio

Il 27/02/2022 17:25, alfio ha scritto:

Grazie :-)

Si lo so che sarebbe stato meglio usare un vero PID e avevo letto anche quella pagina del link ma il codice proprio non l'ho capito :-D, fra l'altro la regolazione PID la conosco bene, ero strumentista in uno stabilimento chimico e questi controlli li modificavo spesso quando ancora c'erano i regolatori pneumatici, poi con l'avvento dell'elettronica ci si metteva mano solo all'installazione e se non

semplice l'uso del PI ma con le temperature spesso si doveva usare anche il Derivativo ed era sempre un casino, specialmente se cambiava qualcosa nella produzione. Usarlo per una caldaietta da 300ml mi sembrava esagerato ma il solo PI (proporzionale e integrale) non sarebbe male, comunque con la piccola

variabili fisiche da regolare non cambiano in questo caso :-)

--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

Il 27/02/2022 17:46, Drizzt do'Urden ha scritto:

Dimenticavo, il termostato intelligente della mia caldaia, come quello di altre marche, ha solo il proporzionale per regolare la temperatura

l'intergrale altrimenti l'offset fra set e variabile non cambia mai.

--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.