Připojený prohlížečem?

Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Připojený prohlížečem?

Příspěvek od Kwt 23 » 10 kvě 2020, 19:38

Zdravím všechny a prosím o radu,
Jak se dá v arduinu WiFi detekovat, že zrovna na prohlížeči prohlížím stránku, (arduino jako server).
Chtěl bych svoji meteostanici s logováním na SD kartu obohatit o bezdrát přístup.
A chtěl bych :
- Na kartu zapisuji po 5ti minutách
- Do prohlížeče posílat data častěji

Proto bych potřeboval rozlišit jestli se prohlížečem dívám na arduino nebo jsem už stránku zavřel. Příkazy jako Sever.available() nebo client.connected() zůstanou na jedničce i po odpojení. Když použiju client.stop() nemůžu zas připisovat data na konec tabulky v prohlížeči atp.

Dále bych se chtěl zeptat jak aktualizovat (synchronizovat) hodiny. K ukládání používám RTC modul a abych za měsíc neměl rozhozené hodiny, můžu získat aktuální čas voláním getTime() v Javascriptu ve stránce napsané v arduino serveru?

Je to můj první větší soukromý projekt a nemám představu pořádně jak tohle všechno elegantně vyřešit abych nepřetěžoval chudáka arduino.

Díky moc za pomoc.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Připojený prohlížečem?

Příspěvek od pavel1tu » 10 kvě 2020, 20:11

Nevím jak často vyčítáš data z čidel,
já toto řešil (s někým) ne na arduinu, ale třeba ti to pomůže.

- data se vyčítají co 30s ze všech čidel, ne ani kvůli meteostanici, ale vnitřním hodnotám
- do SQL na externí server (jako ty na SD) ukládám po 5 minutách - data co se naposledy vyčetly
- WWW stránku automaticky občerstvuji po 30s, nepřidávám tedy žádné řádky do tabulky, mám v "poli" uloženo posledních 30 měření, vypisuji různé průměry za den, hodinu, graf z posledních 30 měření atd.

čerpal jsem odsud
http://www.martyncurrey.com/esp8266-and ... e-webpage/

Kod nedávám, do Arduina se nevejde, je to upraveno na STM32 (a nedělal jsem to sám - jednalo se právě o přechod z MEGA na STM32, z mnoha různých důvodů)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Re: Připojený prohlížečem?

Příspěvek od Kwt 23 » 10 kvě 2020, 21:33

Pomohlo. Vůbec mě nenapadla možnost Scriptem znova dotazovat arduino a jak píšeš, číst hodnoty častěji jen si uklátat na SD ty pětiminutovky a zbytek mít připraven pro script. Jdu zkoušet. Jen to bude chtít víc paměti až budu přidávat rychlost větru a srážky :D
Jen to elegantně všechno vypsat pomocí cyklů v JS ať není mnoho textů v proměnných.

Ještě ta synchronizace hodin.

Díky díky moc.

Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Re: Připojený prohlížečem?

Příspěvek od Kwt 23 » 13 kvě 2020, 20:18

Tak jo, už to zkouším tři dny ale ten AJAX mi furt nejde. Rozchodil jsem bez problémů tlačítka (zkusil jsem i odkazy ale tlačítka jsou hezčí) ale podle Serial monitoru data odesílám, ale podle mých pomocných Scriptů a rozných čítačů na stránce ta ajaxová funkce nic nedelá...

Kód: Vybrat vše

#include <SPI.h>
#include <WiFiNINA.h>

const int LedPin = 13;
const int ZelPin = 12;

String HTML = R"=====(
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN\'>

<html>
<head>
 <title>Arduino říká..</title>
 <meta charset='UTF-8'>
  
</head>

<body> 

<!-- Stránka s pár pokusnými a pomocnými odstavci a odkazy -->

 <H1> Stránka Vole </H1>
 <p id = 'odstavec'>0</p>
 <p id = 'kontrola'>00</p>
 <p id = 'kontrola2'>000</p>
 <p id = 'pocitadlo'>0</p>
 </br>
 <!a href='?nic'>Odkaz na nic</a></br>
 <!a href='?neco'>Odkaz na něco</a>
 <form name='jeden' method='GET' action='http://192.168.88.239/'>
 <input type='hidden' name='1' value='nic'><input type='submit' value='nic'></form>
 <form name='druhy' method='GET' action='http://192.168.88.239/'>
 <input type='hidden' name='2' value='neco'><input type='submit' value='neco'></form>
 
<script language='JavaScript'>

var citac = 0;
var citat2 = 0;
var pocitadlo = 0;

var ajax = null;

ajax = new XMLHttpRequest();
function ajaxLoad(slovo)
{

  //alert("ajaxLoad()");
  if(!ajax)
  {
    document.getElementById('kontrola2').innerHTML = 'Je to v prdeli';
    return;
  }
   
   ajax.open('GET',slovo,true);
   ajax.send();
 
  ajax.onreadystatechange = function()
   {
    document.getElementById('kontrola2').innerHTML = citac2 ++;
    if(ajax.readyState == 4 && ajax.status == 200)
     {
      var odpoved = ajax.responseText;
      document.getElementById('odstavec').innerHTML = odpoved;
      document.getElementById('kontrola').innerHTML = citac ++;
     }
   } 
 
}

function pricti()
{
  //alert("Pricti()");
  ajaxLoad('chci');
  document.getElementByOd('pocitadlo').innerHTML = pocitadlo++;
 //setTimeout(pricti,1000);
}


var casovac = setInterval(pricti,1000);
//pricti();


</script>

</body>
</html>
)=====";



WiFiServer server(80);
WiFiClient client;


void setup() {
  pinMode(LedPin, OUTPUT);
  digitalWrite(LedPin, LOW);  
  pinMode(ZelPin, OUTPUT);
  digitalWrite(ZelPin, LOW);

  
  Serial.begin(9600);
  Serial.println("Můj server");

  // Přiojování k WiFi
  WiFi.begin("***","***");

  // Dokud není připojen
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print("-");
  }

  // Pohli jsme se dál! (připojili k WiFi)
  Serial.println("");
  Serial.println("Připojeno.");
  Serial.print("Adresa:");
  Serial.println(WiFi.localIP());

  // Aby se šlo vůbec připojit, musíme začít serverovat
  server.begin();


 

}

int sviti = 1;

int pripojeni = 0;
String neco;
int hodnota = 0;


void loop() {

  client = server.available();             // Pokud není pripojen žádný klient
  if (!client)
  {

    Serial.println("---- Nikde nikdo ----");// Zatim nikdo nepřipojen
    digitalWrite(LedPin,sviti);
    sviti = !sviti;                        // Přeblikáváme ledku každej projetí LOOPu
   

    client.stop();                         // Nevim jestli musí být ?
    
  }
  else
  {
     
    Serial.println("--------------Někdo se připojil---------------");
    Serial.print("Client: ");
    Serial.println(client.connected());
    Serial.print("Server: ");
    Serial.println(server.available());     // Info pro zajímavost, sleduju změny


      neco = client.readStringUntil('\r');  // Čtení řádku
      Serial.println(neco);                 // vypsání na serial monitor
      hodnota = analogRead(0);              // Přečtení poťáku
         
     if (neco.indexOf("chci") > 0)          // Obsahuje řádek slovo z AJAX scriptu
      {  
        
      Serial.print("Splněno: ");            // Ano obsahuje
      Serial.println(hodnota);           
      client.println(hodnota);              // Pošlem data
      

          

      }  
     else if(neco.indexOf("nic") > 0)
      {
        digitalWrite(ZelPin,HIGH);          // Zaktivujem odkazy ledkou
        client.println(HTML);                  // Musim přeposlat stránku :/
      }
     else if(neco.indexOf("neco")> 0)
      {
        digitalWrite(ZelPin,LOW);
        client.println(HTML);
      }
     else                                              // Nepřišlo z prohlížeče nic -> První připojení
      {
        client.println(HTML);                 // Pošleme celou stránku
      
    
      }

      
      delay(250);                           // počkáme
      Serial.print("Simon říká: ");
      Serial.println(neco);   
      client.flush();                       // Děj se co děj, vyprázdníme a ukončíme
      client.stop();  
      neco = "";                            // Pro jistotu vyprázdníme
      
    
       
  }




delay(250);



}
Jako neřekl bych že mám s JavaScriptem problém. Když tento script zkopíruju na extra stránku tak reaguje. Podle zakomentovanejch alert hlášek ty funkce normálně probíhají, alerty vyskakují, ale nepřepisuje to ani jeden čítač, natož aby mi to napsalo hodnotu z potenciometru... A to tam chci teplotu, vlhkost, tlak, slunko (intenzita a poloha) a časem ještě vítr a srážky :lol:
Pomoc prosím.

Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Re: Připojený prohlížečem?

Příspěvek od Kwt 23 » 13 kvě 2020, 20:26

Ještě jsem jen vyzkoušel, když se připojím telefonem, už se nepřipojím z počítače, je možné zpřístupnit stránku více než jednomu zařízení? Nečekal jsem že to bude takový problém.

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Připojený prohlížečem?

Příspěvek od kiRRow » 13 kvě 2020, 20:59

myslím že id toho html prvku by mělo být v "" ... zkus ...

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Připojený prohlížečem?

Příspěvek od kiRRow » 13 kvě 2020, 22:38

a jen abych tě naštval ... ulož si to jako html a poklikej si to :D

Kód: Vybrat vše

<html>
<head>
 <title>Arduino říká..</title>
 <meta charset='UTF-8'>
  
</head>

<body> 

<!-- Stránka s pár pokusnými a pomocnými odstavci a odkazy -->

 <H1> Stránka Vole </H1>
 <p id = "odstavec">0</p>
 <p id = "kontrola">00</p>
 <p id = "kontrola2">000</p>
 <p id = "pocitadlo">a</p>
 </br>
 <a href='#' onClick="document.getElementById('odstavec').innerHTML = 'Je to v prdeli';">Odkaz na nic</a></br>
 <a href='#' onClick="document.getElementById('pocitadlo').innerHTML = document.getElementById('pocitadlo').innerHTML + 'a';">Odkaz na něco</a>
 <form name='jeden' method='GET' action='http://192.168.88.239/'>
 <input type='hidden' name='1' value='nic'><input type='submit' value='nic' onClick="document.getElementById('kontrola').innerHTML = 'SHIT';""></form>
 <form name='druhy' method='GET' action='http://192.168.88.239/'>
 <input type='hidden' name='2' value='neco'><input type='submit' value='neco' onClick="document.getElementById('kontrola2').innerHTML = 'IS HAPPEN';"></form>

</body>
</html>
nebo si to testni online https://www.w3schools.com/code/tryit.as ... RHN0OBC1BM

ps:ty formuláře taky nejsou dobře napsané ... ale to až příště :)

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Připojený prohlížečem?

Příspěvek od pavel1tu » 14 kvě 2020, 07:25

kiRRow

Tak to mi spadla brada, HTML nedělám, ale tohle mne nadchlo.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Re: Připojený prohlížečem?

Příspěvek od Kwt 23 » 14 kvě 2020, 18:45

kiRRow -> Dobrý, volat události přímo na stránce není žádnej problém. Zamachruj a ty texty mi tam pošli z arduina.. Dík ;)

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Připojený prohlížečem?

Příspěvek od kiRRow » 14 kvě 2020, 19:01

Ty texty tam máš natvrdo uloženy v flash paměti. Pokud chceš na stránku vypsat nějaký data přímo z arduina, tak části té stránky musíš generovat za běhu.

Odpovědět

Kdo je online

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