Controllo temperatura con arduino (sketch funzionante ultimo post)

le resistenze sui led sono da 330 ohm.

partiamo in ordine, sicuramente c'e' un errore sullo script in quanto il led d13 non si accende quando viene raggiunto il valore 220

in allegato lo sketch
la foto del monitor seriale
e fidatevi di me che il led non si accende

qualcuno sa dove e' l errore?

pgiagno:
Le connessioni esatte sono; BASE al pin di Arduino attraverso una resistenza di ALMENO 1kohm; EMETTITORE a GND; COLLETTORE al carico (resistenza scaldante).

Quali sarebbero le caratteristiche della resistenza scaldante?
Con una resistenza in base da 1K avresti una corrente di base di circa 3,5mA (Considerando una Vbe di 1,5V circa)
Considerando una Hfe (guadagno) di circa 30 avresti sulla resistenza scaldante circa 100mA
Se non metti nessuna resistenza tra arduino e la base del transistor, potresti rischiare di cucinare arduino. Puoi confidare sulle sue limitazioni interne ma è da incrociare le dita.
Quel transistor potenzialmente arriva a 8A con una corrente di base pari a 8A/30=266mA quindi se glie ne dai lui se li prende :wink:

Se la resistenza scaldante richiede 100mA ok, se ne chiede di più mi sa che va ricalcolata la resistenza in base, se ne chiede 500 forse è il caso di pensare di cambiare transistor e tornare al mosfet.

Una volta sistemata la parte hardware passiamo al software.

effettivamente collegamenti bjt fatti proprio alla c..o non c'e' altro modo di dirlo,grazie per avemelo fatto notare.
grande pgiamo ora si accende anche il led d13

la resistenza scaldante e' una 40 watt 12 volt di quelle che si usano per le stampanti 3d

siccome sento che il bjt scalda molto mi chiedevo ,appunto come accennato anche da voi ,come farlo andare "piu' piano"

penso appunto si possa fare mettendo una resistenza sul gate
ma a scopo didattico dato che il gate lo piloto con un pwm invece di mandargli 255 non posso mettere un valore inferiore? la sintassi in questo specifico sketch quale sarebbe?
forse questa ? analogWrite(HeaterPin,128) per farlo lavorare al 50% (riga 177)

C'è qualcosa che non mi torna.
La resistenza è da 40W 12V per la legge P = V*I, ricaviamo I = P/V = 40W/12V = 3,3A
Con un guadagno di 30, la corrente in base dovrebbe essere 3,3A/30 = 110mA
Decisamente troppo per un pin di arduino che al massimo massimo tiene 40mA.
Arduino scalda pure lui?
Il transistor è caldo o scotta proprio? Arriverebbe fino a 8A opportunamente raffreddato con le sue alette di raffreddamento, quello che mi lascia perplesso è la corrente di base erogata da Arduino.
Hai messo la resistenza suggerita da @pgiagno?

motorimicro:
forse questa ? analogWrite(HeaterPin,128) per farlo lavorare al 50% (riga 177)

Si, ma solo a scopo didattico, per sistemare basta regolare bene la resistenza di base per limitare la corrente del transistor.
Poi, ovviamente, passerà meno corrente sulla resistenza scaldante che scalderà meno.

Ciao per fare lavorare bene il transistor bisogna aumentare la corrente di base per far lavorare il transistor in zona di saturazione in modo da avere una vce molto bassa ,non in zona lineare dove il transistor lavora come una resistenza e comandandolo in PWM . Per fare questo bisogna cambiare il transistor con un darlinton affinché arduino
lo possa comandare oppure tornare a un mosfeth opportuno.
rslogix52

io direi di fare cosi'...dato che il bjt che ho messo e' stato un rimedio in quanto non disponevo di un irlz44 come da progetto originale chiedo a rslogix52 se quest ultimo componente (irlz44) e' adatto allo scopo e poi metterei questo aspetto in standby in attesa che mi arrivi il componente (dalla cina...ci vorra un po') cosi magari possiamo riprendere quello che mi sembra l ultimo aspetto problematico del codice e poter cosi'rimanere in discorso programmazione.

ora sul codice sembra funzionare tutto....
accendo corrente, si accendono i led per 6 secondi,poi rimane acceso solo uno ad indicare "io sto scaldando" e poi a seguire al raggiungimento delle temperature 180 190 200 210 220 °c si accendono in serie i vari led associati.
il problema e' che nella pratica succede che

il led 180°c comincia a lampeggiare perche ci si sta avvicinando alla temperatura poi diventa stabilmente acceso ma comincia a lampeggiare il secondo ed il terzo poi si stabilizza anche il secondo etc etc

questo e' dovuto dal fatto che il valore di lettura del termistore e' variabile quindi magari ci restituisce 8 letture 182 che fanno accendere il primo led e due 191 ed ecco che il secondo lampeggia!

per risolvere questo problema ho pensato che si possa fare in logica in questo modo:

invece di far accendere il led alla lettura "diretta" del termistore bisognerebbe farlo accendere alla lettura di una media di valori raccolta in intervallo di tempo:

quindi per T secondi leggo il termistore e restituisco il valore media Vm , se Vm e' maggiore di tot allora accendi il led
se il led si e' accesso allora lascialo acceso ed esegui una nuova lettura del valore Vm e cosi via

in questo modo mi sembra di risolvere.
un aiuto potrebbe essere quello di guardare come hanno fatto nelle stampanti 3d.(ho allegato il firmware qualche post fa)

qui a livello di sintassi e programmazione la cosa diventa un po complicata e piu di discutere la logica non posso dare il mio contributo.

cmq grazie a tutti

Visto che sembri volenteroso ti posso suggerire una soluzione abbastyanza facile che dovresti riuscire ad applicare senza troppi problemi, non sarà la fine del mondo ma potrebbe sanare almeno in parte il problema dei led lampeggianti.
Allora nel tuo loop hai già un ritardo di 100 ms (delay alla fine) quindi senza complicare troppo la faccenda potresti gestire la cosa in questo modo:
Ti crei una variabile uguale a ActualTemp (Es. sommaTemp) e una nuova variabile di tipo byte (Es pippo) che ti serviranno per gestire la media.
Nel loop subito dopo la lettura del termistore

ActualTemp = double(Thermister(analogRead(ThermistorPin)));

prendi il valore della variabile e la sommi alla variabile sommaTemp, subito dopo incremendi di uno la variabile pippo.
Quando pippo è arrivato a cinque (Se pippo == 5) allora:

  • lanci la funzione TemperatureLeds(sommaTemp / pippo , 0) ;
  • rimetti pippo a zero
  • Azzeri sommaTemp

Tutto il resto rimanue uguale, prova a buttare giù il codice, mettilo qui (anche solo la parte che modifichi tar i tag code) oppure se ti senti abbastanza sicuro fai una prova direttamente sul campo

Ciao.
Il mosfeth è un l Logic-Level Gate Drive quindi va bene però sul gate devi mettere una resitenza da 100Hom e una di 1khom tara il gate e il gnd
e comandarlo in pwm.
rslogix52

Ciao qui c'è uno schema di come collegare il mosfet devi non considerare il diodo al posto del motore collegare la resistenza di riscaldo, molto probabilmente devi montare un dissipatore sul mosfet
rslogix52

Con il tuo circuito mi pare strano che si sia bruciato un irlz44.
Potresti provare a riverificare il tutto con quello che pensi si sia bruciato, stando attendo a collegarlo nel modo corretto.
Se lo hai messo storto (invertendo D e S) si dovrebbe comportare come un diodo e quindi condurre sempre con una piccola caduta di tensione ai suoi capi.
Ti allego lo schema dei piedini.
Il G va collegato ad Arduino, D verso la resistenza scaldante e S verso massa.

IRLZ44.png

Per quanto riguarda il software, hai oscillazioni sulla lettura di ampiezza superiore alle soglie di intervallo che vuoi gestire, da cosa dipendono? Mi suonano un po' strani i calcoli del metodo Thermister, non vedo dove si tiene conto della resistenza verso massa che assieme al termistore fa il partitore di tensione su cui viene fatta la lettura analogica.
I calcoli sono basati sulla resistenza attuale del termistore che varia in base alla temperatura.
Per ricavarla, si conoscendo la resistenza nominale del termistore e la resistenza verso massa, la tensione ai capi del partitore e la tensione letta da arduino.
Da qui si parte con i parametri del termistore per convertire il tutto in gradi.
Ora, non vorrei sbagliarmi, ma mi pare che il codice non faccia proprio questo, giusto?
Poi, per ridurre eventuali oscillazioni in lettura, personalmente abbasserei la resistenza verso massa in modo da renderla meno influente rispetto alla resistenza nominale del partitore per avere un range di letture valido più ampio. Ad es. se le due resistenze fossero uguali potrei avere letture che vanno da 2,5V a 5V per l'intera gamma di temperature sopportata dal termistore, Se invece ipoteticamente facessi arrivare quasi a zero la resistenza per renderla trascurabile, potrei arrivare ad avere un range da 0V a 5V.
Ora, zero non va bene ma 4,7K direi di si. Avresti un range da circa 0,25V a 5V.
Ma poi ne devi tenere conto nei calcoli.

IRLZ44.png

Ciao qui c'è uno schema di come collegare il mosfet devi non considerare il diodo al posto del motore collegare la resistenza di riscaldo, molto probabilmente devi montare un dissipatore sul mosfet
schema
spero che sia la volta buona
rslogix52

inizialmente era un 1d13ac che si e' bruciato penso...ma ora ho ordinato un irlz44, quindi da ora ragioniamo come se avessimo quello e mi pare che mi dite che vada bene!

ho allegato lo schema seguendo le indicazioni di rslogix per l inserimento delle resistenze cosi vediamo se ci siamo capiti!(queste resistenze potrebbero influenzare il funzionamento di rilevamento della temperatura?)

mentre per il ragionamento che fa maubarzi per le oscillazioni io non so proprio cosa rispondere quindi lascio a voi discuterne

mentre per la proposta di modifica di fabpolli non saprei proprio dove cominciare cmq prima di cimentarmi su questo vorrei sapere anche io cosa ne pensate di quello che dice maubarzi perche sarebbe eventualmente la soluzione piu semplice.

mi sono dimenticato di allegare!
piccola precisazione ho seguito solo le indicazioni per le resitenze ma ho mantenuto validi i collegamenti del progetto iniziale!
vi riallego tutto!

Ciao

queste resistenze potrebbero influenzare il funzionamento di rilevamento della temperatura?

le resistenze sono necessarie per un buon funzionamento del mosfet. La resistenza di 100hom serve a non caricare troppo l'uscita di arduino poiché il gate del mosfet si comporta come un condensatore, quella di 10khom invece serve a non fare innescare involontariamente il mosfet. Non influenzano la lettura della temperatura.
rslogix52

perfetto quindi sull hardware ci siamo , scusa la resistenza da 1kohm oppure 10kohm? perche' nell altro post hai scritto 1kohm!

direi allora che rimane solo da stabilizzare la lettura del sensore!

vediamo se maubarzi e fabpolli concordano su una strada da seguire!

10khom sul link che ho inserito c'è spiegato.
rxlogix52

La puoi mettere anche più grande, ne ho viste da 47K o addirittura da 100K.
Serve solo per avere una connessione a massa all'avvio o al reset, quando le uscite sono in alta impedenza e quindi lascerebbero la connession senza un riferimento di tensione preciso con il rischio di attivare il mosfet e farlo condurre facendo circolare corrente sul carico.

perfetto!!! io direi a questo punto di aprire una nuova discussione specifica per stabilizzare la lettura di temperatura, cosi' facendo se c'e' qualcuno che si vuole intromettere nel discorso parte da un punto fisso che sarebbe il riassunto di tutte le discussioni avute fin qui.
domani faccio un post riassuntivo con schemi e sketch di tutte le nostre conclusioni !!!!

grazie davvero a tutti per l aiuto datomi fin qui!
cmq mettero' anche il link della nuova discussione....spero di ritrovarvi tutti li!

qui di seguito script e tutto ilo materiale aggiornato con le modifiche che sono seguite a questi post.
piccola descrizione:
tramite il potenziometro si regola la temperatura della resistenza scaldante man mano che la temperatura sale si accendono i led. al momento il tutto e' impostato per funzionare tra i 180 ed i 220 gradi.
apro una nuova discussione la questione per stabilizzare la lettura della temperatura:

https://forum.arduino.cc/index.php?topic=608003.0

FTOJLAFI83LGWI4-marco.ino (4.99 KB)