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:
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:#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); }
492;-7.75;21.69;19.37;39.44;Przechwytuję te wartości przy pomocy programu CoolTerm i zapisuję do pliku.
60000;-7.88;21.69;19.37;38.94;
120000;-7.81;21.62;19.37;38.50;
...
Można je następnie wkleić do np LibreOffice Calc i uzyskać taki wykres
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