Pages: [1]   Go Down
Author Topic: Transmetre des Données arduino>serveur pc, sauvegarde en Bdd sql.  (Read 1302 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjours à tous , j'ai un projet qui me tient à cœur ... sur lequel je bloque.

je construit sur arduino un projet visant à automatiser un espace de culture de plante carnivore sous différents climats ( 3 climat prédéfinie ).
Materiel :
arduino mega , differente sonde , shield eth compatible librairie ethernet. routeur.

Gestion d'allumage de lampe , chaque jours l'allumage des lampes change par rapport au soleil du climat désirée .
Gestion de la température  toute les 15 min pour recréer la variation de température d'un climat 365j/ans .
Gestion de l'humidité , identique a la température
Gestion de humidificateur , pour un arrosage en douceur.

Tout ce programme fonctionne parfaitement.

Ce qu'il me manque au programme c'est la visualisation des données , et l'enregistrement sur une base de données.
je souhaites que les données du programme soit accessible sur le net et en réseau local.
je souhaite visualiser les données sur un smartphone et un pc.

voici en image mon souhait (vision simpliste):


Dans l'ordre , il faudrait déjà que arduino a la fin du script envoie les données au serveur local.
et que le serveur local les enregistre en bdd.

pour le moment je n'ai pas monter de serveur apache car je ne sait comment transmettre de arduino > serveur.

données GET/POST, web socket ?
comment dire au serveur que si il reçoit des données il les enregistres? , dans ce cas un script doit tourner en arrière plan sur le serveur ?
(je me débrouille sur php sa fait longtemps mais sa peut aider...)
Arduino doit aussi recevoir des donnée de la part du serveur ( du client navigateur web exactement ) pour effectuer certaine action telle que la mise a jours manuel de l'heure du ds1302, ou bien le changement de certain paramètre.

....
Voila après avoir réaliser ceci,je verrait la domotique arduino/web d'une façon impressionnante pouvant données libre cours a une imagination débordante d’application!
Merci a vous pour toute l'aide/conseil que vous pourrez m'apporter quand la la fin de ce 1er projet arduino de ma part quelque peu complexe.
« Last Edit: August 03, 2013, 07:01:22 am by ppzikos » Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

En gros tu veut faire ça :
http://skyduino.wordpress.com/2013/01/02/arduino-systeme-de-traitement-online-offline/
(un membre du forum avait fait une variante testant la réussite ou non de la requête HTTP, mais je l'ai plus sous la main)
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci skywodd , 1er a répondre comme toujours!

Effectivement l'envoi a partir d'arduino de requete get/post sur le serveur local est me semble t'il le plus simple pour sauvegarder en bdd.

dans ce cas cela me donnerais globalement un script comme suit:

arduino envoie un get vers serveur.  index.php?info=x&info2=x...etc...
serveur reçoit get , décompile les données et les sauvegarde en bdd(sous certaine condition).

ceci est assez simple a réaliser je pense que c'est une bonne solution pour la mise en bdd sql.

ce qu'il va me manquer c'est la mise a jour par ajax des balise div des navigateur connecté au serveur quand le serveur a reçu un get de arduino.
mais la c'est un autre language...
merci pour tout
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

arduino envoie un get vers serveur.  index.php?info=x&info2=x...etc...
serveur reçoit get , décompile les données et les sauvegarde en bdd(sous certaine condition).
Un petit script PHP qui test $_GET, balance le tout en bdd via Mysqli/PDO et hop fini smiley-wink

ce qu'il va me manquer c'est la mise a jour par ajax des balise div des navigateur connecté au serveur quand le serveur a reçu un get de arduino.
mais la c'est un autre language...
merci pour tout
Le plus simple : Jquery + JSON.
Fait deux scripts PHP : un pour stocker en bdd et un pour lire la bdd (en formatant la sortie en JSON).
Côté client un coup de Jquery.getJSON(), âpres le reste c'est du bidouillage de html pour afficher les info.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Intéressant ce projet,
j'ai en tête un système domotique géré avec une interface web sur serveur Raspberry-pi et deux ou trois Arduino qui communique par Ethernet, chaque Arduino serait autonome mais transmettrait des infos au serveur à la demande (températures, état des éclairage, détecteurs de présence, sondes diverses...)  et depuis un navigateur web on pourrait piloter les Arduino (éclairage, chauffage, alarme...)

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci skywodd , le script pour sauvegarder en bdd sa va aller sans problème j'en ai fait des tas.
mais jquery json httprequest ajax etc.. connaissance zéro , sa va être bien smiley

Quote
j'ai en tête un système domotique géré avec une interface web sur serveur Raspberry
j'ai penser la meme Raspberry comme serveur , mais je vais préférer un eepc d'occaz , pas cher , déjà une batterie un écran etc... puis il est plus facile de faire sur un vrai pc que sur Raspberry.

Arduino is Magic !
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

mais jquery json httprequest ajax etc.. connaissance zéro , sa va être bien smiley
Tu verras c'est vraiment pas compliqué smiley-wink
En plus avec Jquery tu auras des $ partout, à toi la richesse smiley-cool
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 27
Breaks ? We don't need breaks !!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai développé ce genre de chose, un Arduino Uno avec un shield ethernet qui relève la T°de 20 sondes DS18B20 en plusieurs zones. J'ai fait une carte avec des borniers pour simplifier le connectique.

En gros, toutes les minutes ça envoie les données vers un serveur Kimsufi, une requête PHP les injecte dans une base MySQL avec un horodatage et j'ai fait une page HTML + CSS3 pour consulter avec du "Responsive Web Design" pour les mobiles et un graphe généré avec la librairie JpGraph pour une évolution sur 2 heures.

http://37.59.122.168/test/

Je peux poster le code de l'ensemble, c'est un peu cracra et largement amélliorable, la question que je pose aux autres membres du forum est la suivante :

- Vaut t-il mieux partager le code déjà publié avec quelqu'un et lui permettre de le modifier et l'améliorer ou l'aider à produire son propre code en comprenant le problème de A à Z ?

Au bout du compte, je pense que le résultat est le même si la personne est dans une optique d'apprentissage, j'attends vos réponses.


* 2013-04-17_08-21-17_204.jpg (295.47 KB, 2592x1456 - viewed 20 times.)

* 2013-04-20_21-33-06_694.jpg (374.71 KB, 2592x1456 - viewed 20 times.)
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 26
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour ,

Quote
Je peux poster le code de l'ensemble
je suis intéressé par  ton code et surtout la partie PHP pour avoir une idée pour créer mon propre projet.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour merci de vos réponse,
voila ou j'en suis actuellement:
Création du script web serveur+client ensemble sur arduino:
Celui ci me permet d'envoyer des requêtes vers serveur distant (local).(arduino client),
il permet aussi de recevoir des requête get entrante(serveur)pour la config de arduino et pour du debug simple.

Création du serveur local-distant wamp sur pc, configuration pour rendre tout ceci accessible sur le web et sur le local.
Création d'une page de réception d'un seul get (php)

les reste a faire:
Fonction création de Get a partir des données arduino(T°/hr), ( actuellement le get est fixe a l'envoi car en test)
+ une autre fonction GET pour les données dite de configuration arduino , a n'envoyer que sous certaine condition.
-la page de reception > sql
-la page web avec mise a jour auto , et qui fonctionne sous android et iphone.

et quelque babiole qui prenne du temps...

DrWaX je suis bien d'accord pour regarder ton code ,c'est bien sympa ce que tu a fait car effectivement j'ai les même besoin que ton projet:

les données vers un serveur Kimsufi,> loool il sont bien les serveur a 3E par mois?
requête PHP les injecte dans une base MySQL avec un horodatage > je vais y arriver sans problème
page HTML + CSS3 "Responsive Web Design" pour les mobiles > la je suis méga preneur,
graphe généré avec la librairie JpGraph. > je comptais aussi établir des graph mais avec les fonctions de dessin de php. je ne connaissait pas la lib , elle merite un cop d'oeil quand le reste sera fini.

pour résumer DrWaX , pour le moment le plus utile pour moi serait le code de la page web , d'autant plus qu'elle est accessible pour les petit écran des smartphone et je tient particulièrement a ce point.
Quote
- Vaut t-il mieux partager le code déjà publié avec quelqu'un et lui permettre de le modifier et l'améliorer ou l'aider à produire son propre code en comprenant le problème de A à Z ?
personnellement je préfère le code dit 'exemple' , un code minimaliste permettant de mettre en valeur les fonctions essentiel. dans le cas de la page web se serait : assez de contenu pour remarquer l'adaptation smartphone/écran classique, + une ou 2 valeur à mise a jour auto.


Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

voici un exemple d'un code assez simple pour le Serveur/client ensemble sur arduino , il ne s'agit pas de mon code, je l'ai légèrement modifier pour le rendre plus facilement compréhensible et intégrable dans un script ainsi le void loop() reste assez épurer pour mettre en fonctionnement le code facilement ,
les fonctions sont regroupé comme suit :pour le serveur:
on_a_un_client() , a cette fonction on sait que l'on a un client distant connecter a arduino, c'est dans cette fonction que l'on peut faire un decode_get(readString) pour décoder la requête Get du client et envoyer page_web() correspondant a la requête
page_web() ( la page web de réponse )
pour le client web:
void sendGET() , ensimple : si le client reussi a se connecter au serveur sur le port 80 alors envoie la requette get
Code:
("GET /?ici+le+get=test HTTP/1.0")


Code:
/*
web client/serveur > ok
*/
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //MAC
byte ip[] = {192, 168, 1, 101 }; // IP LAN pour le client/server
byte gateway[] = {192, 168, 1, 100 }; // passerelle par defaut
byte subnet[] = {255, 255, 255, 0 }; //Mask sous reseau
EthernetServer server(80); //server port arduino server will use
EthernetClient client;

//char serverName[] = "web.comporium.net"; // (DNS) zoomkat's test web page server
byte serverName[] = {192,168,1,20}; //ip de wamp local( ordi sous lequel tourne wamp )


//////////////////////

void setup(){

  Ethernet.begin(mac,ip,gateway,gateway,subnet);

  server.begin();
  Serial.begin(115200);
  Serial.println("server/client 1.0 test 7/03/12"); // keep track of what is loaded
  Serial.println("Send an g in serial monitor to test client"); // what to do to test client
}

void loop(){
  // detecte la lettre g sur serial pour envoyer un get sur le serveur distant
  if (Serial.available() > 0){if(Serial.read() == 'g'){sendGET();}} 

  client = server.available();// si un client est disponible, création de l'objet client correspondant
  if (client) {  on_a_un_client(); } //---- fin if client existe ----

} //Fin du Loop

//////////////////////////
void sendGET() //client function to send and receive GET data from external server.
{
  if (client.connect(serverName, 80)) {
    Serial.println("connected");
    client.println("GET /?ici+le+get=test HTTP/1.0");
    client.println();
  }
  else {
    Serial.println("connection failed");
    Serial.println();
  }

  while(client.connected() && !client.available()) delay(1); //waits for data
  while (client.connected() || client.available()) { //connected or data available
    char c = client.read();
    Serial.print(c);
  }

  Serial.println();
  Serial.println("disconnecting.");
  Serial.println("==================");
  Serial.println();
  client.stop();

}
//////////////////
void on_a_un_client()
{String readString;// déclare un string vide
 if (client.connected()) {
   while (client.available()) {
     char c = client.read();
     if (readString.length() < 100) {readString += c;}//read char by char HTTP request
     if (c == '\n') {// si nouvelle ligne dans le get , fait les actions maintenant car la suite de la requete nous importe peu
       Serial.print(readString); //Debug
       //decode_get(readString); // pour decoder la requete recu
       page_web(); // lance la page web de reponse
       delay(1);
       client.stop();
     } // fin du si nouvelle ligne       
    } // fin du client available
   } // --- fin if client connected
  }//Fin de la fonction on_a_un_client .




////////////////////////
void page_web(){
             // envoi d'une entete standard de réponse http
             client.println(F("HTTP/1.1 200 OK"));
             client.println(F("Content-Type: text/html"));
             client.println(F("Connection: close")); // indique au client que la connexion est fermée après réponse,à noter que la connexion est persistante par défaut coté client en l'absence de cette ligne         
             client.println(); // ligne blanche obligatoire après l'entete HTTP envoyée par le serveur
             // envoi du code HTML de la page             
             client.println(F("<html>"));  //---- debut de la page HTML ---
             client.println(F("<head>"));
             client.println(F("<title>Connexion au Serveur Arduino</title>"));
             //client.println(F("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"10;URL=/\">"));  // balise meta pour réactualisation automatique de la page Web toutes les n secondes
             // envoi du corp de la page     
             client.println(F("</head>"));
             client.println(F("<body style=\"color: rgb(200, 255, 120)); background-color: rgb(255, 255, 255));\">"));
             client.println(F("<br>"));
             client.println(F("<center>")); // pour centrer la page HTML
             client.println(F("************************************************* <br> "));
             client.println(F("Test Serveur Arduino<br>"));
             client.println(F("************************************************* <br>"));
             client.println(F("<br>"));
             client.println(F("<CENTER> <img src=\"http://www.arduino.cc/mes_images/communs/led_rouge_5mm.gif\"> </CENTER>"));
             client.println(F("</body>"));
             client.println(F("</html>"));//---- fin de la page HTML
}

Chaque fonction principal de mon programme est réécrite dans un sens ou je peut la réadapter au plus simple si je doit tout refaire.
je garde le void loop aussi clair que possible car les fonction dans le programme sont assez nombreuse.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

en tapant 'framework responsive CSS' sur e moteur de recherche préfère , j'ai vu ce site http://schnaps.it/.
a priori de bon commentaire , une bonne doc , et une communauté assez réactive sur le sujet.

je ne connaissait pas ce genre de chose , la programmation web est devenu bien élégante de nos jours..
merci DrWaX!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
Breaks ? We don't need breaks !!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

voici une (grosse) partie du code que j'ai pondu, il y a ce qui concerne la structure de la base MySQL, les utilisateurs créés pour exploiter la base avec des droits restreints, le code Arduino (une vingtaine de DS18B20 répartis en 6 zones, un transmetteur RF pour déclencher une ventilation), le scripts php pour injecter les données, le fichier de config à mettre à part protégé par un .htaccess et le code de la page RDC et Graphe.

J'ai utilisé Bootstrap pour la partie Responsive et JpGraph pour générer les graphes. J'ai dans l'idée de le refaire avec jQuery en utilisant JSON, une piste à suivre peut-être...

Le projet n'est pas fini, c'est pour un ami qui a déployé les 20 sondes dans sa maison, j'espère finir bientôt.

C'est largement améliorable, utilisez-le pour votre propre projet.

* Arduino.tar.gz (5.13 KB - downloaded 15 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci , le code est assez sympa ! je vais testé bootstrap . ta fonction pour créer le GET est bien ,je comptais faire dans se sens aussi.
J'aime aussi cette partie dans le php récupération de GET :
Quote
if($_SERVER['REMOTE_ADDR']==$IP_ARDUINO)
cela est assez simple et très efficace , si les données ne provienne pas de arduino tu n'y touche pas !
+1 lool ,
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
Breaks ? We don't need breaks !!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le $IP_ARDUINO est un début de vérification, de toute façon la transmission n'est pas cryptée et on peut toujours faker le referer, mais bon, on ne cherche pas à transmettre des données secret défense.  smiley-cool
Logged

Pages: [1]   Go Up
Jump to: