blog.ijacek007.cz

Blog o všem trochu jinak.

Dnes Vám ukáži příklad realizace měření teploty a vlhkosti v domě. Na jeden Wi-Fi modul esp8266 jsem napojil tři teploměry s vlhkoměrem dht22 a přidal jsem možnost regulovat jas na diodě, která indikuje připojení teploměru k Wi-Fi síti.


obrázek materiál pro teploměr

Rozhodl jsem se měřit teplotu a vlhkost ve všech místnostech mého skromného bydlení. Princip je následující, kde to půjdeu místím modul ESP tak, aby mohl zpracovávat údaje z více pokojů. Tím zmenším počet ESP modulů, jejich přenosu po síti i problémy s napájením jednotlivých modulů. Představa je tedy jasná. V každé místnosti bude teplotní a vlhkostní čidlo dht22. Bezdrátově budu moci informace z čidel načítat do systému.


obrázek teploměr příprava

Pro instalaci elektroniky jsem zvolil elektroinstalační panelovou krabičku, která bude připojena k vedlejší zásuvce napřímo. Ze přední části jsem umístil informační modrou led diodu, která informuje zda je modul připojen k Wi-Fi. Aby bylo možné teploměr vypnout nebo restartovat, přidal jsem do krabičky z boční strany vypínač. Kabely z vypínače jdou již přímo na zdroj, který z 220v připraví požadované usměrnění 3,3V.


obrázek modul esp8266

K samotnému ESP modulu jsem si nachystal svorkovnici. Na obrázku je vidět, že u této instalace využívám jen jeden teploměr. Tato totiž bude v místnosti, kde okolo žádné další čidlo připojit pomocí kabelu nechci.


obrázek finalní instalace v krabici

Všude na internetu se píše o nepředvídaných výkyvech odběru modulu ze zdroje, kdy při generování připojení modul několikrát krátkodobě převyšuje standartní odběr. S objednaným zdrojem jsem si nevšiml, že by měl modul problémy, nicméně jsem pro jistotu přeci jen do zapojení přidal kondenzátor, který by se měl o výkyv postarat v případě, že by na něj neuměl zareagovat zdroj.


obrázek teploměr finálni instalace

Protože chci průběžně čidla přidat do všech místností a ne vždy je modrá dioda svítící do prostoru a informující o správném připojení k Wi-Fi síti vítaná, pravil jsem tedy kód tak, aby bylo možné jas diody regulovat. Přepnutím výstupu do analogu získáme možnost regulace od 0 do 255, kdy 0 je vypnuta a 255 je největší možný jas. Nastavení se zapisuje do modulu a tak jakmile teploměr restartujete znovu se hodnota nastaví na maximální jas.


obrázek teploměr stránka regulace jasu diody

Jas je možné jednoduše upravit pomocí posuvníku, kterým lze rychle nastavit požadovanou úroveň. Vzhledem k tomu že čidla budou vidět jen ve vnitřní síti a nebudou žádné data zpracovávat ani odesílat mimo domácí síť je není nastavení nijak chráněno a nastavit jej muže kdokoliv kdo zná webovou adresu.


obrázek pohled na webovou stránku modulu

Každý modul s teploměry bude fungovat jako jednoduchá webová stránka. Kdy jednotlivé teploměry budou odděleny znakem * a teplota od vlhkosti je oddělena znakem |. Nic více od esp nečekám. Všechny údaje si budu totiž načítat z opačné strany a to serverem kde budu informace zpracovávat. Toto řešení jsem zvolil hlavně proto, že poté mohu s daty nakládat ukládat nebo počítat s mnohem větším výkonem a nebudu závislý na esp. Také na jedné straně mohu upravovat výstupy, aniž bych musel znovu přeprogramovat všechny moduly.


obrázek instalace modulu esp8266 AP  mode

Ve chvíli kdy jsem měl nainstalovány dva ESP moduly, které sbíraly informace ze čtveřice teploměrů, jsem zjistil že standartní nastavení ESP8266 zapne kromě klienta k Wi-Fi ještě vlastní bezdrátový bod, který jde v okolí vidět a připojit se na něj. Takže jsem opět instalaci rozebral a zjišťoval jsem, jak mohu tento Acess Point vypnout. Po několikahodinovém laborování a nahrávání nových firmware jsem našel funkční příkaz, který v kódu programu funkci AP vypne. Konkrétně se jedná o příkaz

WiFi.softAPdisconnect(true);

Po nahrání nové verze již o sobě ESP informace nedává a funguje jen jako klient.

Celý mnou modifikovaný kód je s regulaci jasu vypnutým AP módem a vystup ze trojice dht22.

/* DHTServer - ESP8266 Webserver with a DHT sensor as an input

   Based on ESP8266Webserver, DHTexample, and BlinkWithoutDelay (thank you)

   Version 1.0  5/3/2014  Version 1.0   Mike Barela for Adafruit Industries
*/

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#define DHTTYPE DHT22
#define DHTPIN1  2
#define DHTPIN2  4
#define DHTPIN3  5
#define led_wifi_ok  12
#define led_wifi_ko  13
int jas = 255 ;
const char* ssid     = "Novotni-Krasov";
const char* password = "Moje-strasne-tajne-heslo-vam-tady-nenapisu";


ESP8266WebServer server(80);

// Initialize DHT sensor
// NOTE: For working with a faster than ATmega328p 16 MHz Arduino chip, like an ESP8266,
// you need to increase the threshold for cycle counts considered a 1 or 0.
// You can do this by passing a 3rd parameter for this threshold.  It's a bit
// of fiddling to find the right value, but in general the faster the CPU the
// higher the value.  The default for a 16mhz AVR is a value of 6.  For an
// Arduino Due that runs at 84mhz a value of 30 works.
// This is for the ESP8266 processor on ESP-01
DHT dht1(DHTPIN1, DHTTYPE, 22); // 11 works fine for ESP8266
DHT dht2(DHTPIN2, DHTTYPE, 22); // 11 works fine for ESP8266
DHT dht3(DHTPIN3, DHTTYPE, 22); // 11 works fine for ESP8266

float humidity1, temp_f1;  // Values read from sensor1
float humidity2, temp_f2;  // Values read from sensor2
float humidity3, temp_f3;  // Values read from sensor3

String webString="";     // String to display
// Generally, you should use "unsigned long" for variables that hold time
unsigned long previousMillis = 0;        // will store last temp was read
const long interval = 2000;              // interval at which to read sensor

void handle_root() {
 // server.send(200, "text/plain", "Hello from the weather esp8266, read from /temp or /humidity");
   gettemperature();       // read sensor
    webString=""+String(temp_f1)+"|"+String((int)humidity1)+"*"+String(temp_f2)+"|"+String((int)humidity2)+"*"+String(temp_f3)+"|"+String((int)humidity3)+"";   // Arduino has a hard time with float to string
    server.send(200, "text/plain", webString);            // send to someones browser when asked

  delay(100);
}

void setup(void)
{

  // Nastav pin D1 na zapis a nastav nizkou hodnotu (LED dioda nesviti)
 pinMode(led_wifi_ok, OUTPUT);
 analogWrite(led_wifi_ok, 0);

 pinMode(led_wifi_ko, OUTPUT);
 digitalWrite(led_wifi_ko, LOW);

  // You can open the Arduino IDE Serial Monitor window to see what the code is doing
  Serial.begin(115200);  // Serial connection from ESP-01 via 3.3v console cable
  dht1.begin();           // initialize temperature sensor1
  dht2.begin();           // initialize temperature sensor2
  dht3.begin();           // initialize temperature sensor3


 // nasstaveni wifi modu jen na clienta
 // WiFi.mode(m): set mode to WIFI_AP, WIFI_STA, or WIFI_AP_STA.
 // WiFi.mode(WIFI_STA);
 WiFi.softAPdisconnect(true);

  // Connect to WiFi network

  WiFi.begin(ssid, password);
  Serial.print("\n\r \n\rWorking to connect");

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

  server.on("/", handle_root);


 server.on("/jas", []() {
String nastav=server.arg("nastav");



if ((nastav.toInt() > -1 ) and (nastav.toInt() < 256)) {jas = nastav.toInt(); server.send(200, "text/html", "<!DOCTYPE html><html><body><input onchange=\"javascript:location.href='/jas?nastav=' + this.value\" type=\"range\" min=\"0\" max=\"255\" value=\""+nastav+"\" /> nastaveno " + nastav);}
else
{server.send(200, "text/plain", "neplatne zadani cekam 0/255 ");}
});



  server.on("/temp", [](){  // if you add this subdirectory to your webserver call, you get text below :)
    gettemperature();       // read sensor
    webString="Temperature: "+String((int)temp_f1)+" F";   // Arduino has a hard time with float to string
    server.send(200, "text/plain", webString);            // send to someones browser when asked
  });




  server.on("/humidity", [](){  // if you add this subdirectory to your webserver call, you get text below :)
    gettemperature();           // read sensor
    webString="Humidity: "+String((int)humidity1)+"%";
    server.send(200, "text/plain", webString);               // send to someones browser when asked
  });

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

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

 if (WiFi.status() == WL_CONNECTED) {  analogWrite(led_wifi_ok, jas);digitalWrite(led_wifi_ko, LOW);   }
 if (WiFi.status() == WL_DISCONNECTED) {analogWrite(led_wifi_ok, 0);digitalWrite(led_wifi_ko, HIGH);}

}

void gettemperature() {
  // Wait at least 2 seconds seconds between measurements.
  // if the difference between the current time and last time you read
  // the sensor is bigger than the interval you set, read the sensor
  // Works better than delay for things happening elsewhere also
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis >= interval) {
    // save the last time you read the sensor
    previousMillis = currentMillis;

    // Reading temperature for humidity takes about 250 milliseconds!
    // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
    humidity1 = dht1.readHumidity();          // Read humidity (percent)
    temp_f1 = dht1.readTemperature();     // Read temperature as Fahrenheit

    humidity2 = dht2.readHumidity();          // Read humidity (percent)
    temp_f2 = dht2.readTemperature();     // Read temperature as Fahrenheit

    humidity3 = dht3.readHumidity();          // Read humidity (percent)
    temp_f3 = dht3.readTemperature();     // Read temperature as Fahrenheit


    //float t = dht.readTemperature();
    // Check if any reads failed and exit early (to try again).
    if (isnan(humidity1) || isnan(temp_f1)) {
      Serial.println("Failed to read from DHT sensor 1!");
      return;
    }
  }
}

Mohlo by Vás zajímat

Minimalistické zapojení ESP8266 a DHT22

První zapojení ESP8266


Štítky článku elektronika | programovani | skutecnost |
Autor Ijacek.007 03.12.2016 zobrazeno 6 988x
Předchozí článek Minimalistický Wi-Fi teploměr s vlhkoměrem esp8266 s dht22
Jak pomocí Arduina přeprogramovat Wi-Fi relátko Sonoff basic Další článek


1

Jarda_Of9KM

2017-09-26 10:09:41

Dobru den chtěl bych se zeptat zdá by bylo možné předávat hodnoty z jednoho module ESP pro sběr dat do druhého přes wifi, který by sloužil ke zobrazování případně po arduina s web shieldem. Pochopil jsem z vašeho článku, že to máte asi podobné. Pokud ano nebo by jste věděl jak na to moc bych se přimlouval za zpracování tohoto projektu do dalšího clanku. Dekuji


gravatar2iconblog.ijacek007.cz

Ijacek.007

2017-09-29 19:28:23

zdravím Jardo, teď to mám uděláno tak že ESP je nastaven jako klient je připojen k mé domácí wifi síti a hodnoty nikam neposílá pouze je zobrazuje na ip adrese kterou jsem mu prostřednictvím Wifi přidělil. Poté následuje server který má nastaveno že prochází adresy modulu a data z nich vyčítá. Nicméně kvuli výkonu ale také díky tomu že server mi zároveň doma beží kvuli jiným projektum mám spracovavání na serveru Ubuntu na klasickém pc. Neanalizuji data žádným Arduinem ani dalším ESP abych mohl s daty nadále pracovat.


gravatar

Vložit komentář

Nick *:
WWW:
Email * (nezobrazuje se ):
Gravatar:
Pamatuj si mě:
Komentář článku *:
Opiš následující text: *

* - vyžadované údaje. RSS kanál s komentáři

Přihlášení



Audioknihy

Jsme milovníci audio knížek, kterých aktuálně máme zakoupených 194. Poslech všech dohromady zabral přes 2596 hodin.

Z tohoto množství jsme si již stihli poslechnout téměř 35% tedy 67 audioknih.

Aktuálně poslouchaná audioknihakniha je Artemis

Poslední hodnocenou audioknihou je Artemis .

Nejlépe hodnocenou audioknihou je Astronautův průvodce životem na Zemi .

Reklama