Arduino => PHP => SQL

Bonjour,

Je suis entrain de configurer une base de données SQL, hébergée sur un serveur NAS en local.
Pour le moment j’arrive bien à imputer les valeurs dans la base via un fichier PHP.
Seulement je n'arrive à enregistrer qu'une seul ligne de valeurs dans la base (au démarrage de l'Arduino).
Si je veux une deuxième ligne, il me faut un RESET de l'Arduino....

Si quelqu'un a une petite idée......
Il serait fort aimable!!!

merci d'avance

Voici le code arduino:

#include "DHT.h"
#include <SPI.h>
#include <Ethernet.h>

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0x9B, 0xC9 };
IPAddress server(192,168,2,100); // My server

EthernetClient client;

void setup() {

  Serial.begin(9600);
    
  dht.begin();
  
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 1080)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println();
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{  
  if (client.connected())  {
    
    float temp = dht.readHumidity();
    float hum = dht.readTemperature();
    
    client.print( "GET /add.php?");
    client.print("temp=");
    Serial.print("temp=");
    client.print(temp);
    Serial.print(temp);
    client.print("&&");
    Serial.print("&&");
    client.print("hum=");
    Serial.print("hum=");
    client.print(hum);
    Serial.print(hum);
    client.println( " HTTP/1.1");
    Serial.println( " HTTP/1.1");
    client.println( "Host: 192.168.2.100:1080" );
    Serial.println( "Host: 192.168.2.100:1080" );
    client.println( "Content-Type: application/x-www-form-urlencoded" );
    Serial.println( "Content-Type: application/x-www-form-urlencoded" );
    client.println( "Connection: close" );
    Serial.println( "Connection: close" );
    client.println();
    client.println();
    client.stop();   
  }
   delay( 5000 );
}

J'ai développé un truc dans le genre, je remercie par avance les nombreux sites dont je me suis inspiré, voici le code :

#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[] = { 37, 59, 122, 168 }; // 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");
  client.print(i);
  client.print("=");
  client.print(temparray[i]);
  if (i < numSensors-1)
  {
   client.print("&");
  }
  else
  {
  }    
 }
 client.println(" HTTP/1.1");
 client.println("Host: 37.59.122.168");
 client.println("User-Agent: Arduino");
 client.println("Accept: text/html");
 client.println("Connection: close");
 client.println();
 delay(50);
}


void loop(void)
{
 if(client.connect(server, 80))
 {
  getTemp();
 }
 else
 {
  Serial.println("Echec de connexion (loop). Essayez de nouveau plus tard.");
 }
 client.stop();
 delay(60000); // 1 minute
}

Et le résultat en ligne après une interprétation PHP/JpGraph :

http://37.59.122.168/ds18b20.php

Ca fonctionne depuis une cinquantaine de jours, plus de 70000 lignes à raison d'un relevé par minute, pas de reset.

Bonne chance.

Hello,

Le comportement de ton programme est normal, car le client TCP est initialisé dans le setup(), donc une seule fois au boot.

C'est cette partie du code qui est importante :

  // if you get a connection, report back via serial:
  if (client.connect(server, 1080)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println();
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }

Pour faire une requête HTTP, il faut établir une nouvelle connexion TCP à chaque fois, dans ta mouture actuelle du code, setup() initialise la connexion TCP pour toute la durée de vie du programme, la première itération envoyait les données, fermait la connexion (client.close()) et pour les suivantes tu essayais d'envoyer des données sur un canal fermé.

Il faut que du déplace le bout de code dans la loop, du coup, à chaque itération : ouverture du TCP, lecture des données de ton capteur, envoi, fermeture.

Tout va marcher impec après ça.

Merci ça tourne impec!!!
Mtn il me faut envoyer tous ça dans un graph Highcharts.....

Des pistes???

Encore merci......

Highcharts est super mais il va falloir passer une étape de transformation et de traitement pour passer des données en PHP en JSON de tes series pour voir tes graphes, faire traiter ça par du javascript sur la page etc..

Si tu n'es pas habitué à faire ce genre de choses prends plutôt une librairie pur PHP pour grapher dans un premier temps (http://jpgraph.net/, la doc est très bien faite, un bon tuto en français Sommaire) et quand tu aura abouti à quelque chose de fonctionnel Highcharts sera une partie de plaisir. Afficher tes données sous forme d'un tableau HTML sera déjà un bon début.

Commencer par les choses simples et faire de l'amélioration continue c'est le meilleur moyen d'avancer :slight_smile:

JpGraph est plus simple effectivement, il y a un exemple ici avec Google Visualization API qui donne un résultat sympathique :