Arduino + PHP

Boas a todos.

Fiz o seguinte sketch no arduino:

#include <SPI.h>
#include <Ethernet.h>
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(192,168,10,203);
EthernetClient client;

void setup()
{
  Serial.begin(9600);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    for(;;)
      ;
  }
  delay(1000);
  Serial.println("connecting...");
  if (client.connect(server, 80))
  {
    Serial.println("connected");
  } 
  else
  {
    Serial.println("connection failed");
  }
}

void loop()
{
  int chk = DHT11.read(DHT11PIN);
  Serial.print("Read sensor: ");
  switch (chk)
  {
  case 0: 
    Serial.println("OK"); 
    break;
  case -1: 
    Serial.println("Checksum error"); 
    break;
  case -2: 
    Serial.println("Time out error"); 
    break;
  default: 
    Serial.println("Unknown error"); 
    break;
  }
  Serial.println("Sending Data...");
  float hum=DHT11.humidity;
  float temp=DHT11.temperature;
  float dew=DHT11.dewPoint();
  client.print("GET /registar.php?hum=");
  client.print(hum,DEC);
  client.print("&temp=");
  client.print(temp,DEC);
  client.print("&dew=");
  client.print(dew,DEC);
  client.println(" HTTP/1.1");
  client.println("Host: arduino1");
  client.println();
  Serial.println("Data Sent...");  
  Serial.print("Humidade: ");
  Serial.print(hum);
  Serial.println("%");
  Serial.print("Temperatura: ");
  Serial.print(temp);
  Serial.println("*C");
  Serial.print("Ponto de Orvalho: ");
  Serial.print(dew);
  Serial.println("*C");
  while(client.available())
  {
    char c = client.read();
    Serial.print(c);
  }
  delay(60000);
}

O script PHP é o seguinte:

<?php
	$user=""; //aqui o user correcto
	$password=""; //aqui a pass correcta
        $server="localhost";
	$database="meteo";
	mysql_connect($server,$user,$password);
	@mysql_select_db($database) or die( "Base de Dados inválida...");
	$temp=$_GET['temp'];
	$hum=$_GET['hum'];
	$dew=$_GET['dew'];
	$tstamp=date("Y-m-d H:m:s", time());
	$query = "INSERT INTO `dados`(`Temp`, `Hum`, `Dew`) VALUES (round($temp,2),round($hum,2),round($dew,2))";
	mysql_query($query);
	mysql_close();
	echo "Dados Guardados";
?>

Agora surgiu o seguinte problema: quando abro o serial monitor a informação é enviada para o PHP e registada apenas 1 vez - aparentemente o loop só é executado uma vez.
Sei que o problema não é do PHP, pois a informação é registada durante a 1ª execução do sketch e se correr o PHP directamente no browser.

Agradeço qualquer dica e/ou ajuda.

Se tirasses esse delay de um minuto do código é que fazias bem…

O teu problema deve estar na ligação que abres com o servidor para correr o php. Abres a ligação no setup, mas corres uma vez o sketch, o servidor onde o php corre fecha a ligação no fim do script, mas o arduino não sabe disso e continua a tentar ligar apesar da socket estar fechada.

Ora vê aqui:

http://arduino.cc/en/Reference/ClientConnected

Tenta colocar o código da ligação no loop e desliga a ligação por lá também.

Depois arranjar outra maneira de temporizar um minuto (dica, millis() ), e de minuto a minuto ligas ao servidor, corres o php, desligas do servidor.

Isso já deve resultar.

Obrigado, já resolvi… Ficou assim:

#include <SPI.h>
#include <Ethernet.h>
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(192,168,10,203);
EthernetClient client;

void setup()
{
  Serial.begin(9600);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    for(;;)
      ;
  }
  delay(1000);
  Serial.println("connecting...");
}

void loop()
{
  if (client.connect(server, 80))
  {
    Serial.println("connected");
    int chk = DHT11.read(DHT11PIN);
    Serial.print("Read sensor: ");
    switch (chk)
    {
    case 0: 
      Serial.println("OK"); 
      break;
    case -1: 
      Serial.println("Checksum error"); 
      break;
    case -2: 
      Serial.println("Time out error"); 
      break;
    default: 
      Serial.println("Unknown error"); 
      break;
    }
    int hum=DHT11.humidity;
    int temp=DHT11.temperature;
    float dew=DHT11.dewPoint();
    if (client.connected())
    {
      Serial.println("Sending Data...");
      client.print("GET /registar.php?hum=");
      client.print(hum,DEC);
      client.print("&temp=");
      client.print(temp,DEC);
      client.print("&dew=");
      client.print(dew,DEC);
      client.println(" HTTP/1.1");
      client.println("Host: arduino1");
      client.println();
      client.stop();
    }
    Serial.println("Data Sent...");  
    Serial.print("Humidade: ");
    Serial.print(hum);
    Serial.println("%");
    Serial.print("Temperatura: ");
    Serial.print(temp);
    Serial.println("*C");
    Serial.print("Ponto de Orvalho: ");
    Serial.print(dew);
    Serial.println("*C");
    while(client.available())
    {
      char c = client.read();
      Serial.print(c);
    }
    delay(5000);
    client.stop();
    delay(5000);
  } 
  else
  {
    Serial.println("connection failed");
  }
}

Quanto ao delay, este sensor não é muito rápido e chega-me perfeitamente um sample de 10 em 10 segundos.
Obrigado pela ajuda.

Eu já por várias vezes falei aqui dos problemas do delay... Se pretendes apenas fazer isto com o Arduino, então podes deixar o delay porque não terá muita influência no que pretendes fazer. Mas utilizar o delay só porque não se sabe outro método para temporizar é que é mau porque isso impede o progresso. Podes tentar usar o millis para isso e ainda ficas com processamento de sobra para fazer mais coisas no programa... tipo escrever para um LCD e interagir com teclas, etc, etc...

Pronto, chega de rants. :P

tens razão… retirei o delay e “adaptei” o código do blinknodelay