blog.ijacek007.cz

Blog o všem trochu jinak.

Dnes si ukážeme zapojení pro měření teploty a vlhkosti ve fóliovníku. Celý systém bude napájen z trojice baterií 18650, které budeme nabíjet solárním panelem. Pojďme se podívat, jak to celé funguje.

Protože je měřené místo vzdáleno od domu a potencionálního napájení, rozhodl jsem se poprvé ve svých obvodech použít solární panel. Vybral jsem solární panel určený k nabíjení mobilních telefonů, který by měl teoreticky dosahovat maximálního výkonu 10W. Protože jsem nikdy podobný panel nezapojoval, objednal jsem si i modul měření proudu a napětí a chtěl jsem tedy měřit nejen teploty, ale také proud a napětí, které do sítě panel dodává. Bohužel jsem ale měřicí modul při testovacím zapojení zničil a než mi přijde nový modul, bude zapojení muset vydržet bez měřicího okruhu.


obrázek UPS Modul 3,7v to 5V

Protože solární panel dovede obvod zásobovat energií, jen pokud na něj dopadá dostatečné množství světla, musí zapojení obsahovat také baterie. Jinak by se modul od Wi-Fi odpojil pokaždé, když by kleslo napětí na panelu nebo přes noc. Baterie jsem tentokrát ale nekupoval, protože mi doma ležela stará powerbanka, u které umřela elektronika. Měřením jsem ale zjistil, že baterie jsou v pořádku, a tak jsem se rozhodl je do obvodu využít. Tím, že tedy máme teoreticky dva zdroje napájení, musíme také do obvodu zapojit modul, který se bude starat o nabíjení baterií, pokud je dostatek světla a o přepnutí napájení z baterií, pokud solární panel dostatečné množství energie nedodává. Zde jsem poprvé použil UPS modul, který je připraven na 3,7V baterii na vstupu, umí pracovat s rozsahem napětí 4,5 až 8 V, a na jehož výstupu je připraveno 5V.


obrázek nodemcu 0.9

Napájení tedy máme, teď už zbývá samotná programovací deska a také obvod pro měření požadované teploty a vlhkosti. Jako vývojovou desku jsem použil NODEMCU 0.9 osazenou známým čipem ESP8266. Deska oproti samotným ESP8266 čipům, které normálně používám, je připravena na napájení 5V, tedy nemusím nijak napětí z UPS modulu zmenšovat. Nevýhodou této desky je, že k ní nelze připojit externí Wi-Fi anténu, a tedy je nutné mít v místě měření alespoň trochu toho Wi-Fi signálu. Dalším příjemným faktem je, že je deska vybavena usb konektorem, a tak se dá nejen napájet, ale také rychle přeprogramovat a to chci využít, jakmile mi dorazí měřicí obvod. Také přemýšlím, že bych pro přesnost účinnosti měření panelu přidal i obvod pro měření intenzity slunečního světla.


obrázek měření teploty a vlhkosti ve skleníku

obrázek sorání panel a elektronika na dilně

Schéma zapojení je tedy velice prosté a najdete na něm vlastně jen popsané moduly, jelikož Powerbanka měla trojici článků spojenou do sebe, nechal jsem v celém obvodu všechny tři články. Jakmile jsem vše umístil do krabičky, zjistil jsem, že při nabíjení baterií solárním panelem se UPS modul docela zahřívá. Trochu mě to znervóznilo, a tak jsem přidal ještě jedno teplotní čidlo do rozváděče, abych si udělal představu o tom, jak moc v malé krabičce stoupá během dne teplota. Ono v samotném fóliovníku totiž za slunečních dní teplota dosahuje více jak 40 stupňů a v uzavřené krabičce je teplota přes slunečný den ještě o trochu vyšší.


obrázek Solární panel na foliovníku

obrázek Měřící obvody ve foliovníku

Krabici s elektronikou jsem sice mohl umístit i ven a tím docílit menší teploty uvnitř, nicméně jsem kvůli nepřízni počasí nakonec rozhodl, že bude jednodušší, když bude celá elektronika i s bateriemi „pod střechou“. Celé zapojení již několik dní spolehlivě funguje, nicméně kvůli absenci měřicího obvodu nemám ani ponětí, zda panel stíhá během dne nabíjet baterie. Jakmile mi měřicí obvod dorazí, určitě řídicí elektroniku přeprogramuji a změřím, kolik vlastně energie je panel do obvodu schopen dodávat.


obrázek pohled na hotové řešení


obrázek Nastaveni nodemcu 0.9 pod arduino

Zdrojový kód

Jde o velmi jednoduše modifikovaný původní kód který mi na ESP8266 běží doma a defacto dává jen jedinou stránku s naměřenými daty o jejíž analýzu se stará samotný server. Jak je vidět v kódu jsou v něm za komentované zmínky o měřícím modulu. Kód pro test stačí později jej přepravuji a novou verzi zveřejním. V kódu najdete i definované LED diody indikující připojení nebo odpojení od Wifi které ve skutečnosti připojené nejsou. Nicméně i tak jako celek je systém funkční a aktuálně výstup mohu zpracovávat na serveru.

/* 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
*/
// pro ina219 napetový a proudovy modul

#include <Wire.h>
//#include <Adafruit_INA219.h>

// definování adresy senzoru
//#define ADDR 0x40
// inicializace senzoru s nastavenou adresou z knihovny
//Adafruit_INA219 ina219(ADDR);

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#define DHTTYPE DHT22
#define DHTPIN1  14
#define DHTPIN2  12
//#define DHTPIN3  5
#define led_wifi_ok  1
#define led_wifi_ko  0




int jas = 255 ;
const char* ssid     = "matajnawifi";
const char* password = "SuperTajneHesloDoWifi";


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, 11); // 11 works fine for ESP8266
DHT dht2(DHTPIN2, DHTTYPE, 11); // 11 works fine for ESP8266
// DHT dht3(DHTPIN3, DHTTYPE, 11); // 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) +"*"; // 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)
{
  ///Wire.pins(sda, scl)
 // Wire.pins(13, 14);

  // napetovy a proudovy modul
  // ina219.begin();
  // nastavení kalibrace, k dispozici jsou 3 režimy
  // režim 32V a 2A má největší rozsahy, ale nejmenší přesnost
  // ina219.setCalibration_32V_2A();
  // režim 32V a 1A má lepší rozlišení průchozího proudu
  // ina219.setCalibration_32V_1A();
  // režim 16V a 400mA má nejlepší rozlišení proudu i napětí
  // ina219.setCalibration_16V_400mA();


  // 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

teploměr a vlhkoměr připojený k WiFi pomocí ESP8266

Minimalistické zapoiení teplotního a vlkostního čidla u desky ESP8266


Štítky článku elektronika | programovani | zahrada | zajimavosti |
Autor Ijacek.007 27.06.2018 Opravil(a) Iwíček zobrazeno 329x
Předchozí článek ESP32 s oled displejem jako počítadlo odvinutých metrů
Wi-Fi teploměr s ldc teplotou vlhkostí a indikátorem Wi-Fi signálu. Další článek


1

ondra_qbjmM

2018-06-27 11:16:17

Tento cip se vyborne hodi na wifi jammer :P


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