Pages: [1]   Go Down
Author Topic: Gestione antigelo caldaia  (Read 1668 times)
0 Members and 1 Guest are viewing this topic.
Galliate (NO) Italia
Offline Offline
Full Member
***
Karma: 0
Posts: 180
Sviluppo sistemi software PLC/DCS/SCADA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti,

vi presento la il mio ultimo progetto in fase di sviluppo, diciamo che siamo al 85% del completamento smiley

si tratta di un sistema basato su arduino uno per il controllo antigelo della caldaia posta nel sottotetto, che comprende:
  • n° 4 sensori di temperatura LM35DZ (°C)

  • n° 5 MOSFET IRF520 tipo N

  • n° 5 resistenze da 10 KOhm 1/4W 1%
  • n° 3 relè finder mod.34.51.7.024.0010

  • n° 3 zoccolo porta relè finder mod. 93.01.7.024

  • n° 3 cavi scaldanti da 3W/m
  • n° 1 ethernet shield v2 (SD)
[/list]

in caso di assenza prolungata nel periodo invernale, arduino provvede al mantenimento della temperatura delle parti vitali della caldaia, ingresso acqua fredda, uscita acqua fredda e valvola acqua/gas, compresa tra una temperatura di start ed una temperatura di stop, prossimamente impostabili via web, ed il controllo e monitoraggio delle temperature sulle tubazioni/ambiente/esterna, provvedendo all'attivazione dei soli cavi scaldanti necessari al mantenimento della temperatura sopra allo zero.

il progetto prevede il controllo di 5 sensori di temperatura per il monitoraggio di:
  • temperatura tubazione ingresso acqua fredda
  • temperatura tubazione uscita acqua fredda
  • temperatura valvola acqua/gas
  • temperatura ambiente
  • temperatura esterna

di seguito vi posto il codice funzionante del primo 85% del progetto, i valori di start e stop sono stati impostati a 27°C e 32°C in modo tale da poter collaudare il circuito semplicemente toccando il sensore di temperatura con le dita ed attendendo una 20ina di secondi smiley

Code:
float Temp_inH2O, Temp_outH2O, Temp_ambiente, Temp_esterna;
float Set_start[3], Set_stop[3];

int RL_cs_inH2O = 4;         // definizione I/O per comando cavo scaldante tubazione ingresso acqua fredda
int RL_cs_outH2O = 7;        // definizione I/O per comando cavo scaldante tubazione uscita acqua fredda
int RL_cs_vlv_H2OGas = 8;    // definizione I/O per comando cavo scaldante valvola acqua-gas 

int ST_cs_inH2O, ST_cs_outH2O, ST_cs_vlv_H2OGas;

void setup(){
  Serial.begin(9600);
 
  Set_start[0] = 27.0;   // setpoint start cavo scaldante tubazione ingresso acqua fredda
  Set_start[1] = 1.0;    // setpoint start cavo scaldante tubazione uscita acqua fredda 
  Set_start[2] = 1.0;    // setpoint start cavo scaldante valvola acqua-gas
  Set_start[3] = 998.0;  // setpoint spare
 
  Set_stop[0] = 32.0;    // setpoint stop cavo scaldante tubazione ingresso acqua fredda
  Set_stop[1] = 7.0;     // setpoint stop cavo scaldante tubazione uscita acqua fredda
  Set_stop[2] = 7.0;     // setpoint stop cavo scaldante valvola acqua-gas
  Set_stop[3] = 999.0;   // setpoint spare
 
  pinMode(RL_cs_inH2O, OUTPUT);
  pinMode(RL_cs_outH2O, OUTPUT); 
  pinMode(RL_cs_vlv_H2OGas, OUTPUT);   
 
  digitalWrite(RL_cs_inH2O, LOW);
  digitalWrite(RL_cs_outH2O, LOW);
  digitalWrite(RL_cs_vlv_H2OGas, LOW);
}

void loop(){
int i; // variabile temporanea utilizzata da ciclo for

// LETTURA TEMPERATURE
Temp_inH2O = ReadTemperatureLM35(2,10); // ingresso analogico A2 -> 10 samples
Serial.print("Temp_inH2O = "); Serial.println(Temp_inH2O);
Temp_outH2O = ReadTemperatureLM35(3,10); // ingresso analogico A3 -> 10 samples
Serial.print("Temp_outH2O = "); Serial.println( + Temp_outH2O);
Temp_ambiente = ReadTemperatureLM35(4,10); // ingresso analogico A4 -> 10 samples
Serial.print("Temp_ambiente = "); Serial.println( + Temp_ambiente);
Temp_esterna = ReadTemperatureLM35(5,10); // ingresso analogico A5 -> 10 samples
Serial.print("Temp_esterna = "); Serial.println( + Temp_esterna);
delay(5000);

// GESTIONE START-STOP CAVI SCALDANTI
if (Temp_inH2O < Set_start[0]){
    ST_cs_inH2O = HIGH;
    Serial.println("ST_cs_inH2O -> HIGH");
}

if (Temp_inH2O > Set_stop[0]){
    ST_cs_inH2O = LOW;
    Serial.println("ST_cs_inH2O -> LOW");
}

if (Temp_outH2O < Set_start[1]){
    ST_cs_outH2O = HIGH;
    Serial.println("ST_cs_outH2O -> HIGH");
}

if (Temp_outH2O > Set_stop[1]){
    ST_cs_outH2O = LOW;
    Serial.println("ST_cs_outH2O -> LOW");
}

if (Temp_ambiente < Set_start[2]){
   ST_cs_vlv_H2OGas = HIGH;
   Serial.println("ST_cs_vlv_H2OGas -> HIGH");
}

if (Temp_ambiente > Set_stop[2]){
    ST_cs_vlv_H2OGas = LOW;
    Serial.println("ST_cs_vlv_H2OGas -> LOW");
}

// AGGIORNAMENTO USCITE DIGITALI RELE'
digitalWrite(RL_cs_inH2O, ST_cs_inH2O);
digitalWrite(RL_cs_outH2O, ST_cs_outH2O);
digitalWrite(RL_cs_vlv_H2OGas, ST_cs_vlv_H2OGas);
 
}

// -------------------------- function and subroutine --------------------------
float ReadTemperatureLM35(int Channel, int Sample)
 {
  float samples[15];
  float tempc, Temp;
  int i, reading;
 
  //getting the voltage reading from the temperature sensor
  reading = analogRead(Channel);

  // converting that reading to voltage, for 3.3v arduino use 3.3
  float voltage = reading * 5.0;
  voltage /= 1024.0;
   
  // now print out the temperature
  float temperatureC = (voltage) * 100 ;  //converting from 10 mv per degree wit 500 mV offset
   
  for(i = 0;i<=Sample-1;i++){ // gets a samples of temperature
    samples[i] = temperatureC;
    tempc = tempc + samples[i];
    delay(10);
  }

  Temp = tempc/float(Sample); // better precision
  tempc = 0;

  return Temp;
}

il prossimo step sarà quello d'implementare, mediante le librerie tinywebserver, un server web con tanto di pagine html memorizzate su scheda SD ed interfacciare arduino mediante una rappresentazione grafica del sistema antigelo caldaia, inoltre implementerò la possibilità di modificare i set di temperatura start/stop per i vari cavi scaldanti.

saluti
Alessandro.
Logged

kattivik76
Sviluppo e realizzazione  Progetti Arduino
Teamspeack -> Arduino.cc -> 79.38.142.178:9987

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 25
Posts: 5481
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bello,Utile ed interessante:) ora aspettiamo il resto:)
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Massa Martana
Offline Offline
Newbie
*
Karma: 0
Posts: 18
Credi in ciò che sei e diventerai ciò che vuoi essere!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Alessandro, molto interessante!
Sei andato avanti con l'interfacciamento via web?
Logged

Arduinomania!

Verona
Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao kattivik76,

ho dato un'occhiata al tuo codice e sto provando a convertire il valore di un sensore (DS18S20) da int a string usando una tua routine che però non mi restituisce i valori decimali, riesci a capire dove sbaglio?


Code:
Questo è quello che mi succede:
Dallas Temperature IC Control Library Demo
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: 24.75
valore convertito in string: 24.00

per il codice ho usato un esempio della libreria DallasTemperature

Code:
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 6

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
char sensor1[]= {" "};

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void loop(void)
{
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0)); 
  char Temp = sensors.getTempCByIndex(0);
  Serial.print("valore convertito in string: ");
  Serial.println(floatToString(sensor1, Temp, 2, 0));
}

char * floatToString(char * outstr, double val, byte precision, byte widthp){
  char temp[16];
  byte i;

  // compute the rounding factor and fractional multiplier
  double roundingFactor = 0.5;
  unsigned long mult = 1;
  for (i = 0; i < precision; i++)
  {
    roundingFactor /= 10.0;
    mult *= 10;
  }
 
  temp[0]='\0';
  outstr[0]='\0';

  if(val < 0.0){
    strcpy(outstr,"-\0");
    val = -val;
  }

  val += roundingFactor;

  strcat(outstr, itoa(int(val),temp,10));  //prints the int part
  if( precision > 0) {
    strcat(outstr, ".\0"); // print the decimal point
    unsigned long frac;
    unsigned long mult = 1;
    byte padding = precision -1;
    while(precision--)
      mult *=10;

    if(val >= 0)
      frac = (val - int(val)) * mult;
    else
      frac = (int(val)- val ) * mult;
    unsigned long frac1 = frac;

    while(frac1 /= 10)
      padding--;

    while(padding--)
      strcat(outstr,"0\0");

    strcat(outstr,itoa(frac,temp,10));
  }

  // generate space padding
  if ((widthp != 0)&&(widthp >= strlen(outstr))){
    byte J=0;
    J = widthp - strlen(outstr);
   
    for (i=0; i< J; i++) {
      temp[i] = ' ';
    }

    temp[i++] = '\0';
    strcat(temp,outstr);
    strcpy(outstr,temp);
  }
 
  return outstr;
}

grazie in anticipo.
Logged

Albenga (SV) / Torino, Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bellissimo progetto! Ma un plauso va soprattutto all'enorme utilità di un progetto del genere: per quello che ho potuto vedere girano davvero pochi progetti utili da queste parti smiley-lol. Bravo!
Logged

Verona
Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho risolto il problemino della conversione da float a string, sbagliavo sicuramente io da qualche parte, ho ricontrollato bene il tutto e ora funziona..  smiley-sad-blue
Logged

Galliate (NO) Italia
Offline Offline
Full Member
***
Karma: 0
Posts: 180
Sviluppo sistemi software PLC/DCS/SCADA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho!!!! il mio vecchio post smiley-razz

ragazzi, ecco qua: https://sites.google.com/site/circuitiarduino/home
ho rivisto tutto il progetto, ora "Antigelo Caldaia" risiede su server altervista.org http://homegalliate.altervista.org/ , utilizza un piccolo database MySql + algoritmo MD5() AJAX per la crittografia delle password ci accesso, interfacciamento con server pachube per il recupero dei dati e l'invio dei setpoint di utilizzo smiley-wink

arduino, invece, con il suo bel Ethernet Shield, si interfaccia con il server pachube ogni 60secondi per l'invio dei dati e la ricezione dei setpoint smiley
p.s.: ho rivisto anche la parte hardware delle sonde, ora utilizzo delle dallas DS18B20 smiley-wink

riporto di seguito gli altri post relativi al progetto smiley-wink

http://arduino.cc/forum/index.php/topic,61424.0.html

http://arduino.cc/forum/index.php/topic,63747.0.html

l'ultima versione la potete vedere online:
progetto -> https://sites.google.com/site/circuitiarduino/home
server altervista.org -> https://sites.google.com/site/circuitiarduino/home

saluti
kattivik76
« Last Edit: March 09, 2012, 11:56:02 am by kattivik76 » Logged

kattivik76
Sviluppo e realizzazione  Progetti Arduino
Teamspeack -> Arduino.cc -> 79.38.142.178:9987

Pages: [1]   Go Up
Jump to: