ATtiny85 - Teplomer s DS18B20

Zápisník experimentátora

Hierarchy: ATtiny85

V tomto článku si vyrobíme miniatúrny teplomer. Použijeme na to mikrokontrolér ATtiny85 a integrovaný obvod DS18B20. Výsledok budeme zobrazovať na displeji TM1637. Zapojenie súčiastok je jednoduché a celý projekt si možno postaviť na breadboarde.

Vychádzať budeme z nasledujúcej schémy. S takýmto zapojením ste sa už na tejto stránke stretli. Displej je pripojený na piny 2 a 3. Senzor teploty je v parazitickom napájaní a je pripojený na pin 7. Pri takomto zapojení treba dávať pozor na pin 7. Pokiaľ je pripojený senzor teploty, nebude sa vám dať naprogramovať mikrokontrolér pomocou USBasp. Treba ho pred programovaním mikrokontroléra odpojiť.

Zoznam súčiastok

Budeme potrebovať tieto súčiastky.

Použité knižnice

Potrebujeme nainštalovať nasledovné knižnice. Môžete na to využiť správcu knižníc. Hypertexty na zdrojové texty knižníc nájdete v zdrojovom kóde programu na serveri GitHub. Zdrojový kód je uvedený na konci článku.

  • TM1637Display - Ovládanie displeja TM1637.
  • OneWire - One Wire protokol.
  • DallasTemperature - Ovládanie senzora DS18B20 v parazitickom napájaní. Drobnou úpravou zapojenia získate napájanie v normálnom režime. Z hľadiska samotného programovania v tom nie je žiaden rozdiel. Knižnica si pri štarte zo senzora získa spôsob napájania a tomu sa prispôsobí.

Program

Program je jednoduchý, ale obsahuje niekoľko zaujímavých častí. V premennej SEG_ERR je definovaný text Err, ktorý sa zobrazí na displeji vtedy, keď nie je možné nájsť na zbernici One Wire žiaden senzor DS18B20. Využíva sa na to funkcia setSegments, ktorá priamo nastaví jednotlivé LED segmenty, ktoré vytvoria požadovaný nápis. Príklad takejto situácie je na druhej fotografii.

Ak sa senzor teploty nájde, v periodických intervaloch je z neho získaná teplota, ktorá sa zobrazuje na displeji. Teplota sa násobí hodnotou 100, aby sa zobrazila na displeji vo vhodnom formáte a desatinna bodka je určená pevne na druhom znaku. Príklad je na prvej fotografii. Program nie je upravený na záporné teploty. Ak by ste to chceli urobiť, je treba myslieť na to, že na znamienko mínus bude potrebná prvá pozícia na displeji. Desatinnu bodku v takom prípade treba posunúť na tretiu pozíciu.

Na senzore je nastavené maximálne rozlíšenie a teplota je z neho získavaná veľmi často. Je to tak nastavené preto, aby ste sa s príkladom mohli hrať a testovať, ako reaguje senzor teploty napríklad na teplo ľudských prstov. Tento príklad som použil aj na vytvorenie videa a aj preto som potreboval, aby bola reakcia veľmi rýchla. V praxi môžete pokojne znížiť rozlíšenie na 10 bitov a teplotu merať jedenkrát za minútu.

#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Module connection pins (Digital Pins)
#define CLK 4
#define DIO 3
#define ONE_WIRE_BUS 2

const uint8_t SEG_ERR[] = {
  SEG_A | SEG_D | SEG_E | SEG_F | SEG_G, // E
  SEG_E | SEG_G,                         // r
  SEG_E | SEG_G,                         // r
  0,                                     // space
};

TM1637Display display(CLK, DIO);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  display.setBrightness(0x02);
  sensors.begin();
  if (sensors.getDS18Count() == 0)
    display.setSegments(SEG_ERR);
  else
    sensors.setResolution(12);
}

void loop() {
  if (sensors.getDS18Count() != 0) {
    sensors.requestTemperatures();
    double temp = sensors.getTempCByIndex(0);
    display.showNumberDecEx(temp * 100, 0b01000000, false);
  }
  delay(1000);
}

Na nasledujúcej fotografii je na displeji zobrazená teplota, ktorú meria senzor DS18B20.

Na nasledujúcej fotografii je na displeji zobrazené chybové hlásenie, ktoré sa zobrazí vtedy, keď sa nepodarilo nájsť senzor teploty DS18B20. Senzor vidíte položený na stole vedľa breadboardu.

Zdrojový kód

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

Video

Video sa nachádza na serveri YouTube.



Video


05.01.2019


Menu