ESP8266 - Teploměr s DS18B20

Zápisník experimentátora

Hierarchy: ESP8266

V dnešním článku bych chtěl začít pracovat s tématem jednoduchého teploměru, kterou budu postupně vylepšovat. V prvním článku si navrhneme jednoduchý teploměr pomocí mkrokontroléra ESP8266 a integrovaného obvodu DS18B20. Výsledek budeme zobrazovat na OLED displeji. Toto základní zapojení nám poslouží také v dalších článcích, ve kterých se budeme snažit odeslat shromážděné údaje o teplotě k Internetu do služby, která je určena pro sběr a vizualizaci hromadných dat.

Kombinaci mikrokontroléru ESP8266 a OLED displeje jsem použil proto, aby byl výsledek zajímavější. ESP8266 má WiFi připojení a proto je logické, pokud se výsledky měření odešlou prostřednictvím protokolu HTTP na vzdálený server. Toto je ale první článek ze série a ten se zabývá konstrukcí samotného teploměru. A protože je k článku i doprovodné video, na videu vypadá měření teploty lépe, když můžete měřenou teplotu vidět přímo na displeji.

K měření teploty je použit integrovaný obvod DS18B20. Ten je schopný pracovat ve dvou režimech.

Pokud použijete Arduino, můžete použít oba režimy. Arduino je schopné přes pin pustit poměrně velký proud, který je schopný napájet integrovaný obvod rovněž v parazitické napájení. ESP8266 pracuje s nižším napětím a přes pin pustí mnohem nižší proud. Výsledkem je to, že parazitické napájení nelze použít. Dá se to pouze pomocí úpravy zapojení, které je třeba doplnit o další součástky a proto se takovému zapojení nebudeme věnovat. Na naše účely to nemá smysl. Kromě toho se v poslední době začínají objevovat verze DS18B20 (pravděpodobně čínské napodobeniny nebo vyřazené obvody), které mají problémy s parazitickým napájením.

Použité součástky

Použil jsem tyto součástky.

Použité knižnice

Do Arduino IDE jsem doinstalovat jádro pro ESP8266.

Použil jsem tyto knihovny. Všechny se dají instalovat pomocí Správce knihoven.

Program

Program je jednoduchý. ESP8266 má omezený počet digitálních pinů, proto používám takové rozložení pinů, které kopíruje rozmístění pinů na desce NodeMCU. Na připojení displeje je použitých 5 pinů. Jeden pin je použit pro připojení integrovaného obvodu DS18B20, který měří teplotu. Program na začátku inicializuje OLED displej a OneWire sběrnici. Na displeji pak vypíše informační text. Pak mohou nastat dva stavy.

  • Pokud program nenašel připojen žádný senzor, vypíše na displej chybové hlášení.
  • Pokud program našel senzor teploty, na displeji bude v sekundových intervalech vypisovat měřenou teplotu. Sekundový interval je nastaven proto, abych mohl ukázat reakci senzoru ve videu. V praxi stačí měřit teplotu v delších intervalech.
#include <U8g2lib.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS D6

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

U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ D1, /* data=*/ D2, /* cs=*/ D5, /* dc=*/ D4, /* reset=*/ D3);
char draw[30];

#define LINE0 11
#define LINE1 22
#define LINE2 33
#define LINE4 44
#define LINE5 55

void setup() {
  u8g2.begin();
  u8g2.enableUTF8Print();
  u8g2.setFont(u8g2_font_helvR08_tf);

  u8g2.clearBuffer();
  u8g2.drawStr(0, 12, "Arduino Slovakia");
  u8g2.drawStr(0, 26, "DS18B20 Thermometer");
  u8g2.sendBuffer();

  sensors.begin();
  sensors.setResolution(12);

  Serial.begin(115200);

  delay(1000);

  Serial.println("Setup done");
}

void loop() {
  if (sensors.getDS18Count() != 0) {
    sensors.requestTemperatures();
    double temp = sensors.getTempCByIndex(0);
    Serial.println(temp);

    u8g2.clearBuffer();
    sprintf(draw, "Temperature");
    u8g2.setFont(u8g2_font_helvR08_tf);
    u8g2.drawUTF8(1, LINE0, draw);
    sprintf(draw, "%.02f °C", temp);
    u8g2.setFont(u8g2_font_helvB18_tf);
    u8g2.drawUTF8(15, LINE4, draw);
    u8g2.drawFrame(0, 0, 128, 64);
    u8g2.sendBuffer();
  }
  else {
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_helvR08_tf);
    u8g2.drawUTF8(1, LINE0, "Error");
    u8g2.drawFrame(0, 0, 128, 64);
    u8g2.sendBuffer();
  }
  delay(1000);
}

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.

Video

Video se nachází na serveru YouTube.

  • to-do

30.01.2019


Menu