Spínání rele pomoci DHT a nastavení hodnot přes wifi

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Spínání rele pomoci DHT a nastavení hodnot přes wifi

Příspěvek od Kony » 29 pro 2020, 11:36

Ahoj, snažím se udělat spínání relé pomocí teploty (DHT22)
pomocí tohoto kódu mi funguje spínání dle nastavené teploty, ale chtěl bych abych mohl tuto teplotu měnit pomocí wifi (serveru na arduinu).
Mám to zapojené na NODEMCU
Rozchozeni jednoduchych stranek na NODEMCU by asi neměl být problém, ale vubec nechápu jak udělat aby se zadaná hodnota ze stránek (spodní teplota kdy se má sepnout rele a vrchni teploty kdy se ma rele vypnout) pouzila v programu. A jak to potom bude při výpadku elektriky. Aby tyto hodnoty zůstaly zapsané. A samozřejmě když bych je chtěl změnit, abych se připojil na www NODEMCU a mohl je změnit
Potřeboval bych aby se relé seplo například u -2 a bylo seplé do +2 a pak zase vyplo

PS1: tak jsem kod upravil, aby se pripojil na wifi a pouzival meze na spinani rele, ale ted to dostat na web toho nodemcu

Kód: Vybrat vše

// připojení knihoven
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <SPI.h>
// nastavení čísla pinu s připojeným DHT senzorem
#define pinDHT D1
#define typDHT22 DHT22     // DHT 22

// inicializace DHT senzoru s nastaveným pinem a typem senzoru
DHT mojeDHT(pinDHT, typDHT22);

// Nazev Wi-Fi site, do ktere se mam pripojit
const char* ssid = "yyyyy";
// Heslo Wi-Fi site, do ktere se mam pripojit
const char* password = "ccccccccccc";
WiFiClient client;
WiFiServer server = WiFiServer(80); //port
int teplota_spodek = 25;
int teplota_vrsek = 26;

void setup() {
  // komunikace přes sériovou linku rychlostí 9600 baud
  Serial.begin(9600); 
  pinMode(D2, OUTPUT); //rele
  // zapnutí komunikace s teploměrem DHT
  mojeDHT.begin();
  // Pripojeni k Wi-Fi
 Serial.println();
 Serial.print("Pripojuji k ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);

 // Dokud nejsem pripojeny k Wi-Fi,zapisuj do seriove linky tecky progressbaru
 while (WiFi.status() != WL_CONNECTED) {
 delay(100);
 Serial.print(".");
 }

 // Jsem pripojeny k Wi-Fi a mohu pokracovat
 Serial.println();
 Serial.println("WiFi pripojena!");

 // Napis IP adresu, kterou mikropocitac dostal
 Serial.print("Pouzij k pripojeni tuto adresu: ");
 Serial.print("http://");
 Serial.println(WiFi.localIP());
 server.begin(); //spuštění serveru
}

void loop() {

  // pomocí funkcí readTemperature a readHumidity načteme
  // do proměnných tep a vlh informace o teplotě a vlhkosti,
  // čtení trvá cca 250 ms
  float tep = mojeDHT.readTemperature();
  float vlh = mojeDHT.readHumidity();
  // kontrola, jestli jsou načtené hodnoty čísla pomocí funkce isnan
  if (isnan(tep) || isnan(vlh)) {
    // při chybném čtení vypiš hlášku
    Serial.println("Chyba při čtení z DHT senzoru!");
  } else {
    // pokud jsou hodnoty v pořádku,
    // vypiš je po sériové lince
    Serial.print("Teplota: "); 
    Serial.print(tep);
    Serial.print(" stupnu Celsia, ");
    Serial.print("vlhkost: "); 
    Serial.print(vlh);
    Serial.println("  %");
    if (tep<teplota_spodek)digitalWrite(D2,LOW);
    if (tep>teplota_vrsek)digitalWrite(D2,HIGH);            
  }
  // pauza pro přehlednější výpis
  delay(2000);
}

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Spínání rele pomoci DHT a nastavení hodnot přes wifi

Příspěvek od Kony » 29 pro 2020, 13:30

Tak jsem dale upravil kod :
Nyní bych potřeboval pomoct jen na zmenu tech hodnot pres www

Kód: Vybrat vše

// připojení knihoven
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <SPI.h>
// nastavení čísla pinu s připojeným DHT senzorem
#define pinDHT D1
#define typDHT22 DHT22     // DHT 22

// inicializace DHT senzoru s nastaveným pinem a typem senzoru
DHT mojeDHT(pinDHT, typDHT22);

// Nazev Wi-Fi site, do ktere se mam pripojit
const char* ssid = "xxxx";
// Heslo Wi-Fi site, do ktere se mam pripojit
const char* password = "yyyyyyy";
WiFiClient client;
WiFiServer server(80);
int teplota_spodek = 25;
int teplota_vrsek = 26;
const char* stav_rele;

void setup() {
  // komunikace přes sériovou linku rychlostí 9600 baud
  Serial.begin(9600); 
  pinMode(D2, OUTPUT); //rele
  digitalWrite(D2,HIGH);
  // zapnutí komunikace s teploměrem DHT
  mojeDHT.begin();
  // Pripojeni k Wi-Fi
 Serial.println();
 Serial.print("Pripojuji k ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);

 // Dokud nejsem pripojeny k Wi-Fi,zapisuj do seriove linky tecky progressbaru
 while (WiFi.status() != WL_CONNECTED) {
 delay(100);
 Serial.print(".");
 }

 // Jsem pripojeny k Wi-Fi a mohu pokracovat
 Serial.println();
 Serial.println("WiFi pripojena!");

 // Napis IP adresu, kterou mikropocitac dostal
 Serial.print("Pouzij k pripojeni tuto adresu: ");
 Serial.print("http://");
 Serial.println(WiFi.localIP());
 server.begin(); //spuštění serveru
}

void loop() {
    float tep = mojeDHT.readTemperature();
    float vlh = mojeDHT.readHumidity();
      if (isnan(tep) || isnan(vlh)) {
    // při chybném čtení vypiš hlášku
    Serial.println("Chyba při čtení z DHT senzoru!");
  } else {
    // pokud jsou hodnoty v pořádku,
    // vypiš je po sériové lince
    Serial.print("Teplota: "); 
    Serial.print(tep);
    Serial.print(" stupnu Celsia, ");
    Serial.print("vlhkost: "); 
    Serial.print(vlh);
    Serial.println("  %");
    if (tep<teplota_spodek){
      digitalWrite(D2,LOW);
      stav_rele = "Zapnuto";
    }
    if (tep>teplota_vrsek){
      digitalWrite(D2,HIGH); 
      stav_rele = "Vypnuto";           
    }
    Serial.println(stav_rele);
  }
    delay(2000);
 // Listenning for new clients
  WiFiClient client = server.available();
  
  if (client) {
    Serial.println("New client");
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
                  client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            // your actual web page that displays temperature and humidity
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<head></head><body><h1>Teplota a vlhkost</h1><h3>Teplota : ");
            client.println(tep);
            client.print(" ");
            client.print((char)176);
            client.println("C</h3><h3>Vlhkost : ");
            client.println(vlh);
            client.println("%</h3><h3>");
            client.println("Stav : ");
            client.print(stav_rele);
            client.println("</body></html>");     
            break; 
      }
                delay(1);
            client.stop();
            Serial.println("Client disconnected."); 
      }
  }
}

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Spínání rele pomoci DHT a nastavení hodnot přes wifi

Příspěvek od martinius96 » 29 pro 2020, 16:08

Celý projekt by si si veľmi uľahčil, ak by si použil knižnicu ESP8266WebServer, ktorá ti handling toho klienta urobí a ty len klientovi pošleš to, čo chceš, urobíš si x podstránok, ktoré používaš, prípadne spracuješ dáta, ktoré očakávať GET / POST metódou.
Takto som postupoval aj u môjho projektu WiFi termostat na ESP8266 - NodeMCU v3 Lolin: https://martinius96.github.io/WiFi-termostat/

Ešte by som doplnil, že moje funkcie pre prácu s EEPROM: writeString používa EEPROM.put() a EEPROM.commit(), nakoľko to zapisujem rovno ako float() a cez EEPROM.write ide zapísať iba byte(). Read_String používa EEPROM.get(), ktorá mi hodnotu dokáže vytiahnuť ako float(), obdobne pre EEPROM.read(), ktoré prečíta iba byte. Z toho dôvodu používam EEPROM.put() a EEPROM.get(), nakoľko dokážu vytiahnuť ľubovoľný dátový typ z EEPROM.

Celý zdrojový kód tu bohužiaľ nedám, nakoľko je ten projekt k dispozícii iba v .bin skompilovanom tvare na Githube, dám ti tu len nejaké fragmenty, ktoré ti veľmi pomôžu pri riešení.

Napríklad v setupe:

Kód: Vybrat vše

  server.on("/", handleRoot); // HLAVNA STRANKA S VYPISOM, HTML FORM S ACTION NA action.html subor, method: GET
  server.on("/action.html", HTTP_GET, handleBody); //SPRACOVANIE DAT --> CEZ GET (obdobne by to šlo i cez post)
Hlavný prehľad + HTML form (len ukážka, fragment...) - stránka: / :
  • Všimni si hlavne metódu spracovania (GET) a akciu na súbor action.html (tým spracujem dáta nižšie)

Kód: Vybrat vše

void handleRoot() {
  String stranka = F("<!DOCTYPE html>");
  stranka += F("<html>");
  stranka += F("<head>");
  stranka += F("<meta charset='utf-8'>");
  stranka += F("<meta name='author' content='Martin Chlebovec'>");
  stranka += F("<meta http-equiv='Refresh' content='10'; />");
  stranka += F("<title>WiFi termostat - ESP8266</title>");
  stranka += F("</head>");
  stranka += F("<body>");
  stranka += F("<center><h3>Zadajte dáta pre webserver:</h3>");
  stranka += F("<form action='/action.html' method='get'>");
  stranka += "<b>Referenčná teplota:</b><br><input type='number' id='fname' name='fname' min='5' max='50' step='0.25' value=" + String(read_String(10)) + "><br>";
  stranka += "<b>Hysteréza:</b><br><input type='number' id='fname2' name='fname2' min='0' max='10' step='0.25' value=" + String(read_String(100)) + "><br>";
  stranka += F("<input type='submit' class='btn btn-success' value='Zapísať'>");
  stranka += F("</form><hr>");
  if (stav == "ZAP") {
    stranka += F("<b><font color='green'>Výstup: Zapnutý</font></b>");
  }
  if (stav == "VYP") {
    stranka += F("<b><font color='red'>Výstup: Vypnutý</font></b>");
  }
  stranka += F("<div id=\"countdown\"></div>");
  stranka += F("<b>Aktuálna teplota senzora DS18B20:</b> ");
  stranka += String(teplota);
  stranka += F(" °C");
  stranka += F("<hr>");
  stranka += F("<h3>Autor: Martin Chlebovec - martinius96@gmail.com - https://martinius96.github.io/WiFi-termostat/</h3>");
  stranka += F("<h4>Verzia free - 1.0.2.1 build: 24. Dec. 2020</h4>");
  stranka += F("</center>");
  stranka += F("</body>");
  stranka += F("</html>");
  server.send(200, "text/html", stranka);
}
Spracovanie dát z formulára (len ukážka, fragment...) - stránka: /action.html :
  • Request vyzerá takto (IP napríklad 192.168.1.100): 192.168.1.100/action.html?fname=20.35&fname2=0.25
  • Spracujem argument fname (cieľová teplota), vypíšem na UART, uložím do emulovanej EEPROM na offset 10
  • Spracujem argument fname2 (hysteréza), vypíšem na UART, uložím do emulovanej EEPROM na offset 100
  • Dáta sú uložené a dostupné aj po power-on cykle, reštarte ESP
  • Vždy, keď chcem vykonať logiku, vypísať túto hodnotu si ju vytiahnem z EEPROM hocikde v programe z konkrétneho offsetu
  • 5 sekúnd po spracovaní dát sa používateľ presmeruje naspäť na / stránku - meta Refresh tag.

Kód: Vybrat vše

void handleBody() {
  if (server.hasArg("fname")) {
    float cielova_teplota = server.arg("fname").toFloat();
    Serial.println(F("Dostali sme tieto data --> ref. teplota:"));
    Serial.println(cielova_teplota);
    writeString(10, cielova_teplota);
  }
  if (server.hasArg("fname2")) {
    float hystereza = server.arg("fname2").toFloat();
    Serial.println(F("Dostali sme tieto data --> hystereza:"));
    Serial.println(hystereza);
    writeString(100, hystereza);
  }
  String stranka = F("<!DOCTYPE html>");
  stranka += F("<html>");
  stranka += F("<head>");
  stranka += F("<meta charset='utf-8'>");
  stranka += F("<meta http-equiv='Refresh' content='5; url=/' />");
  stranka += F("<title>WiFi termostat - ESP8266 - spracovanie riadiach dát</title>");
  stranka += F("</head>");
  stranka += F("<body>");
  stranka += F("<center><h3>Server prijal data z formulára:</h3>");
  stranka += "<li><b>Referenčná teplota: </b>" + String(read_String(10)) + " °C</li>";
  stranka += "<li><b>Hysteréza: </b>" + String(read_String(100)) + " °C</li>";
  stranka += F("<b>Presmerovanie... Prosím čakajte</b></center>");
  stranka += F("</body>");
  stranka += F("</html>");
  server.send(200, "text/html", stranka); //vypisem stranku, po 5 sekundach presmerujem na / - ROOT stranku s hlavnym vypisom
}
Nezávisle na týchto funkciách a fragmentoch kódu vykonávam každých 10 sekúnd meranie z DS18B20 a na základe cieľovej teploty a hysterézy, ktorú mám navolenú riadim výstup - relé, ktorého stav si potom pri automatickom refreshi HTML stránky (meta Refresh tag) dynamicky mením aj vo vizualizácii pre používateľa.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Spínání rele pomoci DHT a nastavení hodnot přes wifi

Příspěvek od jankop » 29 pro 2020, 17:44

martinius96 ví co říká. V principu můžeš použít metodu GET i POST a pro odeslání dat použiješ formulář <form>.
Pro inspiraci se můžeš podívat třeba i na tohle, i když tam analogovou hodnotu nezadávám.
https://fancon.cz/esp8266-http-server-m ... duino.html

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Spínání rele pomoci DHT a nastavení hodnot přes wifi

Příspěvek od jankop » 29 pro 2020, 19:02

Jsem našel html, co jsem chtěl použít na termostat s ESP8266. Z toho by se dalo vyjít.

https://fancon.cz/common/termostat03.html

Kód: Vybrat vše

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta content="text/html; charset=utf-8">
<title>OTU</title></head><body style="font-family:Arial,sans-serif">
<form action="/" method="GET">
<table border="3" cellpadding="5" cellspacing="0" style="text-align:right;Font-weight:bold;font-size:medium;">
<caption>Thermostat SONOFF BASIC</caption>
<tr style="background-color:#dcdcdc"><td style="text-align:left">Device ID</td><td>127779</td><td style="text-align:center">-</td></tr>
<tr style="background-color:#f5f5f5"><td style="text-align:left">Relay status</td><td>ON</td><td style="text-align:center">-</td></tr>
<tr style="background-color:#f5f5f5"><td style="text-align:left">Actual temperature</td><td>20.4</td><td style="text-align:center">&deg;C</td></tr>
<tr style="background-color:#f5f5f5"><td style="text-align:left">Relay <select name="DIRECTION"><option value="DOWN">OFF</option><option value="UP" selected="selected">ON</option></select>at increase</td><td><input style="text-align:right;" type="text" name="SWITCHTEMP" value="60.50" size="6" ></td><td style="text-align:center">&deg;C</td></tr>
<tr style="background-color:#f5f5f5"><td style="text-align:left">Hysteresis</td><td><input style="text-align:right;" type="text" name="HISTERESIS" value="1.0" size="6" ></td><td style="text-align:center">&deg;C</td></tr>
<tr style="background-color:#f5f5f5"><td style="text-align:left">Manual control <input style="text-align:right;" type="checkbox" name="MANUAL" value="MAN"></td><td style="text-align:center"><input type="submit" name="RELAYSET" value="ON"></td><td style="text-align:center"><input type="submit" name="RELAYSET" value="OFF"></td></tr>
<tr style="background-color:#f5f5f5"><td style="text-align:left">Submit & Refresh</td><td></td><td style="text-align:center"><input type="submit" name="SUBMIT" value="SUB"></td></tr>
<tr style="background-color:#dcdcdc"><td style="text-align:left">Minimal temperature</td><td>20.4</td><td style="text-align:center">&deg;C</td></tr>
<tr style="background-color:#dcdcdc"><td style="text-align:left">Maximal temperature</td><td>20.4</td><td style="text-align:center">&deg;C</td></tr>
<tr style="background-color:#dcdcdc"><td style="text-align:left">WiFi signal strength</td><td>46.00</td><td style="text-align:center">%</td></tr>
<tr style="background-color:#dcdcdc"><td style="text-align:left">Free memory</td><td>35784</td><td style="text-align:center">Byte</td></tr>
<tr style="background-color:#dcdcdc"><td style="text-align:left">Firmware version</td><td>1.4</td><td style="text-align:center">-</td></tr>
</table></form></body></html>

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Spínání rele pomoci DHT a nastavení hodnot přes wifi

Příspěvek od Kony » 31 pro 2020, 10:41

ale to asi nepujde pouzit primo na NodeMCU ....

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Spínání rele pomoci DHT a nastavení hodnot přes wifi

Příspěvek od jankop » 31 pro 2020, 12:37

To není program, to jsou pro NodeMCU data. V tom HTML vidíš, jak se tvoří formuláře pro odesílání dat na server. Něco podobnýho mi momentálně běží na NodeMCU tady, jen tam není vstup dat z webové stránky:

http://109.183.159.104:5678/ a ještě to posílá data sem:

http://fancon01.tmep.cz/

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Spínání rele pomoci DHT a nastavení hodnot přes wifi

Příspěvek od KamilV » 01 led 2021, 21:02

Po zkušenosti z jiných vláken se raději zeptám: není to náhodou součástí komplexního řešení Tvé domácnosti?
Pokud ano, už máš webserver s mysql a bylo by nejjednodušší nastavovat si meze tam. NodeMCU by si jen sáhlo po nastavených hodnotách.
Samozřejmě může NodeMCU poskytovat nějakou nastavovací www stránku (jak je výše uvedeno), ale je to opruz a špatně se to udržuje / vylepšuje.

Takže si dokážu představit, že bude na plnohodnotném www serveru nějaké klikátko, kde si meze nastavím (třeba i s obrázky a JS vychytávkami), NodeMCU pak už bude jen klient, který si bude na nastavené hodnoty sahat a reagovat na ně. Výpadek proudu pak nemusíš ani řešit, protože bez proudu nepojede ani relátko samotné.

analytik
Příspěvky: 148
Registrován: 26 čer 2020, 12:48
Reputation: 0
Bydliště: Děčín

Re: Spínání rele pomoci DHT a nastavení hodnot přes wifi

Příspěvek od analytik » 02 led 2021, 06:50

Občas brouzdám po ramdomnerdtutorials.com a narazil jsem na zajímavý projekt využívající messenger Telegram:
https://randomnerdtutorials.com/telegra ... 2-esp8266/
Je tam dokonale popsaný příklad, který by tě mohl inspirovat.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Bing [Bot] a 17 hostů