Pages: 1 2 3 [4] 5   Go Down
Author Topic: Contrôler une LED par le web (IDE 1.0)  (Read 9346 times)
0 Members and 1 Guest are viewing this topic.
Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Par la suite je rajouterai des affichages des températures et taux d'humidité; je ne sais pas encore comment m'y prendre pour afficher les infos en temps réel

Pour les relevés de temps ou autres, j'envoyais une commande à intervalle régulier et je retournais via l'arduino les données en retour à la commande (requête).
Pour l'inscription en base de données le mieux c'est de parser au niveau socket php après récupération des données de retour "$buffer".
Niveau temps réel la vrai solution c'est les websocket je pense, parce qu'ici il y a une certaine latence à cause des différents traitements.  (enfin pour tout ce qui est relevé genre temp toute les minutes mini via ajax devrait être suffisamment raisonnable).
J'en reparle ici http://arduino.cc/forum/index.php/topic,80422.msg732055.html#msg732055.

Code:
function init()
{
setInterval("getStatut()", 60000);
}

function getStatut()
{
  var dataJSon = {"0":0x02,"1":0x12,"2":0x12 };
  send(dataJSon);
}

Logged


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

Je vais étudier cela.
Par contre j'ai oublié de dire que j'aimerai aussi réaliser des courbes de température, donc dans ce cas j'ai pas le choix je dois passer par une BDD Sql ,l'arduino devra envoyé toute les 30 mn les infos dans la BDD en plus d'écouter d'éventuelle commande provenant de ma gestion des lampes.Comment gérer cela ? par TIMER peut etre?

Par contre il serait bien que ces données soit réalisé a heure fixe ex 13h 13h30 ...  c'est plus joli.
Suis je obligé de rajouter sur l'arduino un module RTC ou bien récupérer l'heure par d'autre moyen? et comment m'y prendre?

Désolé de toutes ces questions , ce n'est pas facile de mélanger tout ces différents langages , j'avance par petit pas en réalisant de petit code pour comprendre leur fonctionnement et essayé d'adapter a mes besoins.

Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je vais étudier cela.
Par contre j'ai oublié de dire que j'aimerai aussi réaliser des courbes de température, donc dans ce cas j'ai pas le choix je dois passer par une BDD Sql ,l'arduino devra envoyé toute les 30 mn les infos dans la BDD en plus d'écouter d'éventuelle commande provenant de ma gestion des lampes.Comment gérer cela ? par TIMER peut etre?

Ici ce que tu peux faire c'est un peux l'inverse de la partie cmd, la requête se fera côté arduino vers une page php et non plus du navigateur à la page php.

Un post récent traitait des requête a partir d'un arduino, sauf que c'était pour gérer des mails ici toi ce sera une bdd.
http://arduino.cc/forum/index.php/topic,111896.0.html

Par contre il serait bien que ces données soit réalisé a heure fixe ex 13h 13h30 ...  c'est plus joli.
Suis je obligé de rajouter sur l'arduino un module RTC ou bien récupérer l'heure par d'autre moyen? et comment m'y prendre?

Pour l'heure etc, le module rtc reste quand même ce qu'il y a de plus fiable, maintenant si c'est juste pour inscription de l'heure de relevé de temp tu peux te servir du timestamp php au moment de l'inscription en bdd.
Logged


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

Grâce a setInterval je reçois bien toute les x secondes de l'arduino mon info de température par l’intermédiaire de la fonction suivante.
Code:
function log(msg)
{
  msg=msg+" °"+" C";
  $("log").innerHTML=msg;
}

Mais voila je voudrais transmettre aussi 2 données supplémentaire qui seront transmis a 2 autres id("") différents.
Donc de l'arduino mon message en partance est par exemple :  client.println("22.5:20.2:65");
et dans la fonction Log rajouté une explode pour retrouvé les 3 données séparément, genre :
Code:
function log($msg)
{
$msf=explode(":",$msg);
  $msg=$msg+" °"+" C";
  $("log").innerHTML=$msg;
}
Avant d'ajouter la ligne explode le code ci avec $msg fonctionne mais lorsque explode et rajouté cela ne marche plus?
Quel est mon erreur? Y a t'il d'autres moyens pour arriver a mon but?
Merci.
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://php.net/manual/fr/function.explode.php
Je connais pas cette fonction explode mais apparemment elle retourne un tableau  de chaines, donc si tu tentes $msg=$msg+$msf vu que ce ne sont pas les même type de variables ça ne fonctionnera pas.

il faudrait faire quelque chose comme

Code:
function log($msg)
{
$msf=explode(":",$msg);
  $msg=$msg+" °"+" C";
  $msg=$msg+"\n"+$msf[0]+"\n"+$msf[1]+"\n"+$msf[2];
  $("log").innerHTML=$msg;
}

Quelque chose dans le genre (suis pas pro php  smiley-mr-green).

Logged


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

Cela ne marche pas, msg est vide lorsque j'envoie  client.print("2:"+Tempa");  soit par ex 2:18.5
mais lorsque j'envoie sans les : ca marche  (j'ai 218.5 )

J'ai réessayé par ta méthode soit
Code:
String json = "{\"start\":";
    json+=2;                                     
    json+=",\"Tempa\":";
    json+=Tempa;
    json+="}";

La ca marche j'ai  {"start":2,"Tempa":18.5}
or je ne voudrais que 2:18.5 puis par traitement de la chaine récupérer 2 et 18.5 pour les affecter à des variables a et b par ex..
Logged

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

Ca y est j'ai trouvé...

de l'arduino j'envoie  :  "{"var1":x,"var2":y}"          x=2  y = 5
dans la  fonction log(msg)   je rajoute
var objet = JSON.parse(msg);
var Data1 =objet.var1;      //  Data = 2
var Data2 =objet.var2;      //  Data = 5
Logged

Aix en Provence
Offline Offline
Sr. Member
****
Karma: 2
Posts: 264
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

J’ai pas mal avancé à partir des éléments qu’a fournis Osaka. Encore mille fois merci à lui.

Je les ai petit à petit transformés pour que cela puisse correspondre à mon projet, et faire quelque chose de fonctionnel.
Ce que j’ai fait correspond à un bricolage, que beaucoup d’entre vous vont juger infâme, mais ça me permets d’apprendre, et de faire avancer mon projet.

Je sais que tôt ou tard il va falloir que je passe en PHP avec une petite base de données MySql, mais pour le moment ce n’est pas à ma portée (je verrai probablement cela durant les longues soirées d’hiver).

Pour l’instant je « gère » deux sorties en fonction de plages horaires (3 pour chaque sortie), avec une possibilité de « marche forcée ».
Je vais avoir à gérer une quinzaine de sorties (pour commencer), je compte faire 3 pages avec 5 sorties par page, je pense que plus de 5 sortie par page, ce sera illisible (déjà là, il faudra s’accrocher !) Mais pour les aspects visuels, je verrai encore après, avant tout je veux que cela fonctionne,  je joins une copie d’écran avec les 2 sorties.

J’ai deux questions qui vont très probablement vous paraître triviales :
1) Comment faire savoir à l’arduino quelle est la page (des 3) qui est concernée ? Ce qui reviendrait à transmettre un identifiant de la page active. J’ai essayé en vain, mais mes compétences en html sont très limitées.

 2) Comment écrire à un endroit précis dans le tableau ? Dans la dernière colonne, à coté de « Electrovanne », j’aimerai écrire « activée » ou « désactivée » en fonction de l’état de l’électrovanne. Actuellement je n’arrive à l’écrire qu’en dessous du tableau « EV1 activée ou désactivée » et « EV2 activée ou désactivée ».

Je ne sais pas si je suis bien clair dans mes questions.

Je joins l'ensemble des fichiers.

Bien à vous


* Capture écran aspergeurs.JPG (68.61 KB, 600x602 - viewed 24 times.)
* Domoweb.zip (40.14 KB - downloaded 13 times.)
* Domo_RTC_LCD_PCF8574lib_UIA_PH_DS18B20_LED_SD_NTP.ino (35.68 KB - downloaded 9 times.)
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je les ai petit à petit transformés pour que cela puisse correspondre à mon projet, et faire quelque chose de fonctionnel.
Ce que j’ai fait correspond à un bricolage, que beaucoup d’entre vous vont juger infâme, mais ça me permets d’apprendre, et de faire avancer mon projet.

C'est comme ça qu'on apprend et qu'on retiens.  smiley-wink

Je sais que tôt ou tard il va falloir que je passe en PHP avec une petite base de données MySql, mais pour le moment ce n’est pas à ma portée (je verrai probablement cela durant les longues soirées d’hiver).

Pour les petites quantités de données et ce que tu désires faire tu verras les bdd c'est très simple.  

1) Comment faire savoir à l’arduino quelle est la page (des 3) qui est concernée ? Ce qui reviendrait à transmettre un identifiant de la page active. J’ai essayé en vain, mais mes compétences en html sont très limitées.

Ici tu peux faire une fonction par formulaire ou si identique ajouter un ou des paramètres pour les différencier et ainsi séparer la fonction send() qui pourra alors envoyer différentes données, même autre que formulaires.

Code:
function sendForm(form)  //fonction qui sera appelé depuis la page html, form = numero du formulaire
{
  //appel de la fonction send(msg) chargé d'envoyé les différente valeurs trouvee grace a la fonction $(id)
  send(
{
 fnum: form,
 hda1: $('hda1').value, mda1: $('mda1').value, hfa1: $('hfa1').value, mfa1: $('mfa1').value,
 hda2: $('hda2').value, mda2: $('mda2').value, hfa2: $('hfa2').value, mfa2: $('mfa2').value,
 hda3: $('hda3').value, mda3: $('mda3').value, hfa3: $('hfa3').value, mfa3: $('mfa3').value,
 hdb1: $('hdb1').value, mdb1: $('mdb1').value, hfb1: $('hfb1').value, mfb1: $('mfb1').value,
 hdb2: $('hdb2').value, mdb2: $('mdb2').value, hfb2: $('hfb2').value, mfb2: $('mfb2').value,
 hdb3: $('hdb3').value, mdb3: $('mdb3').value, hfb3: $('hfb3').value, mfb3: $('mfb3').value,
 EV1: $('EV1').checked, EV2: $('EV2').checked
}
  );
}

function send(msg)
{
  // requête post vers socket.php avec les différentes valeurs du formulaire (msg)
  jQuery.post("socket.php", msg,
function(data) //data contiendra la ou les données en retour de la requête
{
 $("retour").innerHTML = data; // on integre dans la balise portant l'id "retour" les data de retour
});
}

function $(id)
{
  return document.getElementById(id); // fonction '$' recherche l'element html par son 'id'
}


Dans la page html, appel de la fonction adapté à ton formulaire spécifique ou différent (différencier ici par un paramètre (1) que tu changeras sur chaque pages ou chaque formulaires de page).
Code:
<div><button id="bouton" onclick="sendForm(1)">Valider</button></div>

Entre (), c'est ici que php te serait utile comme les pages et formulaires sont assé similaire et répétitives, mais bon une chose à la fois  smiley-grin.
 
2) Comment écrire à un endroit précis dans le tableau ? Dans la dernière colonne, à coté de « Electrovanne », j’aimerai écrire « activée » ou « désactivée » en fonction de l’état de l’électrovanne. Actuellement je n’arrive à l’écrire qu’en dessous du tableau « EV1 activée ou désactivée » et « EV2 activée ou désactivée ».

Ça c'est le truc le plus ch... avec le html, savoir placer ses données ou autres au bon endroit c'est tout une sinécure, c'est pour celà que je n'ai jamais chercher de ce côté là niveau emplois  smiley-sleep.
En séparent la case en deux colonne ça ne marche pas ?
« Last Edit: August 22, 2012, 12:29:25 pm by osaka » Logged


Aix en Provence
Offline Offline
Sr. Member
****
Karma: 2
Posts: 264
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci Osaka,
Je vais essayer ce que tu proposes pour identifier la page.

Pour ce qui concerne la position de "activée" ou "désactivé" dans une colonne, je n'ai pas essayé, comme tu le laisses entendre.
De toute manière, je ne sais pas comment indiquer où placer un bout de texte.

@+
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour ce qui concerne la position de "activée" ou "désactivé" dans une colonne, je n'ai pas essayé, comme tu le laisses entendre.
De toute manière, je ne sais pas comment indiquer où placer un bout de texte.

Pour placer des éléments à un endroit spécifique :
http://www.siteduzero.com/tutoriel-3-13566-le-positionnement-en-css.html#ss_part_4
http://www.siteduzero.com/tutoriel-3-13522-l-alignement.html
« Last Edit: August 22, 2012, 01:51:55 pm by osaka » Logged


Aix en Provence
Offline Offline
Sr. Member
****
Karma: 2
Posts: 264
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci Osaka,

J'avais vu sur le site du zéro, j'ai même acheté le bouquin. Mais pour ce que j'en ai compris c'est un alignement ou un placement par rapport à un endroit précis, et non pas tout simplement à la suite d'un mot, un peu comme dans un texte à trou où un mot viendrait s'insérer à la suite d'un autre, ou dans une cellule d'un tableau, je pensais que c'était une (ou des) fonction(s) existante(s) qui m'avai(en)t échappé.

De toute façon ce n'est pas important, c'est plus cosmétique que fonctionnel.
@+
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En fait le texte en lui même tu ne sais pas le positionner, par contre les balise type bloc ou inline oui, donc  pour inséré un texte différent, décalé ou autre tu auras 3 balise span par exemple, une contenant le texte à gauche, un au centre (celui qui sera décalé) et un à sa droite.
Enfin c'est clair qu'il faut joué et bricoler pour obtenir ce que l'on désire la plus part du temps  smiley-sad.
« Last Edit: August 24, 2012, 12:01:21 pm by osaka » Logged


Aix en Provence
Offline Offline
Sr. Member
****
Karma: 2
Posts: 264
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset



Bonjour,
J’ai bien avancé.
J’ai réussi à faire fonctionner mon système avec deux pages web, une première page pour les 5 électrovannes « aspergeurs » et une seconde page pour les 5 électrovannes « goutte à goutte ». Cela fonctionne très bien, je peux leur affecter des plages horaires et lire et afficher (pas encore exactement où je veux, mais j’ai laissé tomber pour le moment car c’est un détail) les états des entrées correspondantes.
Mon problème du moment est le suivant :
Lorsque j’utilise la fonctionnalité de mise à jour automatique de l’heure par un serveur NTP, celle-ci fonctionne, mais je n’arrive plus à me connecter au serveur web apache, il doit y avoir un conflit, mais c’est au delà de mes compétences.
J’ai refait des essais avec uniquement ces deux fonctionnalités avec les « programmes de base » :
1) l’échange de données avec le serveur web (actuellement en local : serveur apache) programmes fournis par Osaka => fonctionne très bien

Code:
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0x6D, 0x86 }; // a remplacer
byte ip[] = { 192,168,0,49 }; // a remplacer

EthernetServer server(8888); // 1080 a remplacer si différent fonctionne également avec 8888 => à modifier alors dans php
byte nb = 0;

void setup()
{

  Serial.begin(9600);

  Ethernet.begin(mac, ip);
  server.begin();

}


void loop()
{
  EthernetClient client = server.available();
 
  if (client)
  {
    nb++;
    if (client.connected())
    {
      while (client.available())
      {
        char c = client.read();
        Serial.write(c); //on affiche dans le monitor les caractère reçu

        if(!client.available())
        {

          client.write("j'ai bien reçu la requete "); //réponse avec write
          client.print(nb, DEC); // réponse avec print (nb = nombre de requêtes)
          delay(1);
         
          client.stop();
        }
      }
      Serial.println (); // retour à la ligne dans serial monitor après chaque réception des données
    }
  }
}

2) la lecture de données sur un serveur NTP => fonctionne très bien

Code:
#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

unsigned int localPort = 8888;      // local port to listen for UDP packets

IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server

const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start Ethernet and UDP
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  Udp.begin(localPort);
}

void loop()
{
  sendNTPpacket(timeServer); // send an NTP packet to a time server

    // wait to see if a reply is available
  delay(1000); 
  if ( Udp.parsePacket() ) { 
    // We've received a packet, read the data from it
    Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); 
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord; 
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);               

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;     
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears; 
    // print Unix time:
    Serial.println(epoch);                               


    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':'); 
    if ( ((epoch % 3600) / 60) < 10 ) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch %60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(10000);
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:    
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer,NTP_PACKET_SIZE);
  Udp.endPacket();
}

3) la lecture de données NTP dans setup, et échange de données avec le serveur web => seul la lecture NTP fonctionne
 le programme en fichier joint

Voici ce que  renvoi le serveur apache au bout d’un moment :
Warning: socket_connect() [function.socket-connect]: unable to connect
  • : Une tentative de connexion a �ou�ar le parti connect��a pas r�ndu convenablement au-del��une certaine dur�ou une connexion �blie a �ou�ar l�h�de connexion n�a pas r�ndu. in C:\Program Files (x86)\EasyPHP-5.3.9\www\Osaka1\socket.php on line 11

Warning: socket_write() [function.socket-write]: unable to write to socket
  • : Une requ� d�envoi ou de r�ption de donn� n�a pas � autoris�car le socket n�est pas connect�t (lors de l�envoi sur un socket datagramme en utilisant un appel sendto) aucune adresse n�a � fournie. in C:\Program Files (x86)\EasyPHP-5.3.9\www\Osaka1\socket.php on line 12

Auriez-vous une idée ?
Bien à vous

* UdpNtpClient_web.ino (5.2 KB - downloaded 7 times.)
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yop Bribri,
Il y a déjà conflit avec le même port utilisé (8888) pour deux connexions simultané différente.

Code:
EthernetServer server(8888);

unsigned int localPort = 8888;      // local port to listen for UDP packets
Udp.begin(localPort);

Logged


Pages: 1 2 3 [4] 5   Go Up
Jump to: