Sari la conținut
ELFORUM - Forumul electronistilor

trimitere valori din pagina web la esp8266


Vizitator sea

Postări Recomandate

Vizitator sea

Salutare,

Incerc sa transmit date de la o pagina web la modulul Wemos ESP8266 D1mini prin intermediul unui server.

Pagina web se afla la: xx.xxx.xxx.xxx/ard/page.html, in interiorul acestei pagini este urmatorul cod html:
 

<html><head>
    <title>Page Title</title>
</head>
<body>
    <div>
        <a href="?btn1on">btn 1 on</a>
        <a href="?btn1off">btn 1 off</a>
    </div>
    <div>
        <a href="?btn2on">btn 2 on</a>
        <a href="?btn2off">btn 2 off</a>
    </div>


</body></html>

btn1 on vreau sa actioneze digitalWrite(D2, HIGH);

btn1 off vreau sa actioneze digitalWrite(D2, LOW);

 

btn2 on vreau sa actioneze digitalWrite(D3, HIGH);

btn2 off vreau sa actioneze digitalWrite(D3, LOW);

 

Cu ajutorul codului de mai jos, am reusit sa ma conectez la server si la pagina web, insa nu stiu cum transmit actiunile link-urilor din pagina web in modul

#include <ESP8266WiFi.h> 
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFiMulti.h>

const char* ssid     = "xxxxxxxxxx";  
const char* password = "xxxxxxxxx";
const char* host = "xx.xxx.xxx.xxx";
const int   port = 80;              

void setup() {

  digitalWrite(D2, LOW);
  digitalWrite(D3, LOW);
  
  Serial.begin(115200);
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) { 
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  
  Serial.println(WiFi.localIP());

  Serial.setDebugOutput(true);
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) { 
        HTTPClient http;

        String url = "/ard/page.html";
       
        http.begin(host,port,url);

        int httpCode = http.GET();
        
        if(httpCode > 0) {
          String payload = http.getString(); 
          Serial.println(payload);       
        }

        Serial.println("closing connection");
        http.end();
  }
  delay(30000);
}

Multumesc!

Link spre comentariu
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • modoran

    2

Top autori în acest subiect

Cred ca nu ai inteles principiul de functionare. Serverul insusi trebuie sa fie continut in ESP8266, iar la simpla acesare a unui URL din exterior ( telefon, tableta, calculator - folosit ca si client ) executa o anumita comanda.

 

In exemplul prezentat de tine este folosit ca si client ( exact invers ).

Link spre comentariu
Vizitator sea

Am testat si varianta in care ESP8266 este configurat ca si server insa nu am reusit sa il pot accesa din afara retelei.

Ceea ce incerc sa fac este sa conectez ESP8266 ca si client la un server web, iar modulul sa reactioneze in functie de datele oferite de server.

Revin cu editarea codului pt modul:

#include <ESP8266WiFi.h> 
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFiMulti.h>

const char* ssid     = "xxxxxxx";  
const char* password = "xxxxxxx";
const char* host = "xxx.xxx.x.xxx";
const int   port = 80;           

void setup() {
  pinMode(D2, OUTPUT);
  pinMode(D3, OUTPUT);
  digitalWrite(D2, LOW);
  digitalWrite(D3, LOW);
  
  Serial.begin(115200);
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) { 
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  
  Serial.println(WiFi.localIP());

  Serial.setDebugOutput(true);
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) { 
        HTTPClient http;

        String url = "/test/a.php";
       
        http.begin(host,port,url);

        int httpCode = http.GET();
        
        if(httpCode > 0) {
          String payload = http.getString(); 
          Serial.println(payload);
            if(payload == "1"){
              digitalWrite(D2, HIGH);
              digitalWrite(D3, LOW);
            }else if (payload == 0){
              digitalWrite(D2, LOW);
              digitalWrite(D3, HIGH);
            }
        }

        Serial.println("closing connection");
        http.end();
  }
  delay(30000);
}

pagina a.php are urmatorul script:

<?php
$host_ard       = 'localhost';
$user_ard       = 'root';
$password_ard   = '';
$dbname_ard     = 'arduino';
$dsn_ard        = 'mysql:host=' . $host_ard . ';dbname=' . $dbname_ard;
//END


// conexiunea la db liamed
try {
    $conn = new PDO($dsn_ard, $user_ard, $password_ard);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
    die("Database connection failed arduino: " . $e->getMessage());
}

$sqlSelect = "SELECT Status FROM arduino.tbl_ard where Id=1";

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $conn->query($sqlSelect);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($rows as $row) {
    echo $row['Status'];
}

Pagina a.php se conecteaza la baza de date mysql arduino in care se afla un tabel ce are doua coloane si doua randuri:

+----+--------+
| Id | Status |
+----+--------+
|  1 |   1    |
|  2 |   0    |
+----+--------+

Id-ul 1 este aferent digitalWrite(D2); iar valoarea din status 1 este pentru HIGH si 0 pentru LOW

Id-ul 2 este aferent digitalWrite(D3) ......

 

Valorile din tabela mysql pentru cele doua id-uri sunt dinamice

 

In pagina a.php am ca rezultat final un echo al statusului pentru Id-ul 1, atat am reusit sa testez, acum incerc sa testez cu doua valori. 

Nu stiu cum pot insera in variabila String payload = http.getString(); cu ajutorul php-ului variabile C adica, din foreach-ul php sa trimit urmatoarele:

echo "int btn1 = $variabila1; int btn2 = $variabila2"

iar arduino sa le interpreze ca si variabile C nu ca si un simplu String

 

Multumesc!

Link spre comentariu

Nu se pot trimite "variabile" in mod direct intre client si server.  Daca totusi insisti sa folosesti ESP8266 ca si client ( eu nu as face asa ceva ca e o complicatie in plus ) trebuie sa procesezi rezultatul returnat in cererea HTTP si sa interpretezi manual parametrii ( care sunt dinamici dupa cum spui ).

 

Uite aici functiile disponibile pentru manipularea unui string:

https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

 

Daca nu sunt de ajuns, poti oricand sa folosesti c_str() si sa folosesti functiile obisnuite ale limbajului de programare C.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări