Go Down

Topic: [Résolu] Problème upload vers un script php (Read 649 times) previous topic - next topic

Engel1st

May 06, 2013, 09:55 pm Last Edit: Jun 08, 2013, 02:52 pm by Engel1st Reason: 1
Bonsoir,

J'ai retourné un bon bout d'Internet et de ce forum mais impossible de trouver la solution. J'ai une sonde 1Wire et je souhaite l'injecter dans une base de donnée toute les heures. Pour l'instant l'envoi de la requete est dans le setup une fois que ca fonctionnera je le mettrais dans le loop pour que ca boucle. J'ai testé plein de config mais impossible d'envoyer la requete. Actuellement je fais un get avec la temperature inscrite directement en paramètre pour débugger mais rien n'y fais. J'ai l'impression que la requête est mal formée et que ca "ne part pas". Au niveau du get j'ai essayer avec un / devant le http comme dans certains ex ca ne passe pas, j'ai essayer avec juste le fond de l'url dans l'hôte c'est pareil... Si vous avez une idée.. :(

Merci.
Quote
// ***** INCLUSION DES LIBRAIRIES NECESSAIRES *****
#include <OneWire.h>
#include <SPI.h>
#include <WiFly.h>
#include "Credentials.h"

// ***** DEFINITIONS DES VARIABLES *****
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 8 // Broche utilisée pour le bus 1-Wire

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
byte server[] = { 66, 249, 89, 104 }; // Google
////////////////////////////

//Client client(server, 80);

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
 byte data[9], addr[8];
 // data : Données lues depuis le scratchpad
 // addr : adresse du module 1-Wire détecté

 if (!ds.search(addr)) { // Recherche un module 1-Wire
   ds.reset_search();    // Réinitialise la recherche de module
   return false;         // Retourne une erreur
 }
 
 if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
   return false;                        // Si le message est corrompu on retourne une erreur

 if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
   return false;         // Si ce n'est pas le cas on retourne une erreur
 ds.reset();             // On reset le bus 1-Wire
 ds.select(addr);        // On sélectionne le DS18B20
 ds.write(0x44, 1);      // On lance une prise de mesure de température
 delay(800);             // Et on attend la fin de la mesure
 ds.reset();             // On reset le bus 1-Wire
 ds.select(addr);        // On sélectionne le DS18B20
 ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

 for (byte i = 0; i < 9; i++) // On lit le scratchpad
   data = ds.read();       // Et on stock les octets reçus
 
 // Calcul de la température en degré Celsius
 *temp = ((data[1] << 8) | data[0]) * 0.0625;
 // Pas d'erreur
 return true;
}

WiFlyClient client;

void setup() {
 
Serial.begin(9600);
WiFly.setUart(&Serial);
WiFly.begin();
float temp;
 
 if (!WiFly.join(ssid, passphrase)) {
   Serial.println("Association failed.");
   while (1) {
     // Hang on failure.
   }
 }  

 Serial.println("connecting...");

 if (client.connect("192.168.100.2", 80)) {
   Serial.println("connected");
     if(getTemperature(&temp)) {
     
   client.print("GET http://192.168.100.2/InjectTempBD.php?Temperature=25");        
   client.println(" HTTP/1.1\r\n");
   client.println("Host: http://192.168.100.2");
   client.println("Content-Type: application/x-www-form-urlencoded");
   client.println("Connection: close");
       
 //  client.print("Temperature=");
  // client.print(temp);  
     }
 } else {
   Serial.println("connection failed");
 }
 
}

void loop() {
 if (client.available()) {
   float temp;

 
  char c = client.read();
   Serial.print(c);
 
       delay(10000);
   
 
   
 }
 
 if (!client.connected()) {
   Serial.println();
   Serial.println("disconnecting.");
   client.stop();
   for(;;)
     ;
 }
}



infobarquee

bonjour,
jete un oeil sur ce code
https://github.com/dpslwk/WiFly/blob/master/examples/WiFly_WebClient/WiFly_WebClient.ino

DrWaX

Bonjour, j'ai développé ce genre de chose, voici le code de l'Arduino :
Code: [Select]
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <Ethernet.h>

#define ONE_WIRE_BUS 7
#define TEMPERATURE_PRECISION 12

byte mac[] = { 0xDE, 0xAD, 0xCA, 0xFE, 0xBA, 0xBE };
byte ip[] = { 192, 168, 0, 100 };
byte server[] = { 198, 168, 0, 104 }; // IP serveur MySQL + PHP
byte gateway[] = { 192, 168, 0, 254 };
byte dns[] = { 192, 168, 0, 254 };
byte subnet[] = { 255, 255, 255, 0 };

EthernetClient client;

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress DS0, DS1, DS2;

void setup(void)
{
 
Serial.begin(9600);
sensors.begin();
if (!sensors.getAddress(DS0, 0)) Serial.println("Pas d'adresse pour le capteur 0");
if (!sensors.getAddress(DS1, 1)) Serial.println("Pas d'adresse pour le capteur 1");
if (!sensors.getAddress(DS2, 2)) Serial.println("Pas d'adresse pour le capteur 2");
sensors.setResolution(DS0, TEMPERATURE_PRECISION);
sensors.setResolution(DS1, TEMPERATURE_PRECISION);
sensors.setResolution(DS2, TEMPERATURE_PRECISION);
Ethernet.begin(mac, ip, dns, gateway, subnet);
}

void getTemp(void)
{
int i = 0;
int numSensors = sensors.getDeviceCount();
float temparray[numSensors]; 
sensors.requestTemperatures();
delay(100);
for(i=0; i<numSensors; i++)
{
   
  float temp = sensors.getTempCByIndex(i);
  temparray[i] = temp;
}
client.print("GET /getTemp.php?");
for (i=0; i<numSensors; i++)
{
  client.print("t");
  Serial.print("t");
  client.print(i);
  Serial.print(i);
  client.print("=");
  Serial.print("=");
  client.print(temparray[i]);
  Serial.print(temparray[i]);
  if (i < numSensors-1)
  {
   client.print("&");
   Serial.print("&");
  }
  else
  {
  }   
}
client.println(" HTTP/1.1");
Serial.println(" HTTP/1.1");
client.println("Host: 198.168.0.104");
Serial.println("Host: 198.168.0.104");
client.println("User-Agent: Arduino");
Serial.println("User-Agent: Arduino");
client.println("Accept: text/html");
Serial.println("Accept: text/html");
client.println("Connection: close");
Serial.println("Connection: close");
client.println();
Serial.println();
delay(50);
}

void loop(void)
{
if(client.connect(server, 80))
{
  getTemp();
  while (client.connected() && client.available())
  {
   char c = client.read();
   Serial.print(c);           
  }
Serial.println();       
}
else
{
  Serial.println("Echec de connexion. Essayez de nouveau plus tard.");
}
delay(60000); // 1 minute
client.stop();



Et le code PHP pour injecter dans la base MySQL :
Code: [Select]
<?php

include("inc/config-ds18b20.php");

mysql_connect($hostname,$username,$password) or die("Impossible de se connecter a la base de donnees.");
@
mysql_select_db($database) or die("Impossible de trouver la base de donnees.");

if(
$_SERVER['REMOTE_ADDR']==$IP_ARDUINO)
{
 
$temp0 $_GET['t0'];
 
$temp1 $_GET['t1'];
 
$temp2 $_GET['t2'];
 
$requete "INSERT INTO temperatures(t_DS0, t_DS1, t_DS2) VALUES('$temp0','$temp1','$temp2')";
 
mysql_query($requete);
 
mysql_close();
 exit(
'200');
}

?>


Le fichier config-ds18b20.php contient le nom de la base, le username et le mot de passe ainsi que l'adresse IP de l'Arduino (petite sécurité).

En espérant que ça puisse te rendre service.

Engel1st

C'est bon j'ai réussi à corriger mon problème !!

-Cette ligne là ne sert à rien : //byte server[] = { 213, 186, 33, 4 }; on peut donc la quoté!

-Il faut bien avoir cette ligne renseignée : "WiFlyClient client("xxx.fr", 80);"
-Et voilà le code qui marche :
if (client.connect()) {
    client.print("POST http://www.xxx.fr/InjectBD.php?Temperature=");
    client.print(temp);
    client.print(" HTTP/1.0\r\n");
    client.println("Host: www.xxx.fr");
    client.println();
    delay(1800000);
  } else {
    Serial.println("connection failed");
  }

La ligne en rouge est CRUCIALE! Si elle n'y est pas ca ne fonctionnera pas!

Go Up