Controllo temperatura con arduino (sketch funzionante ultimo post)

Anche in questo caso hai individuato l'istruzione corretta da modificare, la modifica è molto semplice quindi invece di suggerirtela direttamente ti metto il link al reference della funzione leggilo e vedrai che ti sarà chiaro cosa devi modificare, se poi hai dubbi metti la modifica che faresti prima di inserirla nel codice, ma non temere anche se sbagli non puoi danneggiare nulla

motorimicro:
...SetPoint = map(analogRead(ThresholdPin),0,1023,0,300);...

Quella riga ti dice questo:
Il pin di arduino legge il valore analogico della tensione (0-5V) e lo "trasforma" in un valore che va da 0 (0V) a 1023 (5V).
Considera queste scale equivalenti:

Applicando questa tensione al pin di arduino
0V        0,49      0,98      1,47      1,96      2,44      2,93      3,42      3,91      4,40         5,00
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+--
Si ottengono questi valori
0         100       200       300       400       500       600       700       800       900          1023
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+--

L'istruzione "map" cambia il MIN e MAX della scala inferiore e "ridistribuisce" i valori intermedi. Nel caso dell'istruzione

SetPoint = map(analogRead(ThresholdPin),0,1023,0,300);
Le scale diventano
0V        0,49      0,98      1,47      1,96      2,44      2,93      3,42      3,91      4,40        5,00
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+--
0                   58                  117                 176                 235                   300
Si ottengono questi valori

Penso che tu abbia capito come funziona map. Puoi dare il MIN e il MAX entro i quali saranno compresi i tuoi valori.

Ciao,
P.

P.S. Ottimo il suggerimento di fabpolli!

ora me li studio un po e poi vi dico cosa farei....intanto una domanda per voi...come vi dicevo ho il sospetto che si sia bruciato il mosfet perche mal dissipato, in quanto mi accorgo che quando accendo l apparato la resistenza comincia a scaldare indipendentemete dal potenziometro.non ho rimediato un mosfet in sostituzione ma un bjt ...andra' bene ugualmente?

Risposta impossibile da fornire in assenza del modello del mosfet sostituito e anche del modello del BJT sostitutivo.

per il bjt ho tagliato la testa al toro...l ho provato e funziona

mentre invece per lo script
io penso che debba variare lo 0 ed il 300.

se ad esempio i valori tra cui vorrei lavorare fossero 180e 230

modifico la riga sia sul void setup e sul void loop in questo modo:

SetPoint = map(analogRead(ThresholdPin),0,1023,180,230);

cosi facendo con il potenziometro al minimo lei va a 180 °c, al massimo a 210 °c

Posso suggerirti di postare lo schema elettrico definitivo con i valori e le sigle dei componenti?
Così si riesce a seguire meglio i collegamenti che stai facendo.
Intendo uno schema tipo quello che avevi fatto a mano, non quello fatto al computer che è meno immediato da seguire.
Va bene anche ri-fatto a mano, magari un pelo più ordinato, ma proprio un pelo, giusto per non avere intrecci fitti e componenti sovrapposti.

(ora vi faccio lo schema del cablaggio)

ho fatto la prova ...e si...funziona...passettino dopo passettino si sta aggiustando tutto...
cmq ancora qualche problema c'e'

in primis e proprio non capisco perche non si accende l ultimo led quello dei 220 (cablaggio e led funzionano)

poi succede che siccome la lettura del termistore e' variabile succede che magari si accende il led dei 180 ma comincia a lampeggiare anche quello dei 190 o addirittura pure quello dei 200 con un effetto ottico che da l impressione che l apparato e' un po ballerino.
per risolvere il problema penso si debba mettere a livello hardware sui capi dei led un consensatore per stabilizzarlo
mentre a livello software bisognerebbe fargli fare la media su un intervallo di tempo e farlo accendere quando la media cade tra un intervallo di valori...quest'ultima cosa non la vedo cosi' semplice...mi viene da pensare che si potrebbe dare un occhiata allo script (marlin)che e' stato scritto per le stampanti 3d (qui davvero la cosa per me rimane lontano dalle mie capacita' ve lo lascio in allegato ma mi rendo conto che la cosa si fa complicata)

ultimo problema sarebbe quello di far andare il mosfet un po piu lentamente perche scalda da paura cosi' impostato...si puo' fare da script o solo da hardware?

Marlin.ino (1.83 KB)

FTOJLAFI83LGWI4-marco.ino (5.21 KB)

ecco lo schema

Posta la sigla di quel mosfet che, per come è collegato non mi convince per niente, per niente, proprio PER NIENTE.

Ciao,
P.

la sigla e' E13007

nel frattempo ho studiato un po' e fatto prove.
ho messo la resistenza sul gate e ho visto che il bjt lavora molto meno anzi quella che ho messo lo faceva lavorare troppo poco...allora l ho tolta e cominciato a far prove sullo script ed ora sto testando e mi sembra funzionare ma perfavore confermatemelo che per far andare piu piano il mosfet(o bjt) devo cambiare lo script in questo modo:

prima cera scritto cosi alla riga 177
analogWrite(HeaterPin,output)

io ho cambiato cosi
analogWrite(HeaterPin,128) per farlo lavorare al 50%

giusto?

Mosfet e transistor sono due cose diverse e funzionano in modo diverso.
Invece di aggiungere componenti a caso sarebbe il caso di vedere un po' come funzionano queste cose e di fare qualche calcolo per domensionare correttamente i vari componenti.
Comprese, magari, le resistenze sui led. Da quanto le hai messe?

Se al posto del mosfet stai usando il bjt MJE13007, allora quello dello schema è collegato male.
La resistenza scaldante da quanto è?
Così calcoliamo la corrente necessaria e in base alle caratteristiche del MJE13007 ci calcoliamo la corrente da mandare in base per pilotarlo e ci mettiamo una resistenza per limitarla al valore trovato.

Dal datasheet, la piedinatura del MJE13007 è questa:
MJE13007.png

Ecco, il tempo di completare il testo durante la partita e siete già andati avanti...

MJE13007.png

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?

FTOJLAFI83LGWI4-marco.ino (5 KB)

motorimicro:
ecco lo schema

Se le connessioni sono come le hai disegnate sono sbagliate.Da questo data sheet si vede che,guardando la sigla del transistor, il terminale di sinistra è la BASE e tu l'hai connessa a massa, il terminale centrale è il COLLETTORE e tu l'hai connesso al pin di controllo di arduino, il terminale di destra è l'EMETTITORE e tu l'hai collegato al carico.

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

I terminali del mosfet sono IN GENERALE da sinistra a destra: GATE, DRAIN, SOURCE e vanno connessi in questo modo: GATE al pin di Arduino attraverso una resistenza di protezione di 100 ohm; il DRAIN al carico (resistenza scaldante); il SOURCE a GND.

Ciao,
P.

motorimicro:
...qualcuno sa dove e' l errore?

Cambia

     else if(Temp > TemperatureThreshold220){

con

     if(Temp > TemperatureThreshold220){

Ciao,
P.

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