DS18B20 a sviečkové grafy

Zápisník experimentátora

Hierarchy: Sviečkové grafy

V záverečnom článku celej série si zobrazíme reálne údaje zo senzora DS18B20 pomocou sviečkových grafov. Jedna sviečka bude ukazovať hodinový vývoj teploty a teplotu budeme merať každých desať sekúnd. Výsledok budeme zobrazovať na displeji Nokia 5110.

Reálne merania

Na nasledovných obrázkoch sú reálne situácie, ktoré som odmeral v našej kuchyni. Každá sviečka predstavuje jednu hodinu merania.

Pôvodne som chcel začať obrázkom, ktorý ukazuje, ako v noci pomaly klesá teplota. Celé zapojenie som mal v USB porte na notebooku a presne ráno, keď som vošiel do kuchyne, mohol som si už len pozrieť výsledok a keď som zobral do rúk fotoaparát, notebook sa uspal a spolu s ním aj USB. A tak nočné klesanie teploty na obrázkoch chýba.

Prvý obrázok preto pokračuje hneď ráno. Pekne je vidno, že akonáhle som sa začal pohybovať v kuchyni a variť čaj a zapínať notebook, stačilo to na to, aby sa teplota mierne zodvihla. Potom sa ustálila na hodnote 23,3 a tam vydržala až do obeda.

Akonáhle sme ale začali variť a súčasne aj chodiť na balkón po zeleninu, podarilo sa nám na pár minút stiahnuť teplotu v miestnosti o tri stupne dolu. Samotné varenie ale dodávalo do miestnosti energiu a tak sa zase začala teplota v miestnosti dvíhať hore.

Na druhom obrázku je pár hodín po obede. Teplota mierne stúpala, pretože vonku bolo po dvoch dňoch dažďov slnečné počasie. Predposledná sviečka, ktorá zaznamenala nárast teploty o 1,5 stupňa zaznamenáva okamih, keď sa do kuchyne oprelo zapadajúce októbrové slnko. Aj to stačilo na to, aby teplota prudko stúpla.

Akonáhle slnko zapadlo, teplota začala opäť klesať a tak by to pokračovalo až do rána. Z týchto dvoch obrázkov je jasne vidieť, ako nám dokáže 12 sviečok na grafe veľmi pekne zobraziť priebeh teploty.

Program

Každý senzor DS18B20 má vlastnú adresu. Môžete si ju zistiť napríklad programom, popisovaným v predchádzajúcom blogu. Mohli by sme trošku polemizovať nad tým, či je v tomto prípade, keď máme len jeden senzor, nutné používať pole, ale výstup zo spomínaného programu to vytvorí takto a kompilátoru je srdečne jedno, ako to napíšeme v c++. V nasledovnom kóde preto odkazujem na môj senzor ako da[0], aby bolo jasné, s ktorým senzorom pracujem.

#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

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// use your DS18B20 address
const DeviceAddress da[]={
  {0x28,0x49,0xBD,0x44,0x06,0x00,0x00,0x61}  // sensor 0
};

const int dacount=sizeof(da)/sizeof(DeviceAddress);

Nasleduje určenie dĺžky trvania jednej sviečky. Už som spomenul, že trvá jednu hodinu. Na ladenie je ale takýto interval nepraktický a preto som použil makro SPEED_HOURS. Ak je definované, sviečka má 60 minút, ak definované nie je, má dĺžku 10 sekund, tak ako sme to používali v predchádzajúcich príkladoch. Od tohto makra sa odvíja niekoľko parametrov. Napríklad makro MEASURE_DELAY, ktoré nastavuje prestávku medzi meraniami. Ak má jedna sviečka hodinu, nepotrebujeme merať príliš často a preto je tu nastavených 10 sekund. Vďaka tej prestávke sa nebude senzor ani samovoľne zahrievať, čo prispieva vyššej presnosti merania.

// Speed
// define SPEED_HOURS in normal conditions
// undef it in fast demo
#define SPEED_HOURS

#ifdef SPEED_HOURS
  // 10 secs between measurements
  #define MEASURE_DELAY 10000L
#else
  #define MEASURE_DELAY 200
#endif

#ifdef SPEED_HOURS
  // 12 bars, 60 min/bar, bar renderer
  OHLCChart<double, 12, 60000L*60, OHLCNokia5110BarRender<double> > ohlc;
#else
  // 12 bars, 10 sec/bar, bar renderer
  OHLCChart<double, 12, 10000L, OHLCNokia5110BarRender<double> > ohlc;
#endif  

Vo funkcii setup sa nastavia požadované parametre merania a pretože nechceme mať na prvej sviečke skok z 0 na aktuálnu teplotu, odmeriame si aj prvú teplotu a použijeme ju ako východiskovú hodnotu. Vodorovná mriežka je v prípade merania teloty ideálne nastavená na jeden stupeň Celzia.

double value=0.;

void setup() {
  ...

  // DS18B20
  sensors.begin();
  sensors.setResolution(da[0], TEMPERATURE_PRECISION);
  sensors.requestTemperatures();
  value = sensors.getTempC(da[0]);

  // connect renderer to Nokia 5110
  ohlc.getRender().setDisplay(&display);
  ohlc.setGridStep(1.);

  ...
}

Funkcia loop je v tomto prípade jednoduchá. Iba meriame teplotu a dodávame ju do objektu sviečkového grafu.

Keď som si teraz po sebe čítal napísaný zdrojový kód v c++, tak som si uvedomil, že predchádzajúce tvrdenie o počiatočnej hodnote a jej nastavení vlastne nie sú potrebné. Uhádnete prečo v tomto prípade nie je potrebný jeden riadok vo funkcii setup?

 

void loop() {
  sensors.requestTemperatures();
  value = sensors.getTempC(da[0]);
  //Serial.println(value);
  ohlc.addValue(value);

  ...
  
  delay(MEASURE_DELAY); // 5 values/second
} 

A celý program je vlastne hotový. Musel som ešte urobiť drobné úpravy v súbore candlestick.h, ale to sa už týkalo len zmeny parametra pre trvanie jednej sviečky, kde tiež potrebujeme mať unsigned long.

Zdrojový kód

Zdrojový kód sa nachádza na GitHub.



Download
  • DS18B20 - Programmable Resolution 1-Wire Digital Thermometer

22.10.2016


Menu