Arduino i PHP

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Borik
Młodszy majsterkowicz
Posty: 24
Rejestracja: 21 paź 2012, 21:43

Arduino i PHP

Post autor: Borik » 1 gru 2012, 01:21

Witam

Napisałem stronę w php i teraz chciałbym na niej wyświetlać stan zmiennych i aktualizować je z poziomu strony.
Znalazłem bibliotekę na php ale nie mam pojęcia jak z niej skorzystać :/.

Może ktoś pomoże? Jakieś wskazówki?

http://pl1.php.net/DIO

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


bruder
Młodszy majsterkowicz
Posty: 38
Rejestracja: 8 wrz 2012, 14:16

Re: Arduino i PHP

Post autor: bruder » 2 gru 2012, 00:55

A co dokładnie chcesz zrobić? Masz stronę i chcesz na niej wyświetlić np. temperaturę, którą odczytuje arduino?
Borik
Młodszy majsterkowicz
Posty: 24
Rejestracja: 21 paź 2012, 21:43

Re: Arduino i PHP

Post autor: Borik » 3 gru 2012, 19:31

Chcę odczytywać dane z Arduino i wysyłać polecenia np zapal diodę. Z tego co wyczytałem to biblioteka którą zamieściłem wyżej to umożliwia.
bruder
Młodszy majsterkowicz
Posty: 38
Rejestracja: 8 wrz 2012, 14:16

Re: Arduino i PHP

Post autor: bruder » 4 gru 2012, 01:20

Ja to robię w ten sposób:
Do arduino dorzucam ethernet shield i podłączam do rutera. Dzięki temu mogę nim sterować np. z poziomu przeglądarki internetowej.

Wystarczy wywołać odpowiedni adres, który pozwoli zapalić/zgasić diodę lub pobrać jakąś wartość. Np:
192.168.0.204/?out=4&status=1 - włączy diodę
192.168.0.204/?out=4&status=0 - wyłączy diodę

Aby skrypt wykonywany na stronie www "wiedział", że operacja się powiodła warto też wyrzucić trochę danych np. w formie json. Zarówno z poziomu php jak i js w łatwy sposób można json zamienić na np. tablicę, z którą już będziesz mógł zrobić co chcesz.

Ja osobiście wywoływałbym powyższe adresy za pomocą AJAX'a. Umożliwia to działanie w tle - bez konieczności odświeżania strony. Mógłbyś również odczytywać temperaturę automatycznie co kilka sekund.

To kod, który umożliwia to co opisałem wyżej (po stronie arduino). Dla wersji 1.0 działa. Jeżeli nie posiadasz ethernet shield'a to zachęcam do zakupu. Daje ogromne możliwości.

Kod: Zaznacz cały

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress ip(192, 168, 0, 204);
byte gateway[] = { 192 ,168 ,0 ,1 };
byte subnet[] = { 255 ,255 ,255 ,0 };

EthernetServer server(80);

float temp;

String readString = String(30);

void setup() {
  Ethernet.begin(mac, ip, gateway, subnet);
  delay(1000);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  Serial.begin(57600);
   
}

void loop(){
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (readString.length() < 30)
        {
          readString = readString + c;
        }
        if (c == '\n') {
          Serial.print(readString);
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();          
          
          if(readString.startsWith("GET /?out=4&status=1"))
          {
            Serial.print("\n 3 HIGH \n");
            digitalWrite(4, HIGH);
            client.print("{\"status\" : \"1\" , \"out\" : \"");
            client.print(4);
            client.print("\"}");
          }
          
          if(readString.startsWith("GET /?out=4&status=0"))
          {
            Serial.print("\n 3 LOW \n");
            digitalWrite(4, LOW);
            client.print("{\"status\" : \"0\" , \"out\" : \"");
            client.print(4);
            client.print("\"}");
          }          
          
          readString="";
          client.stop();
        }
      }
    }
  }
}
Borik
Młodszy majsterkowicz
Posty: 24
Rejestracja: 21 paź 2012, 21:43

Re: Arduino i PHP

Post autor: Borik » 4 gru 2012, 14:56

Mam ethernet ale model 28j60 i do tego bibliotekę EtherCard.

Mam też prosty kod który przełącza diodę led i działa

Kod: Zaznacz cały

// Ethercard LED example
#include <EtherCard.h>

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,1,222 };

#define BUFFER_SIZE 500
byte Ethernet::buffer[BUFFER_SIZE];
BufferFiller bfill;

#define LED 13  // define LED pin
bool ledStatus = false;

const char http_OK[] PROGMEM =
    "HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Pragma: no-cache\r\n\r\n";

const char http_Found[] PROGMEM =
    "HTTP/1.0 302 Found\r\n"
    "Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =
    "HTTP/1.0 401 Unauthorized\r\n"
    "Content-Type: text/html\r\n\r\n"
    "<h1>401 Unauthorized</h1>";

void homePage()
{
    bfill.emit_p(PSTR("$F"
        "<meta http-equiv='refresh' content='5'/>"
        "<title>Ethercard LED</title>" 
        "ledStatus: <a href=\"?led=$F\">$F</a>"),
        http_OK,
        ledStatus?PSTR("off"):PSTR("on"),
        ledStatus?PSTR("ON"):PSTR("OFF"));
}

void setup()
{
    Serial.begin(9600);
    
    pinMode(LED, OUTPUT);
    
    if (ether.begin(BUFFER_SIZE, mymac) == 0)
        Serial.println("Cannot initialise ethernet.");
    else
        Serial.println("Ethernet initialised.");

    ether.staticSetup(myip);
}

void loop()
{
    digitalWrite(LED, ledStatus);   // write to LED digital output
    
    delay(1);   // necessary for my system
    word len = ether.packetReceive();   // check for ethernet packet
    word pos = ether.packetLoop(len);   // check for tcp packet

    if (pos) {
        bfill = ether.tcpOffset();
        char *data = (char *) Ethernet::buffer + pos;
        
        if (strncmp("GET /", data, 5) != 0) {
            // Unsupported HTTP request
            // 304 or 501 response would be more appropriate
            bfill.emit_p(http_Unauthorized);
        }
        else {
            data += 5;
            
            if (data[0] == ' ') {
                // Return home page
                homePage();
            }
            else if (strncmp("?led=on ", data, 8) == 0) {
                // Set ledStatus true and redirect to home page
                ledStatus = true;
                bfill.emit_p(http_Found);
            }
            else if (strncmp("?led=off ", data, 9) == 0) {
                // Set ledStatus false and redirect to home page
                ledStatus = false;
                bfill.emit_p(http_Found);
            }
            else {
                // Page not found
                bfill.emit_p(http_Unauthorized);
            }
        }
        
        ether.httpServerReply(bfill.position());    // send http response
    }
}
próbowałem go jednak zmodyfikować żeby działało z kilkoma diodami ale druga dioda się nie zapala tylko dostaje błąd strony:

401 Unauthorized

Kod z który nie działa to

Kod: Zaznacz cały

// Ethercard LED example
#include <EtherCard.h>

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,1,222 };

#define BUFFER_SIZE 500
byte Ethernet::buffer[BUFFER_SIZE];
BufferFiller bfill;

#define LED 13  // define LED pin
bool ledStatus = false;

#define LED2 14  // define LED pin
bool ledStatus2 = false;

const char http_OK[] PROGMEM =
    "HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Pragma: no-cache\r\n\r\n";

const char http_Found[] PROGMEM =
    "HTTP/1.0 302 Found\r\n"
    "Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =
    "HTTP/1.0 401 Unauthorized\r\n"
    "Content-Type: text/html\r\n\r\n"
    "<h1>401 Unauthorized</h1>";

void homePage()
{
    bfill.emit_p(PSTR("$F"
        "<meta http-equiv='refresh' content='5'/>"
        "<title>Ethercard LED</title>" 
		
        "ledStatus: <a href=\"?led=$F\">$F</a>"
		"<br>"
	"ledStatus2: <a href=\"?led2=$F\">$F</a>"),
        http_OK,
        ledStatus?PSTR("off"):PSTR("on"),
        ledStatus?PSTR("klik ON"):PSTR("klik OFF"),
        ledStatus2?PSTR("off"):PSTR("on"),
	ledStatus2?PSTR("klik ON"):PSTR("klik OFF")
		
		
		);
}

void setup()
{
    Serial.begin(9600);
    
    pinMode(LED, OUTPUT);
    pinMode(LED2, OUTPUT);
    
    if (ether.begin(BUFFER_SIZE, mymac) == 0)
        Serial.println("Cannot initialise ethernet.");
    else
        Serial.println("Ethernet initialised.");

    ether.staticSetup(myip);
}

void loop()
{
    digitalWrite(LED, ledStatus);   // write to LED digital output
    
    delay(1);   // necessary for my system
    word len = ether.packetReceive();   // check for ethernet packet
    word pos = ether.packetLoop(len);   // check for tcp packet



    if (pos) {
        bfill = ether.tcpOffset();
        char *data = (char *) Ethernet::buffer + pos;
        
        if (strncmp("GET /", data, 5) != 0) {
            // Unsupported HTTP request
            // 304 or 501 response would be more appropriate
            bfill.emit_p(http_Unauthorized);
        }
        else {
            data += 5;
            
            if (data[0] == ' ') {
                // Return home page
                homePage();
            }
            else if (strncmp("?led=on ", data, 8) == 0) {
                // Set ledStatus true and redirect to home page
                ledStatus = true;
                bfill.emit_p(http_Found);
            }
            else if (strncmp("?led=off ", data, 9) == 0) {
                // Set ledStatus false and redirect to home page
                ledStatus = false;
                bfill.emit_p(http_Found);
            }
			else if (strncmp("?led2=on ", data, 10) == 0) {
                // Set ledStatus true and redirect to home page
                ledStatus2 = true;
                bfill.emit_p(http_Found);
            }
			else if (strncmp("?led2=off ", data, 11) == 0) {
                // Set ledStatus false and redirect to home page
                ledStatus2 = false;
                bfill.emit_p(http_Found);
            }
            else {
                // Page not found
                bfill.emit_p(http_Unauthorized);
            }
        }
        
        ether.httpServerReply(bfill.position());    // send http response
    }
}
Awatar użytkownika
Janus
Majsterkowicz
Posty: 110
Rejestracja: 3 gru 2012, 07:48
Lokalizacja: Mikołów

Re: Arduino i PHP

Post autor: Janus » 4 gru 2012, 19:24

Spróbuj zmień w ten kawałki kodu:

Kod: Zaznacz cały

else if (strncmp("?led2=on ", data, 9) == 0) {
oraz

Kod: Zaznacz cały

else if (strncmp("?led2=off ", data, 10) == 0) {
Trzeci argument funkcji strncmp mówi o tym ile znaków ma być porównywanych pomiędzy jednym a drugim łańcuchem.
Pierwszy argument w Twoim przypadku ma długość odpowiednio 9 i 10 znaków.
Zielony
Młodszy majsterkowicz
Posty: 5
Rejestracja: 27 lis 2012, 22:22

Re: Arduino i PHP

Post autor: Zielony » 6 gru 2012, 18:13

Sam ostatnio kombinowałem ze sterowaniem przez php, przez serial oczywiście.

Kod dla arduino:

Kod: Zaznacz cały

unsigned char ledPin = 13;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    switch (Serial.read()) {
      case 'H':
        digitalWrite(ledPin, 255);
        Serial.write("1");
        break;
      default:
        digitalWrite(ledPin, LOW);
        Serial.write("0");
        break;
    }
  }
}
PHP:

Kod: Zaznacz cały

<?php
	exec("mode com3: BAUD=9600 PARITY=N data=8 stop=1 xon=off");
	$fp = fopen("COM3", "w+");
	usleep(100000);
	fwrite($fp, $_GET['c']);
	usleep(100000);
	$state = fgets($fp);
	fclose($fp);
?>
<center>
<?=($state) ? 'Dioda wlaczona!' : 'Dioda wylaczona!'?>
<form action="<?=$_SERVER['PHP_SELF']?>" method="GET">
<input type="submit" name='c' value='<?=($state) ? 'L' : 'H'?>'/>
</form>
</center>
bruder
Młodszy majsterkowicz
Posty: 38
Rejestracja: 8 wrz 2012, 14:16

Re: Arduino i PHP

Post autor: bruder » 6 gru 2012, 23:05

Borik
Młodszy majsterkowicz
Posty: 24
Rejestracja: 21 paź 2012, 21:43

Re: Arduino i PHP

Post autor: Borik » 8 gru 2012, 18:43

?zięki za link ale mam jeszcze jeden proble.

Wygenerowałem sobie liki po stronie arduino np 192.168.2.2/?=1 --- zapala diodę led itp
Chciałbym teraz po stonie PHP wykonywać konkretne polecenie np po kliknięciu na obrazek żarówki zapala led czyli coś w tym stylu;

onclick=192.168.2.2/?=1

tylko nie wiem jak to wykonać?

Może jak będę w domu to wkleję kawałek swojego kodu.

Pozdrawiam
Zielony
Młodszy majsterkowicz
Posty: 5
Rejestracja: 27 lis 2012, 22:22

Re: Arduino i PHP

Post autor: Zielony » 8 gru 2012, 21:59

Borik pisze:?zięki za link ale mam jeszcze jeden proble.

Wygenerowałem sobie liki po stronie arduino np 192.168.2.2/?=1 --- zapala diodę led itp
Chciałbym teraz po stonie PHP wykonywać konkretne polecenie np po kliknięciu na obrazek żarówki zapala led czyli coś w tym stylu;

onclick=192.168.2.2/?=1

tylko nie wiem jak to wykonać?

Może jak będę w domu to wkleję kawałek swojego kodu.

Pozdrawiam
Polecam poczytać o formularzach w html:
http://www.kurshtml.edu.pl/html/formularze.html

;)
bruder
Młodszy majsterkowicz
Posty: 38
Rejestracja: 8 wrz 2012, 14:16

Re: Arduino i PHP

Post autor: bruder » 9 gru 2012, 13:00

Jeśli chcesz to zrobić bez przeładowania strony to użyj AJAX'a. W jquery bardzo łatwo można to zrobić. Jakoś niedługo będę robił podobne rzeczy. Jeśli do tego czasu sobie nie poradzisz to będę mógł podesłać kod.
bruder
Młodszy majsterkowicz
Posty: 38
Rejestracja: 8 wrz 2012, 14:16

Re: Arduino i PHP

Post autor: bruder » 10 gru 2012, 02:27

Poniżej wklejam źródło strony, która za pomocą AJAX'a włączy/wyłączy diodę.

Należy pamiętać o dodaniu pliku z jquery do tego samego katalogu. (jquery-1.7.1.js)

url: 'http://192.168.0.204/?out=4', -> zmienić aby pasowało do waszego kodu w arduino

<a href="javascript:;" id="led4">Led on/of</a> -> Tekst z odnośnika oczywiście możesz sobie zmienić na obrazek.

Kod: Zaznacz cały

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
    <script type="text/javascript" src="jquery-1.7.1.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $("#led4").click(function(){
                $.ajax({
                    url: 'http://192.168.0.204/?out=4',
                    type: 'GET',
                    dataType: 'json',
                    success: function(data, textStatus){
                        alert('sukces');
                    },
                    error: function(xhr, textStatus, errorThrown){
                        alert(textStatus);
                    }
                });

            });
        });
    </script>
</head>
<body>
<a href="javascript:;" id="led4">Led on/of</a>
</body>
</html>
mój kod arduino:

Kod: Zaznacz cały

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress ip(192, 168, 0, 204);
byte gateway[] = { 192 ,168 ,0 ,1 };
byte subnet[] = { 255 ,255 ,255 ,0 };

EthernetServer server(80);

float temp;

String readString = String(30);

void setup() {
  Ethernet.begin(mac, ip, gateway, subnet);
  delay(1000);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  Serial.begin(57600);
   
}

void loop(){
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (readString.length() < 30)
        {
          readString = readString + c;
        }
        if (c == '\n') {
          Serial.print(readString);
          client.println("HTTP/1.1 200 OK");
          client.println("Access-Control-Allow-Origin: *");
          client.println("Content-Type: application/json");
          client.println();  
          
          if(readString.startsWith("GET /?out=4"))
          {
            if(digitalRead(4)==LOW)
              digitalWrite(4, HIGH);
            else
              digitalWrite(4, LOW);
              
            client.print("{\"status\":");
            client.print(digitalRead(4));
            client.print(",\"out\":");
            client.print(4);
            client.print("}");
          }
          
          readString="";
          client.stop();
        }
      }
    }
  }
}
zwiadowca
Młodszy majsterkowicz
Posty: 6
Rejestracja: 24 cze 2013, 00:19
Lokalizacja: Tychy

Re: Arduino i PHP

Post autor: zwiadowca » 24 cze 2013, 00:33

Czy jest jakaś dobra pozycja książkowa, która łagodnie wprowadza w świat PHP ?
quin19
Młodszy majsterkowicz
Posty: 1
Rejestracja: 6 cze 2014, 14:16

Re: Arduino i PHP

Post autor: quin19 » 6 cze 2014, 14:22

Chciałbym odświeżyć temat. Czy istnieje możliwość wprowadzania wartości zmiennej na stronie php dla arduino? Zapalanie /gaszenie diody można zrealizować przez wysłanie odpowiedniego linku. Chciałbym wprowadzić zadaną temperaturę np. 20 st.C na stronie www i wysłać tą wartość do arduino.
paweo
Majsterkowicz
Posty: 97
Rejestracja: 1 paź 2013, 16:58

Re: Arduino i PHP

Post autor: paweo » 6 lip 2014, 14:43

Zielony pisze:Sam ostatnio kombinowałem ze sterowaniem przez php, przez serial oczywiście.

Kod dla arduino:

Kod: Zaznacz cały

unsigned char ledPin = 13;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    switch (Serial.read()) {
      case 'H':
        digitalWrite(ledPin, 255);
        Serial.write("1");
        break;
      default:
        digitalWrite(ledPin, LOW);
        Serial.write("0");
        break;
    }
  }
}
PHP:

Kod: Zaznacz cały

<?php
	exec("mode com3: BAUD=9600 PARITY=N data=8 stop=1 xon=off");
	$fp = fopen("COM3", "w+");
	usleep(100000);
	fwrite($fp, $_GET['c']);
	usleep(100000);
	$state = fgets($fp);
	fclose($fp);
?>
<center>
<?=($state) ? 'Dioda wlaczona!' : 'Dioda wylaczona!'?>
<form action="<?=$_SERVER['PHP_SELF']?>" method="GET">
<input type="submit" name='c' value='<?=($state) ? 'L' : 'H'?>'/>
</form>
</center>
Na jakiej wersji działa ten kod? Mi na UNO nie chce działać (resetuje się).
paweo
Majsterkowicz
Posty: 97
Rejestracja: 1 paź 2013, 16:58

Re: Arduino i PHP

Post autor: paweo » 8 lip 2014, 22:03

A jak przystosować ten kod do UNO? Zależy mi na tym :)
rafix89
Młodszy majsterkowicz
Posty: 1
Rejestracja: 5 gru 2016, 22:33

Re: Arduino i PHP

Post autor: rafix89 » 28 kwie 2017, 17:52

Witam potrzebuje pomocy a raczej gotowego szkicu bo nie moge sam sobie poradzic w napisaniu :( aby po wlaczeniu przycisku fizycznego dzwonkowego wysylal mi informacje do domoticz c (http get w domoticz json) bardzo prosze o pomoc z gory dziekuje
Ostatnio zmieniony 28 kwie 2017, 19:18 przez rafix89, łącznie zmieniany 1 raz.
Awatar użytkownika
ethanak
Złota rączka
Posty: 766
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Arduino i PHP

Post autor: ethanak » 28 kwie 2017, 18:12

Ile płacisz? Faktura czy paragon?
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
ODPOWIEDZ

Strony partnerskie: