Go Down

Topic: Arduino y php consulta (SOLUCIONADO) (Read 10038 times) previous topic - next topic

Pipper

Bueno al fin esta funcionando  =(, gracias Sergegsx, ahora a seguir con el proyecto...vos sabes q he probado seguramente como te lo mande y no andaba jaaa toy casi seguro :P,bueno en breve ire postiando adelantos y espero que sean siempre adelantos y no atrancadas jee, saludos.

Sergegsx

por favor marca el titulo del post con el texto solucionado.
me alegro que te funcione.

SrDonGato

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

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

Sergegsx

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.

Pipper

#34
Feb 08, 2012, 06:15 pm Last Edit: Feb 08, 2012, 06:23 pm by Pipper Reason: 1
Aca dejo el codigo funcionando, claro que no tengo drama en poner el codigo :) 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.

Code: [Select]

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

SrDonGato

Lo pongo en el playground

Un saludo

Sergegsx

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?

Pipper

#37
Feb 08, 2012, 11:42 pm Last Edit: Feb 08, 2012, 11:46 pm by Pipper Reason: 1
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:

Code: [Select]

<?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 :) ), 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.

SrDonGato

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)>(10*60*1000)); // 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


Pipper

#39
Feb 09, 2012, 04:52 pm Last Edit: Feb 09, 2012, 05:14 pm by Pipper Reason: 1
Bueno a ver eh estado probando con lo que me dijiste dongato:

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

Code: [Select]

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

Sergegsx

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"

SrDonGato

#41
Feb 09, 2012, 10:16 pm Last Edit: Feb 10, 2012, 12:30 am by SrDonGato Reason: 1
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
Code: [Select]

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");
  }

Pipper

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

Sergegsx

pon el código que no te funciona.

Pipper

Lo habia puesto mas arriba lo vuelvo a poner :

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

Go Up