Szerverszoba hőmérséklet projekt v2: ESP8266, DS18B20

ESP8266_DS18B20Az előző bejegyzésben egy látványos változatát készítettem el a wifis hőmérséklet mérőnek. Az alábbiakban pedig egy olcsó és picike változat következik. A teljes beruházási költség Kínából számolva nem éri el az 1000Ft-ot és akár több szenzorosra is bővíthető. A programozáshoz szükség van egy USB-soros átalakítóra (FTDI/CH), de a használathoz már nincs. Az eredmény most is JSON objektumként fog weben megjelenni, ennek köszönhetően a Munin plugin azonos az előző változatban leírtakkal.

A szükséges alkatrészek

  • ESP8266 (ESP-1 változat), magyar ára jelenleg kb. 1000Ft, kínai ára 520Ft-tól
  • Dallas DS18B20 1wire modul (felhúzóellenállással), magyar ára 468Ft,  kínai ára 326Ft
  • [USB-soros átalakító (pl. FTDI232 vagy klónja)] – csak programozáshoz
  • [3.3V táp, pl. microUSB töltő + LM1117 3.3V stabilizátor IC, 500mA vagy nagyobb terhelhetőség ajánlott]

Szoftveres könyvtárak

Mind telepíthető a Vázlat -> Könyvtár tartalmazása -> Könyvtárak kezelése… menüpontból

Vezetékelés

A programozáshoz a GPIO0 lábat a GND-vel össze kell kötni, csatlakoztatni USB-re az FTDI232 modult, majd 5 másodperccel később elindítani a programozást. Hosszú várakozás után az ESP modul kilép a feltöltés módból, ilyenkor a folyamatot újra kell kezdeni. Az FTDI232 modulon a jumpert 3.3V állásba kell állítani!

DS18B20 ESP8266 ESP-1 FTDI232
Vcc Vcc Vcc 3.3V!
GND GND GND
DQ GPIO2
Rx Tx
Tx Rx
CH_PD -> Vcc
GPIO0 -> GND
(csak feltöltéshez)

A program

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const char* ssid = "LegyesHome";
const char* password = "12345678";

ESP8266WebServer server(80);

const int led = 13;

void handleRoot() {
  digitalWrite(led, 1);

  char temperatureStr[5];
  sensors.requestTemperatures();
  float temp1 = sensors.getTempCByIndex(0);
  dtostrf(temp1,2, 0, temperatureStr);

  String s = "{\"temperature\":";
  s += temperatureStr;
  s += ",\"location\":\"server_room_1\"";
  s +="}";

  server.send(200, "application/json", s);
  digitalWrite(led, 0);
}

void setup(void){

  Serial.begin(115200);

  sensors.begin();

  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp8266")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);
  server.onNotFound(handleRoot);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void){
  server.handleClient();
}

Sketch uses 253 203 bytes (58%) of program storage space. Maximum is 434 160 bytes.
Global variables use 35 788 bytes (43%) of dynamic memory, leaving 46 132 bytes for local variables. Maximum is 81 920 bytes.

Egyéb dolog, ami még kellhet

ESP8266 flasher

Munin plugin (PHP)

10 perc után...
10 perc után…
#!/usr/bin/php
<?php

if ( count($argv) == 2 && $argv[1] == 'autoconf' ) {
  exit('yes');
}

if ( count($argv) ==2 && $argv[1] == 'config' ) {
  echo 'graph_title Temperature'.PHP_EOL;
  echo 'graph_vlabel Celsius'.PHP_EOL;
  echo 'graph_category Sensors'.PHP_EOL;
  echo 'temperature.label Temperature'.PHP_EOL;
  echo 'temperature.type GAUGE'.PHP_EOL;
  echo 'temperature.colour COLOUR0'.PHP_EOL;
  echo 'temperature.draw AREA'.PHP_EOL;
  exit();
}

$json = file_get_contents('http://192.168.11.211');
$j = @json_decode( $json );

if ( isset( $j->temperature ) ) {
  echo 'temperature.value '.$j->temperature.PHP_EOL;
}
?>

A plugin helye esetemben a /usr/share/munin/plugins/esp8266 . Ennek futtathatónak kell lennie: sudo chmod +x /usr/share/munin/plugins/esp8266. Majd kell egy szimbolikus link: sudo ln -s /usr/share/munin/plugins/esp8266 /etc/munin/plugins. Végül újra kell indítani a node-ot: sudo service munin-node restart.
Remélem valaki hasznát veszi 🙂

Update #1

Meglepően egyenletesen karcol a kis olcsóság és mindig ad is értéket a DTH11-es modulommal ellentétben. A kis szünetet a grafikonban én okoztam, relévezérléssel kísérleteztem, sajnos nem ad le elég áramot a relémodul behúzásához, de egy LED-et el bír villogtatni. Szal’ valószínűleg tranzisztorral vagy FET-tel kell illeszteni a relét.

esp8266-day (1)