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.
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.
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.
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šší.
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.
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
ondra_qbjmM
2018-06-27 11:16:17Tento cip se vyborne hodi na wifi jammer :P
Vložit komentář
* - vyžadované údaje. RSS kanál s komentáři