Jump to content
ELFORUM - Forumul electronistilor

trimitere valori din pagina web la esp8266


Guest sea

Recommended Posts

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 to comment
  • Replies 3
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

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 to comment

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 to comment

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 to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.




×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines