Arduino ethernet shield + base datos + php +xampp

Buenas :slight_smile:
Estoy intentando que arduino me introduzca tres datos leidos por los puertos analógicos en una base de datos mySQL. Actualmente estoy usando la ultima version de xampp. Mi problema es que las librerias han cambiado, no copila el código del tutorial que estoy siguiendo y no soy capaz de echarlo a andar.
Estoy siguiendo este tutorial Capturando datos en MySQL usando Apache, php, Arduino + Ethernet Shield – Internet de las Cosas
pero me es imposible. ¿Alguien me puede echar una mano?
Un saludo
Gracias

teines experiencia con el ejemplo de WebClient? yo de ti miraria ese ejemplo para entenderlo 100% y luego me complicaria con bases de datos php y xampp. no podemos ir a lo mas complicado sin entender lo anterior.

ejecuta webclient de arduino 1.0.1 y asegurate que no te da error. entiende sus lineas y luego avisanos y podemos seguir ayudandote. el ejemplo del tutorial seguramente no compile porque es previo a arduino 1.0.1

buenas:
Exactamente lo que quiero hacer es que arduino me guarde lo que esta leyendo de sus 5 puertos analógicos a una base de datos. Arduino con la shield de ethernet me devuelve los datos en texto plano y lo que quiero es guardar ese texto en una base de datos mySQL. Adjunto el código fuente de arduino
Un saludo y gracias :slight_smile:

/*
 Arduino Data Web Server


  encender led http://192.168.1.7/digitalWrite/7/1
  apagar led http://192.168.1.7/digitalWrite/7/0
  ver valor analgogico en puerto 2 http://192.168.1.7/analogRead/0
 ver  valor analogico en puerto 1 http://192.168.1.7/analogRead/1
......
*/

#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>
#include <SPI.h>
#include <avr/pgmspace.h>
#include <string.h>

// MAC address can be anything that is unique within your network.
// IP is the address the Arduino Ethernet Card would respond to.  It needs to be an unused address within your network.
byte mac[] = {0x00, 0x1E, 0x2A, 0x77, 0x24, 0x02 };
byte ip[] = {192,168,1,7 }; // This is typically 10.0.0.x



EthernetServer server(80); // Port 80 is http.

//-- Commands and parameters (sent by browser) --
char cmd[15];    // Nothing magical about 15, increase these if you need longer commands/parameters
char param1[15];
char param2[15];

//-- Sample Ports ---
void SetupSamplePorts()
{
  // To illustrate how to use this, I have an LED and a Potentiometer.
  // The 10K potentiometer left lead is connected to GND, right lead to +5V, and middle lead to Analog 0.
  // The LED cathode is on digital pin 7 and anode is on pin 8.
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);   // I use this pin as GND for the LED.
  pinMode(8,OUTPUT); // Sample output, unable to use built-in LED at pin 13 because Ethernet Shield uses pins 10,11,12,13.
}

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.begin(57600);
  SetupSamplePorts();
}

#define bufferMax 128
int bufferSize;
char buffer[bufferMax];

void loop()
{
  EthernetClient client = server.available();
  if (client)
  {
    WaitForRequest(client);
    ParseReceivedRequest();
    PerformRequestedCommands();
    
    
    client.stop();
  }
}

void WaitForRequest(EthernetClient client) // Sets buffer[] and bufferSize
{
  bufferSize = 0;

  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      if (c == '\n')
        break;
      else
        if (bufferSize < bufferMax)
          buffer[bufferSize++] = c;
        else
          break;
    }
  }
  
  PrintNumber("bufferSize", bufferSize);
}

void ParseReceivedRequest()
{
  Serial.println("in ParseReceivedRequest");
  Serial.println(buffer);
  
  //Received buffer contains "GET /cmd/param1/param2 HTTP/1.1".  Break it up.
  char* slash1;
  char* slash2;
  char* slash3;
  char* space2;
  
  slash1 = strstr(buffer, "/") + 1; // Look for first slash
  slash2 = strstr(slash1, "/") + 1; // second slash
  slash3 = strstr(slash2, "/") + 1; // third slash
  space2 = strstr(slash2, " ") + 1; // space after second slash (in case there is no third slash)
  if (slash3 > space2) slash3=slash2;

  PrintString("slash1",slash1);
  PrintString("slash2",slash2);
  PrintString("slash3",slash3);
  PrintString("space2",space2);
  
  // strncpy does not automatically add terminating zero, but strncat does! So start with blank string and concatenate.
  cmd[0] = 0;
  param1[0] = 0;
  param2[0] = 0;
  strncat(cmd, slash1, slash2-slash1-1);
  strncat(param1, slash2, slash3-slash2-1);
  strncat(param2, slash3, space2-slash3-1);
  
  PrintString("cmd",cmd);
  PrintString("param1",param1);
  PrintString("param2",param2);
}

void PerformRequestedCommands()
{
  if ( strcmp(cmd,"digitalWrite") == 0 ) RemoteDigitalWrite();
  if ( strcmp(cmd,"analogRead") == 0 ) RemoteAnalogRead();
}

void RemoteDigitalWrite()
{
  int ledPin = param1[0] - '0'; // Param1 should be one digit port
  int ledState = param2[0] - '0'; // Param2 should be either 1 or 0
  digitalWrite(ledPin, ledState);

  //-- Send response back to browser --
  server.print("El didodo conectado en el puerto ");
  server.print(ledPin, DEC);
  server.print(" esta ahora:  ");
  server.print( (ledState==1) ? "ENCENDIDO" : "APAGADO" );

  //-- Send debug message to serial port --
  Serial.println("RemoteDigitalWrite");
  PrintNumber("ledPin", ledPin);
  PrintNumber("ledState", ledState);
}

void RemoteAnalogRead()
{
  // If desired, use more server.print() to send http header instead of just sending the analog value.
  int analogPin = param1[0] - '0'; // Param1 should be one digit analog port
  float analogValue =(float) analogRead(analogPin);
  analogValue=analogValue*0.42;
  
  //-- Send response back to browser --
  server.print("Por el pin A");
  server.print(analogPin, DEC);
  server.print(" esta leyendo una temperatura de: ");
  server.print(analogValue,DEC);
  
  //-- Send debug message to serial port --
  Serial.println("RemoteAnalogRead");
  PrintNumber("analogPin", analogPin);
  PrintNumber("analogValue", analogValue);
}

void PrintString(char* label, char* str)
{
  Serial.print(label);
  Serial.print("=");
  Serial.println(str);
}

void PrintNumber(char* label, int number)
{
  Serial.print(label);
  Serial.print("=");
  Serial.println(number, DEC);
}

ese codigo es tuyo?
has mirado lo que te dije de hacer el ejemplo WebClient funcionar?
donde estas enganchado?
tienes claro que arduino tiene que comunicarse con un archivo php y este archivo php meter los datos en mysql?
necesito saber en que punto estas para poder ayudarte.

Estoy en el punto de que comprendo perfectamente lo que me devuelve arduino un texto plano. Lo que quiero es mediante PHP coger ese numero que me devuelve y meterlo en la base de datos. Crear una base de datos y una tabla se como hacerlo, lo que no se es como tomar ese dato en texto plano y gestionarlo para luego poder almacenarlo en la base de datos.
Un saludo y muchas gracias

ok, si sabes crear bases de datos y tablas vamos bien
sabes php? sabes hacer un INSERT a la base de datos desde php?

lo que tienes que hacer es que arduino llame a un archivo php y le pase los parametros que tienes en variables del arduino
ejemplo
www.tupaginaweb.com/subirdatos.php?dato1=variable1&dato2=variable2

el php hace un GET
$rawdata = $_GET['dato1'];

y luego el mysql insert

No me aclaro :(.
Vamos a ver a mi arduino solo me devuelve un numer
Lo que quiero es desde un PHP tomar ese dato. Cuando tenga ese dato la inserccion si se hacerla se crear la conexion con la base de datos, crearla etc.....
Solo es tomar ese dato de la respuesta de arduino. Prueba el código que te he dado compilalo y veras que da solamente un texto plano con el numero.

Perdonad pero esque estoy pegado y me hace bastante falta esto.
Un saludo
y gracias

videmort:
No me aclaro :(.
Vamos a ver a mi arduino solo me devuelve un numer
Lo que quiero es desde un PHP tomar ese dato. Cuando tenga ese dato la inserccion si se hacerla se crear la conexion con la base de datos, crearla etc.....
Solo es tomar ese dato de la respuesta de arduino. Prueba el código que te he dado compilalo y veras que da solamente un texto plano con el numero.

Perdonad pero esque estoy pegado y me hace bastante falta esto.
Un saludo
y gracias

tu arduino te devuelve un numero? que numero ? por donde te lo devuelve? pon tu código pero no un programa completo, sino create un programa basico donde generes ese valor y donde lo único que haga es enviarselo al php. así veo donde te estas enganchando.
el php no toma ese dato, sino que arduino le ENVIA ese dato a php llamando al archivo php y pasandoselo como parametro de la URL.

He conseguido guardar los datos en texto plano en PHP.
Me queda guardarlo en una base de datos y me falla no se porque.
Codigo de arduino

/*
 Arduino Data Web Server


  encender led http://192.168.1.7/digitalWrite/7/1
  apagar led http://192.168.1.7/digitalWrite/7/0
  ver temperatura http://192.168.1.7/analogRead/0


*/

#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>
#include <SPI.h>
#include <avr/pgmspace.h>
#include <string.h>

// MAC address can be anything that is unique within your network.
// IP is the address the Arduino Ethernet Card would respond to.  It needs to be an unused address within your network.
byte mac[] = {0x00, 0x1E, 0x2A, 0x77, 0x24, 0x02 };
byte ip[] = {192,168,1,26 }; // This is typically 10.0.0.x



EthernetServer server(80); // Port 80 is http.

//-- Commands and parameters (sent by browser) --
char cmd[15];    // Nothing magical about 15, increase these if you need longer commands/parameters
char param1[15];
char param2[15];

//-- Sample Ports ---
void SetupSamplePorts()
{
  // To illustrate how to use this, I have an LED and a Potentiometer.
  // The 10K potentiometer left lead is connected to GND, right lead to +5V, and middle lead to Analog 0.
  // The LED cathode is on digital pin 7 and anode is on pin 8.
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);   // I use this pin as GND for the LED.
  pinMode(8,OUTPUT); // Sample output, unable to use built-in LED at pin 13 because Ethernet Shield uses pins 10,11,12,13.
}

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.begin(57600);
  SetupSamplePorts();
}

#define bufferMax 128
int bufferSize;
char buffer[bufferMax];

void loop()
{
  EthernetClient client = server.available();
  if (client)
  {
    WaitForRequest(client);
    ParseReceivedRequest();
    PerformRequestedCommands();
    
    
    client.stop();
  }
}

void WaitForRequest(EthernetClient client) // Sets buffer[] and bufferSize
{
  bufferSize = 0;

  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      if (c == '\n')
        break;
      else
        if (bufferSize < bufferMax)
          buffer[bufferSize++] = c;
        else
          break;
    }
  }
  
  PrintNumber("bufferSize", bufferSize);
}

void ParseReceivedRequest()
{
  Serial.println("in ParseReceivedRequest");
  Serial.println(buffer);
  
  //Received buffer contains "GET /cmd/param1/param2 HTTP/1.1".  Break it up.
  char* slash1;
  char* slash2;
  char* slash3;
  char* space2;
  
  slash1 = strstr(buffer, "/") + 1; // Look for first slash
  slash2 = strstr(slash1, "/") + 1; // second slash
  slash3 = strstr(slash2, "/") + 1; // third slash
  space2 = strstr(slash2, " ") + 1; // space after second slash (in case there is no third slash)
  if (slash3 > space2) slash3=slash2;

  PrintString("slash1",slash1);
  PrintString("slash2",slash2);
  PrintString("slash3",slash3);
  PrintString("space2",space2);
  
  // strncpy does not automatically add terminating zero, but strncat does! So start with blank string and concatenate.
  cmd[0] = 0;
  param1[0] = 0;
  param2[0] = 0;
  strncat(cmd, slash1, slash2-slash1-1);
  strncat(param1, slash2, slash3-slash2-1);
  strncat(param2, slash3, space2-slash3-1);
  
  PrintString("cmd",cmd);
  PrintString("param1",param1);
  PrintString("param2",param2);
}

void PerformRequestedCommands()
{
  if ( strcmp(cmd,"digitalWrite") == 0 ) RemoteDigitalWrite();
  if ( strcmp(cmd,"analogRead") == 0 ) RemoteAnalogRead();
}

void RemoteDigitalWrite()
{
  int ledPin = param1[0] - '0'; // Param1 should be one digit port
  int ledState = param2[0] - '0'; // Param2 should be either 1 or 0
  digitalWrite(ledPin, ledState);

  //-- Send response back to browser --
  server.print("El didodo conectado en el puerto ");
  server.print(ledPin, DEC);
  server.print(" esta ahora:  ");
  server.print( (ledState==1) ? "ENCENDIDO" : "APAGADO" );

  //-- Send debug message to serial port --
  Serial.println("RemoteDigitalWrite");
  PrintNumber("ledPin", ledPin);
  PrintNumber("ledState", ledState);
}

void RemoteAnalogRead()
{
  // If desired, use more server.print() to send http header instead of just sending the analog value.
  int analogPin = param1[0] - '0'; // Param1 should be one digit analog port
  float analogValue =(float) analogRead(analogPin);
  analogValue=analogValue*0.42;
  
  //-- Send response back to browser --
 // server.print("Por el pin A");
  //server.print(analogPin, DEC);
  //server.print(" esta leyendo una temperatura de: ");
//Cabecera HTTP estándar
          server.println("HTTP/1.1 200 OK");
          server.println("Content-Type: text/html");
          server.println();        
          //Página Web en HTML
          server.println("<html>");
          server.println("<body>");
          server.println(analogValue,DEC);
          server.println("</body>");
          server.println("</html>");
  //-- Send debug message to serial port --
  Serial.println("RemoteAnalogRead");
  PrintNumber("analogPin", analogPin);
  PrintNumber("analogValue", analogValue);
}

void PrintString(char* label, char* str)
{
  Serial.print(label);
  Serial.print("=");
  Serial.println(str);
}

void PrintNumber(char* label, int number)
{
  Serial.print(label);
  Serial.print("=");
  Serial.println(number, DEC);
}

Código PHP

<?php


//tomo las medidas de los puertos de arduno mediante peticion HTTP
$medida1="http://192.168.1.26/analogRead/0";
$medida2="http://192.168.1.26/analogRead/1";
$medida3="http://192.168.1.26/analogRead/2";
$medida4="http://192.168.1.26/analogRead/3"; 
$medida5="http://192.168.1.26/analogRead/4";


$valor1=file_get_contents($medida1);
$valor2=file_get_contents($medida2);
$valor3=file_get_contents($medida3);
$valor4=file_get_contents($medida4);
$valor5=file_get_contents($medida5);

//muestro por pantalla el contenido de los valores (Devuelven un HTML)

echo $valor1;
echo $valor2;
echo $valor3;
echo $valor4;
echo $valor5;

//conexion con base de datos del servidor
mysql_pconnect('localhost','root','');
//seleccion base de datos servidor
mysql_select_db('centroarduino');
//consulta de accion
if(isset($_POST['nombre'])) //devuelve true o false si existe o si no existe la variable
{
$valor1=$_POST['valor1'];
$valor2=$_POST['valor2'];
$valor3=$_POST['valor3'];
$valor4=$_POST['valor4'];
$valor5=$_POST['valor5'];
$cad="insert into arduino1(valor1,valor2,valor3,valor4,valor5) Values('".$valor1."','".$valor2."','".$valor3."','".$valor4."','".$valor5."')";
echo $cad; //muestro pantalla
mysql_query($cad);//ingreso  base de datos
echo 'Ingreso realizado';

}
//Autorecarga de código para que cada 10 segundos guarde dato en la base de datos mySQL
$self = $_SERVER['PHP_SELF']; //Obtenemos la página en la que nos encontramos es decir a.php 
header("refresh:10; url=$self"); //Refrescamos cada 10 segundos

?>

Un saludo y gracias

todo este codigo es tuyo? porque la verdad no es lo que hemos estado hablando en este post. no confundas "conseguir" con "entender". si has conseguido copiando y pegando que funcione es posible que no hayas aprendido. en este post hemos habaldo de que el arduino enviaba los datos a un php y este a un mysql.
tu ejemplo es mucho mas complicado. por lo tanto ya no se exactamente lo que quieres hacer. recuerda que te dije que el ejemplo WebClient era todo lo que necesitabas para aprender lo que va en el codigo del arduino.

solo tenias que cambiar estas lineas:

IPAddress server(173,194,34,215); // Google
    client.println("GET /search?q=arduino HTTP/1.0");

y hacer que en lugar de realizar la llamada a la URL en el setup(), que lo haga en el loop cada xxx segundos.

pues ya he conseguido que tome los datos periódicamente y los almacene en una base de datos.
Otra cosa:
¿como se puede guardar un valor tomado con Post y que este al recargar la web siga valiendo lo mismo hasta que no se introduzca otro?

videmort:
pues ya he conseguido que tome los datos periódicamente y los almacene en una base de datos.
Otra cosa:
¿como se puede guardar un valor tomado con Post y que este al recargar la web siga valiendo lo mismo hasta que no se introduzca otro?

Suele ser habitual que cuando en el foro cuando te ayudan a solucionar la duda que se plantea, el usuario pone su código y la solucion para que otros usuarios en el futuro puedan aprender de el.
Ademas, de marcar el titulo del hilo con la palabra SOLUCIONADO.

luego nos ponemos y miramos tu siguiente duda que es sencillita

amigo Sergegsx, tengo casi el mismo problema de Videmot, estoy intentando hacer lo del amigo videmot, meter un dato de una variable en una base de datos. te cuento lo siguiente. estoy utilizando este codigo que consegui en esta direccion INTERNET DE LAS COSAS [PARTE 2] – SUBIR LOS DATOS A UNA BASE DE DATOS te cuento que a este codigo le hice algunos comentarios ya que yo estoy haciendo pruebas para luego conectarle un sensor sct-13 serie . se lo basico de tablas y bases de datos, tambien se como hacer un scip php para la conexion y la insersion de los datos en la base de datos. la cosa es que el codigo me funciono un dia, estaba mas alegre porq lo habia logrado pero... al siguiente dia cuando fui a hacer la demostracion de que el numero o dato que le cargo a la variable variable se guardaba en mysql mediante metodo get no me quiso seguir guardando el dato y no se porque, porque no toque mas el codigo en absoluto. yo pruebo manualmente el scip de php mediante la colocacion de cualquier valor en la url y se almacena perfectamente en mysql, el problema esta es en el arduino. tambien en el terminal serial me dice conectando.... luego conectado. al quitar el cable de internet me dice conectando.... y luego desconectado conexion fallida. eso me dice que si hay conexion con el servidor local o no ?? aqui te postare el codigo.

#include <Ethernet.h>
#include <SPI.h>
 
// Configuracion del Ethernet Shield
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x00}; // Direccion MAC
byte ip[] = { 192,168,77,51 }; // Direccion IP del Arduino
byte server[] = { 192,168,77,99 }; // Direccion IP del servidor
EthernetClient client; 
//float temperatura;
//int analog_pin = 0;
int valor = 0;
 
void setup(void) {
  Ethernet.begin(mac, ip); // Inicializamos el Ethernet Shield
  delay(1000); // Esperamos 1 segundo de cortesia
  Serial.begin(9600);
}
 
void loop(void) {
  valor=55;
  //temperatura = analogRead(analog_pin);
  //temperatura = 5.0*temperatura*100.0/1024.0;
  //Display in Serial Monitor
  Serial.println(valor); //Return temperature to Monitor
  //Serial.println(" oC");
  // Proceso de envio de muestras al servidor
 
  Serial.println("Connecting...");
  if (client.connect(server, 80)>0) { // Conexion con el servidor
    client.println();
    client.print("GET /proyectos/ar_mysqli.php?valor=9"); // Enviamos los datos por GET
    client.print(valor);
    client.println();
    client.println();
    client.println(" HTTP/1.0");
    client.println("User-Agent: Arduino 1.0");
    client.println();
    client.println();
    Serial.println("Conectado");
  } else {
    Serial.println("Fallo en la conexion");
  }
  if (!client.connected()) {
    Serial.println("Disconnected!");
  }
  client.stop();
  client.flush();
  delay(9000); // Espero un minuto antes de tomar otra muestra
}

Prestaste atención al WARNING en color rojo que te advertía que el ultimo post tenía mas de 120 días.
Ultima respuesta el **04-10-2012, 17:48:58 **