Arduino y php consulta (SOLUCIONADO)

Después de todo podrías poner el código que rula bien :smiley:

Por que sirva de ayuda para los que vengan después y busquen sobre el mismo problema. Lo podríais poner también en el playground

Un saludo

Pipper como dice DonGato podrias poner el codigo que tienes que funciona correctamente. Luego ya postearas mas avances pero un simple ejemplo del codigo funcional para cerrar el post como solucionado.
Sino los esfuerzos en ayudarte solo te beneficias tu, y no devuelves nada a la comunidad, lo cual en otras ocasiones puede generar que la comunidad no te ayude tanto.

Aca dejo el codigo funcionando, claro que no tengo drama en poner el codigo :slight_smile: para eso son estas comunidades no?, para compartir:

El codigo lo que hace es manejar el encendido y apagado de 3 led via web con php y mysql(donde arduino es el cliente), saludos.

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 88 };
byte server[] = {192, 168, 1,33  };
Client client(server, 80);
int g=0;
int posicion=0;
int prend;
int foco;

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

}
void loop()
{
 delay(2000);               
 recibirdatos();
while (client.available()) {
    if (g<15){
    char dato_recibido = client.read();
   if (dato_recibido=='B' && posicion==0){
      posicion=1;
      Serial.println("POSICION 1");
      Serial.println(dato_recibido);
    }
    if (((dato_recibido=='H')) && posicion==1){
      posicion=2;
      Serial.println("POSICION 2");
      Serial.println(dato_recibido);
    }
    if (((dato_recibido=='1')||(dato_recibido=='2')||(dato_recibido=='3')||(dato_recibido=='4')||(dato_recibido=='5')) && posicion==2){
      posicion=3;
      if (dato_recibido=='1')  foco=13;
      if (dato_recibido=='2')  foco=28;
      if (dato_recibido=='3')  foco=30;
      Serial.println("POSICION 3");
      Serial.println(dato_recibido);
    }
    if (((dato_recibido=='A')||(dato_recibido=='Y')) && posicion==3){
      posicion=4;
      if (dato_recibido=='A')  prend=1;
      if (dato_recibido=='Y')  prend=0;
      Serial.println("POSICION 4");
      Serial.println(dato_recibido);
      Serial.println(prend);
    }
    if (dato_recibido=='F' && posicion==4){
      posicion=0;
      pinMode(foco, OUTPUT);
      digitalWrite(foco,prend);
      Serial.println("POSICION 5");
      Serial.println(dato_recibido);
      Serial.println(prend);
      Serial.println(foco);
    }
    g=g+1;
    }
    else{
    char d = client.read();
    Serial.print("");}
}
}

void recibirdatos()
{
 g=0;
//Serial.println("Dentro de la funcion");
delay(100);                  

if (client.connect()) {
Serial.println("Connected");
client.println("GET /prueba2.php?led=1&led1=2&led2=3");
client.println();
}
else
{
Serial.println("");
}
  if (!client.connected()) {                     
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
}
}

Bueno es mas o menos como lo tengo hasta ahora, lo que hago es recibir datos tipo trama por ejemplo:
BH1AF (donde B me indica el inicio de la trama, H para conotar habitacion, 1 el numero de la habitacion, A o Y para prendido o apagado, y F final de la trama), bien a la hora de recibir los datos si se fijan he puesto un if(g<15) eso es para q lea los primeros 15 caracteres y todo lo demas q lee lo guardo en otra variable sin hacer nada, es la unica forma q encontre de poder leer los datos, ya que el arduino lee todo lo q esta en html...(si alguien puede mejorarme esto se lo agradesco ;)).

Bien ahora estoy probando poder meter la temperatura cada 10 min. en mysql, lo logro en un codigo aparte, pero se me esta complicando adaptarlo a ese que ya tengo echo, de apoco ire postiando mas avances, saludos.

Lo pongo en el playground

Un saludo

Estupendo Pipper!
respecto a que hacer con lo que contiene el Serial que no deseas, siempre puedes leer lo que te interesa y hacer un Serial.flush con el resto. intentalo y me cuentas, seguro que tu programa tendra una pinta mas profesional así.

otra cosa, puedes poner el codigo php tambien para tener una solucion total al problema?

y una pregunta, al final lo has hecho como te dije...

  1. en php escribes sobre mysql un 1 o un 0 para el led que quieres encender o apagar
  2. arduino llama a php y pregunta como deberia estar el led
  3. arduino hace lo que ha leido del php por serial
  4. arduino escribe en mysql mediante php el estado actual del led.

creo que esa seria una solución que cerraria el circulo. y dandole tiempo a arduino a leer y hacer sus cosas se podria tener una web con control "indirecto" sobre el arduino pero como ventaja de no depender de abrir puertos, ips fijas etc.

tu como lo has hecho?

Ya probare el Serial.flush ese que me dices :), bueno aca pongo el codigo php, esta echo asi nomas ya q es un codigo de prueba, en cuanto termine todas mis pruebas lo dejare mas bonito :). igual espero les sirva:

<?php
$estado=$_GET["pinD13"];     //variables las cual actualizamos desde la pagina el estado
$estado1=$_GET["pinD14"];   //variables las cual actualizamos desde la pagina el estado
$estado2=$_GET["pinD15"];  //variables las cual actualizamos desde la pagina el estado
$val =$_GET["led"];     //variables que pregunta arduino y utilizamos para saber el estado
$val1=$_GET["led1"];  //variables que pregunta arduino y utilizamos para saber el estado
$val2=$_GET["led2"];  //variables que pregunta arduino y utilizamos para saber el estado
//$temperatura=$_GET["temperatura"];
$con = mysql_connect("localhost", "root", "*****");
if(!$con)
	{
	die('Could not connect: ' .mysql_error());
	}
mysql_select_db("arduino", $con);

//comprobamos el estado de los led

$result = mysql_query("SELECT `numero`, `estado` FROM `habitacion` WHERE numero=$val");
while($rs = mysql_fetch_array($result)) {
echo "$rs[1]";
}
$resulta = mysql_query("SELECT `numero`, `estado` FROM `habitacion` WHERE numero=$val1");
while($rsa = mysql_fetch_array($resulta)) {
echo "$rsa[1]";
}
$resulta1 = mysql_query("SELECT `numero`, `estado` FROM `habitacion` WHERE numero=$val2");
while($rsa1 = mysql_fetch_array($resulta1)) {
echo "$rsa1[1]";
mysql_close($con);
}

//Actualizamos el estado de los led desde la pagina

if ($estado=="Y"){
mysql_query("UPDATE habitacion set estado='BH1YF' WHERE numero=1");
mysql_close($con);
}
if ($estado=="A"){
mysql_query("UPDATE habitacion set estado='BH1AF' WHERE numero=1");
mysql_close($con);
}
if ($estado1=="Y"){
mysql_query("UPDATE habitacion set estado='BH2YF' WHERE numero=2");
mysql_close($con);
}
if ($estado1=="A"){
mysql_query("UPDATE habitacion set estado='BH2AF' WHERE numero=2");
mysql_close($con);
}
if ($estado2=="Y"){
mysql_query("UPDATE habitacion set estado='BH3YF' WHERE numero=3");
mysql_close($con);
}
if ($estado2=="A"){
mysql_query("UPDATE habitacion set estado='BH3AF' WHERE numero=3");
mysql_close($con);
}
mysql_query("INSERT INTO `led`(`habitacion`) VALUES ($val1)");
mysql_close($con);
?>
<b>Apretar Boton para prender o Apagar led Verde</b>
<form action='/prueba2.php' method='GET'><p><input type='hidden' name='pinD13' value='Y'>
<input type='submit' value='Off'/></form>
<form action='/prueba2.php' method='GET'><p><input type='hidden' name='pinD13' value='A'>
<input type='submit' value='On'/></form>
<b>Apretar Boton para prender o Apagar led Rojo</b>
<form action='/prueba2.php' method='GET'><p><input type='hidden' name='pinD14' value='Y'>
<input type='submit' value='Off'/></form>
<form action='/prueba2.php' method='GET'><p><input type='hidden' name='pinD14' value='A'>
<input type='submit' value='On'/></form>
<b>Apretar Boton para prender o Apagar led Amarillo</b>
<form action='/prueba2.php' method='GET'><p><input type='hidden' name='pinD15' value='Y'>
<input type='submit' value='Off'/></form>
<form action='/prueba2.php' method='GET'><p><input type='hidden' name='pinD15' value='A'>
<input type='submit' value='On'/></form>

Bueno el codigo lo q hace es tengo los botones correspondientes de encendido y apagado para cada led, lo que hacen es actualizarme la base de datos, la base de datos se llama arduino, tiene una tabla habitacion, dentro de habitacion tengo los campo index, numero, estado... dentro del campo "estado" tengo la trama guardada (un poco rebuscado por ahi como lo hice pero fue como me salio en el momento, en un futuro vere como voy haciendo adaptaciones :slight_smile: ), entonces con los botones actualizo estos estados dentro de la base de datos...el arduino lo que hace es preguntar cada 2 seg. como se encuentran esos estados y realizar la accion correspondiente(si a veces tengo retardos de hasta 4 seg en que se encienda o apague el led, pero no veo que sea inconveniente ya q no necesito velocidad de respuesta)...ja no se si los pasos son como vos me explicaste Sergegsx fijate...

Ahora estoy con el tema que quiero meter la temperatura cada 10 min. pero no me doy idea como puedo hacer para que una funcion se ejecute solo cada 10 min. acoplandolo a ese codigo que ya tengo...aca seguimos trabajando un saludos a todos, si alguno aporta alguna mejora que se le pueda ir haciendo bienvenido sea, saludos.

para hacer la funcion cada cierto tiempo

estableces un tiempo inicial
tiempo_inicial=millis();

luego la funcion que quieres la metes dentro de un IF tal que este

if ((millis()-tiempoinicial)>(10601000)); // 10 minutos * 60 segungos * 1000 milisegundos
{
//aqui pones lo que quieres que haga la función

tiempo_inicial=millis(); // antes de salir del IF tienes que resetear esta variable apra que empiece a contar de nuevo
}

Un saludo

Bueno a ver eh estado probando con lo que me dijiste dongato:

long retardo = 1000;
long tiempoEspera = 6000;
long tiempofuncion1 = 0;
long tiempofuncion2 = retardo;     //determino tiempo entre funciones  

void setup() {
  Serial.begin(9600);
}

void loop() {
  
   if (millis() >= tiempofuncion1) {
      funcion1();
      tiempofuncion1 = millis() + tiempoEspera;    
   }
  
   if (millis() >= tiempofuncion2) {
      funcion2();
      tiempofuncion2 = millis() + tiempoEspera;
   }
}
   void funcion1()
   {
    Serial.println("Dentro de la funcion 1"); 
   }
   void funcion2()
   {
    Serial.println("Dentro de la funcion 2"); 
   }

Ahora lo que yo quiero es q mi funcion 1 pregunte los datos a mi servidor web cierto? y mi funcion 2 que inserte datos en mysql, no me sucede ninguna de las dos cuando lo adapto a mi codigo: (no me da errores pero no hace lo que tiene q hacer :().
1.sera que le tengo q dar mas tiempo entre ambas funciones?
2.sera q no lo puedo hacer de esta forma?

Editado: al darle mas tiempo se ejecuta mi funcion 1 q es la de preguntar por el estado de los led bien, pero mi funcion 2 no :S, este es el codigo:

data = analogRead(tempPin);	   
//Serial.println(data);

if (client.connect()) {
Serial.println("Connected");
client.print("GET /prueba1.php?");
client.print("data");
Serial.print("data");
client.print("=");
Serial.print("=");
client.print(data);
Serial.print(data);
client.println(" HTTP/1.1");
client.println("Host: localhost");
client.println();
Serial.println();			   
}
else
{
Serial.println("Connection unsuccesfull");
}

Ese serial el codigo dentro de funcion 2, pero me pone Connection unsuccesfull...alguna idea de por que? (el codigo este en un programa aparte me anda bien).

buen trabajo Pipper.
este fin de semana quiero desarrollar un ejemplo base de todo esto, asi que mirare tu código para coger ideas pero si lo has dicho como dices, entonces es lo que yo pense para sistemas donde no requieres un tiempo de respuesta muy corto.

respecto a guardar temperaturas, sencillisimo. quieres hacerlo en otra tabla,no? simplemente llama al mismo php o a otro diferente y pasale la temperatura leida por el arduino con un parametro y que lo guarde junto con el unixtimestamp o con mysql time y listo.
luego ya te pondras a graficar los valores leidos, para esto te recomiendo "flot graphs"

Qué envidia me dais joer ¡¡ a ver si aprendo de una vez html php y le saco partido al shield

aqui te dejo la solucion que buscabas a los retardos, tienes que hacer un temporizador por evento, si quieres que una dependa de la otra hay que modificar alguna cosa

un saludo

long retardo = 1000; // no te hace falta
long tiempoEspera = 6000; // no te hace falta
long tiempofuncion1 = 1000; // cada segundo
long tiempofuncion2 = 3000; // cada 3 segundos
long TiempoInicial1;
long TiempoInicial2;

void setup() {
  Serial.begin(9600);
  TiempoInicial1=millis(); // inicia la variable al momento actual para temporizador 1
  TiempoInicial2=millis(); // inicia la variable al momento actual para temporizador 2
}

void loop() {
  
   if (millis() >= (TiempoInicial1+tiempofuncion1)) {
      funcion1();
      TiempoInicial1=millis();    // reset de inicio
   }
  
   if (millis() >= (TiempoInicial2+tiempofuncion2)) {
      funcion2();
      TiempoInicial2=millis();    // reset de inicio
   }
}
   void funcion1()
   {
    Serial.println("Dentro de la funcion 1"); 
   }
   void funcion2()
   {
    Serial.println("Dentro de la funcion 2"); 
   }

Exelente codigo Srdongato gracias es justo como queria q anduviera...

Ahora bien sigo sin poder meter la temperatura a la base de datos cuando llamo a la funcion senddata(), no me conecta el cliente :S (osea no entra en el if(client.connect)) no logro entender por que, ya q si cargo esa funcion sola en un sketch aparte si funciona, alguna idea de que puede ser??

pon el código que no te funciona.

Lo habia puesto mas arriba lo vuelvo a poner :

if (client.connect()) {
Serial.println("Connected");
client.print("GET /prueba1.php?");
client.print("data");
Serial.print("data");
client.print("=");
Serial.print("=");
client.print(data);
Serial.print(data);
client.println(" HTTP/1.1");
client.println("Host: localhost");
client.println();
Serial.println();			   
}
else
{
Serial.println("Connection unsuccesfull");
}

Ese codigo asi solo en un sketch anda (obio agragando lo q falta no :)), pero cuando lo pongo dentro de una funcion, y lo combino con todo lo que ya tengo echo no anda (no entra nunca al if(client.connect))...(siempre pasa al else y me muestra Connection unsuccefull).

  1. no se si se deba a que con la otra funcion tambien hago un client.connect() y entonces despues esta no pueda conectar...sinceramente no se bien que esta pasando, hoy me he puesto con la interfaz del proyecto, ya en cuanto vuelva esta noche o mañana con el codigo ese voy a ver si lo puedo depurar para ver q esta pasando q no conecta el cliente cuando lo llamo desde mas de una funcion....

Sergegsx:
pon el código que no te funciona.

repito...entero.

Bueno serg no te me enojes je :*, no he leido bien perdon ahi va todo el codigo:

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 88 };
byte server[] = {192, 168, 1,33  };
Client client(server, 80);
int g=0;
int posicion=0;
int prend;
int foco;
long tiempofuncion1 = 1000; // cada segundo
long tiempofuncion2 = 10000; // cada 3 segundos
long TiempoInicial1;
long TiempoInicial2;
int data = 0;
int tempPin = 1;

void setup()
{
Serial.begin(9600);         
Ethernet.begin(mac, ip);       
TiempoInicial1=millis(); // inicia la variable al momento actual para temporizador 1
TiempoInicial2=millis(); // inicia la variable al momento actual para temporizador 2
}
void loop()
{
 if (millis() >= (TiempoInicial1+tiempofuncion1)) {
      recibirdatos();
      TiempoInicial1=millis();    // reset de inicio
   }
  
   if (millis() >= (TiempoInicial2+tiempofuncion2)) {
      senddata();
      TiempoInicial2=millis();    // reset de inicio
   }       
 
while (client.available()) {
    if (g<15){
    char dato_recibido = client.read();
   if (dato_recibido=='B' && posicion==0){
      posicion=1;
      Serial.println("POSICION 1");
      Serial.println(dato_recibido);
    }
    if (((dato_recibido=='H')) && posicion==1){
      posicion=2;
      Serial.println("POSICION 2");
      Serial.println(dato_recibido);
    }
    if (((dato_recibido=='1')||(dato_recibido=='2')||(dato_recibido=='3')||(dato_recibido=='4')||(dato_recibido=='5')) && posicion==2){
      posicion=3;
      if (dato_recibido=='1')  foco=13;
      if (dato_recibido=='2')  foco=28;
      if (dato_recibido=='3')  foco=30;
      Serial.println("POSICION 3");
      Serial.println(dato_recibido);
    }
    if (((dato_recibido=='A')||(dato_recibido=='Y')) && posicion==3){
      posicion=4;
      if (dato_recibido=='A')  prend=1;
      if (dato_recibido=='Y')  prend=0;
      Serial.println("POSICION 4");
      Serial.println(dato_recibido);
      Serial.println(prend);
    }
    if (dato_recibido=='F' && posicion==4){
      posicion=0;
      pinMode(foco, OUTPUT);
      digitalWrite(foco,prend);
      Serial.println("POSICION 5");
      Serial.println(dato_recibido);
      //Serial.println(prend);
      //Serial.println(foco);
    }
    g=g+1;
    }
    else{
    //Serial.flush();
    char d = client.read();
    Serial.print("");}
}
}

void recibirdatos()
{
 g=0;
//Serial.println("Dentro de la funcion");
delay(100);                  

if (client.connect()) {
Serial.println("Connected");
client.println("GET /prueba2.php?led=1&led1=2&led2=3");
client.println();
}
else
{
Serial.println("");
}
  if (!client.connected()) {                     
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
}
}

void senddata()
{
data = analogRead(tempPin);	     //leemos la temperatura
//Serial.println(data);
Serial.println();
Serial.println("Next");
delay(100);						

if (client.connect()) {
Serial.println("Connected");
client.print("GET /prueba1.php?");
client.print("data");
Serial.print("data");
client.print("=");
Serial.print("=");
client.print(data);
Serial.print(data);
client.println(" HTTP/1.1");
client.println("Host: localhost");
client.println();
Serial.println();			   
}
else
{
Serial.println("Connection unsuccesfull");
}
//}
 //stop client
 client.stop();
 while(client.status() != 0)
{
  delay(5);
}
}

Saludos.

no se si tendra algo que ver pero en una funcion lo haces asi

  if (!client.connected()) {                     
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
}

y enla otra no compruebas y haces el stop forzado

 //stop client
 client.stop();
 while(client.status() != 0)
{
  delay(5);
}

tampoco se para que haces lo del client.status

buenas, me estoy uniendo, de La Rioja -Argentina. me interesa este tema. estoy intentando hacer lo mismo. un casa domotica. no para lucrar sino para mi tesis final de lic en sistema. grande aporte
"PIPPER" muy bueno lo tuyo. viendo lo de temperatura creo que no sera tan dificl, por que lo digo. por es algo que no utilizaria arduino. solo lo almacenarias en la BD para visualizarlo en tu web

hola!!, unos compañeros y yo estamos haciendo algo parecido, un control domótico desde web para encender y apagar varios dispositivos (focos, persianas, ventiladores, etc.), estamos trabajando con raspberry como servidor local, arduino, reles y los dispositivos, y necesito trabajar con el estado de cada dispositivo, mis conocimientos de programación son bastante basicos, estuve buscando info y me tope con que con una base de datos se puede hacer simplemente le doy ordenes al arduino enviando desde php lo que se necesita para que encienda, entonces arduino lo procesa lo ejecuta y con un sistema de regreso al arduino obtiene si esta encendido o apagado (a nivel serial con arduino todo funciona bien), de hecho ya logramos enviar un update desde el arduino hasta la base de datos pero no tenemos bien definido como seria el codigo de arduino para todo eso ya que tenemos todo por separado la recepcion en un codigo y el envio en otro, y no sabemos como juntarlos ayudenme por favor, no se preocupen yo subo la información para compartirla con todos ya que se me hace un proyecto muy práctico e interesante, de antemano gracias.

Gente. Dejen de responder mensajes abandonados desde 2012. Creen un nuevo hilo y canalicen por ahi sus dudas o inquietudes.