Go Down

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

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.

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. 

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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.

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
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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

Go Up