Arduino schéma - arduino.sk

HTTP parser s Ethernet Wiznet W5100/W5200/W5300/W5500

Kompletné projekty s návodom a zdrojovým kódom
Príspevky: 43
Registrovaný: Uto 23. Dec 2014 2:15:50

HTTP parser s Ethernet Wiznet W5100/W5200/W5300/W5500

Poslaťod martinius96 » Ned 27. Máj 2018 17:28:04

Ahoj, chcem vám predstaviť useful súborík pre Arduino a Ethernet shield z rodiny Wiznet W5100 - 5500 (mimo W5400).
Sketch je kompatibilný, treba len zmeniť knižnicu pri W5200/W5300/W5500 na Ethernet2.h.
Funkčnosť spočíva v prečítaní správneho riadku prijatej response, je možné čítať ako textové súbory, tak i JSON, či HTML stránku a parsovať si niektorý riadok a ten si následne orezať..
Napr si prečítame príslušný riadok (úloha tohto sketchu): <h1>Dnes: 24°C v lokalite Poprad</h1>
Následne cez C funkciu si môžeme orezať tento riadok na: 24°C
Toto je práve úloha tohto parsera, prečítať riadok, ktorý potrebujeme, najľahšie sa aplikuje na textový súbor, kde je ten riadok presne daný, len ho treba správne vyrátať...
Response vyzerá následovne:
Obrázok
S premennou vieme pracovať veľmi jednoducho, napríklad:
Kód: Vybrať všetko
if(readString=="VYP"){
  Serial.println("Vypnutie spotrebica");
digitalWrite.... LOW;
  }else if(readString=="ZAP"){
  Serial.println("Zapnutie spotrebica");
digitalWrite.... HIGH;
  }

Týmto vieme prakticky ovládať výstupy z internetu na príslušných pinoch. Ethernet shield používa Webclient mód na pripojenie do internetu.
Priložený sketch demonštruje ovládanie ledky ako výstupu z mojej stránky s využitím ovládania hlasom, ktorý pozmení obsah textového súboru, ktorý Arduino periodicky číta. Riešenie používa čítanie 12-teho riadku response: (php5.sk webhosting), napríklad sweb.cz používa 10 riadkovú response.
HTTP parser:
Kód: Vybrať všetko
//Vytvoril: Martin Chlebovec
//Web: https://arduino.php5.sk
#include <SPI.h>
#include <Ethernet.h>
int led = 6;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //fyzicka adresa MAC
char serverName[] = "www.arduino.php5.sk"; // webserver
IPAddress ip(192, 168, 2, 40);
EthernetClient client;
String readString;
int x=0; //pocitadlo riadkov
char lf=10; //line feed character
void setup(){
pinMode(led, OUTPUT);
if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);
  }
  Serial.begin(9600);
}

void loop(){
if (client.connect(serverName, 80)) {  //starts client connection, checks for connection
    Serial.println("connected");
    client.println("GET /PHP_sk/preklady.txt HTTP/1.1"); //download text
    client.println("Host: www.arduino.php5.sk");
    client.println("Connection: close");  //close 1.1 persistent connection 
    client.println(); //end of get request
  }
  else {
    Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
    Serial.println();
  }

  while(client.connected() && !client.available()) delay(1); //cakaj na data
  while (client.connected() || client.available()) { //pramenna
    char c = client.read(); //dostan bity z buffera
    Serial.print(c); //cela http hlavicka
    if (c==lf) x=(x+1); //pocitaj
    else if (x==12) readString += c; //nasa premenna

   }
if(readString=="Zapni"){
  digitalWrite(led, HIGH);
  }else if(readString=="Vypni"){
  digitalWrite(led, LOW); 
    }
    else{
Serial.println("Nepodporovana premenna.");
}
 
  readString = ("");
  x=0;
  client.stop(); //ukonc spojenie
  delay(5000); //pockaj 5s a vykonaj novu slucku loop
}

Informáciu, ktorú Arduino číta môžete pozmeniť hlasom na: https://arduino.php5.sk/PHP_sk (funguje pod Chrome).

Ak už aplikujete sketch na váš web a ovládanie nefunguje, chyba bude zrejme v počte riadkov response... poďme si preto ukázať, ako si túto response vyrátať na praktickom obrázku s počítaním riadkov:
Obrázok
Vyrátané číslo zmeníme v kóde na tomto riadku:
Kód: Vybrať všetko
else if (x==12) readString += c; //nasa premenna 12 nahrad svojim riadkom

Viac zaujímavých projektov aj na mojom webe: https://arduino.php5.sk

Späť na Hotové projekty