Problém s načtením webu
Problém s načtením webu
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
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
-
- Příspěvky: 1030
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: Problém s načtením webu
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š.
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š.
-
- Příspěvky: 1030
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: Problém s načtením webu
Tak jsem si zkusil kompilaci pro Arduino s knihovnou Ticker a nejde to přeložit, chybí tam nějaké další knihovny.
-
- Příspěvky: 1030
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: Problém s načtením webu
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.
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
#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();
}
}
}
}
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 __??__
Re: Problém s načtením webu
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
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
-
- Příspěvky: 1030
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: Problém s načtením webu
Ten zápis nechápu, můžeš mi ho přiblížit?
Jinak si myslím, že když nahraješ můj příklad, tak by měl normálně fungovat.
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));
Re: Problém s načtením webu
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
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
Re: Problém s načtením webu
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ří
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ří
-
- Příspěvky: 1030
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: Problém s načtením webu
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.
Prostě to, co jsem napsal nahraj rovnou a nezasahuj do toho.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 7 hostů