2016. február 28., vasárnap

Hőmérséklet mérés és adat tárolás Arduino-val

English version.

Azt terveztem, hogy mérni fogom az elektromos bojlerünk víz hőmérsékletét egy Arduino-val és a mért adatokat egy diagramon meg tudom majd nézni. Csak azért gondoltam ezt, mert kíváncsi voltam, mennyi idő alatt hány fokot hűl vagy melegszik a víz hőmérséklete.


Sajnos a bojleren nincsen olyan pont ahová a termisztort (Egy olyan ellenállás aminek a hőmérséklettől függően változik az értéke. Én az enyémet a laptop akkumulátorból szedtem ki) ragaszthattam volna, hogy mérjem a hőmérsékletet. A bojler teljesen körbe van szigetelve és az alsó részén pedig a fém lap amire a fűtőszál is van erősítve jóval hidegebb mint a víz. Sajnos egyelőre ezt a projektet el kell halasszam. De az Arduino áramkört megcsináltam, megvan a kód is hozzá, azt megosztom az olvasóimmal. A kód tetszőleges időközönként méri a hőmérsékletet, majd azt a belső memóriájában eltárolja. Sajnos a felhasználható memória mérete az én Arduinomon 1024 Byte, így csak 1024 darab 0-256 közötti számot tud tárolni. De ha fél percenként veszek csak mintát így is 8 órányi adatot tud tárolni. Ha kikapcsoljuk az Arduino-t az adatok akkor is tárolva maradnak.

Egy 10000 OHM-os ellenállás és egy termisztor kell csak hozzá. A képen látszik, hogyan kell bekötni.


A termisztorra hosszabb kábelt forrasztottam az egyszerűbb kezelhetőség miatt:


A hőmérséklet mérő:

#include <EEPROM.h>

// itt kell megadni, hogy melyik analóg bemenetet használjuk
#define THERMISTORPIN A0
// a memória címzése 0-ról indul
int addr = 0;

void setup(void) {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}
 
void loop(void) {
  
  float reading;
  //leolvasunk egy értéket 
  reading = analogRead(THERMISTORPIN);
  //elosztjuk 4-el mert csak 0-256 közötti számot tudunk elmenteni
  int val = analogRead(THERMISTORPIN) / 4;
  // elmentjük egy adott címre
  EEPROM.write(addr, val);
  //egyel növeljük a cím számát
  addr = addr + 1;
  if (addr == EEPROM.length()) {
    addr = 0;
  }  
  //várunk fél percet
  delay(30000);
}

A memória kiolvasó:

/*
 * EEPROM olvasó
 *
 * kiolvassa az EEPROM-ot byte-onként
 * 
 * 
 */

#include <EEPROM.h>
// elkezdjük kiolvani a memóriát a 0-dik helyrol
int address = 0;
int value;
double Temp;
void setup() {
  // megnyitjuk a serial kapcsolatot a számítógéppel
  Serial.begin(9600);
  while (!Serial) {
    ; // várunk a kapcsolat létrejöttére
  }
}

void loop() {
  float reading;
  // kiolvassuk az értéket a memóriából
  value = EEPROM.read(address);

  Serial.print(address);
  Serial.print("\t");
  Serial.print(value, DEC);
  Serial.print(" ");
  //néggyel meg kell szorozzuk a kiolvasott értéket mert mielott elmentettük, 4-el elosztottuk
  value=value*4;
  Serial.print(value);
  //a képlet ami alapján kiszámítjuk a homérsékletet a mért értékbol a képletet innen vettem: https://en.wikipedia.org/wiki/Thermistor
  Temp = log(((10240000/value) - 10000));
  Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
  Temp = Temp - 273.15;           // Convert Kelvin to Celcius  
   
  Serial.print(" Temperature "); 
  Serial.print(Temp);
  Serial.println(" *C");
  /***
    továbblépünk a következo memóriacímre, ha végigértünk az 1024-en akkor elölrol kezdjük a kiolvasást

    A nagyobb mikrokontrollereknek több belso memóriája van pl:
    - Arduno Duemilanove: 512byte EEPROM storage.
    - Arduino Uno:        1kbyte EEPROM storage.
    - Arduino Mega:       4kbyte EEPROM storage.

    a következo paranccsal az elérheto maximum memórianagyságig olvasunk    
  ***/
  address = address + 1;
  if (address == EEPROM.length()) {
    address = 0;
  }

  //várunk 50 mikomásodperced kiolvasásonként
  delay(50);
}

Először a mérő kódot kell lefuttatni és várni, hogy elmentse az adatokat, majd feltölthetjük a kiolvasó kódot, hogy kinyerjük az adatokat. Én próbából megmértem a radiátor hőmérséklet változását. Majdnem 6 órán át gyűjtötte az adatokat. A kinti hőmérséklet 6-ról közben 3-ra csökkent.


Jól látható, hogy a radiátor hőmérséklete rohamosan emelkedik amikor bekapcsol a fűtés, majd mikor kikapcsol, egyre lassabban hűl le, míg végül el nem éri a szoba hőmérsékletét. A második és harmadik csúcsnál a kis visszaesés a keringető szivattyú vezérlése miatt van, mert ha a termosztát eléri az elvárt hőmérsékletet akkor lekapcsolja a fűtést, de a szivattyú később még egy kicsit visszakapcsol, hogy kivigye még a meleget a kazánból.

Nincsenek megjegyzések:

Megjegyzés küldése