Pages: 1 [2] 3 4 ... 6   Go Down
Author Topic: Cercasi Volontari Per Automazione Camera Fermentazione "Birra" Con Arduino  (Read 8096 times)
0 Members and 1 Guest are viewing this topic.
Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7257
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Interessante.  smiley-mr-green
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1553
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sempre a proposito della cella Peltier, poiché la sua efficienza si basa su un'ottima trasmissione del calore o del freddo, bisognerebbe adottare sia sul lato caldo che sul lato freddo di un sistema a liquido, cioè qualcosa di simile ai dissipatori usati per i microprocessori (dissipatore cavo, serbatoio liquido refrigerante, pompa) collegato ad una serpentina immersa nel fermentatore.

Ecco che qui subentra un problema: bisognerebbe anche adottare un valvola a tre vie per commutare il flusso freddo/caldo nella serpentina.

Per cui propongo una soluzione intermedia: usare la cella solo per generare il freddo ed usare un semplice riscaldatore ad immersione per riscaldare il composto.
Logged

Ivrea
Offline Offline
Newbie
*
Karma: 0
Posts: 31
I Maker sono personaggi interessanti: non sono nerd, anzi sono dei tipi piuttosto fighi che si interessano di tecnologia, design, arte, sostenibilità, modelli di business alternativi. (Massimo Banzi)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


Ciao l'idea di usare un relè DPDT doppio polo e doppio contatto è sicuramente buona, semplice ed economica ma vanifica uno dei vantaggi principali dell'uso delle celle di peltier ovvero quello di poter essere controllate linearmente in potenza da 0 al 100% e quindi di poter eseguire un controllo molto preciso e raggiunto il set point di ridurre al minimo il consumo

L'ultilizzo di un controllo on off con rele meglio si adatta poi alla soluzione gruppo frigo + resistenza faccendo attenzione a mettere le opportune isteresi. Commutare on off una cella o peggio ancora vicino al set point invertire brutalmente caldo freddo e' distruttivo per le celle.

il ponte di h ha costi contenuti e parecchi vantaggi per cui per le celle secondo me e' componente essenziale, la soluzione DPDT la vedo per frigo+ resistenza

la soluzione di controllo HW non sposta tuttavia il tema di come gestire il SW e l'algoritmo del doppio PID caldo/freddo (commutare un rele' o il PIN direzione del h-bridge e' identico) su cui sono ancora arenato.... smiley-sad smiley-sad

Davide


Logged

Ivrea
Offline Offline
Newbie
*
Karma: 0
Posts: 31
I Maker sono personaggi interessanti: non sono nerd, anzi sono dei tipi piuttosto fighi che si interessano di tecnologia, design, arte, sostenibilità, modelli di business alternativi. (Massimo Banzi)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


Ecco che qui subentra un problema: bisognerebbe anche adottare un valvola a tre vie per commutare il flusso freddo/caldo nella serpentina.


Mumble...no ti seguo

provo a ricapitolare il funzionamento della parte "termica" e cosa dovrebbe fare il sistema di controllo.

La souzione con le celle di peltier puo' essere realizzata in qualunque modo...scambio aria - aria, scambio aria - acqua o addirittura acqua - acqua. Ciascuno sceglierà quello che li e' piu' congeniale in funzione della propria capacità realizzativa...
la shiedl di controllo prescinde da come e' fatto il gruppo termico : misura una temperatura diciamo della birra in fermentazione e pilota la cella per mantenere quella temperatura il piu' possibile costante modulando potenza e caldo/freddo di conseguenza.

Obiettivo quindi del controllo e una gestione termostatica del mezzo di raffreddamento e/o riscaldamento sia esso aria o h20.

Sinceramente non vedo necessita di valvole o complicazioni...in un scambio aria-aria il flusso soffiato dentro la camera dovra' compensare le variazioni di temperatura esterne e interne e sara' "caldo" o "freddo"  a seconda temperatura ambiente e set point.



Lo stesso in un flusso aria h20. Il liquido di ricircolo nel mosto in fermentazione sara' "caldo" o "freddo" con lo stesso principio.

 


giusto per capirsi "non dobbiamo inventare nulla" ma dobbiamo realizzare in HW (Arduino) e SW (il punto mancante) come base il prodotto sottostante per la gestione della parte termica con aggiunta di tutte le altre funzioni specifiche per applicazione birra descritte da Savio

TETECH controller
http://www.tetech.com/Temperature-Controllers/TC-36-25-RS232.html
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 286
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Al posto del ponte H, ho preferito usare un più semplice relè a due scambi.

Grazie Cyberhs proprio oggi ho giocherellato un po con la parte meccanica
Ho iniziato a fare il recipiente per il ricircolo
E il pacco dissipatore per giocare un po con queste celle
Ho postato due foto sul mio sito
http://www.saviot.com/index.php?option=com_content&view=article&id=18&Itemid=172

E fortunatamente Sabato mi sono arrivati i IRLB3034PBF ordinati un mesetto fa smiley-grin
http://www.irf.com/product-info/datasheets/data/irlb3034pbf.pdf

Quindi se riesci ad usare questi ansiche un doppio rele per me sarebbe meglio
 
Usare un Itengrato lo vedo più lineare non un on off secco e duraturo e silenzioso rispetto ad un rele smiley-grin

:Edit ho visto che su questo ha già Risposto Davide che ha spiegato più precisamente quello che intendevo IO
Ovvero meglio un controllo lineare per avere un controllo proporzionale da 0 a 100% ansiche un rele secco che è solo 0 e 1

Si dobbiamo sfruttare la capacita della celle di cambiare lato caldo/freddo con inversione di polarita
e quidi inutile e troppo complessa la soluzione a scambio meccanico con valvola a tre vie
meglio uno scambio elettronico della polarità

In questo serve un HW che ci supporti ma soratutto in questo Momento una mano a Davide
per la parte Software della gestione del PWM e PID per gestire la potenza della cella ma soratutto
la loro inversione forse ci vorebbe qualcosa tipo un cross 0 e quindi definire un tempo e una lettura a 0
prima di invertire la polarita alle celle per evitare che si rompano  smiley-wink

Grazie
« Last Edit: October 14, 2013, 01:18:33 am by saviothecnic » Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1553
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Ciao l'idea di usare un relè DPDT doppio polo e doppio contatto è sicuramente buona, semplice ed economica ma vanifica uno dei vantaggi principali dell'uso delle celle di peltier ovvero quello di poter essere controllate linearmente in potenza da 0 al 100%
Perché lo vanifica? Se osservi lo schema proposto, è presente il PWM di modulazione composto da un solo MOSFET di potenza (maggiore efficienza rispetto al ponte). Il relè serve solo ad invertire i poli dell cella ed entra in funzione solo quando il sistema decide di raffreddare o riscaldare il composto!

Il vero problema è che se si decide di usare per il lato caldo un semplice dissipatore raffreddato ad aria (essendo il lato freddo collegato al fermentatore per contatto diretto oppure con refrigerante tramite serpentina) è impossibile invertire il ciclo!
Ecco spiegato il senso della mia affermazione "adottare un valvola a tre vie OPPURE USARE UN SEMPLICE RISCALDATORE".

Allego uno schema più completo della mia idea.


* Birra.png (43.21 KB, 2302x1567 - viewed 73 times.)
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 286
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il vero problema è che se si decide di usare per il lato caldo un semplice dissipatore raffreddato ad aria (essendo il lato freddo collegato al fermentatore per contatto diretto oppure con refrigerante tramite serpentina) è impossibile invertire il ciclo!

NON capisco questa cosa dell' impossibilità di ivnertire il ciclo ovviamente il tutto deve essere dimensionato
In modo che cio possa essere fatto
Quindi un Dissipatore Attivo adeguato a sopperire inversione Ciclo

Allora quello che si va a comandare per una gestione tipo Peltier con serpetina immersa nel fermentatore è una cosa tipo questa allego immagine
http://www.aliexpress.com/item/Free-Shipping-DIY-TEC-Peltier-semiconductor-refrigerator-water-cooling-air-condition-Movement-for-refrigeration-and-fan/807156784.html
Che io mi sto autocostruendo ho quasi tutto aspetto che arrivano questi smiley-grin
http://www.ebay.it/itm/290896805418?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

Lo schema che hai postato inizia a piacermi vedo che hai già piu o meno definito tutto smiley-grin
Ma Manca la Gestione PWM della ventola che dissipa la Peltier dato che parliamo di dissipatori Attivi

Allora noi vorremmo fare tutto con un gruppo e non due gruppi uno per il caldo e uno per il freddo
Il vantaggio della cella è proprio quello che invertendo la polarita inverte la faccia calda con quella fredda
Diciamo che se decidiamo di tenere la fermentazione a 25° la cella lavorera quasi sempre per dare dal lato caldo 25°C a contatto con lo scambiatore H20
Mentre se lavoriamo in lagerizzazione 5°C La cella lavorera quasi sempre polarizzata per dare freddo lato scambiarore h20 che va nel fermentatore
Se coibendato il tutto bene non ci sono grandi sbalzi in inversione polarità e lavorera quasi semrpe solo con la gestione PWM della cella seguendo il protocollo PID
Ma se serve per un brusco cambiamento di temperatura vedi anche durante la notte o nelle ore di punta di giorno ecco che al volo la cella inverte il senso di diffusione calore
Per Questo Davide voleva una cosa proporzionale piu a livello soft per inversione polarita quindi decidere fino a che livello lavorare dal lato caldo o freddo
Ma avere qualcosa che nel inversione polarità salvaguardi la cella tipo un cross 0 forse converebbe mandare in arduino la tensione cella e le due temp cosi da affinare questa cosa.

Grazie


* ScambiatoreH20Peltier.jpg (43.15 KB, 631x427 - viewed 45 times.)
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1553
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Savio, il gruppo che hai postato serve alla sola refrigerazione: infatti il lato caldo delle 4 celle Peltier viene raffreddato ad aria, mentre il lato freddo è collegato a 2 scambiatori a liquido collegati idraulicamente in serie.

Se operi l'inversione di polarità, in teoria dovrebbe continuare a funzionare, ma nella realtà i dissipatori ghiacciano riducendo l'efficienza di scambio con l'ambiente: il delta (circa 50°C) tra lato freddo e caldo impone che i dissipatori ad aria si portino a circa -25°C  e dubito che il flusso d'aria delle ventole sia sufficiente per evitare il "tappo di ghiaccio"!
E' il problema di tutti condizionatori a pompa di calore che, usati d'inverno a ciclo invertito, devono verificare costantemente la formazione di ghiaccio sul condensatore/evaporatore.
Bisognerebbe adottare un sistema a doppio scambiatore a liquido, ma in questo caso bisognerebbe usare una valvola a tre vie oppure una doppia serpentina: molto più semplice usare per riscaldare un semplice riscaldatore ad immersione.

Ho omesso volutamente il PWM per le ventole in quanto trovo sia inutile: mandiamole sempre alla massima velocità a meno che il rumore generato sia insopportabile.

Spero con questo di essermi spiegato meglio.
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 286
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Savio, il gruppo che hai postato serve alla sola refrigerazione: infatti il lato caldo delle 4 celle Peltier viene raffreddato ad aria, mentre il lato freddo è collegato a 2 scambiatori a liquido collegati idraulicamente in serie
Si ne ho citato uno tanto per fare un esempio ma Davide con Uno simile riesce a gestire il tutto smiley-grin
Ma lui non vuole fare lagerizzazione IO SI smiley-grin

Se operi l'inversione di polarità, in teoria dovrebbe continuare a funzionare, ma nella realtà i dissipatori ghiacciano riducendo l'efficienza di scambio con l'ambiente: il delta (circa 50°C) tra lato freddo e caldo impone che i dissipatori ad aria si portino a circa -25°C  e dubito che il flusso d'aria delle ventole sia sufficiente per evitare il "tappo di ghiaccio"!

Si infatti io che voglio anche fare lagnerizzazione "mosto a 3 - 5°C" ho ordinato anche un gruppo a radiatore per l' altra parte proprio per avere uno scambio efficente quindi doppio circuito H20 uno nel fermentatore uno per altra parte
Spero che basti posto il Link se qualcuno vuole fare una cosa simile spero che sia sufficiente smiley-grin
http://www.ebay.it/itm/111170388091?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

Ho omesso volutamente il PWM per le ventole in quanto trovo sia inutile: mandiamole sempre alla massima velocità a meno che il rumore generato sia insopportabile.
Be visto che ci sono PWM io avrei messo poi male che va si va si manda sempre alla max smiley-grin

Per LCD vorrei andare in I2C usando moduli tipo questo
http://www.ebay.it/itm/251265560755?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1423.l2649
Cosi se uno vuole recupera LCD che ha gia dentro e fa tutto con poca spesa smiley-grin

Domanda mi piace il fatto che vuoi mettere una tastiera per inserire i dati mi confemri che è questa cosi la ordino
http://www.ebay.it/itm/4-x-3-Matrix-Array-12-Key-Membrane-Switch-Keypad-Keyboard-for-Arduino-AVR-PI-C-/400344170967?pt=LH_DefaultDomain_0&hash=item5d365f41d7

Mentre per i suggerimenti Soft per Davide nessuna News ?

Grazie
« Last Edit: October 14, 2013, 08:20:09 am by saviothecnic » Logged

Ivrea
Offline Offline
Newbie
*
Karma: 0
Posts: 31
I Maker sono personaggi interessanti: non sono nerd, anzi sono dei tipi piuttosto fighi che si interessano di tecnologia, design, arte, sostenibilità, modelli di business alternativi. (Massimo Banzi)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Perché lo vanifica? Se osservi lo schema proposto, è presente il PWM di modulazione composto da un solo MOSFET di potenza (maggiore efficienza rispetto al ponte). Il relè serve solo ad invertire i poli dell cella ed entra in funzione solo quando il sistema decide di raffreddare o riscaldare il composto!

Il vero problema è che se si decide di usare per il lato caldo un semplice dissipatore raffreddato ad aria (essendo il lato freddo collegato al fermentatore per contatto diretto oppure con refrigerante tramite serpentina) è impossibile invertire il ciclo!
Ecco spiegato il senso della mia affermazione "adottare un valvola a tre vie OPPURE USARE UN SEMPLICE RISCALDATORE".

Allego uno schema più completo della mia idea.

hai ragione sorry visto il relè ma non il Mosfet per la gestione del PWM !! smiley-red

direi che puo' sicuramente andare...il mosfet pilotato sul gate con digitalwrite() controlla la potenza, l'inversione con rele DPDT.

Mi sfugge (a parte la tua affermazione sulla maggiore efficienza rispetto a ponte di H) il vantaggio di commutare "hard" caldo freddo con un rele' con tutti i problemi di oscillazione e isteresi rispetto a usare 4 mosfet configurati in ponte di H e realizzare una transizione eletteronica e piu' soft...in generale in un sistema di controllo rele' "non mi piacciono smiley-confuse"



ho compreso anche tua osservazione piu' che pertinente sull' inversione con un sistema aria / h20 e il rischio che quando la parte ad aria debba "raffreddare" si formino condense e addirittura ghiaccio.

Teoricamente è sicuramente un rischio ma nella nostra applicazione,e per esperienza pratica, credo che possiamo trascurare questo rischio. ..e comunque un dimensionamento termodinamico di una pompa di calore con tutti i sacri crismi credo sia fuori della portata di un hobbista fai da te

Mi spiego...come ho descritto precedentemente il processo di controllo e' "lentamente variante" , le grandezze da controllare sono in range limitati, i salti termici limitati e le potenze in gioco basse. In un caso pratico dobbiamo compensare temperatura media di una casa/cantina in piu' o in meno di qualche grado...25 gradi in estate in casa da portare a 20 tanto per fare un esempio o 20 gradi in inverno da portare a 12 (fare le basse fermentazioni in inverno e' sempre una buona regola anche se si ha il sistema piu' figo del mondo  smiley )
Se Savio vuole lagherizzare...magari in inverno...va benissimo smiley-lol in quanto useremo il gruppo aria/aria o aria/h20 come FRIGO spinto e quindi la parte ad aria dissipa calore senza rischio di condensa !

Diciamo che in condizioni normali il sistema e' per 80% un frigo ma in quelle situazioni, come la mia, dove la cantina di inverno va a 10-12 gradi e voglio fare una ale a 18 gradi va bene avere un po' di tepore...con un salto di 8-10 gradi in riscaldamento secondo me non rischiamo condensa e/o ghiaccio.

Sul PWM delle ventole MUST HAVE... ti assicuro che una volta raggiunta la temperatura il processo e' semistatico...PWM delle celle va al minimo e avere le ventole al MAX e' una discreta seccatura.
Nella mia implementazione faccio variare il PWM delle celle da 0 a 100% mentre la ventola varia tra 40% a 100% cosi' rimane un minimo di flusso di aria e non vado a bassissimi giri dove le ventole DC pilotate in PWM a bassa frequenza fischiano

sulle ventole  preferirei un controllo basic in tensione 0-12 V anziche' PWM (a patto di non alzare frequanza PWM di ardiuno)

MA SUL SOFTWARE NULLA...????
ok mettere a punto il controller e le uscite ma un aiutino su come realizzare l'algoritmo PID termostatico ??
come accrocchiare librerie PID per pilotare mosfet + rele' o h-bridge ??

Davide
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 286
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

MA SUL SOFTWARE NULLA...????
ok mettere a punto il controller e le uscite ma un aiutino su come realizzare l'algoritmo PID termostatico ??
come accrocchiare librerie PID per pilotare mosfet + rele' o h-bridge ??Davide

Esatto va bene anche il relè per la semplice inversione polarità
Anche se per evitare di incollare i contatti relè e cose simili preferisco che anche inversione di polarità fosse allo stato solido

Allora Tornado alla parte Software Arduino Nessuno riesce a darci una Mano ?

In poche parole ci manca la parte software Arduino per:

Un controllo PID PWM uno lo si chiama CALDO e uno FREDDO

Quindi vediamo dalla parte soft la cella peltier come due elementi distinti tipo Frigo e Resistenza

E un controllo PID Con isteresi On Off che decide se far partire la cella in CALDO o in FREDDO o Off
se la temperatura è stabile in un rang di X°C per non tenere sempre il gruppo accesso 24h su 24

Spero che con queste parole sono risucito a spiegare meglio cosa ci manca nella gestione software
per un gruppo scambiatore a celle peltier smiley-grin

Grazie
Logged

Ivrea
Offline Offline
Newbie
*
Karma: 0
Posts: 31
I Maker sono personaggi interessanti: non sono nerd, anzi sono dei tipi piuttosto fighi che si interessano di tecnologia, design, arte, sostenibilità, modelli di business alternativi. (Massimo Banzi)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


ritornando sul software e verificando progetti gia' realizzati di controllo termostatico caldo/freddo quello che si avvicina di piu' a nostra idea e' riportato in questo thread

http://forum.arduino.cc//index.php?PHPSESSID=eg91i9nmn2i7eg3ljbg6646v90&topic=117086.0

il codice non e' proprio lineare da seguire (era un po' che non vedevo i "goto" ...) ma in assenza di meglio posso provare ad adattarlo...

il principio e' il seguente : vengono realizzati due controlli indipendenti (non PID ma non e' importante) e la selezione del controllo caldo o freddo e' fatta da un terzo loop di tipo ON / OFF con isteresi

In pratica si controlla temperatura misurata con set point se T_MEAS > T_SET+isteresi si da max potenza alla cella in modo "frigo" viceversa se T_MEAS < T_SET+isteresi si da massima potenza a cella in modo "stufa".
In prossimità' di T_SET  ovvero all'interno del reange di isteresi si applica un controllo proporzionale piu' di fino

prefereirei un "controllo " unico e lineare ma potrebbe essere un punto di partenza

altre idee ?

Davide

Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7257
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho dato uno sguardo a quel codice... mi sono messo ad urlare e a stapparmi i capelli, soprattutto quando richiama setup();  smiley-eek-blue smiley-eek
Per non parlare dei goto...

EDIT:
Tolto l'obbrobrio
Code:
/*

    Thermo Electric Cooler (TEC)
   ````````````````````````````````


Circuit Description:
  Serial Communication  - Pin 0,1
  Input Buttons         - Pins 2,3,4
  TEC Module (H Bridge) - Pins 5,6,7
  LCD                   - Pins 8,9,10,11,12,13
  LED                   - Pin A0
  Current Sensor        - Pin A1
  LM35                  - Pin A3


H Bridge Description (L298)

  Enable Pin - Controls the votlage (indirectly current) applied across load.

  Digital Inputs:
      For positive voltage (cooling)
            Pin 6 - HIGH
            Pin 7 - LOW
      For negative voltage (heating)
            Pin 6 - LOW
            Pin 7 - HIGH

_____________________________________________________________*/


#include <math.h>
#include <Button.h>
Button start_stop_button = Button(4, PULLUP);
Button dec_button = Button(3, PULLUP);
Button inc_button = Button(2, PULLUP);

#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
char blank[] = "    ";                 // to earase 4 characters

double Tref = 20, Tmeas = 30;
int button_time = 0;
unsigned long lcd_time = 0, I_tym = 0;
float Imeas = 0;


//----------------------------Variables-----------------

float step_size = 1;         // Inc/Dec Button step size
float I_calib = 1;             // Current sensor calibration
float T_delta = 2;             // +- 3 degree Celsius
int Imax_dutyCycle = 120;      // 100 -> ~1.8 Amps of current

//------------------------------------------------------


void setup()
{
  Serial.begin(9600);

  pinMode(5, OUTPUT);    digitalWrite(5, LOW);
  pinMode(6, OUTPUT);    digitalWrite(6, LOW);
  pinMode(7, OUTPUT);    digitalWrite(7, LOW);

  lcd.begin(16, 2);
  lcd.print("Enter Tref: 20");

  initT();
  delay(1000);
}


void loop()
{
  //_____________________Temp_______________________

  float Tmeas = analogRead(3);
  for (int i = 1; i < 10; i++)
    Tmeas = (Tmeas + analogRead(3) ) / 2;   // take 10 samples avg value

  Tmeas = Tmeas * 500 / 1024;                     // convert to temp

  //_______________________Current____________________
  /*
    if(millis() - I_tym > 100)       // every 100 ms
    {
      calc_current();
      I_tym = millis();
    }
   */

  //______________________LCD______________________

  if (millis() - lcd_time > 1000) //update lcd every 1 sec
  {
    lcd.clear();
    lcd.print("Tr:");
    lcd.print(Tref);
    //      lcd.setCursor(9,0);
    //  lcd.print("I:");
    // lcd.print(Imeas);
    lcd.setCursor(0, 1);
    lcd.print("Tm:");
    lcd.print(Tmeas);
    lcd_time = millis();
  }

  // ________________________Buttons________________________

  if (inc_button.isPressed())
  {
    Tref += step_size;
    lcd.setCursor(3, 0);
    lcd.print(Tref);
    lcd.print(blank);
    delay(200);
  }

  if (dec_button.isPressed())
  {
    Tref -= step_size;
    lcd.setCursor(3, 0);
    lcd.print(Tref);
    lcd.print(blank);
    delay(200);
  }

  if (start_stop_button.isPressed())   // Used only to stop the controller
  {
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    lcd.clear();
    delay(1000);
    initT();
  }


  // ________________________Controller________________________


  float E = Tmeas - float(Tref);

  if ( E > T_delta)   // cooling at max  - positive voltage
  {
    //positive voltage
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);

    analogWrite(5, Imax_dutyCycle);
    lcd.setCursor(9, 1);
    lcd.print("Max-C");
    lcd.setCursor(9, 0);
    lcd.print("D:");
    lcd.print(Imax_dutyCycle * 100 / 255);
    lcd.print("%   ");
  }

  if ( E < -T_delta)
  {
    //negative voltage
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    analogWrite(5, Imax_dutyCycle);
    lcd.setCursor(9, 1);
    lcd.print("Max-H");
    lcd.setCursor(9, 0);
    lcd.print("D:");
    lcd.print(Imax_dutyCycle * 100 / 255);
    lcd.print("%   ");
  }

  if ( (E > - T_delta)  &&  (E < T_delta))
  {
    // PID or other control

    if ( E >= 0   ) // cooling
    {
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);

      int d =  fscale( 0, T_delta, 0, Imax_dutyCycle, E, 0);
      constrain(d, 0, Imax_dutyCycle);
      analogWrite(5, d);

      lcd.setCursor(9, 1);
      lcd.print("PID-C");
      lcd.setCursor(0, 1);
      lcd.print("Tm:");
      lcd.print(Tmeas);
      lcd.setCursor(9, 0);
      lcd.print("D:");
      lcd.print(d * 100 / 255);
      lcd.print("%   ");
    }

    else if (E < 0)
    { // heating
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);

      int d =  fscale( (-1 * T_delta), 0, Imax_dutyCycle, 0, E, 0);
      constrain(d, 0, Imax_dutyCycle);
      analogWrite(5, d);

      lcd.setCursor(9, 1);
      lcd.print("PID-H");
      lcd.setCursor(0, 1);
      lcd.print("Tm:");
      lcd.print(Tmeas);
      lcd.setCursor(9, 0);
      lcd.print("D:");
      lcd.print(d * 100 / 255);
      lcd.print("%   ");
    }

  }

  delay(50);

  Serial.print("Error ");
  Serial.print(E);
  Serial.print("   T : ");
  Serial.println(Tmeas);

  delay(500);
}


float fscale( float originalMin, float originalMax, float newBegin, float
              newEnd, float inputValue, float curve) {

  float OriginalRange = 0;
  float NewRange = 0;
  float zeroRefCurVal = 0;
  float normalizedCurVal = 0;
  float rangedValue = 0;
  boolean invFlag = 0;


  // condition curve parameter
  // limit range

  if (curve > 10) curve = 10;
  if (curve < -10) curve = -10;

  curve = (curve * -.1) ; // - invert and scale - this seems more intuitive - postive numbers give more weight to high end on output
  curve = pow(10, curve); // convert linear scale into lograthimic exponent for other pow function

  /*
   Serial.println(curve * 100, DEC);   // multply by 100 to preserve resolution
   Serial.println();
   */

  // Check for out of range inputValues
  if (inputValue < originalMin) {
    inputValue = originalMin;
  }
  if (inputValue > originalMax) {
    inputValue = originalMax;
  }

  // Zero Refference the values
  OriginalRange = originalMax - originalMin;

  if (newEnd > newBegin) {
    NewRange = newEnd - newBegin;
  }
  else
  {
    NewRange = newBegin - newEnd;
    invFlag = 1;
  }

  zeroRefCurVal = inputValue - originalMin;
  normalizedCurVal  =  zeroRefCurVal / OriginalRange;   // normalize to 0 - 1 float

  /*
  Serial.print(OriginalRange, DEC);
   Serial.print("   ");
   Serial.print(NewRange, DEC);
   Serial.print("   ");
   Serial.println(zeroRefCurVal, DEC);
   Serial.println();
   */

  // Check for originalMin > originalMax  - the math for all other cases i.e. negative numbers seems to work out fine
  if (originalMin > originalMax ) {
    return 0;
  }

  if (invFlag == 0) {
    rangedValue =  (pow(normalizedCurVal, curve) * NewRange) + newBegin;

  }
  else     // invert the ranges
  {
    rangedValue =  newBegin - (pow(normalizedCurVal, curve) * NewRange);
  }

  return rangedValue;
}

void initT(void) {
  while (1) {
    if (millis() - lcd_time > 2000) //update lcd every 2 sec
    {
      float Tmeas = analogRead(3);
      for (int i = 1; i < 10; i++)
        Tmeas = (Tmeas + analogRead(3) ) / 2;   // take 10 samples avg value
      Tmeas = Tmeas * 500 / 1024;

      lcd.setCursor(0, 1);
      lcd.print("Tmeas : ");
      lcd.print(Tmeas);
      lcd_time = millis();
    }

    if (inc_button.isPressed())
    {
      Tref += step_size;
      lcd.setCursor(12, 0);
      lcd.print(Tref);
      delay(200);
    }

    if (dec_button.isPressed())
    {
      Tref -= step_size;
      lcd.setCursor(12, 0);
      lcd.print(Tref);
      delay(200);
    }

    if (start_stop_button.isPressed())
    {
      lcd.clear();
      lcd.print("Starting...");
      break;
    }
  }
}

Alla fine calcola il delta all'uscita del pid: se maggiore della temperatura riscalda se minore raffredda.
Un banale IF.
Se la differenza supera i 2° in positivo o in negativo, riscalda o raffredda alla massima potenza, se all'interno dell'intervallo lavora di fino (PID).
« Last Edit: October 17, 2013, 12:09:23 pm by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Sr. Member
****
Karma: 1
Posts: 286
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allego uno schema più completo della mia idea.
Bene vedo che iniziano ad arrivare anche aiuto dal lato software ottimo smiley-grin

Ho ordinato questa tastiera che la vedo più completa e comoda per interfaciarci con il tutto
4 x 4 Matrix Array 16 Key Membrane Switch Keypad Keyboard for Arduino
http://www.ebay.it/itm/310511616357?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

Puoi darci gia un idea di come verebbe il PCB base e lo stadio di potenza che comanda le Peltier basato su
Power MOSFET IRLB3034PbF gli usiamo anche come rele scambio polarità cosi abibamo tutto solido
ed un unico ricambio cosi inizio a vedere come configurare la parte HW che è unica dove posso subito montare e provare.

Grazie
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 286
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho dato uno sguardo a quel codice... mi sono messo ad urlare e a stapparmi i capelli,
EDIT: Tolto l'obbrobrio
Alla fine calcola il delta all'uscita del pid: se maggiore della temperatura riscalda se minore raffredda.
Un banale IF.
Se la differenza supera i 2° in positivo o in negativo, riscalda o raffredda alla massima potenza,
se all'interno dell'intervallo lavora di fino (PID)

Bello mi piace quando voi programmatori parlate cosi smiley-grin

Be credo che Davide ha gia HW per provare il tuo codice io resto in attesa di uno bozza di pcb
cosi da montasre e provare anche io Grazie per Ariuto

Domanda Non ho capito una cosa quante sonde gestisci in questa cosa ?

Se non erro servirebbe una sonda temp ambiente

Una Sonda Temp liquido o ambiente da termostatare
e una sonda sul lato opposto della peltier per capire se sta lavorando bene
ed eventualmente aumentare la velocita della ventola di dissipazione o fermare il tutto
se la differenza tra i due lati supera i 60°C e quindi rischio di rottura cella.

Grazie
Logged

Pages: 1 [2] 3 4 ... 6   Go Up
Jump to: