Wifi webserver

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Arnost
Příspěvky: 22
Registrován: 05 říj 2017, 21:15

Wifi webserver

Příspěvek od Arnost » 05 říj 2017, 21:23

Ahojte,
potřeboval bych pomoct s vytvořením web serveru na ESP 8266 + 2560, mám kód programu, který by měl fungovat ale nedaří se mně provést kompilaci. Stále mně píše, že nemám deklarovanou WL_MAC_ADDR_LENGTH, knihovny si myslím, že používám standardní co jsem našel na netu (zkoušeno už několik bez úspěchu). Nevíte někdo jak tento problém odstranit. Děkuji za pomoc a přikládám část kódu.

Kód: Vybrat vše

void setupWiFi(){
WiFi.mode(WIFI_AP);
uint8_t mac[WL_MAC_ADDR_LENGTH];
WiFi.softAPmacAddress(mac);

String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) +
String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
macID.toUpperCase();
String AP_NameString = "ESP8266 Thing " + macID;
char AP_NameChar[AP_NameString.length() + 1];
memset(AP_NameChar, 0, AP_NameString.length() + 1);
for (int i=0; i<AP_NameString.length(); i++){
AP_NameChar[i] = AP_NameString.charAt(i);
}
WiFi.softAP(AP_NameChar, WiFiAPPSK);
}

Arnost
Příspěvky: 22
Registrován: 05 říj 2017, 21:15

Re: Wifi webserver

Příspěvek od Arnost » 05 říj 2017, 22:50

Tak už jsem možná našel kde je zakopaný pes, delší dobu jsem už neprogramoval tak jsem si ještě zkusil nahrát poslední verzi Arduina, ale zase se mně nedaří kompilace. Háže to chybu s tím statusem 1, na netu jsem dopátral, že mám někde něco nahrát ale nevím co přesně, pomůže mně někdo? Dík

G:\dfgsdf\sketch_oct05a\sketch_oct05a.ino:1:25: fatal error: ESP8266WiFi.h: No such file or directory

#include <ESP8266WiFi.h>
^
compilation terminated.

exit status 1
Nastala chyba při kompilaci u desky Arduino/Genuino Mega or Mega 2560.

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18

Re: Wifi webserver

Příspěvek od zbysek » 06 říj 2017, 06:58

Teď mě napadá, jestli nebude problém v tom, ze mícháte dohromady dva přístupy, jak pracovat s ESP.

Jeden je, že ESP ovladate přes AT příkazy z Arduino, druhý, že programujete přímo ESP.

ESP8266Wifi.h je knihovna pro programování ESP přímo. Vy ale program nahráváte do Arduina, ne?

Arnost
Příspěvky: 22
Registrován: 05 říj 2017, 21:15

Re: Wifi webserver

Příspěvek od Arnost » 06 říj 2017, 11:59

No já se nyní snažím rozjet ten kód na Jednoduchý webserver a nejde mně zkompilovat. Předpokládám, že kód bude fungovat jak potřebuju jen ho nemůžu kvůli té kompilaci rozjet a zobrazuje mně to ten status jedna. Na netu jsem dohledal nějaký problém se špatnýma knihovnami ale dál už nevím.

Princip by měl byt takový, že se mně nastaví pomocí knihovny ESP8266 wifi a pak se mně přes Wifiserver bude zobrazovat ta stránka.

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18

Re: Wifi webserver

Příspěvek od zbysek » 06 říj 2017, 12:14

Dobrý den,
vy vycházíte z kapitoly o ESP8266 v knížce "Průvodce světem Arduina".

Problém je v tom, že jste si vzal příklad, který je určený pro desku ESP8266 Thing, která není jako klasické Arduino. Jejím procesorem je právě ESP8266.
Vy jste tento kód vzal a snažíte se ho nahrát přímo do Arduina. To ale nejde.

ESP, které vám přijde od výrobce, má v sobě v základu nahraný firmware, který umožňuje desku ovládat pomocí AT příkazů. Vy musíte do Arduina nahrát program, který bude AT příkazy do ESP posílat. Tomu se věnuje odstavec "Vytváříme server" ve stejné kapitole.

Druhou možnost, kterou máte, je programovat přímo ESP. Potom můžete vybraný program použít, ale musíte si k tomu koupit/postavit programátor pro ESP.

Arnost
Příspěvky: 22
Registrován: 05 říj 2017, 21:15

Re: Wifi webserver

Příspěvek od Arnost » 07 říj 2017, 20:02

Ano, máte pravdu použil jsem špatný kód omlouvám se. Teď jsem použil ale správný Vytváříme server (snad je to ten správný). Musel jsem provést menší úpravu zápisu z:

Kód: Vybrat vše

cmd = "AT+CWSAP="ESP-WIFI","12345678",11,2";
na

Kód: Vybrat vše

cmd = "AT+CWSAP=\"ESP-WIFI\",\"12345678\",11,2";
Dále jsem upravil příkaz z:

Kód: Vybrat vše

cmd = "AT+CIPSERVER=1";
na

Kód: Vybrat vše

cmd = "AT+CIPSERVER=1,80";
Protože předpokládám, že ten port by tam měl být nastavený. Zde ale mé vědomosti končí, nevím jak zobrazit stránku pokud se někdo připojí. Připojím se na ESP-WIFI, pak zadám IP 192.168.11.11 a stránka se dlouze načítá a nic. Určitě tam někde něco chybí.
Ještě k nastavení pomocí AT příkazů, na příkaz AT+CIFSR nedostanu žádnou odpověď tak nevím zda je to dobře nebo špatně.

Arnost
Příspěvky: 22
Registrován: 05 říj 2017, 21:15

Re: Wifi webserver

Příspěvek od Arnost » 10 říj 2017, 21:08

Ahojte, myslíte že my mně někdo dokázal pomoct spojit následující dva programy v jeden?
Tento slouží k připojení k wifi síti a vytvoření web serveru:

Kód: Vybrat vše

/*
Arduino Due - ESP 8266 WiFi Module
Serial (Tx/Rx) communicate to PC via USB
Serial3 (Tx3/Rx3) connect to ESP8266
Tx3 - ESP8266 Rx
Rx3 - ESP8266 Tx
ESP8266 CH_PD Connect to ESP8266 VCC
*/
#define ASCII_0 48
#define ESP8266 Serial3
String SSID = "MojeWifi";
String PASSWORD = "123456789";

int LED = 13;

boolean FAIL_8266 = false;

String strHTML;
String strHTMLstart = "<!doctype html>\
<html>\
<head>\
<title>";

String strHTMLend ="</title>\
</head>\
<body>\
<H1>Ahoj Lidi</H1>\
</body>\
</html>";
void htlmcode(){
  strHTML = "";
  strHTML = strHTML + millis() + strHTMLend;
}

boolean cwJoinAP()
{
  String cmd="AT+CWJAP=\"" + SSID + "\",\"" + PASSWORD + "\"";
  ESP8266.println(cmd);
  return waitOKfromESP8266(10);
}

void setup() {
  pinMode(LED, OUTPUT);
  
  do{
    Serial.begin(115200);
    ESP8266.begin(115200);
  
    //Wait Serial Monitor to start
    while(!Serial);
    Serial.println("--- Start ---");

    ESP8266.println("AT+RST");
    delay(1000);
    if(ESP8266.find("ready"))
    {
      Serial.println("Module is ready");
      ESP8266.println("AT+CWMODE=1");
      delay(2000);
      
      //Quit existing AP, for demo
      Serial.println("Quit AP");
      ESP8266.println("AT+CWQAP");
      delay(1000);
      
      clearESP8266SerialBuffer();
      if(cwJoinAP())
      {
        Serial.println("CWJAP Success");
        FAIL_8266 = false;
        
        delay(3000);
        clearESP8266SerialBuffer();
        //Get and display my IP
        sendESP8266Cmdln("AT+CIFSR", 1000);  
        //Set multi connections
        sendESP8266Cmdln("AT+CIPMUX=1", 1000);
        //Setup web server on port 80
        sendESP8266Cmdln("AT+CIPSERVER=1,80",1000);
        
        Serial.println("Server setup finish");
      }else{
        Serial.println("CWJAP Fail");
        delay(500);
        FAIL_8266 = true;
      }
    }else{
      Serial.println("Module have no response.");
      ESP8266.println("AT+RST");
      delay(3000);
      FAIL_8266 = true;
    }
  }while(FAIL_8266);
  
  digitalWrite(LED, HIGH);
}

void loop(){
  if(ESP8266.available())
  {
    Serial.println("Something received");
    delay(1000);
    if(ESP8266.find("+IPD,"))
    {
      String action;
      
      Serial.println("+IPD, found");
      int connectionId = ESP8266.read()-ASCII_0;
      Serial.println("connectionId: " + String(connectionId));
      htlmcode();
      sendHTTPResponse(connectionId, strHTML);
      
      //Close TCP/UDP
      String cmdCIPCLOSE = "AT+CIPCLOSE="; 
      cmdCIPCLOSE += connectionId;
      sendESP8266Cmdln(cmdCIPCLOSE, 1000);
    }
  }
}

void sendHTTPResponse(int id, String content)
{
  String response;
  response = "HTTP/1.1 200 OK\r\n";
  response += "Content-Type: text/html; charset=UTF-8\r\n"; 
  response += "Content-Length: ";
  response += content.length();
  response += "\r\n";
  response +="Connection: close\r\n\r\n";
  response += content;

  String cmd = "AT+CIPSEND=";
  cmd += id;
  cmd += ",";
  cmd += response.length();
  
  Serial.println("--- AT+CIPSEND ---");
  sendESP8266Cmdln(cmd, 1000);
  
  Serial.println("--- data ---");
  sendESP8266Data(response, 1000);
}

boolean waitOKfromESP8266(int timeout)
{
  do{
    Serial.println("wait OK...");
    delay(1000);
    if(ESP8266.find("OK"))
    {
      return true;
    }

  }while((timeout--)>0);
  return false;
}



//Send command to ESP8266, assume OK, no error check
//wait some time and display respond
void sendESP8266Cmdln(String cmd, int waitTime)
{
  ESP8266.println(cmd);
  delay(waitTime);
  clearESP8266SerialBuffer();
}

//Basically same as sendESP8266Cmdln()
//But call ESP8266.print() instead of call ESP8266.println()
void sendESP8266Data(String data, int waitTime)
{
  ESP8266.print(data);
  delay(waitTime);
  clearESP8266SerialBuffer();
}

//Clear and display Serial Buffer for ESP8266
void clearESP8266SerialBuffer()
{
  Serial.println("= clearESP8266SerialBuffer() =");
  while (ESP8266.available() > 0) {
    char a = ESP8266.read();
    Serial.write(a);
  }
  Serial.println("==============================");
}

Tento slouží k vytvoření AP:

Kód: Vybrat vše

char ssid[] = "ssid-site"; //SSID wifi sítě
char pwd[] = "heslo-site"; //heslo sítě
String cmd; //řetězec pro ukládání a skládání příkazů
String http;

void setup(){
Serial.begin(115200);
Serial3.begin(115200); //9600, 57600, 115200
cmd = "AT";
command(cmd, "Zkousim pritomnost modulu", "Modul komunikuje",
"Modul nekomunikuje", "OK", 3000);
cmd = "AT+RST";
command(cmd, "Restartuji modul", "Modul restartovan", "Modul se nepovedlo restartovat", "ready", 5000);
cmd = "AT+CIPMUX=1";
command(cmd, "Nastavuji vicenasobne pripojeni", "Nastaveno", "Nepovedlo se nastavit", "OK", 1000);
cmd = "AT+CWMODE=3";
command(cmd, "Nastavuji AP mod", "Nastaveno", "Nepovedlo se nastavit", "OK", 2000);
cmd = "AT+CWSAP=\"ESP-WIFI\",\"12345678\",8,3";
command(cmd, "Vytvarim pristupovy bod", "Vytvoreno", "Nepovedlo se vytvorit pristupovy bod", "OK", 3000);
cmd = "AT+CIPSERVER=1,80";
command(cmd, "Vytvarim server", "Vytvoreno", "Nepovedlo se vytvoritserver", "OK", 2000);
cmd = "AT+CIFSR";
command(cmd, "Zjistuji aktualni adresu", "", "", "", 2000);
}
void loop(){
if(waitFor("+IPD", 50)){ //hledej výskyt +IPD
Serial3.parseInt(); //jedno číslo zahoď
Serial3.parseInt(); //druhé číslo zahoď
int p = Serial3.parseInt(); //přečti třetí číslo
Serial.print("Nacetl jsem: ");
Serial.println(p);
Serial3.flush(); //zbytek zpravy me ted nezajima, zahod ho
}
resendData();
}
boolean command(String cmd, String comment, String success, String
unsuccess, char *waitForString, long waitingTime){
Serial.println();
Serial.println(comment);
Serial.println("] " + cmd);
Serial3.println(cmd);
boolean result = waitFor(waitForString, waitingTime);
if(result){
Serial.println("[ " + success);
}
else{
Serial.println("[ " + unsuccess);
}
resendData();
return result;
}
boolean waitFor(char *s, long waitingTime){
Serial3.setTimeout(waitingTime);
return Serial3.find(s);
}
boolean resendData(){
while(Serial.available()){
Serial3.write(Serial.read());
}
if(Serial3.available()){
while(Serial3.available()){
Serial.write(Serial3.read());
}
}
}
Oba kódy by měli fungovat zkoušel jsem, ale nevím jak docílit souběžného běhu, aby se mně vytvořilo AP a zároveň na něm vysílat server. Hlavně si nevím s nastavením modulu a severu jako takového.

Děkuji moc za pomoc.

Uživatelský avatar
SkullKeep
Příspěvky: 313
Registrován: 23 srp 2017, 18:51
Bydliště: Brno
Kontaktovat uživatele:

Re: Wifi webserver

Příspěvek od SkullKeep » 10 říj 2017, 21:30

Asi nepomuzu moc ,ale zkus tady ---> http://easycoding.tn/tuniot/demos/code/ to je graficke rozhrani na programovani ESP8266 a na youtube najdes video tutorialy. link ---> https://www.youtube.com/watch?v=5PGZb-v ... cKKOisMUZ1
:twisted: :?: :arrow: :geek: P. Q. M.

colos3453
Příspěvky: 3
Registrován: 15 říj 2017, 11:58

Re: Wifi webserver

Příspěvek od colos3453 » 15 říj 2017, 12:03

chtěl bych se zeptat, jak by šel udělat teploměr přes ESP8266 modul wifi teploměr, ale přes acces point. Ani jeden z mých pokusů nefunguje.
Díky za odpověď

Uživatelský avatar
SkullKeep
Příspěvky: 313
Registrován: 23 srp 2017, 18:51
Bydliště: Brno
Kontaktovat uživatele:

Re: Wifi webserver

Příspěvek od SkullKeep » 15 říj 2017, 14:39

Rad pomohu ,ale neni videt tvuj kod.
:twisted: :?: :arrow: :geek: P. Q. M.

Odpovědět

Kdo je online

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