Szukaj na tym blogu

niedziela, 24 marca 2013

RRDTool i wykresy


Dzisiaj napiszę kilka słów o wykresach.
Kupiłem cztery czujniki temperatury d18b20. Przykład ich podłączenia jest np tu. W sumie w sieci jest wiele takich przykładów.

Teraz chcę napisać nie jak zmierzyć temperaturę tylko jak narysować wykres tej temperatury. Najpierw napisałem programik, o taki:
#include <OneWire.h>
#include <DallasTemperature.h>

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

#define MAX_NUM_OF_DEVICES 8


// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

int numberOfDevices; // Number of temperature devices found

DeviceAddress arrTempDeviceAddress [MAX_NUM_OF_DEVICES];


// odstęp między pomiarami
#define ODSTEP_MIEDZY_POMIARAMI 60000


unsigned long ostatniCzasPomiaru = 0;


void setup(void)
{
  // start serial port
  Serial.begin(57600);

  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  if (numberOfDevices > MAX_NUM_OF_DEVICES)
    numberOfDevices = MAX_NUM_OF_DEVICES;
  
  for (int i = 0; i < numberOfDevices; i++)
  {
    // Search the wire for address
    if (sensors.getAddress(arrTempDeviceAddress [i], i))
    {
      sensors.setResolution(arrTempDeviceAddress [i], TEMPERATURE_PRECISION);
    }
  }
}


void loop(void)
{ 
  unsigned long czasPomiaru = millis();

  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  sensors.requestTemperatures(); // Send the command to get temperatures
  
  Serial.print(czasPomiaru);
  Serial.print(";");

  // Loop through each device, print out temperature data
  for(int i = 0; i < numberOfDevices; i++)
  {
    float tempC = sensors.getTempC(arrTempDeviceAddress [i]);
    if (tempC > -127.0) // -127.0 to brak odczytu z sensora
      Serial.print(tempC);
    Serial.print(";");
  }
  
  Serial.println();
  
  
  // obliczenie ile czasu czekać do następnego pomiaru
  
  long waitTime = ODSTEP_MIEDZY_POMIARAMI - (millis() - ostatniCzasPomiaru);

 
  ostatniCzasPomiaru += ODSTEP_MIEDZY_POMIARAMI;
  
  if (waitTime > 0) 
    delay (waitTime);
  
}
Program raz na minutę wysyła na RS232 informację o czasie od uruchomienia w milisekundach i wartości pomiarów z czterech czujników, coś takiego konkretnie:
492;-7.75;21.69;19.37;39.44;
60000;-7.88;21.69;19.37;38.94;
120000;-7.81;21.62;19.37;38.50;
...
Przechwytuję te wartości przy pomocy programu CoolTerm i zapisuję do pliku.
Można je następnie wkleić do np LibreOffice Calc i uzyskać taki wykres
Wykres z LibreOffice Calc
Wykres całkiem ładny jednak trzeba się trochę narobić aby go zrobić. Może i niedużo ale jednak. A ja chciałbym aby taki wykres sam się robił i jeszcze publikował gdzieś gdzie będzie dla mnie dostępny online.

I tu z pomocą przyszło mi narzędzie RRDTool. Bardzo (ale to bardzo) ogólnie mówiąc jest to narzędzie, które potrafi zbierać dane i tworzyć raporty (także w postaci wykresów).

Po napisaniu kilku prostych skryptów (windowsowe cmd + gawk) otrzymałem taki efekt:


Pełny zbiór kodów dostępny jest tutaj.

W dalszej części zajmę się publikowaniem tych wykresów w sieci oraz jakimś sposobem aby dane pomiarowe lądowały od razu w sposób automatyczny w bazie RRDTool i były publikowane na serwerze www.

Jeżeli Was to interesuje i chcielibyście wiedzieć coś więcej proszę o pytania.

Brak komentarzy:

Prześlij komentarz