Go Down

Topic: Arduino + PHP (Read 1 time) previous topic - next topic

poliveira1978

Boas a todos.

Fiz o seguinte sketch no arduino:

Code: [Select]

#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:
Code: [Select]

<?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.

bubulindo

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. 

This... is a hobby.

poliveira1978

Obrigado, já resolvi... Ficou assim:
Code: [Select]

#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.

bubulindo

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
This... is a hobby.

poliveira1978

tens razão... retirei o delay e "adaptei" o código do blinknodelay

Go Up