W5100 webserver po 6-24hod nedostupný

Viktor_EX
Příspěvky: 40
Registrován: 19 črc 2021, 11:18
Reputation: 0

W5100 webserver po 6-24hod nedostupný

Příspěvek od Viktor_EX » 25 zář 2022, 19:38

ahojte pánové, už ze mě dlouho nikdo neudělal kreténa, tak mám absťák

po delší době mám trochu volného času a vracím se ke svému projektu monitoringu FVE (protoze me trapi jedna drobnost)
mam arduino mega + W5100 ethernetshield + INA219 + INA3221 + barevny display.
pres I2C ctu napeti, ctu proudy, dokonce ovladam expander na ovladani rele, krmím barevny display pres tx/rx ... všechno funguje
prakticky jsem to všechno rozpohyboval na základě příkladů v základním znění.

data ale chci vidět na jednoduche html strance na mobilu na konkretni IP adrese.
pouzivam standardni webserver z arduino id, v soucasne dobe jsem se vratil k uplnemu zakladu tohoto webserveru (mel jsem tam hodne tabulkových tagů jako TR TD apod) + jsem doplnil zobrazovani asi 5 numerickych hodnot. vše funguje, ale ...
... ke koukání použivame asi 3 mobily a 2 pc ... když v prechodnem obdobi, kdy je malo slunce, koukam casteji, webserver se stane nedostupným asi po 6ti hodinách, když koukám méně, tak po 1-3 dnech. jednoduchý reset tlačítkem to napraví a vše jede supr dál, ihned se objeví stránka na všech zařízeních. uz jsem zmenil i IP, kdyby se to náhodou tlouklo s necim jinym. mam na routeru nastaven rozsah omezený DHCP, moji IP adresu pouzivam v rozsahu, kde mam jen pevne adresy v domě.
webserver mám v programu jako "podprogram", tedy samostatný void() a volám ho z hlavniho void() každé 2sec, a refresh html stránky je 4 sec.
samozřejmě než jsem vlezl do jámy lvové (sem) jsem vyčerpal všechny dostupné prostředky. našel jsem tema jako softreset pouze ethernetové karty, anebo tip, že se neuzavírají client.session, naplni se buffer a karta přestane komunikovat, anebo jsem pouzil funkci freeRam() nekde z internetu, ale to nepomohlo. jelikož nemám ambice stát se průmyslovým programátorem, spousta informací a znalostí mi chybí. softreset a to s temi session se mi nepodarilo realizovat.
jestli má někdo zapotřebí ze mě udělat debila, do toho (zkušenost z minule, cca 5 řádků programu se diskutovalo na 5-6 stranach fora dost nepříjemným způsobem). přesto by mi zároveň s tím pomohlo nějaké řešení. celá věc očividně funguje. takže hardwarově je to asi schopné existence. po vytuhnutí ethernetkarty ale arduino jede dál normálně, display bliká, dává čísla, všechno jede normálně.
možná než nejaké vytejrávání tady, a zkoušení mě z rozsáhlých neznalostí a dokazování mi, že strkám nos do věcí, kterým vůbec nerozumím, bych přivítal konstruktivní jednání s někým znalým, klidně za odměnu. přes PN si sjednáme telefony, emaily, opravdu bych to rád vyřešil.

diky předem, Viktor

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

Re: W5100 webserver po 6-24hod nedostupný

Příspěvek od martinius96 » 25 zář 2022, 20:26

Ahoj, pomohol by zdrojový kód tvojej aplikácie, alebo aspoň MRE.

Používaš pre HTML kód F() makro, aby si mal statickú webstránku vo flash pamäti a nie v RAM?
Dokáže to veľmi odlahčiť aplikáciu.
Aká je pamäťová náročnosť programu po kompilácii, koľko % zabranej RAM a flash programom?

Po nedostupnosti webservera vidíš UART výstup, alebo nemáš ani ten, že to Arduino úplne nereaguje?
Skús si nastaviť cyklický výpis napr. každých 30 sekúnd s MAC adresou Arduina a jeho IP.

Viktor_EX
Příspěvky: 40
Registrován: 19 črc 2021, 11:18
Reputation: 0

Re: W5100 webserver po 6-24hod nedostupný

Příspěvek od Viktor_EX » 25 zář 2022, 21:06

ahoj, uff, tak to je dost věcí, něco přes můj limit

takže, tohle program co mi dela webserver (ted v okudlany verzi, aby tam nebyl zbytečný balast)

Kód: Vybrat vše

void wwwserver(){

  Serial.println(freeRam());

  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
//    if (client.connect(server, 80)) {
//
//    }
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 4");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.print("<HTML lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>");
          client.print(" <HEAD  >");
          client.print("  <META content='text/html; charset=utf-8' http-equiv='Content-Type'>");
          client.print("  <link rel='shortcut icon' href='https://cdn.arduino.cc/header-footer/prod/assets/favicon-arduino/favicon.ico'>");
          client.print("  <link rel='icon' type='image/png' sizes='16x16' href='https://cdn.arduino.cc/header-footer/prod/assets/favicon-arduino/favicon-16x16.png'>");
          client.print("  <TITLE>OSTROVNÍ ELEKTRÁRNA</TITLE>");
          client.print("</HEAD>");

          // output the value of each analog input pin
            client.print("<font size='18'>");
            client.print("Batt Napětí: ");
            client.print(battVoltage);
            client.println("<br />");
            
            client.print("Min/Max: ");
            client.print(minVoltage);
            client.print(" - ");
            client.print(maxVoltage);
            client.println("<br />");

            client.print("SOC: ");
            client.print((SOC / (BattCap / 100)));
            client.print(" %");
            client.println("<br />");

            client.print("CHRG: ");
            client.print(chrgPower);
            client.print(" W (");
            client.print(String(int(reglPower[1] * battVoltage)));
            client.print(" + ");
            client.print(String(int(reglPower[2] * battVoltage)));
            client.print(")");
            client.println("<br />");

            client.print("LOAD: ");
            client.print(loadPower);
            client.print(" W");
            client.println("<br />");

            client.println("</font><br />");
          client.println("</html>");

          //while(client.connected()) {
          //  while(client.available()) Serial.write(client.read());
          //}
          
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
co to znamená HTML kod F() makro ... nevim, nepouzivam

tady je co píše arduino id
Projekt zabírá 33268 bytů (13%) úložného místa pro program. Maximum je 253952 bytů.
Globální proměnné zabírají 2623 bytů (32%) dynamické paměti, 5569 bytů zůstává pro lokální proměnné. Maximum je 8192 bytů.

UART ... nevím, musím vyzkoušet

teď mi jeden kamarad z rakouska poslal odkaz na toto:
https://forum.arduino.cc/t/reseting-eth ... o/281860/6

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

Re: W5100 webserver po 6-24hod nedostupný

Příspěvek od jankop » 25 zář 2022, 21:56

Ta tvoje okudlaná verze je prostě na nic. To by člověk musel být jasnovidec! Myslíš, že bychom balast, který může být příčinou tvých problémů nezkousli?
Dělal jsem monitor FVE pro kamaráda, ale veškeré údaje jsem bral s nabíječe/měniče přes jeho sériový výstup.

Viktor_EX
Příspěvky: 40
Registrován: 19 črc 2021, 11:18
Reputation: 0

Re: W5100 webserver po 6-24hod nedostupný

Příspěvek od Viktor_EX » 25 zář 2022, 22:44

balast (tvoreni tabulky tagy) je pryc, abych eliminoval mozny problem.

okudlana verze je na nic.... existuje jiná?, protože jinak mě tento výrok dál neposunul.
jak souvisí tahaní dat z regulatoru s vytvarenim html na webserveru?

zkusili jsme nahrát ted tohle: https://forum.arduino.cc/t/ethernet-shi ... e/276975/6
uvidim, jestli to bude tuhnout dál.

hezký večer

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

Re: W5100 webserver po 6-24hod nedostupný

Příspěvek od jankop » 25 zář 2022, 23:37

Ten můj výrok tě nikam posunout nemůže. To co prezentuješ, není program, pouze nepoužitelné torzo. Nevíš, kde ti to tuhne, ale ten tvůj "program" nemá ani základní nezbytnou strukturu. Setup(), loop(), definice proměnných, použité knihovny. Děláš si z nás legraci?

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

Re: W5100 webserver po 6-24hod nedostupný

Příspěvek od KamilV » 26 zář 2022, 13:58

Kód: Vybrat vše

// give the web browser time to receive the data
delay(1);
Tady bych mu zkusil dát víc, jak 1 ms.
Co napájení toho Ardu? Nezakolísá, když je na něj víc konexí? Je napájeno z dostatečně dimenzovaného adaptéru?

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: W5100 webserver po 6-24hod nedostupný

Příspěvek od gilhad » 27 zář 2022, 02:32

https://www.arduino.cc/reference/en/lan ... s/progmem/ poslední bod (The F() macro) ti ušetří spoustu RAM a nechá tě vypisovat řetězce přímo z flash paměti programu (kde stejně musí být uložené)

prostě místo (řetězec je uložený ve Flash, při startu se překopíruje do RAM a zabírá místo i tam a pak se vypíše z RAM)

Kód: Vybrat vše

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close"); 
budeš psát (řetězec je uložený ve Flash a pak se vypíše přímo z Flash a nežere žádné místo v RAM)

Kód: Vybrat vše

          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println(F("Connection: close")); 

Viktor_EX
Příspěvky: 40
Registrován: 19 črc 2021, 11:18
Reputation: 0

Re: W5100 webserver po 6-24hod nedostupný

Příspěvek od Viktor_EX » 27 zář 2022, 16:04

aha, diky, tak ja to vyzkousim.

ted jsem daval tuto cast programu na ukoncovani client.session:

Kód: Vybrat vše

      connectLoop++;

      if(connectLoop > 2000)
          {
            // then close the connection from this end.
            //Serial.println();
            //Serial.println(F("Timeout"));
            client.stop();
          }
          // this is a delay for the connectLoop timing
          delay(1);
nahore v programu je samozrejme definovana promenna a v na zacatku podprogramu vynulovana. to znatelně prodloužilo cyklus do nutneho resetu z 6 na asi 40 hodin, tedy vice nez 24 hodin, nicmene nutnemu resetu nezabranilo.
jeste dodatecna informace ... z pc mi jel ping 192.168.100.175 -t a kdyz webserver nereagoval, ping jel docela v pohode dal 2-4ms.

jeste jsem dal pryc vsechny serial.print/serial.write (nebo lepe zaremoval) a connectLoop snizil z 10000 na 2000 a jedem druhe kolo zkouseni.

s tim F to zni rozumne, uz to ted bezi pul dne, tak to necham bezet. v dalsim kole bych pouzil toto.
zkouseli jsme i funkci na zobrazovani aktivni session, ale tam se nam nepodarila rozebehnout knihovna #include <utility/socket.h> ... nahral jsem tam kde co, a stale to zde hazelo chybu.
asi takovy aktualni stav. asi by bylo reseni delat softreset jen te ethernetkarty kazdou hodinu,... ale zatim nevim jak, a asi to neni elegantni reseni. zrejme bude lepsi se prokousat a doplnit zakladni kod webserveru jeste o nutnou cast, aby se nezaplnovala pamet ram, nebo neobsazovaly session.
jinak jeste pro upresneni ... napajim to tim modrym usb kabelem, co se k arduinu kupuje (0,5m) ze step down zdroje 5A nastaveneho presne na 5V. kdyz by to bylo nutne, muzu to vysroubovat treba na 6V

Viktor_EX
Příspěvky: 40
Registrován: 19 črc 2021, 11:18
Reputation: 0

Re: W5100 webserver po 6-24hod nedostupný

Příspěvek od Viktor_EX » 30 zář 2022, 12:32

přidal jsem to F a nastavil delay z 1 na 5.
nepomohlo. za asi 1,5 dne zase to klopýtalo, sice to nevytuhlo uplne, ale není to řešení.na pc byla html vice nedostupná než dostupná

našel jsem toto:
https://www.youtube.com/watch?v=PeK2gAdqjas

a toto

https://startingelectronics.org/tutoria ... -tutorial/
nejlepe kapitola 8 (ale vsechny jsou zajimave)
takže se prokousávám tímto tématem, doufejme, že ten ajax pomůže. zatím mám běžet v hrubém testu 24 hodin, zatím běží prima.

PS: jankop: ne nedelam si z vas legraci, řeším reálný problém. proč bych si proboha dělal legraci? a očividně s mým problémem nejsem sám.

v každém případě ostatním díky za rady, ale nebylo to tím.

Odpovědět

Kdo je online

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