Datalogning af temperatur

PID regulator, styringer og programmer.
Brugeravatar
Nimbus39
Indlæg: 3392
Tilmeldt: 27. jun 2010, 09:52
Geografisk sted: Greve (Mosede Strand)
Kontakt:

Re: Datalogning af temperatur

Indlæg af Nimbus39 »

Nu har jeg sammensat en datalogger til en kollega der ikke er helt så meget inde i Arduino (endnu)
Hans behov er kun logning af gæringen, så den er lavet med lidt færre stumper (ingen relæer), men til gengæld er den i stand til at sige til når der er X antal minutter mellem boblerne. Dette parameter indstilles i koden og når der f.eks. er gået mere end 5 min siden sidste blop tænder den for en diode så man kan se at kriteriet er opfyldt.
Samtidig udlæses der en række data til displayet:
20140119_160444.jpg
20140119_160444.jpg (274.06 KiB) Vist 5361 gange
Den logfører stadigvæk temperaturer og antal bobler på et SD-kort så man kan lege med disse data i f.eks. excel eller et andet datavisualiseringsværktøj.

Her er koden:

Kode: Vælg alt

//biblioteker
#include <DS1307RTC.h>
#include <Time.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <SD.h>
#include <LiquidCrystal_I2C.h>
#include <StopWatch.h>

//Opstart af boards mm

// Dallas
// Data wire is plugged into port 5 Pause the Arduino
#define ONE_WIRE_BUS 5
#define TEMPERATURE_PRECISION 9
//SD kort
//CS on Pin 4
const int chipSelect = 4;

// LCD 1602
// set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd(0x27,20,4);
//Definer variabler
tmElements_t tm, LBTime;
//Stopur
StopWatch StopUr;
float OldDag, OldHour, OldMin, BlopCount, LastTemp, Dage, LBM, LBH, BlopPause; 
int i;
// the pin that the photogate is attached to
const int  PhotoPin = 2; 
// counter for the number of Blops
int BlopCounter = 0;
// current state of the buttPause
int PhotoState = 0; 
// previous state of the buttPause
int lastPhotoState = 0;     
// 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);
//datafil instans
File dataFile; // Systemet benytter 2 filer: Datalog.txt (temperatur og bobler) og Timelog.txt (Kilder tænd/sluk tidspunkter)
// LED udgange.
int YLed = 7;  //Gul diode
int GLed = 6;  //Grøn diode

// Tidsvariabler
const float LBI = 60; //LastBlopInterval. Denne variable angiver hvor længe der skal være mellem bobler, angives i hele minutter.

void setup (void)  // Obligatorisk initialiseringsafsnit
{
  tmElements_t TimeTest; // Variable til at indeholde tidspunkter
  pinMode(YLed, OUTPUT); //Definer YLed som udgang
  pinMode(GLed, OUTPUT); //Definer GLed som udgang
  pinMode(PhotoPin, INPUT); //PhotoPin GLed som indgang
  // Test LED
  digitalWrite(YLed, HIGH); // Tænd YLed
  delay (500); //Vent lidt
  digitalWrite(YLed, LOW); // Sluk YLed
  digitalWrite(GLed, HIGH); // Tænd GLed
  delay (500); // vent lidt
  digitalWrite(GLed, LOW); // Sluk GLed
  // initialize the lcd
  lcd.init();                       
  lcd.backlight();  // Tænd Lys i display
  // Kontroller om RTC virker
  if (RTC.read(TimeTest)) // Se om der er en RTC der svarer
  {
    lcd.setCursor(0,0);
    lcd.print("RTC OK");
  }
  else 
  {
    if (RTC.chipPresent()) // Hiis der er en RTC der kan læses men ikke kører
    {
      lcd.clear();
      lcd.print("RTC stoppet");
      delay(2000);
     } 
     else  // Hvis RTC ikke kan læses
     {
      lcd.clear();
      lcd.print("RTC read error!");
      delay(2000);
     }
  }
  lcd.setCursor(0,1);
  // Start up the Dallas library
  sensors.begin();
  lcd.print("Sensor antal: ");
  lcd.print(sensors.getDeviceCount(), DEC);
  lcd.setCursor(7,0);
  // Initialize SD-card
  pinMode(4, OUTPUT);     //  Sæt CS på SD-kort til udgang 4
  if (!SD.begin(chipSelect)) {
    lcd.clear();
    lcd.print("SD-kort fejl!");
    delay(5000);
    // dont't do anything more:
    return;
  }
  lcd.print("Card OK");
  delay(2000);
  // Print parametre til lcd
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Max pause mellem");
  lcd.setCursor(0,1); 
  lcd.print("bobler: "); 
  lcd.print(LBI, 0);
  lcd.print(" min.");
  delay(5000);
  lcd.clear();
  //start Stopur der måler tid mellem bobler
  StopUr.start();
  SkrivDisplay(); // Skriver aktuelle værdier til display
}
//Funktioner
boolean DagSkift () //undersøger om Minuttal er ændret
{
    //Set new time variables
    if (RTC.read(tm))
    {
      if ( OldDag != tm.Day)
      { // hvis dag ændres
        OldDag= tm.Day;
        // Returner TRUE
        return true;
      }
      else
      { // Hvis dag ikke ændres
        //Returner FALSE
        return false;
      }
    }
}
boolean TimeSkift () //undersøger om timetal er ændret
{
    //Set new time variables
    if (RTC.read(tm))
    {
      if ( OldHour != tm.Hour)
      { // hvis Time ændres
        OldHour= tm.Hour;
        // Returner TRUE
        return true;
      }
      else
      { // Hvis time ikke ændres
        //Returner FALSE
        return false;
      }
    }
}
boolean MinutSkift () //undersøger om Minuttal er ændret
{
    //Set new time variables
    if (RTC.read(tm))
    {
      if ( OldMin != tm.Minute)
      { // hvis Minut ændres
        OldMin= tm.Minute;
        // Returner TRUE
        return true;
      }
      else
      { // Hvis minut ikke ændres
        //Returner FALSE
        return false;
      }
    }
}
boolean SkrivLog ()
{
  tmElements_t tm; 
  RTC.read(tm);// hent nyeste tid
  sensors.requestTemperatures(); // Hent temperaturer fra alle DS18B20
  LastTemp = sensors.getTempCByIndex(0);
  float FilData[3];  //array der indeholder de data der skal skrives til datafilen, værdi er antal sensorer plus en ekstra til bobler-værdien.
  sensors.requestTemperatures(); // Send the command to get temperatures
  for (i=0; i<=1; i++) //gennemløb array med data, og læg temperaturer i det. værdi er antal sensorer minus en.
  {
    FilData[i]= sensors.getTempCByIndex(i);
    // Data skrives i denne rækkefølge: ??
  }
  //læg blob count i float array FilData på plads 2, skal rettes hvis der er flere/færre end 4 DS18B20
  FilData[2] = BlopCounter; //brug den sidste plads i array til bobler værdien. Værdi er antal DS18B20
  dataFile = SD.open("datalog.txt", FILE_WRITE);
  // if the file is available, write to it:
  if (dataFile && RTC.read(tm)) {
    for (i=0; i<=2; i++) //gennemløb array med data, og skriv data i filen. Værdi er antal DS18B20, sidste værdi der skrives er BlopCounter.
  {
    dataFile.print(FilData[i]);
    dataFile.print(";");
  }
  // skriv dato og klokkeslæt til fil i formatet yyyy-mm-dd;hh:mm, passer med excel datoformat
  dataFile.print(tmYearToCalendar(tm.Year));
  dataFile.print('-');
  dataFile.print(tm.Month);
  dataFile.print('-');
  dataFile.print(tm.Day);
  dataFile.print(";");
  
   if (tm.Hour >= 0 && tm.Hour < 10) //skriv klokkeslæt i fil
   { 
    dataFile.print("0");
    dataFile.print(tm.Hour);
   }
   else
   {
     dataFile.print(tm.Hour);
   }
   dataFile.print(":");
   if (tm.Minute >= 0 && tm.Minute < 10)
   { 
    dataFile.print("0");
    dataFile.println(tm.Minute);
   }
   else
   {
     dataFile.println(tm.Minute);
   }
   dataFile.close();
  }  
  // if the file isn't open, pop up an error:
  else 
  {
    lcd.clear();
    lcd.print("error datalog.txt");
  }
  BlopCounter= 0;  //Nulstil "Blop" tælleren
}
boolean SkrivDisplay()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("B:");
  lcd.print(BlopCounter);
  lcd.setCursor(5,0);
  lcd.print("T:");
  lcd.print(LastTemp, 1); 
  lcd.setCursor(12,0);
  lcd.print("D:");
  lcd.print(Dage, 0);
  lcd.setCursor(0,1);
  lcd.print("Tid:");
  if (LBTime.Hour >= 10)
  {
    lcd.print(LBTime.Hour);
  }
  else // hvis timetal er mindre end 10 skal der skrives et 0 foran det
  {
    lcd.print("0");
    lcd.print(LBTime.Hour);
  }
  lcd.print(":");
  if (LBTime.Minute >= 10)
  {
    lcd.print(LBTime.Minute);
  }
  else // hvis minuttal er mindre end 10 skal der skrives et 0 foran det
  {
    lcd.print("0");
    lcd.print(LBTime.Minute);
  }
  lcd.setCursor(10,1);
  lcd.print("P:");
  lcd.print(BlopPause, 0);
}
//Hovedløkke
void loop()
{
  digitalWrite(GLed, HIGH);  //tænder grøn diode på frPauset der angiver programmet kører.
  BlopPause = (StopUr.elapsed()/60000);  //Sæt BlopPause til det antal minutter der gået siden sidste blop. 60.000 Millisekunder pr. minut
  if (BlopPause >= LBI) //Hvis BlopPause er større end eller lig med Den angivne grænse for tid mellem bobler tænd for den gule LED.
      {
        digitalWrite(YLed, HIGH); //Tænd gul LED
      }
      else
      {
        digitalWrite(YLed, LOW); //Sluk gul LED
      }
  if (MinutSkift()) // Hvis Minuttal er skiftet skal time undersøges, og temp skal undersøges.
  {
    SkrivLog();  // står dette kald her skriver den log hvert minut

    if (TimeSkift()) // hvis timetal skifter skal temp logføres sammen med antal bobler
    {
      //SkrivLog();  // står dette kald her skriver den log hvert time.
      if (DagSkift()) // Hvis dagen skifter
      {
        Dage++; // Tæller antal dage loggeren har været tændt 1 op.
      }
    }
    SkrivDisplay(); //opdater display
  }
  // Tæl Bobler
  // read the Photogate input pin:
  PhotoState = digitalRead(PhotoPin);
    // compare the Photogate State to its previous state
  if (PhotoState != lastPhotoState) 
  {
    // if the state has changed, increment the counter
    if (PhotoState == HIGH) 
    {
      // if the current state is HIGH then the buttPause went from Off to On:
      StopUr.stop();
      StopUr.reset();
      BlopCounter++;
      LBTime = tm;
      BlopPause = 0;
      SkrivDisplay();
      StopUr.start();
    } 
   }
  // save the current state as the last state, for next time through the loop
  lastPhotoState = PhotoState;
  digitalWrite(GLed, LOW);  //slukker grøn diode på frPauseten der angiver at program kører
  delay(10);
}
og en principskitse:
DataLoggerUNO_Simpel.png
DataLoggerUNO_Simpel.png (417.18 KiB) Vist 5361 gange
Alle de nødvendige biblioteker er tilgængelige på nettet.
Buy a man a beer and he wastes an hour. Teach a man to brew and he wastes a lifetime.
http://bryggeri.landly.dk
http://www.facebook.com/bryggerilandly
http://beersmithrecipes.com/listrecipes/2810/nimbus39
Brugeravatar
Nimbus39
Indlæg: 3392
Tilmeldt: 27. jun 2010, 09:52
Geografisk sted: Greve (Mosede Strand)
Kontakt:

Re: Datalogning af temperatur

Indlæg af Nimbus39 »

En lille update på projektet.
Nu har jeg prøvet logningen af på det seneste bryg, og selv om jeg ikke havde dyklommen klar satte jeg en føler på spanden og den anden hang løst i luften. De 2 sidste er interne målere på relæerne til 220V styringen (som ikke var aktiveret)
Jeg fik et ganske godt datasæt ud af mine målinger:

Kode: Vælg alt

23,75;24,25;24,25;24,44;0,00;2014-2-22;18:31
24,37;25,94;23,81;25,87;2,00;2014-2-22;19:00
24,19;26,44;23,87;26,37;0,00;2014-2-22;20:00
23,75;26,00;23,00;25,94;0,00;2014-2-22;21:00
23,62;25,75;23,12;25,62;0,00;2014-2-22;22:00
23,44;25,56;23,00;25,50;0,00;2014-2-22;23:00
23,19;25,19;22,56;25,12;0,00;2014-2-23;00:00
22,81;24,87;22,12;24,87;0,00;2014-2-23;01:00
22,50;24,56;21,81;24,50;0,00;2014-2-23;02:00
22,25;24,25;21,44;24,19;0,00;2014-2-23;03:00
22,00;23,94;21,19;23,87;0,00;2014-2-23;04:00
21,75;23,62;20,94;23,56;0,00;2014-2-23;05:00
21,50;23,37;20,56;23,25;0,00;2014-2-23;06:00
21,25;23,12;20,31;23,06;0,00;2014-2-23;07:00
21,25;23,06;20,56;23,00;0,00;2014-2-23;08:00
21,31;23,44;20,87;23,37;0,00;2014-2-23;09:00
21,44;23,69;21,37;23,62;0,00;2014-2-23;10:00
20,56;23,87;20,00;23,75;0,00;2014-2-23;11:00
21,62;24,31;21,87;24,25;494,00;2014-2-23;12:00
21,44;24,19;21,37;24,12;759,00;2014-2-23;13:00
22,00;24,44;23,19;24,37;1393,00;2014-2-23;14:00
21,94;25,69;22,50;25,62;2178,00;2014-2-23;15:00
21,44;24,25;21,12;24,19;2617,00;2014-2-23;16:00
21,87;24,31;22,12;24,25;2776,00;2014-2-23;17:00
22,12;25,00;22,50;25,00;2963,00;2014-2-23;18:00
22,12;25,00;22,19;25,00;3062,00;2014-2-23;19:00
22,12;24,94;22,12;24,81;3213,00;2014-2-23;20:00
22,25;24,87;22,06;24,81;4412,00;2014-2-23;21:00
22,31;24,75;22,00;24,75;3613,00;2014-2-23;22:00
22,31;24,75;22,06;24,69;4520,00;2014-2-23;23:00
22,37;24,75;22,00;24,62;5460,00;2014-2-24;00:00
22,25;24,50;21,62;24,44;5038,00;2014-2-24;01:00
21,94;24,00;20,94;23,94;6755,00;2014-2-24;02:00
21,81;23,50;20,56;23,50;8419,00;2014-2-24;03:00
21,62;23,19;20,19;23,12;7370,00;2014-2-24;04:00
21,56;22,94;20,00;22,87;4173,00;2014-2-24;05:00
21,62;22,94;20,37;22,87;4131,00;2014-2-24;06:00
21,81;23,31;20,69;23,25;4639,00;2014-2-24;07:00
21,69;23,37;20,50;23,31;6276,00;2014-2-24;08:00
21,56;23,00;20,19;22,94;6024,00;2014-2-24;09:00
21,50;22,87;20,19;22,81;11646,00;2014-2-24;10:00
21,50;22,87;20,19;22,81;10559,00;2014-2-24;11:00
21,37;22,75;20,06;22,69;11951,00;2014-2-24;12:00
21,25;22,62;19,94;22,56;12076,00;2014-2-24;13:00
21,12;22,50;19,81;22,44;6440,00;2014-2-24;14:00
21,69;23,00;21,19;22,94;4186,00;2014-2-24;15:00
21,94;24,56;22,19;24,56;4365,00;2014-2-24;16:00
22,06;24,81;21,94;24,75;5508,00;2014-2-24;17:00
22,06;24,50;21,81;24,50;3125,00;2014-2-24;18:00
22,12;24,44;21,81;24,37;3071,00;2014-2-24;19:00
22,37;24,44;22,19;24,37;2834,00;2014-2-24;20:00
22,31;24,87;22,31;24,81;3020,00;2014-2-24;21:00
22,31;24,94;22,25;24,87;2410,00;2014-2-24;22:00
22,31;24,75;22,06;24,75;2699,00;2014-2-24;23:00
22,00;24,37;21,25;24,31;3075,00;2014-2-25;00:00
21,81;23,87;20,94;23,81;3154,00;2014-2-25;01:00
21,69;23,50;20,62;23,44;2619,00;2014-2-25;02:00
21,50;23,25;20,31;23,12;3105,00;2014-2-25;03:00
21,37;22,94;20,00;22,94;2132,00;2014-2-25;04:00
21,19;22,69;19,81;22,69;2101,00;2014-2-25;05:00
21,25;22,75;20,25;22,69;2505,00;2014-2-25;06:00
21,37;23,19;20,69;23,12;1367,00;2014-2-25;07:00
21,25;23,19;20,44;23,19;1536,00;2014-2-25;08:00
21,06;23,00;20,25;22,94;1559,00;2014-2-25;09:00
20,94;22,94;20,31;22,87;1511,00;2014-2-25;10:00
20,87;22,94;20,19;22,87;991,00;2014-2-25;11:00
20,75;22,75;20,06;22,69;977,00;2014-2-25;12:00
20,62;22,62;19,87;22,56;983,00;2014-2-25;13:00
20,50;22,50;19,75;22,44;1409,00;2014-2-25;14:00
20,31;22,31;19,50;22,31;868,00;2014-2-25;15:00
20,44;22,31;19,87;22,25;832,00;2014-2-25;16:00
21,12;23,00;21,37;23,00;900,00;2014-2-25;17:00
21,19;24,50;21,87;24,44;855,00;2014-2-25;18:00
21,19;24,81;22,00;24,75;806,00;2014-2-25;19:00
21,31;24,81;22,06;24,75;756,00;2014-2-25;20:00
21,31;24,87;22,06;24,75;688,00;2014-2-25;21:00
21,37;24,87;22,12;24,87;760,00;2014-2-25;22:00
21,44;25,00;22,25;24,94;656,00;2014-2-25;23:00
21,25;24,69;21,62;24,62;626,00;2014-2-26;00:00
21,12;24,25;21,19;24,19;557,00;2014-2-26;01:00
20,94;23,81;20,69;23,75;563,00;2014-2-26;02:00
20,81;23,50;20,37;23,37;573,00;2014-2-26;03:00
20,62;23,19;20,12;23,06;755,00;2014-2-26;04:00
20,50;22,87;19,87;22,81;540,00;2014-2-26;05:00
20,56;22,81;20,19;22,75;420,00;2014-2-26;06:00
20,69;23,25;20,75;23,12;379,00;2014-2-26;07:00
20,56;23,19;20,25;23,19;454,00;2014-2-26;08:00
20,31;22,81;19,81;22,75;505,00;2014-2-26;09:00
20,19;22,62;19,69;22,56;338,00;2014-2-26;10:00
20,06;22,50;19,62;22,44;301,00;2014-2-26;11:00
19,94;22,31;19,44;22,25;315,00;2014-2-26;12:00
19,81;22,25;19,37;22,12;249,00;2014-2-26;13:00
19,69;22,12;19,25;22,06;299,00;2014-2-26;14:00
19,62;21,94;19,06;21,87;248,00;2014-2-26;15:00
19,56;21,94;19,25;21,94;250,00;2014-2-26;16:00
20,37;23,00;21,44;22,94;270,00;2014-2-26;17:00
20,62;24,87;22,37;24,81;278,00;2014-2-26;18:00
20,62;24,94;22,00;24,94;248,00;2014-2-26;19:00
20,69;24,75;22,00;24,75;661,00;2014-2-26;20:00
20,87;24,94;22,44;24,87;296,00;2014-2-26;21:00
20,94;25,19;22,44;25,19;239,00;2014-2-26;22:00
21,00;25,12;22,25;25,06;269,00;2014-2-26;23:00
20,75;24,62;21,50;24,56;235,00;2014-2-27;00:00
20,56;24,00;20,94;23,94;228,00;2014-2-27;01:00
20,44;23,62;20,56;23,56;236,00;2014-2-27;02:00
20,31;23,31;20,25;23,25;206,00;2014-2-27;03:00
20,19;23,00;20,00;22,94;208,00;2014-2-27;04:00
20,06;22,75;19,69;22,69;176,00;2014-2-27;05:00
20,12;22,69;20,06;22,69;178,00;2014-2-27;06:00
20,25;23,12;20,44;23,06;203,00;2014-2-27;07:00
20,12;23,12;20,06;23,06;188,00;2014-2-27;08:00
19,94;22,75;19,75;22,69;179,00;2014-2-27;09:00
19,81;22,50;19,56;22,44;168,00;2014-2-27;10:00
19,75;22,37;19,37;22,31;162,00;2014-2-27;11:00
19,56;22,25;19,31;22,19;183,00;2014-2-27;12:00
19,50;22,06;19,12;22,00;170,00;2014-2-27;13:00
19,31;21,94;19,00;21,87;175,00;2014-2-27;14:00
19,25;21,75;18,81;21,69;149,00;2014-2-27;15:00
19,44;21,87;19,37;21,81;161,00;2014-2-27;16:00
19,69;22,37;20,25;22,31;155,00;2014-2-27;17:00
20,12;24,06;21,62;24,00;149,00;2014-2-27;18:00
20,19;24,50;21,75;24,44;158,00;2014-2-27;19:00
20,25;24,62;21,69;24,50;134,00;2014-2-27;20:00
20,25;24,50;21,62;24,44;167,00;2014-2-27;21:00
20,37;24,50;21,75;24,44;143,00;2014-2-27;22:00
20,37;24,44;21,31;24,37;127,00;2014-2-27;23:00
20,19;23,87;20,75;23,87;140,00;2014-2-28;00:00
20,00;23,44;20,25;23,37;126,00;2014-2-28;01:00
19,81;23,06;19,94;23,00;149,00;2014-2-28;02:00
19,44;22,69;19,31;22,62;122,00;2014-2-28;03:00
19,19;22,31;19,00;22,25;147,00;2014-2-28;04:00
18,94;21,94;18,69;21,94;125,00;2014-2-28;05:00
18,94;21,87;19,00;21,81;139,00;2014-2-28;06:00
19,62;22,50;20,25;22,50;142,00;2014-2-28;07:00
19,50;22,69;19,69;22,62;110,00;2014-2-28;08:00
19,31;22,37;19,31;22,31;117,00;2014-2-28;09:00
19,19;22,12;19,19;22,06;124,00;2014-2-28;10:00
19,06;22,00;19,06;21,94;114,00;2014-2-28;11:00
19,00;21,87;18,94;21,81;104,00;2014-2-28;12:00
18,94;21,75;18,94;21,69;85,00;2014-2-28;13:00
18,81;21,69;18,75;21,62;98,00;2014-2-28;14:00
18,75;21,56;18,69;21,50;88,00;2014-2-28;15:00
18,87;21,56;19,00;21,50;93,00;2014-2-28;16:00
19,00;21,94;19,25;21,87;106,00;2014-2-28;17:00
19,56;22,62;21,06;22,62;90,00;2014-2-28;18:00
20,00;24,81;22,19;24,75;138,00;2014-2-28;19:00
20,25;25,44;22,37;25,37;115,00;2014-2-28;20:00
20,44;25,44;22,56;25,44;103,00;2014-2-28;21:00
20,44;25,44;22,44;25,37;87,00;2014-2-28;22:00
20,37;24,87;21,69;24,81;84,00;2014-2-28;23:00
20,12;24,12;20,87;24,06;83,00;2014-3-1;00:00
20,00;23,62;20,56;23,56;88,00;2014-3-1;01:00
19,94;23,31;20,37;23,31;104,00;2014-3-1;02:00
19,81;23,06;20,06;23,00;103,00;2014-3-1;03:00
19,75;22,81;19,81;22,75;105,00;2014-3-1;04:00
19,62;22,56;19,56;22,50;106,00;2014-3-1;05:00
19,50;22,31;19,37;22,25;129,00;2014-3-1;06:00
19,37;22,12;19,25;22,06;85,00;2014-3-1;07:00
19,50;22,12;19,50;22,06;93,00;2014-3-1;08:00
19,75;22,56;19,94;22,50;94,00;2014-3-1;09:00
20,37;23,81;21,69;23,75;131,00;2014-3-1;10:00
20,44;24,69;21,94;24,62;88,00;2014-3-1;11:00
20,56;24,94;22,06;24,87;0,00;2014-3-1;11:48
20,56;24,81;21,94;24,81;20,00;2014-3-1;12:00
20,50;24,62;21,56;24,50;109,00;2014-3-1;13:00
20,50;24,50;21,56;24,44;82,00;2014-3-1;14:00
20,44;24,25;21,31;24,25;88,00;2014-3-1;15:00
20,37;24,06;21,19;24,00;86,00;2014-3-1;16:00
20,44;24,06;21,31;24,00;94,00;2014-3-1;17:00
20,37;23,87;20,94;23,81;82,00;2014-3-1;18:00
20,37;23,69;20,81;23,62;69,00;2014-3-1;19:00
20,31;23,56;20,75;23,50;78,00;2014-3-1;20:00
20,31;23,50;20,69;23,44;67,00;2014-3-1;21:00
20,31;23,44;20,62;23,37;87,00;2014-3-1;22:00
20,31;23,44;20,62;23,31;69,00;2014-3-1;23:00
20,31;23,37;20,75;23,31;86,00;2014-3-2;00:00
20,06;23,12;20,06;23,06;71,00;2014-3-2;01:00
19,87;22,75;19,75;22,69;40,00;2014-3-2;02:00
19,75;22,44;19,56;22,37;43,00;2014-3-2;03:00
19,62;22,25;19,37;22,19;53,00;2014-3-2;04:00
19,50;22,06;19,19;22,00;33,00;2014-3-2;05:00
19,37;21,94;19,06;21,81;39,00;2014-3-2;06:00
19,25;21,75;18,87;21,69;44,00;2014-3-2;07:00
19,37;21,75;19,19;21,69;27,00;2014-3-2;08:00
19,50;22,12;19,44;22,06;41,00;2014-3-2;09:00
19,69;22,44;19,75;22,37;45,00;2014-3-2;10:00
20,50;23,31;21,31;23,25;85,00;2014-3-2;11:00
20,50;24,31;21,56;24,25;58,00;2014-3-2;12:00
20,37;24,50;21,56;24,44;37,00;2014-3-2;13:00
20,62;24,56;21,87;24,56;52,00;2014-3-2;14:00
20,56;24,69;21,94;24,62;46,00;2014-3-2;15:00
20,69;25,00;22,25;24,94;47,00;2014-3-2;16:00
20,69;24,75;22,00;24,69;29,00;2014-3-2;17:00
20,75;24,87;22,06;24,81;20,00;2014-3-2;18:00
20,87;24,62;21,81;24,56;16,00;2014-3-2;19:00
21,37;25,75;23,12;25,69;35,00;2014-3-2;20:00
21,37;25,94;23,06;25,94;14,00;2014-3-2;21:00
21,31;25,75;22,75;25,69;24,00;2014-3-2;22:00
21,25;25,31;22,25;25,25;10,00;2014-3-2;23:00
21,06;24,69;21,69;24,62;11,00;2014-3-3;00:00
20,81;23,94;21,00;23,87;15,00;2014-3-3;01:00
20,56;23,37;20,56;23,31;19,00;2014-3-3;02:00
20,31;22,94;20,19;22,87;14,00;2014-3-3;03:00
20,06;22,56;19,75;22,44;25,00;2014-3-3;04:00
20,06;22,50;19,81;22,37;16,00;2014-3-3;05:00
20,19;22,50;20,06;22,44;31,00;2014-3-3;06:00
20,31;22,81;20,56;22,75;19,00;2014-3-3;07:00
20,12;23,00;20,19;22,94;8,00;2014-3-3;08:00
19,50;22,37;19,37;22,31;5,00;2014-3-3;09:00
19,37;22,00;19,12;21,87;13,00;2014-3-3;10:00
19,19;21,69;18,94;21,62;4,00;2014-3-3;11:00
19,06;21,50;18,75;21,44;6,00;2014-3-3;12:00
19,00;21,31;18,69;21,25;13,00;2014-3-3;13:00
18,87;21,31;18,62;21,25;12,00;2014-3-3;14:00
18,81;21,19;18,50;21,12;14,00;2014-3-3;15:00
18,81;21,31;18,75;21,25;6,00;2014-3-3;16:00
19,56;21,69;19,81;21,62;11,00;2014-3-3;17:00
19,87;23,75;21,19;23,69;27,00;2014-3-3;18:00
19,87;24,12;21,25;24,06;12,00;2014-3-3;19:00
19,94;24,31;21,50;24,25;9,00;2014-3-3;20:00
20,12;24,37;21,56;24,31;8,00;2014-3-3;21:00
20,19;24,44;21,56;24,44;11,00;2014-3-3;22:00
20,25;24,44;21,50;24,37;8,00;2014-3-3;23:00
20,00;23,94;20,81;23,87;0,00;2014-3-4;00:00
19,81;23,31;20,31;23,25;2,00;2014-3-4;01:00
19,62;22,87;19,94;22,81;5,00;2014-3-4;02:00
19,50;22,56;19,69;22,50;3,00;2014-3-4;03:00
19,37;22,25;19,44;22,25;1,00;2014-3-4;04:00
19,31;22,06;19,25;22,00;4,00;2014-3-4;05:00
19,44;22,06;19,50;22,00;7,00;2014-3-4;06:00
19,62;22,56;20,00;22,56;13,00;2014-3-4;07:00
19,56;22,62;19,75;22,56;4,00;2014-3-4;08:00
19,31;22,25;19,31;22,19;1,00;2014-3-4;09:00
19,19;22,00;19,19;21,94;1,00;2014-3-4;10:00
19,06;21,81;19,06;21,81;4,00;2014-3-4;11:00
18,94;21,75;19,00;21,69;1,00;2014-3-4;12:00
18,81;21,56;18,81;21,50;3,00;2014-3-4;13:00
18,75;21,44;18,62;21,31;0,00;2014-3-4;14:00
18,62;21,19;18,44;21,12;5,00;2014-3-4;15:00
18,75;21,25;18,69;21,19;3,00;2014-3-4;16:00
19,37;21,87;19,81;21,81;17,00;2014-3-4;17:00
19,75;23,62;21,12;23,56;26,00;2014-3-4;18:00
19,81;24,12;21,12;24,06;7,00;2014-3-4;19:00
20,00;24,19;21,37;24,12;10,00;2014-3-4;20:00
20,06;24,31;21,37;24,25;3,00;2014-3-4;21:00
20,19;24,44;21,62;24,37;6,00;2014-3-4;22:00
20,19;24,50;21,56;24,44;7,00;2014-3-4;23:00
20,00;24,06;21,00;24,00;2,00;2014-3-5;00:00
19,81;23,50;20,50;23,44;0,00;2014-3-5;01:00
19,69;23,06;20,19;23,00;2,00;2014-3-5;02:00
19,56;22,69;19,87;22,62;2,00;2014-3-5;03:00
19,44;22,37;19,56;22,31;1,00;2014-3-5;04:00
19,31;22,12;19,31;22,12;2,00;2014-3-5;05:00
19,44;22,06;19,50;22,06;5,00;2014-3-5;06:00
19,69;22,56;20,12;22,56;8,00;2014-3-5;07:00
19,44;22,69;19,69;22,62;1,00;2014-3-5;08:00
19,19;22,19;19,25;22,12;0,00;2014-3-5;09:00
19,06;21,87;19,06;21,81;0,00;2014-3-5;10:00
18,94;21,69;18,87;21,62;0,00;2014-3-5;11:00
18,81;21,50;18,75;21,44;0,00;2014-3-5;12:00
18,69;21,44;18,62;21,31;0,00;2014-3-5;13:00
18,62;21,31;18,56;21,25;0,00;2014-3-5;14:00
18,50;21,25;18,44;21,12;4,00;2014-3-5;15:00
18,56;21,25;18,69;21,19;2,00;2014-3-5;16:00
18,87;21,69;19,19;21,62;2,00;2014-3-5;17:00
19,69;23,31;21,06;23,25;21,00;2014-3-5;18:00
19,75;23,87;21,31;23,81;6,00;2014-3-5;19:00
19,87;24,50;21,69;24,50;7,00;2014-3-5;20:00
19,87;24,50;21,50;24,50;4,00;2014-3-5;21:00
19,94;24,37;21,50;24,37;4,00;2014-3-5;22:00
20,00;24,25;21,37;24,19;2,00;2014-3-5;23:00
19,87;24,00;20,94;23,87;0,00;2014-3-6;00:00
19,75;23,56;20,62;23,56;0,00;2014-3-6;01:00
19,69;23,25;20,31;23,19;0,00;2014-3-6;02:00
19,62;22,94;20,06;22,87;0,00;2014-3-6;03:00
19,50;22,62;19,81;22,56;0,00;2014-3-6;04:00
19,37;22,37;19,50;22,31;0,00;2014-3-6;05:00
19,25;22,31;19,44;22,25;3,00;2014-3-6;06:00
19,69;22,69;20,12;22,62;2,00;2014-3-6;07:00
19,56;22,75;19,81;22,69;0,00;2014-3-6;08:00
19,37;22,50;19,62;22,44;0,00;2014-3-6;09:00
19,31;22,37;19,50;22,31;0,00;2014-3-6;10:00
19,19;22,31;19,50;22,25;0,00;2014-3-6;11:00
19,12;22,12;19,37;22,00;0,00;2014-3-6;12:00
19,00;21,94;19,12;21,87;0,00;2014-3-6;13:00
18,87;21,69;18,94;21,69;0,00;2014-3-6;14:00
18,75;21,56;18,87;21,56;0,00;2014-3-6;15:00
18,87;21,56;19,06;21,50;0,00;2014-3-6;16:00
19,06;22,00;19,56;21,94;0,00;2014-3-6;17:00
19,81;23,44;21,37;23,37;0,00;2014-3-6;18:00
19,81;24,12;21,25;24,06;0,00;2014-3-6;19:00
20,06;24,37;21,75;24,37;0,00;2014-3-6;20:00
20,06;24,50;21,62;24,50;0,00;2014-3-6;21:00
20,06;24,37;21,44;24,31;0,00;2014-3-6;22:00
20,00;24,12;21,19;24,06;0,00;2014-3-6;23:00
19,81;23,62;20,62;23,56;0,00;2014-3-7;00:00
19,69;23,19;20,25;23,12;0,00;2014-3-7;01:00
19,56;22,87;19,94;22,81;0,00;2014-3-7;02:00
19,44;22,56;19,69;22,50;0,00;2014-3-7;03:00
19,37;22,31;19,50;22,25;0,00;2014-3-7;04:00
19,25;22,12;19,31;22,00;0,00;2014-3-7;05:00
19,37;22,06;19,50;22,00;0,00;2014-3-7;06:00
19,62;22,62;20,06;22,56;0,00;2014-3-7;07:00
19,56;22,81;19,81;22,75;0,00;2014-3-7;08:00
19,31;22,37;19,44;22,31;0,00;2014-3-7;09:00
19,19;22,06;19,25;22,00;0,00;2014-3-7;10:00
19,06;21,94;19,19;21,87;0,00;2014-3-7;11:00
18,87;21,81;19,06;21,75;0,00;2014-3-7;12:00
18,81;21,62;18,94;21,56;0,00;2014-3-7;13:00
18,69;21,44;18,75;21,44;0,00;2014-3-7;14:00
18,62;21,31;18,56;21,25;0,00;2014-3-7;15:00
18,69;21,31;18,81;21,25;0,00;2014-3-7;16:00
18,87;21,75;19,06;21,69;0,00;2014-3-7;17:00
19,00;21,87;19,50;21,81;0,00;2014-3-7;18:00
19,75;23,62;21,56;23,56;0,00;2014-3-7;19:00
20,00;24,87;22,25;24,87;0,00;2014-3-7;20:00
20,19;25,25;22,31;25,19;0,00;2014-3-7;21:00
20,31;25,37;22,50;25,31;0,00;2014-3-7;22:00
20,25;25,19;21,94;25,12;0,00;2014-3-7;23:00
20,06;24,37;21,19;24,25;0,00;2014-3-8;00:00
19,87;23,62;20,62;23,62;0,00;2014-3-8;01:00
19,75;23,19;20,31;23,12;0,00;2014-3-8;02:00
19,69;22,87;20,00;22,81;0,00;2014-3-8;03:00
19,62;22,62;19,81;22,56;0,00;2014-3-8;04:00
19,50;22,44;19,62;22,37;0,00;2014-3-8;05:00
19,44;22,25;19,44;22,12;0,00;2014-3-8;06:00
19,31;22,06;19,31;22,00;0,00;2014-3-8;07:00
19,44;22,19;19,69;22,12;0,00;2014-3-8;08:00
19,69;22,81;20,37;22,75;0,00;2014-3-8;09:00
19,75;23,19;20,56;23,12;0,00;2014-3-8;10:00
19,81;23,37;20,81;23,31;0,00;2014-3-8;11:00
19,94;23,44;20,94;23,37;0,00;2014-3-8;12:00
19,94;23,62;20,94;23,62;0,00;2014-3-8;13:00
19,94;23,69;21,06;23,69;0,00;2014-3-8;14:00
20,12;23,69;21,00;23,62;0,00;2014-3-8;15:00
20,06;23,56;20,69;23,50;0,00;2014-3-8;16:00
20,12;23,44;20,56;23,37;0,00;2014-3-8;17:00
20,06;23,06;20,37;23,00;0,00;2014-3-8;18:00
20,25;23,44;20,94;23,37;0,00;2014-3-8;19:00
21,06;25,31;22,94;25,25;0,00;2014-3-8;20:00
21,00;25,81;22,75;25,75;0,00;2014-3-8;21:00
21,00;25,50;22,50;25,44;0,00;2014-3-8;22:00
20,87;25,06;22,12;25,06;0,00;2014-3-8;23:00
20,81;24,69;21,81;24,62;0,00;2014-3-9;00:00
20,62;24,19;21,19;24,12;0,00;2014-3-9;01:00
20,44;23,69;20,81;23,62;0,00;2014-3-9;02:00
20,37;23,37;20,50;23,31;0,00;2014-3-9;03:00
20,19;23,06;20,25;23,00;0,00;2014-3-9;04:00
20,00;22,75;20,00;22,69;0,00;2014-3-9;05:00
19,87;22,50;19,81;22,44;0,00;2014-3-9;06:00
19,81;22,31;19,62;22,25;0,00;2014-3-9;07:00
20,00;22,44;20,06;22,37;0,00;2014-3-9;08:00
20,12;23,06;20,50;23,00;0,00;2014-3-9;09:00
20,19;23,25;20,75;23,12;0,00;2014-3-9;10:00
20,25;23,56;21,00;23,50;0,00;2014-3-9;11:00
20,25;23,75;21,19;23,69;0,00;2014-3-9;12:00
20,25;23,75;21,19;23,75;0,00;2014-3-9;13:00
20,31;23,87;21,19;23,75;0,00;2014-3-9;14:00
20,25;23,81;21,06;23,81;0,00;2014-3-9;15:00
20,31;23,75;21,06;23,69;0,00;2014-3-9;16:00
20,31;23,81;21,06;23,69;0,00;2014-3-9;17:00
20,31;23,75;20,94;23,69;0,00;2014-3-9;18:00
20,31;23,69;20,87;23,62;0,00;2014-3-9;19:00
20,56;24,00;21,75;23,94;0,00;2014-3-9;20:00
20,62;24,31;22,00;24,25;0,00;2014-3-9;21:00
20,87;24,75;22,12;24,69;0,00;2014-3-9;22:00
20,94;24,94;22,19;24,87;0,00;2014-3-9;23:00
21,00;25,00;22,19;24,94;0,00;2014-3-10;00:00
20,75;24,62;21,62;24,56;0,00;2014-3-10;01:00
20,56;24,19;21,25;24,12;0,00;2014-3-10;02:00
20,44;23,81;20,87;23,75;0,00;2014-3-10;03:00
20,37;23,50;20,62;23,44;0,00;2014-3-10;04:00
20,25;23,25;20,37;23,12;0,00;2014-3-10;05:00
20,31;23,12;20,56;23,06;0,00;2014-3-10;06:00
20,44;23,50;21,19;23,44;0,00;2014-3-10;07:00
20,44;23,62;20,75;23,56;0,00;2014-3-10;08:00
20,19;23,25;20,50;23,19;0,00;2014-3-10;09:00
20,19;23,37;20,62;23,31;0,00;2014-3-10;10:00
20,06;23,31;20,56;23,25;0,00;2014-3-10;11:00
20,06;23,25;20,50;23,19;0,00;2014-3-10;12:00
19,94;23,19;20,37;23,12;0,00;2014-3-10;13:00
19,87;23,12;20,31;23,12;0,00;2014-3-10;14:00
19,75;23,06;20,19;23,00;0,00;2014-3-10;15:00
19,81;23,00;20,50;22,94;0,00;2014-3-10;16:00
20,25;23,50;21,56;23,44;0,00;2014-3-10;17:00
20,69;25,31;22,87;25,25;0,00;2014-3-10;18:00
20,94;25,81;22,94;25,75;0,00;2014-3-10;19:00
21,00;25,81;22,81;25,75;0,00;2014-3-10;20:00
21,12;26,00;23,00;25,87;0,00;2014-3-10;21:00
21,12;25,81;22,87;25,81;0,00;2014-3-10;22:00
21,06;25,50;22,62;25,44;0,00;2014-3-10;23:00
20,81;24,87;21,75;24,81;0,00;2014-3-11;00:00
20,69;24,31;21,37;24,19;0,00;2014-3-11;01:00
20,62;23,94;21,00;23,87;0,00;2014-3-11;02:00
20,50;23,56;20,75;23,56;0,00;2014-3-11;03:00
20,31;23,37;20,56;23,31;0,00;2014-3-11;04:00
20,25;23,12;20,37;23,06;0,00;2014-3-11;05:00
20,31;23,12;20,56;23,06;0,00;2014-3-11;06:00
20,50;23,50;20,94;23,37;0,00;2014-3-11;07:00
20,37;23,62;20,69;23,56;0,00;2014-3-11;08:00
20,31;23,37;20,56;23,37;0,00;2014-3-11;09:00
20,25;23,50;20,75;23,44;0,00;2014-3-11;10:00
20,19;23,44;20,62;23,37;0,00;2014-3-11;11:00
20,06;23,25;20,50;23,25;0,00;2014-3-11;12:00
19,87;23,19;20,37;23,12;0,00;2014-3-11;13:00
19,81;23,06;20,25;23,00;0,00;2014-3-11;14:00
19,75;22,87;20,06;22,81;0,00;2014-3-11;15:00
19,87;22,87;20,37;22,81;0,00;2014-3-11;16:00
20,06;23,25;20,81;23,25;0,00;2014-3-11;17:00
20,19;23,50;20,87;23,44;0,00;2014-3-11;18:00
20,87;24,75;22,81;24,75;0,00;2014-3-11;19:00
20,94;25,69;22,87;25,62;0,00;2014-3-11;20:00
21,00;25,81;22,87;25,75;0,00;2014-3-11;21:00
20,94;25,56;22,69;25,50;0,00;2014-3-11;22:00
20,94;25,25;22,31;25,19;0,00;2014-3-11;23:00
20,75;24,62;21,56;24,56;0,00;2014-3-12;00:00
20,56;24,06;21,12;24,00;0,00;2014-3-12;01:00
20,44;23,69;20,75;23,56;0,00;2014-3-12;02:00
20,31;23,37;20,50;23,25;0,00;2014-3-12;03:00
20,19;23,06;20,31;23,00;0,00;2014-3-12;04:00
20,06;22,87;20,12;22,81;0,00;2014-3-12;05:00
20,12;22,81;20,31;22,81;0,00;2014-3-12;06:00
20,31;23,25;20,62;23,19;0,00;2014-3-12;07:00
20,19;23,31;20,44;23,25;0,00;2014-3-12;08:00
20,06;23,12;20,31;23,06;0,00;2014-3-12;09:00
20,06;23,25;20,56;23,19;0,00;2014-3-12;10:00
20,00;23,25;20,50;23,19;0,00;2014-3-12;11:00
19,75;23,12;20,31;23,00;0,00;2014-3-12;12:00
19,81;22,94;20,19;22,87;0,00;2014-3-12;13:00
19,69;22,81;20,06;22,75;0,00;2014-3-12;14:00
19,56;22,69;19,94;22,62;0,00;2014-3-12;15:00
19,69;22,69;20,19;22,62;0,00;2014-3-12;16:00
19,81;22,94;20,37;22,87;0,00;2014-3-12;17:00
20,00;23,25;20,56;23,19;0,00;2014-3-12;18:00
20,75;24,12;22,12;24,06;0,00;2014-3-12;19:00
20,62;25,12;22,25;25,06;0,00;2014-3-12;20:00
20,62;25,12;22,31;25,06;0,00;2014-3-12;21:00
20,62;25,00;22,06;24,94;0,00;2014-3-12;22:00
20,56;24,62;21,69;24,56;0,00;2014-3-12;23:00
20,37;24,25;21,25;24,19;0,00;2014-3-13;00:00
20,25;23,75;20,75;23,62;0,00;2014-3-13;01:00
20,12;23,31;20,44;23,25;0,00;2014-3-13;02:00
20,00;23,00;20,19;22,94;0,00;2014-3-13;03:00
19,87;22,75;20,00;22,69;0,00;2014-3-13;04:00
19,75;22,56;19,81;22,50;0,00;2014-3-13;05:00
19,87;22,56;20,00;22,50;0,00;2014-3-13;06:00
20,00;23,00;20,37;22,94;0,00;2014-3-13;07:00
19,94;23,12;20,25;23,06;0,00;2014-3-13;08:00
19,81;22,94;20,12;22,87;0,00;2014-3-13;09:00
19,81;23,12;20,37;23,00;0,00;2014-3-13;10:00
19,75;23,06;20,31;23,00;0,00;2014-3-13;11:00
19,56;22,94;20,12;22,87;0,00;2014-3-13;12:00
19,56;22,87;20,06;22,75;0,00;2014-3-13;13:00
19,44;22,75;19,94;22,69;0,00;2014-3-13;14:00
19,37;22,56;19,81;22,50;0,00;2014-3-13;15:00
19,44;22,50;20,00;22,44;0,00;2014-3-13;16:00
19,69;22,94;20,50;22,87;0,00;2014-3-13;17:00
19,81;23,25;20,81;23,19;0,00;2014-3-13;18:00
20,37;24,44;22,19;24,37;0,00;2014-3-13;19:00
20,69;25,56;22,75;25,50;0,00;2014-3-13;20:00
20,87;26,19;23,25;26,12;0,00;2014-3-13;21:00
20,87;25,94;22,81;25,87;0,00;2014-3-13;22:00
20,75;25,31;22,25;25,25;0,00;2014-3-13;23:00
20,56;24,75;21,62;24,69;0,00;2014-3-14;00:00
20,37;24,19;21,19;24,12;0,00;2014-3-14;01:00
20,25;23,75;20,81;23,69;0,00;2014-3-14;02:00
20,12;23,44;20,50;23,37;0,00;2014-3-14;03:00
20,00;23,12;20,25;23,06;0,00;2014-3-14;04:00
19,87;22,87;20,06;22,81;0,00;2014-3-14;05:00
19,94;22,81;20,31;22,81;0,00;2014-3-14;06:00
20,06;23,19;20,50;23,12;0,00;2014-3-14;07:00
20,06;23,25;20,37;23,19;0,00;2014-3-14;08:00
19,87;23,06;20,19;23,00;0,00;2014-3-14;09:00
19,87;23,06;20,31;23,00;0,00;2014-3-14;10:00
19,75;22,94;20,06;22,87;0,00;2014-3-14;11:00
19,62;22,69;20,06;22,62;0,00;2014-3-14;12:00
19,50;22,62;20,12;22,56;0,00;2014-3-14;13:00
19,37;22,44;19,56;22,37;0,00;2014-3-14;14:00
19,31;22,25;19,44;22,19;0,00;2014-3-14;15:00
19,44;22,37;19,87;22,31;0,00;2014-3-14;16:00
19,62;22,75;20,12;22,69;0,00;2014-3-14;17:00
19,69;22,94;20,12;22,87;0,00;2014-3-14;18:00
20,31;23,87;21,75;23,81;0,00;2014-3-14;19:00
20,44;24,69;22,00;24,62;0,00;2014-3-14;20:00
20,50;25,00;22,12;24,94;0,00;2014-3-14;21:00
20,50;24,94;22,00;24,87;0,00;2014-3-14;22:00
20,37;24,44;21,37;24,37;0,00;2014-3-14;23:00
20,19;23,94;20,87;23,87;0,00;2014-3-15;00:00
20,06;23,44;20,50;23,37;0,00;2014-3-15;01:00
19,94;23,06;20,19;23,00;0,00;2014-3-15;02:00
19,81;22,81;19,94;22,75;0,00;2014-3-15;03:00
19,75;22,62;19,75;22,56;0,00;2014-3-15;04:00
19,56;22,37;19,56;22,31;0,00;2014-3-15;05:00
19,44;22,19;19,37;22,12;0,00;2014-3-15;06:00
19,31;21,87;19,12;21,81;0,00;2014-3-15;07:00
19,37;21,87;19,37;21,87;0,00;2014-3-15;08:00
19,62;22,44;19,87;22,37;0,00;2014-3-15;09:00
20,50;24,06;21,75;24,00;0,00;2014-3-15;10:00
20,62;24,81;22,50;24,75;0,00;2014-3-15;11:00
21,06;25,75;23,19;25,69;0,00;2014-3-15;12:00
21,12;26,25;23,56;26,19;0,00;2014-3-15;13:00
21,19;26,37;23,50;26,31;0,00;2014-3-15;14:00
20,94;25,75;22,44;25,62;0,00;2014-3-15;15:00
20,81;25,00;22,06;24,94;0,00;2014-3-15;16:00
20,81;24,62;21,56;24,56;0,00;2014-3-15;17:00
20,81;24,19;21,56;24,12;0,00;2014-3-15;18:00
20,94;24,44;21,81;24,44;0,00;2014-3-15;19:00
21,25;25,25;22,81;25,19;0,00;2014-3-15;20:00
21,25;25,62;22,56;25,62;0,00;2014-3-15;21:00
21,19;25,25;22,31;25,19;0,00;2014-3-15;22:00
21,12;24,94;22,00;24,87;0,00;2014-3-15;23:00
21,00;24,56;21,62;24,50;0,00;2014-3-16;00:00
20,81;24,00;21,00;23,94;0,00;2014-3-16;01:00
20,56;23,50;20,75;23,44;0,00;2014-3-16;02:00
20,44;23,25;20,50;23,19;0,00;2014-3-16;03:00
20,31;23,00;20,31;23,00;0,00;2014-3-16;04:00
20,12;22,87;20,12;22,75;0,00;2014-3-16;05:00
20,06;22,69;19,94;22,56;0,00;2014-3-16;06:00
19,94;22,50;19,81;22,44;0,00;2014-3-16;07:00
20,44;22,62;21,00;22,62;0,00;2014-3-16;08:00
20,94;24,87;22,31;24,81;0,00;2014-3-16;09:00
20,81;24,94;22,00;24,87;0,00;2014-3-16;10:00
20,81;24,62;21,75;24,56;0,00;2014-3-16;11:00
21,12;24,81;22,31;24,75;0,00;2014-3-16;12:00
21,50;25,69;23,06;25,62;0,00;2014-3-16;13:00
21,37;25,75;22,87;25,69;0,00;2014-3-16;14:00
Data læses sådan her:
21,44; 24,19; 21,37; 24,12; 759,00; 2014-2-23; 13:00
gærspand; Rum; Relæ1; Relæ2;bobler; dato; klokkeslæt.

Jeg har dog fundet et par småting jeg skal have fikset i koden, som f.eks. måden den opdaterer display på. mens den opdaterer displayet venter Arduinoen på displayet, det gør at bobler der kommer mens den opdaterer display ikke bliver talt korrekt. Derfor skal jeg have nedsat opdateringsfrekvensen på displayet.
Desuden tager det for lang tid at gennemløbe programmet så jeg har lavet en lille ændring så den bruger det interne ur i stedet for at skulle spørge RTC modulet konstant.

Men alt i alt må jeg sige at det var en rigtig god test, og jeg er ret imponeret over at den faktisk registrerede lige over 12.000 bobler på en time det må siges at være "Aktivitet i gærlåsen"
Buy a man a beer and he wastes an hour. Teach a man to brew and he wastes a lifetime.
http://bryggeri.landly.dk
http://www.facebook.com/bryggerilandly
http://beersmithrecipes.com/listrecipes/2810/nimbus39
Brugeravatar
Nimbus39
Indlæg: 3392
Tilmeldt: 27. jun 2010, 09:52
Geografisk sted: Greve (Mosede Strand)
Kontakt:

Re: Datalogning af temperatur

Indlæg af Nimbus39 »

Så fik jeg lavet lidt om i min software til min egen datalogger/styring.
Den kan nu gære efter en profil, dvs. man for hver dag kan lægge de ønskede temperaturer ind i en simpel fil der blot indeholder en linje for hver dag:
20,25
21,26
Vil give min 20 og max 25 den første dag, og min 21 og max 26 den anden dag og så fremdeles....
Derudover er boksen nu bevidst om hvor langt den er nået i profilen, også selvom strømmen bliver afbrudt da den dagligt gemmer en værdi i en fil der fortæller hvor mange dage styringen har været aktiv.
Løber styringen tør for profil-data holder den bare fast i de sidst indlæste temperaturer.
Styringen holder også øje med relæerne der tænder og slukker for kilderne, bliver de for varme slukkes alt indtil temperaturen er nået ned under den angivne grænse.

Det hele ser således ud som kode:

Kode: Vælg alt

//biblioteker
#include <DS1307RTC.h>
#include <Time.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <SD.h>
#include <LiquidCrystal_I2C.h>
#include <StopWatch.h>

//Opstart af boards mm

// Dallas
// Data wire is plugged into port 5 Pause the Arduino
#define ONE_WIRE_BUS 5
#define TEMPERATURE_PRECISION 9
//SD kort
//CS on Pin 4
const int chipSelect = 4;

// LCD 1602
// set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd(0x27,20,4);  

//Definer variabler
tmElements_t tm;
StopWatch StopUr; //Stopur
boolean SourceOn, OnAllowed, OffAllowed, HeatOn, CoolOn, HeatAlarm, CoolAlarm, RelayAlarm, BlowerOn;
boolean ControlState = false;
boolean ProfileEnd = false;
float OldDag, OldSec, OldHour, OldMin, BlopCount, LastTemp, CurrTemp; 
int i, Pause, SOT, ElapDay, TempMax, TempMin;
// Blæser pin
const int BlowerPin = 1;
// the pin that the photogate is attached to
const int  PhotoPin = A0; 
// counter for the number of Blops
int BlopCounter = 0;
// current state of the buttPause
int PhotoState = 0; 
// previous state of the buttPause
int lastPhotoState = 0;     
// 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);
//datafil instans
File dataFile; // Systemet benytter 2 filer: Datalog.txt (temperatur og bobler) og Timelog.txt (Kilder tænd/sluk tidspunkter)
// Relætemperatur variabler
float CoolRelayTemp, HeatRelayTemp;
char TempDay[5]; // Array til lagring af data fra DAG.TXT filen.
char TempProfile[7]; //Array til lagring af profildata
String Day=""; //String hvori TempDay[] indlæses 
String Profile=""; //Streng til indlæsning af profildata fra fil.

//Parametre
//Her skrives de forskellige parametre styringen skal bruge, grader angives i hele grader C resten i minutter.
//const float TempMax=25;    //Øvre grænse for temperatur i gærtank. Angives i grader C.
//const float TempMin=20;    //Nedre grænse for temperatur i gærtank. Angives i grader C.
const float SourceOnTimeLimit=3;    //Styres af SOT og OffAllowed, angiver hvor lang tid en kilde minimum skal være tændt før den må slukkes. Angives i minutter.
const float VentTempSkift=10;  //Styres af Pause og OnAllowed, angiver hvor lang tid der minimum skal gå fra en kilde slukkes til der må tændes for en kilde. Angives i minutter.
const float RelayAlarmTemp=50;  //Maksimal temperatur et relæ må opnå før alarmen udløses og BEGGE relæer slukkes.
// Relæ og LED udgange.
int Cool = 7;  //Blå diode
int Heat = 6;  //Rød diode
int Beat = 8;  //Grøn diode 
int Styr = 3;  //diode på kontakt til relæstyring
int Alarm = 2; //diode på lyskontakt til display
char Control = A2;  //bruges til kontakt der angiver om relæ styring skal bruges.
  
void setup (void)
{
  tmElements_t TimeTest;
  OldDag = TimeTest.Day; // Sæt dagsvariable til nuværende dag.
  //Reset relæer, og nulstil flag
  SourceOn = false;
  OnAllowed = true;
  OffAllowed = false;
  CoolOn = false;
  HeatOn = false;
  BlowerOn = false;
  CoolAlarm = false; // Sæt alarm status til false for kølingrelæ
  HeatAlarm = false; // Sæt alarm status til false for varmerelæ
  RelayAlarm = false;
  pinMode(Cool, OUTPUT);
  pinMode(Heat, OUTPUT);
  pinMode(Beat, OUTPUT);
  pinMode(Styr, OUTPUT);
  pinMode(Alarm, OUTPUT);
  pinMode(BlowerPin, OUTPUT);
  pinMode(Control, INPUT);
  digitalWrite(Cool, LOW);
  digitalWrite(Heat, LOW);
  digitalWrite(Beat, LOW);
  digitalWrite(Styr, LOW);
  digitalWrite(Alarm, LOW);
  digitalWrite(BlowerPin, HIGH); // Blæser er slukket når PIN er HIGH
  // initialize the lcd
  lcd.init();                       
  lcd.backlight();  
  // initialize the Photogate pin as a input:
  pinMode(PhotoPin, INPUT);
  //
  if (RTC.read(TimeTest)) 
  {
    lcd.setCursor(0,0);
    lcd.print("RTC OK");
  }
  else 
  {
    if (RTC.chipPresent()) 
    {
      lcd.clear();
      lcd.print("RTC stoppet");
      delay(2000);
     } 
     else 
     {
      lcd.clear();
      lcd.print("RTC read error!");
      delay(2000);
     }
  }
  lcd.setCursor(7,0);
  // Start up the Dallas library
  sensors.begin();
  lcd.print("Sensor OK");
  lcd.setCursor(0,1);
  // Initialize SD-card
  pinMode(4, OUTPUT);     //  53 Pause a mega, 4 Pause a UNO
  if (!SD.begin(chipSelect)) {
    lcd.print("SD-kort fejl!");
    delay(2000);
    // dPause't do anything more:
    return;
  }
  lcd.print("Card OK");
  delay(2000);
  // Print parametre til lcd
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(TempMin, 0);
  lcd.print(">T<");
  lcd.print(TempMax, 0);
  lcd.setCursor(8,0);
  lcd.print("Alarm:");
  lcd.print(RelayAlarmTemp);
  lcd.setCursor(0,1);
  lcd.print("SOT:");
  lcd.print(SourceOnTimeLimit, 0);
  lcd.setCursor(8,1);
  lcd.print("Vent:");
  lcd.print(VentTempSkift, 0);
  delay(5000);
  lcd.clear();
  SkrivDisplay();
  CoolRelayTemp = sensors.getTempCByIndex(1); // Henter temp på Cool relæ
  HeatRelayTemp = sensors.getTempCByIndex(3); // Henter temp på Heat relæ
  StopUr.start();
  ElapDay = 0;
  //læs data fra DAG.TXT-filen, læg det ind i ElapDay.
  File dataFile = SD.open("dag.txt");
  if (dataFile) 
  {
    int h=0;//Nulstil tæller variable
    Day=""; //Ryd teksstreng
    while (dataFile.available())
    {
      h++;
      TempDay[h]=dataFile.read(); //Læg værdier fra fil ind i Array.
      Day += TempDay[h]; //Opbyg tekststreng med værdier fra fil
    } 
    ElapDay = Day.toInt(); // Sæt ElapDay til værdien fra fil omdannet til Integer.
  }
  // if the file isn't open, pop up an error:
  else 
  {
    lcd.clear();
    lcd.print("file read");
    delay(1000);
  }
  dataFile.close(); //Luk fil
}
//Funktioner
boolean RelayTemp()  // Overvåger temperaturen på relæerne
{
  CoolRelayTemp = sensors.getTempCByIndex(1); // Henter temp på Cool relæ
  HeatRelayTemp = sensors.getTempCByIndex(3); // Henter temp på Heat relæ
  if (CoolRelayTemp >= RelayAlarmTemp || HeatRelayTemp >= RelayAlarmTemp) // Hvis der er en alarm
  {
    RelayAlarm = true;
    SkrivTid("Relay Alarm;");
    digitalWrite(Cool, LOW);//sluk for køling
    digitalWrite(Heat, LOW);//Sluk for varme
    digitalWrite(Alarm, HIGH); // Tænd alarm diode
    // Sæt globale variabler
    SourceOn = false; 
    OffAllowed = true;
    OnAllowed = false;
    Pause = 0;
    SOT = 0;
    
    if (CoolRelayTemp >= RelayAlarmTemp) // Køle relæ er overophedet 
    {
      CoolAlarm = true; // Sæt global alarm
    }
    
    if (HeatRelayTemp >= RelayAlarmTemp) // Varme relæ er overophedet 
    {
      HeatAlarm = true; // Sæt global alarm
    }
    return false;
  }
 else // Hvis der ikke er en alarm
 {
   CoolAlarm = false; // Sæt alarm status til false for kølingrelæ
   HeatAlarm = false; // Sæt alarm status til false for varmerelæ
   RelayAlarm = false;
   digitalWrite(Alarm, LOW); // Sluk alarmdiode
   SkrivTid("Relay Alarm OK;");
   return true;
 }
}
boolean TempStyring() // tænder og slukker for varme og kulde
{
  if (RTC.read(tm)) // hvis ikke RTC kan læses returneres false
  {
    if (CurrTemp >= TempMax && !SourceOn && OnAllowed) //temp over max og intet er tændt: Tænd kulde
    {
      digitalWrite(Cool, HIGH);
      digitalWrite(Heat, LOW);
      SourceOn = true;
      OffAllowed = false;
      SOT = 0;
      Pause = 0;
      SkrivTid("Cold Pause;");
      CoolOn = true;
    }
    if (CurrTemp <= TempMin && !SourceOn && OnAllowed) // temp under min og intet er tændt: Tænd varme
    {
      digitalWrite(Heat, HIGH);
      digitalWrite(Cool, LOW);
      SourceOn = true;
      OffAllowed = false;
      SOT = 0;
      Pause = 0;
      SkrivTid("Heat Pause;");
      HeatOn = true;
    }
     if (CurrTemp < TempMax && CurrTemp > TempMin && OffAllowed) // temp er over min og under max: Sluk alt!
    {
      digitalWrite(Heat, LOW);
      digitalWrite(Cool, LOW);
      SourceOn = false;
      OnAllowed = false;
      Pause = 0;
      SOT = 0;
      SkrivTid("Source SOT;");
      CoolOn = false;
      HeatOn = false;
    }
  }
  else
  {
    return false;
  }

}
boolean DagSkift () //undersøger om dag er ændret
{
      if ( OldDag != tm.Day)
      { // hvis dag ændres
        OldDag= tm.Day;
        // Returner TRUE
        return true;
      }
      else
      { // Hvis dag ikke ændres
        //Returner FALSE
        return false;
      }
}
boolean TimeSkift () //undersøger om timetal er ændret
{
    //Set new time variables
    if (RTC.read(tm))
    {
      if ( OldHour != tm.Hour)
      { // hvis Time ændres
        OldHour= tm.Hour;
        // Returner TRUE
        return true;
      }
      else
      { // Hvis time ikke ændres
        //Returner FALSE
        return false;
      }
    }
}
boolean MinutSkift () //undersøger om Minuttal er ændret
{
  if (StopUr.elapsed()>57000)
  {
    //Set new time variables
    if (RTC.read(tm))
    {
      if ( OldMin != tm.Minute)
      { // hvis Minut ændres
        OldMin= tm.Minute;
        StopUr.stop();
        StopUr.reset();
        StopUr.start();
        // Returner TRUE
        return true;
      }
      else
      { // Hvis dato ikke ændres
        //Returner FALSE
        return false;
      }
    }
  }
  else
  {
    return false;
  }
}
/* bruges ikke, deaktiveret for at spare RTC kald.
boolean SekundSkift () //undersøger om Sekundtal er ændret
{
      if ( OldSec != tm.Second)
      { // hvis sekund ændres
        OldSec = tm.Second;
        // Returner TRUE
        return true;
      }
      else
      { // Hvis sekund ikke ændres
        //Returner FALSE
        return false;
      }
}
*/
boolean SetTemp() //Lægger værdier fra Profil-fil over i max og min.
{
  int h=0;
  h=Profile.indexOf(','); //find komma i datastreng.
  String TempTemp="";
  TempTemp=Profile.substring(0,h);
  TempMin= TempTemp.toInt();
  TempTemp="";
  TempTemp=Profile.substring(h+1);
  TempMax= TempTemp.toInt();  
}
boolean ReadProfile() //læs data fra filen, læg det ind i Profile variablen, kalder derefter SetTemp
{
  File dataFile = SD.open("Profil.txt");
  if (dataFile) 
  {
    int h=0;//Nulstil tæller variable
    Profile=""; //Ryd teksstreng
    if (dataFile.available())
    {
      do
      {
        
        Profile=dataFile.readStringUntil('\r'); //Læg værdier fra fil ind i Array.
        h++;
      }
      while (h<ElapDay); //læs fil indtil h bliver lig med ElapDay
    }
    if (Profile !="\0")
    {
      SetTemp(); //Læg værdier ind i de rette variabler.
      ProfileEnd = false;
    }
    else
    {
      ProfileEnd = true; // Er der ikke flere data i profilen
    }
  }
  // if the file isn't open, pop up an error:
  else 
  {
    lcd.clear();
    lcd.println("error opening file for read");
  }
  dataFile.close(); //Luk fil
}
boolean SkrivTid(String Tekst)
{
  dataFile = SD.open("tidlog.txt", FILE_WRITE);
  if (dataFile && RTC.read(tm)) {
  dataFile.print(Tekst);
  dataFile.print(';');
    // skriv dato og klokkeslæt til fil i formatet yyyy-mm-dd;hh:mm, passer med excel datoformat
  dataFile.print(tmYearToCalendar(tm.Year));
  dataFile.print('-');
  dataFile.print(tm.Month);
  dataFile.print('-');
  dataFile.print(tm.Day);
  dataFile.print(";");
   if (tm.Hour >= 0 && tm.Hour < 10) //skriv klokkeslæt i fil
   { 
    dataFile.print("0");
    dataFile.print(tm.Hour);
   }
   else
   {
     dataFile.print(tm.Hour);
   }
   dataFile.print(":");
   if (tm.Minute >= 0 && tm.Minute < 10)
   { 
    dataFile.print("0");
    dataFile.println(tm.Minute);
   }
   else
   {
     dataFile.println(tm.Minute);
   }
   dataFile.close();
  }  
  // if the file isn't open, pop up an error:
  else 
  {
    lcd.clear();
    lcd.print("error tidlog.txt");
    delay(2000);
  }
}
boolean SkrivDagFil ()
{
  //Skriv data til filen
  File dataFile = SD.open("dag.txt", FILE_WRITE); //Åbn fil
  if (dataFile) //Hvis filen er til rådighed
  {
    dataFile.seek(0); // Gå til start af fil
    dataFile.print(ElapDay); // Skriv værdi til fil
    dataFile.print('\0');
    dataFile.close();// Luk fil
    return true;
  }
  else // Hvis ikke filen er til rådighed
  {
    lcd.clear();
    lcd.print("Error DAG.TXT W");
    dataFile.close();// Luk fil
    delay(1000);
    return false;
  } 
}
boolean SkrivLog ()
{
  tmElements_t tm; 
  RTC.read(tm);// hent nyeste tid
  float FilData[5];  //array der indeholder de data der skal skrives til datafilen, værdi er antal sensorer plus en ekstra til bobler-værdien.
  for (i=0; i<=3; i++) //gennemløb array med data, og læg temperaturer i det. værdi er antal sensorer minus en.
  {
    FilData[i]= sensors.getTempCByIndex(i);
    // Data skrives i denne rækkefølge: Internal, CoolRelay, External, HeatRelay
  }
  //læg blob count i float array FilData på plads 4, skal rettes hvis der er flere/færre end 4 DS18B20
  FilData[4] = BlopCounter; //brug den sidste plads i array til bobler værdien.
  dataFile = SD.open("datalog.txt", FILE_WRITE);
  // if the file is available, write to it:
  if (dataFile && RTC.read(tm)) {
    for (i=0; i<=4; i++) //gennemløb array med data, og skriv data i filen. Værdi er antal DS18B20, sidste værdi der skrives er BlopCounter.
  {
    dataFile.print(FilData[i]);
    dataFile.print(";");
  }
  // skriv dato og klokkeslæt til fil i formatet yyyy-mm-dd;hh:mm, passer med excel datoformat
  dataFile.print(tmYearToCalendar(tm.Year));
  dataFile.print('-');
  dataFile.print(tm.Month);
  dataFile.print('-');
  dataFile.print(tm.Day);
  dataFile.print(";");
  
   if (tm.Hour >= 0 && tm.Hour < 10) //skriv klokkeslæt i fil
   { 
    dataFile.print("0");
    dataFile.print(tm.Hour);
   }
   else
   {
     dataFile.print(tm.Hour);
   }
   dataFile.print(":");
   if (tm.Minute >= 0 && tm.Minute < 10)
   { 
    dataFile.print("0");
    dataFile.println(tm.Minute);
   }
   else
   {
     dataFile.println(tm.Minute);
   }
   dataFile.close();
  }  
  // if the file isn't open, pop up an error:
  else 
  {
    lcd.clear();
    lcd.print("error datalog.txt");
  }
  BlopCounter= 0;  //Nulstil "Blop" tælleren
}

boolean SkrivDisplay()
{
  lcd.clear();
  lcd.print("B:");
  lcd.print(BlopCounter);
  if (BlowerOn)
  {
    lcd.setCursor(15,0);
    lcd.print("*");
  }
  if (ControlState)  //skriver kun hvis TempStyring er aktiveret.
  {
    if (HeatAlarm) // Hvis er er Heatalarm
    {
      lcd.setCursor(0,1);
      lcd.print("Heat-relay ALARM");
    }
    if (CoolAlarm) // Hvis der er en Coolalarm
    {
      lcd.setCursor(0,1);
      lcd.print("Cool-relay ALARM");
    }
    if (!RelayAlarm) // Hvis der ikke er en alarm
    {
      lcd.setCursor(7,1);
      lcd.print("P:");
      lcd.print(Pause);
      lcd.setCursor(12,1);
      lcd.print("A:");
      lcd.print(SOT);
      lcd.setCursor(0,1);
      lcd.print("T:");
      lcd.print(CurrTemp, 1);
    }
    if (CoolOn || CoolAlarm)
    {
      lcd.setCursor(7,0);
      lcd.print("CR:");
      lcd.print(CoolRelayTemp, 1);
    }
    if (HeatOn || HeatAlarm)
    {
      lcd.setCursor(7,0);
      lcd.print("HR:");
      lcd.print(HeatRelayTemp, 1);
    }
   }
   else // Hvis styring er deaktiveret skrives temperaturen
   {
     lcd.setCursor(0,1);
     lcd.print("T:");
     lcd.print(CurrTemp, 1); 
   }

}
boolean TempStyrDeakt () //Deaktiverer temp styring.
{
  ControlState = false;  //TempStyrng er inaktiv, sluk for evt. kilder der er tændt.
  digitalWrite(Heat, LOW);
  digitalWrite(Cool, LOW);
  digitalWrite(Styr, LOW);
  CoolOn = false;
  HeatOn = false;
  SourceOn = false;
  Pause = VentTempSkift;
}

//Hovedløkke
void loop()
{
  digitalWrite(Beat, HIGH);  //tænder grøn diode på frPauset der angiver programmet kører.
  if (analogRead(Control) >=1000)
  {
    ControlState = true;  // TempStyring er aktiv.
    digitalWrite(Styr, HIGH);
  }
  else
  {
    TempStyrDeakt();
  }
  if (MinutSkift()) // Hvis Minuttal er skiftet skal time undersøges, og temp skal undersøges.
  {
    sensors.requestTemperatures(); // Send the command to get temperatures
    CurrTemp = sensors.getTempCByIndex(0); // Hent temperatur fra gærspand, 0 er den første sensor på bussen - skal sættes til korrekt index!
    if (!RelayAlarm) // Hvis der ikke er en alarm
    {
      if (SourceOn) // Hvis der er en kilde tændt
      {
        SOT++; // SourceOnTime - tæller tiden en kilde har været tændt 1 op.
        Pause = 0; // Pause nulstilles da der ikke er nogen kilder tændt
      }
      else // Hvis ikke der er en kilde tændt
      {
        Pause++; // Pause - Tæller pausen mellem tændt og slukket 1 op.
        SOT = 0; // SourceOnTimeLimit må ikke tælle op så længe der ikke er tændt for noget.
      }
    }
    if (ControlState) // hvis styring er aktiv
    {
      if (!RelayAlarm) // hvis ikke der er en alarm på relæ temperaturer
      {
        TempStyring();
      }
    }
    if (RelayAlarm || SourceOn && ControlState) //Hvis der er en alarm eller der er tændt for en kilde skal blæser tændes
      {
          digitalWrite(BlowerPin, LOW); // Blæser er tændt når PIN er LOW
          BlowerOn = true;
      }
      else
      {
          digitalWrite(BlowerPin, HIGH); // Blæser er slukket når PIN er HIGH
          BlowerOn = false;
      }
    //SkrivLog();  // står dette kald her skriver den log hvert minut

    if (TimeSkift()) // hvis timetal skifter skal temp logføres sammen med antal bobler
    {
      SkrivLog();  // står dette kald her skriver den log hver time.
      if (DagSkift()) //hvis dag skifter
      {
        ElapDay++; //Tæl ElapDay en op hvis dag er skiftet.
        SkrivDagFil(); //Skriv den nye værdi til filen.
        if (!ProfileEnd) //Så længe enden af profil filen ikke er nået
        {
          ReadProfile(); //Indlæs data fra PROFIL.TXT og læg den ind i Max og Min.
        }
      }
    }
    SkrivDisplay(); //opdater display
  }
  // undersøg om kilder må slukkes eller tændes hvis der ikke er en alarm
  if (!RelayAlarm)
  {
    if (SOT >=SourceOnTimeLimit && SourceOn) // Hvis det er længere end SourceOnTimeLimit siden der sidst blev tændt for en kilde er det tilladt at slukke en kilde
    {
      OffAllowed = true;
    }
    else
    {
      OffAllowed = false;
    }
    if (Pause >=VentTempSkift && !SourceOn) // Hvis det er længere end VentTempSkift siden der sidst blev slukket for en kilde er det tilladt at tænde en kilde
    {
      OnAllowed = true;
    }
    else
    {
      OnAllowed = false;
    }
  }
  else // Hvis der er en alarm
  {
    OffAllowed = true;
    digitalWrite(Cool, LOW);//sluk for køling
    digitalWrite(Heat, LOW);//Sluk for varme
    digitalWrite(Alarm, HIGH); // Tænd alarm diode
  }
  // Tæl Bobler
  // read the Photogate input pin:
  PhotoState = digitalRead(PhotoPin);
    // compare the Photogate State to its previous state
  if (PhotoState != lastPhotoState) 
  {
    // if the state has changed, increment the counter
    if (PhotoState == HIGH) 
    {
      // if the current state is HIGH then the buttPause went from SOT to Pause:
      BlopCounter++;
    } 
   }
  // save the current state as the last state, for next time through the loop
  lastPhotoState = PhotoState;
  digitalWrite(Beat, LOW);  //slukker grøn diode på frPauseten der angiver at program kører
  delay(10);
}
Det er nok ikke den mest strømlinede kode, men den virker fint i min testopstilling, har endnu til gode at prøve den af i praksis.
Resultatet af en gæring vil være filer, der fortæller hvilke kilder der har været tændt/slukket på bestemte tidspunkter, logførte temperaturer for 4 målepunkter (spand, gærskab samt de 2 styrings relæer) - dertil kommer selve styringsfilerne der indeholder data om den ønskede temperatur og hvor mange dage styringen har været tændt. Alt sammen data der kan indlæses i f.eks. excell og behandles der.
Buy a man a beer and he wastes an hour. Teach a man to brew and he wastes a lifetime.
http://bryggeri.landly.dk
http://www.facebook.com/bryggerilandly
http://beersmithrecipes.com/listrecipes/2810/nimbus39
Besvar

Tilbage til "Microprocessor styring til ølbrygning"