Problém s načtením webu

ok1vkt
Příspěvky: 26
Registrován: 06 úno 2018, 16:29
Reputation: 0

Problém s načtením webu

Příspěvek od ok1vkt » 07 bře 2018, 16:19

Pánové, dělám web kde budou vypsané hodnoty ze snímačů, a vše mi fungovalo do doby, dokud jsem nepřidal snímač DHT21 do programu. Nyní se mi budto www nenačte a nebo mi napiše nesmysly.
Mám nějaké tušení, že to asi souvisí s dobou než arduino přečte všechny snímače. Ale nevím....
Má někdo nějaký typ kde je problém, popřípadě jak udělat aby se data třeba ze snímače DHT21 četli třeba jednou za minutu? Dalo by se to použít i na Dallasy, nějaký větší interval.
Nebo něco takového, aby to odlehčilo procesoru.???
Popřípadě kde mam problém??

Program davam do přílohy
Eth_hodnoty_snimacu.ino
(4.23 KiB) Staženo 191 x

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

Re: Problém s načtením webu

Příspěvek od jankop » 07 bře 2018, 17:06

Ahoj,
tvůj problém je dle mého názoru jasný a relativně snadno řešitelný.
Musíš si uvědomit, že smyčka loop() se relativně rychle opakovaně provádí, cokoliv do ní vložíš,měl bys nějakým způsobem limitovat, aby se to nedělo třeba mnohokrát za sekundu. Prostě aby se tvoje čtení čidel dělalo pouze jednou za určený čas. Pak zjistíš, že procesor vlastně nemá co dělat. Dělá se to často pomocí millis(). Prostě zjišťuješ aktuální čas a podle toho podmínkou spouštíš požadovaný proces. Já preferuji jinou metodu. Používám knihovnu Ticker, kterou si definuji časová přerušení. Tahle knihovna je sice součástí Arduino ESP8266, ale měla by fungovat i na klasickém arduinu, není podle mě hw závislá. Arduino nemám, tak to nemohu vyzkoušet. Když se podíváš na můj web, tak tam ji používám. Časuji v jednom sketchi 2,5s čtení tlačítka, 10s čtení senzoru, 10s kontrola Wifi a 600s další proces. Běží to s jednoduchým a transparentním nastavením. Opravdu doporučuji vyzkoušet, knihovnu ti klidně někde vystavím, ať nemusíš tápat. Pak existuje od XPablo knihovna interval, která řeší něco podobného. Ta funguje tuším tak, že si vždycky řekneš, za jak dlouho se má činnost vykonat a pak ten čas opakovaně nastavuješ znova. Detaily najdeš u něho na webu. Když se tohle naučíš používat, tak na nějaké millis() ani nevzpomeneš.

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

Re: Problém s načtením webu

Příspěvek od jankop » 07 bře 2018, 17:51

Tak jsem si zkusil kompilaci pro Arduino s knihovnou Ticker a nejde to přeložit, chybí tam nějaké další knihovny.

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

Re: Problém s načtením webu

Příspěvek od jankop » 07 bře 2018, 18:28

Ale ten interval by měl fungovat. Zkusil jsem ti to naznačit v programu, ale bez Arduina to nepřeložím a nezkusím. V každém případě následující program by měl číst senzory každých 30s. Jak ti funguje část serveru jsem nezkoumal, ostatně ani nemám moc jak to udělat.

Kód: Vybrat vše

#include <interval.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <DHT.h>
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
#include <Ethernet.h>
#define BUS_0 40
#define BUS_1 41
#define BUS_2 42
#define BUS_3 43
#define BUS_4 44
#define SENSORTIME      30000 //************ cas v milisekundách
DHT dht (50, DHT21);                       // Dig.vstup 50, Snímač typ DHT21
Interval SensorRead;          //************


float teplota0;
float teplota1;
float teplota2;
float teplota3;
float teplota4;
float temp_Out;
float hum_Out;
OneWire oneWire0(BUS_0);
OneWire oneWire1(BUS_1);
OneWire oneWire2(BUS_2);
OneWire oneWire3(BUS_3);
OneWire oneWire4(BUS_4);

DallasTemperature sensors0(&oneWire0);
DallasTemperature sensors1(&oneWire1);
DallasTemperature sensors2(&oneWire2);
DallasTemperature sensors3(&oneWire3);
DallasTemperature sensors4(&oneWire4);

//LiquidCrystal_I2C lcd(0x27,20,4);          // LCD na adrese 0x27, 20zn,4řadky)

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 11);
EthernetServer server(80);


void setup(void) {
  Serial.begin(115200);
  dht.begin();
  //lcd.init();         // inicializuje displej
  //lcd.backlight();    // zapne podsvětlení
  //lcd.begin(20,4);    // 20znaků, 4řadky
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop(void) {
//-----------------------------------------------------------------
  if (SensorRead.expired()) {                               //*********************
    SensorRead.set(SENSORTIME); // set new interval period  //*********************
    Serial.println("Read sensor");
    //měření teplot DS18B20
    sensors0.requestTemperatures();
    sensors1.requestTemperatures();
    sensors2.requestTemperatures();
    sensors3.requestTemperatures();
    sensors4.requestTemperatures();

    teplota0= (sensors0.getTempCByIndex(0));   // Teplota v nádrži (water in)
    teplota1= (sensors1.getTempCByIndex(0));   // Teplota vody výstupní (Water Out)
    teplota2= (sensors2.getTempCByIndex(0));   // Teplota (Evaporator)
    teplota3= (sensors3.getTempCByIndex(0));   // Teplota za (After Evaporator)
    teplota4= (sensors4.getTempCByIndex(0));   // Teplota  __??__
    temp_Out = dht.readTemperature();         // Teplota venkovní
    hum_Out = dht.readHumidity();             // Venkovní vlhkost
    }
  //-----------------------------------------------------------------
  // když je připojen klient, zjistíme, zda jsou odeslána data
  // od klienta směrem k nám
  EthernetClient client = server.available();

  // dokud je klient připojen
  while (client.connected()) {

    // čti data od něj dokud nenarazíš na znak nového řádku
    if (client.available()) {
      char c = client.read();
      if (c == '\n') {
        // odešle klasickou hlavičku HTML stránky
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println("Connection: close");
        client.println();
        client.println("<!DOCTYPE HTML>");
        // zde již klasická html data
        client.println("<html>");
        client.println("<head>");
        client.println("<title>Tepelné čerpadlo</title>");            // Název stránky
        client.println("<meta http-equiv='refresh' content='5' >");   // refresh 5sec
        client.println("</head>");
        client.println("<body>");
        if (digitalRead(2)) {                                         //aktuální stav - předělat na makro!
          client.print(" Aktuální režim: <font color='green'>Běží</font>");
        } else {
          client.print(" Aktuální režim: <font color='red'>Vypnuto</font>");
        }
        client.println("</br>");
        client.println("</br>");
        client.println("Měřené hodnoty ze snímačů: ");
        client.println("</br>");
        client.println("Teplota vody v nádrži (Water In): "); client.print(teplota0); client.print(" °C");
        client.println("</br>");
        client.println("Teplota vody výstup (Water Out): "); client.print(teplota1); client.print(" °C");
        client.println("</br>");
        client.println("Teplota (Evaporator): "); client.print(teplota2); client.print(" °C");
        client.println("</br>");
        client.println("Teplota za (After Evaporator): "); client.print(teplota3); client.print(" °C");
        client.println("</br>");
        client.println("Teplota __??__ : "); client.print(teplota4); client.print(" °C");
        client.println("</br>");
        client.println("Venkovní teplota : "); client.print(temp_Out); client.print(" °C");
        client.println("</br>");
        client.println("Venkovní vlhkost : "); client.print(hum_Out); client.print(" % RHD");
        client.println("</br>");
        client.println("</body>");
        client.println("</html>");

        //ukončí přenos
        client.stop();
      }
    }
  }
}
Jo a knihovnu najdeš http://www.xpablo.cz/?p=421
Refresh webové stránky bych prodloužil, 5s je hodně málo.
Tohle je ve tvém programu správně? To jsem nějak nepochopil:

Kód: Vybrat vše

float teplota0 (sensors0.getTempCByIndex(0));   // Teplota v nádrži (water in)
  float teplota1 (sensors1.getTempCByIndex(0));   // Teplota vody výstupní (Water Out)
  float teplota2 (sensors2.getTempCByIndex(0));   // Teplota (Evaporator)
  float teplota3 (sensors3.getTempCByIndex(0));   // Teplota za (After Evaporator)
  float teplota4 (sensors4.getTempCByIndex(0));   // Teplota  __??__  

ok1vkt
Příspěvky: 26
Registrován: 06 úno 2018, 16:29
Reputation: 0

Re: Problém s načtením webu

Příspěvek od ok1vkt » 07 bře 2018, 21:11

Tohle tam je správně. Ale pokud ten program udělam jak si navrhnul, tak to pravě začně vyhazovat tady chyby....
Ono to bude asi tím, že ten "časák" nepustí tu část programu (resp.jednou za xx sekund) kterou já vypisuju na webu každé kolo defakto.

Jinak tyhle funkce tam mam proto, aby mi uložili do proměných ty naměřeny hodnoty teplot. A hodnoty zjištuju takto, abych nemusel adresovat jednotlivé snímače a byly do budoucna jednoduše vyměnitelné.

Ted teda nevim kde je problem že mi to nechce ten soft schroupnout :-(

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

Re: Problém s načtením webu

Příspěvek od jankop » 07 bře 2018, 21:16

Ten zápis nechápu, můžeš mi ho přiblížit?

Kód: Vybrat vše

float teplota0 (sensors0.getTempCByIndex(0));
float teplota1 (sensors1.getTempCByIndex(0));
float teplota2 (sensors2.getTempCByIndex(0));
float teplota3 (sensors3.getTempCByIndex(0));
float teplota4 (sensors4.getTempCByIndex(0));
Jinak si myslím, že když nahraješ můj příklad, tak by měl normálně fungovat.

ok1vkt
Příspěvky: 26
Registrován: 06 úno 2018, 16:29
Reputation: 0

Re: Problém s načtením webu

Příspěvek od ok1vkt » 07 bře 2018, 21:38

sensors0.requestTemperatures();
Toto je požadavek na změření,resp. aktualizování teploty na snímači 0.

float teplota0 (sensors0.getTempCByIndex(0));
A následně po tzv.přikazu změř teplotu viž výše, je třeba tuto naměřenou hodnotu uložit do nějaké proměné hodnoty (Float-typ čísla) a (teplota0 je zástupce proměné-toho čísla vlastně, kterou poté využívám dále-a budu ji volat i na více místech v programu) . A v zavorce je vlastně už číslo jako takové, získané tim příkazem sensors0.getTempC....)

No a těch čidel je tam dohromady 5 (0-4) takže se to opakuje ty příkazy, pro každý snímač zvlášt)


No blbě se mi to vysvětluje :lol:

ok1vkt
Příspěvky: 26
Registrován: 06 úno 2018, 16:29
Reputation: 0

Re: Problém s načtením webu

Příspěvek od ok1vkt » 07 bře 2018, 21:52

každopádně ta moje puvodni verze programu fungovala :-) viz obrazek. Pokud sem pripojil ten venkovni senzor DHT, tak mi to spadlo cely....
Určitě to bude tim, že ten DHT senzor je pomalej a brzdí ten program si myslim..... Takže ošetření nějakym tim časem-intervalem je zřejmě přesně to co potřebuju.... Ale jak ho tam nacpat, to už se mi nedaří :-(
web.jpg
web.jpg (48.97 KiB) Zobrazeno 4497 x

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

Re: Problém s načtením webu

Příspěvek od jankop » 08 bře 2018, 06:48

No pořád si ještě myslím, že když ten mnou upravený program nebudeš zpětně upravovat a pouze odblokuješ příkazy pro DHT, tak bude fungovat. Ta tvoje deklarace funkcí ve smyčce loop() včetně jejich volání je značně nestandardní a dřív nebo později narazíš. Nakrásně i kdyby tam nebyly problémy, které tuším, tak logika, že když chci v programu pracovat s teplotou, tak si ji musím vždycky znovu přečíst ze senzoru je zcestná.
Prostě to, co jsem napsal nahraj rovnou a nezasahuj do toho.

ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Reputation: 0
Kontaktovat uživatele:

Re: Problém s načtením webu

Příspěvek od ArduXPP » 08 bře 2018, 09:53

Asi moc nefungovalo, když tam máš -127 :)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů