mardi 21 juillet 2015

Potentiomètre vectoriel

Cette page http://sin.nexgate.ch/slid2/slid.html illustre le résultat du code qui suit. La position du potentiomètre est enregistrée ici http://sin.nexgate.ch/slid2/slid.txt. Le script php invoqué n'est pas présenté ici. Voir billet Un potentiomètre sur une page web.
Le potentiomètre n'a de vectoriel que les images qui le composent. Ce sont des fichiers au format svg produits à l'aide l'éditeur en ligne SVG-Edit.
Le code suivant ne traite pas le tiré-glissé mais le clic de la souris seulement. L'essai intégrant ces deux évènements n'ayant pas donné satisfaction. Avis aux commentaires...
<!doctype html>  
<html>  
  <head>  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>slider</title>  
    <style>  
      #sli {  
        width:40px;
        height:40px;
        left:10px;
        position:absolute;
        top:150px;
      }  
       #plast {
        width:30px;
        height:180px;
        position:absolute;
        left:15px;
      }
       #inf {
        position:absolute;
        left:60px;
        top:10px;
        background-color: #00b300;    
        border-radius: 5px;    
        box-shadow: 4px 4px 2px #373737;    
        color:white;      
        font-family:verdana;      
        text-align: center;
        width:50px;
      }
      #ghost {
        width:30px;
        height:180px;
        position:absolute;
        left:15px;
        //border-style: solid;
        //border-width: 1px;
      }
    </style>  
  </head>  
  <body >  
    <img id="plast" src="./slid.svg">
    <img id="sli" src="./butg.svg">
    <span id="inf">0</span>
    <img id="ghost" src="./ghost2.gif">
    <div></div>
    <script>  
      document.getElementById("ghost").addEventListener("mousedown", addevent);
      document.getElementById("ghost").addEventListener("mouseup", removeevent);
      function putslide() {   
        var y = event.clientY-20;
        if (y>150) y=150;
        if (y<10) y=10;
        var ind=150-y;
        document.getElementById("inf").innerHTML=ind;
        var but=document.getElementById("sli");
        but.style.top = y + "px";
        window.location.href="./test.php?ind="+ind; 
      }
      function addevent() {

        document.getElementById("ghost").addEventListener("mousemove", putslide);
      
        putslide();
      }
      function removeevent() {
        document.getElementById("ghost").removeEventListener("mousemove", putslide);
      }
    </script>   
</html>      
Lecture du code à suivre

samedi 18 juillet 2015

Commutateur animé à 3 positions

Cette page http://sin.nexgate.ch/knb3/knb.html illustre le résultat du code qui suit. La position du commutateur - 0, 1 ou 2 - est enregistrée ici http://sin.nexgate.ch/knb3/knb.txt. Le script php invoqué et réalisant l'enregistrement est similaire à celui du billet Un potentiomètre sur une page web.
<!doctype html>    
<html>    
 <head>    
  <meta name="viewport" content="width=device-width, initial-scale=1.0">    
  <title>Commutator</title>    
  <style>  
    #cmt {    
      left: 20px;     
      position: absolute;   
      top: 60px;    
      width:120px;       
    }    
    #lef {    
      left: 7px;    
      top:50px;   
      width:30px;    
    }  
    #med {    
      left: 65px;    
      top:25px;   
      width:30px;    
    }  
    #rig {    
      left: 130px;  
      top:50px;   
      width:50px;    
    }  
    .lab {    
      background-color: grey;  
      border-color: black;  
      border-radius: 15px;  
      box-shadow: 4px 4px 2px #373737;  
      color:white;    
      font-family:verdana;    
      position: absolute;    
      text-align: center;  
    }   
    @-webkit-keyframes clk1 {    
      from  {-webkit-transform: rotate(-45deg);}    
      to {-webkit-transform: rotate(0deg);}    
    }    
    @-webkit-keyframes clk2 {    
      from  {-webkit-transform: rotate(0deg);}    
      to {-webkit-transform: rotate(45deg);}    
    }    
    @-webkit-keyframes aclk1 {    
      from  {-webkit-transform: rotate(45deg);}    
      to {-webkit-transform: rotate(0deg);}    
    }  
    @-webkit-keyframes aclk2 {    
      from  {-webkit-transform: rotate(0deg);}    
      to {-webkit-transform: rotate(-45deg);}    
    }  
  </style>    
 </head>    
  <body>    
    <img id="cmt" src="./cmt.jpg" onclick="rot(event)">    
    <span class="lab" id="med">1</span>    
    <span class="lab" id="lef">0</span>  
    <span class="lab" id="rig">Auto</span>    
    <script>    
      var but=document.getElementById("cmt").style;
      but.WebkitAnimation = "aclk2 0.2s linear 1 forwards";
      window.location.href="./knb.php?mod=0";  
      var pos=0;
      function rot(event) {    
        var x = event.clientX;  
        switch(pos) {  
          case 0:  
            if(x>80 ) {     
              but.WebkitAnimation = "clk1 0.2s linear 1 forwards";     
              pos++;     
              }    
              break;  
          case 1:  
            if(x>80 ) {     
              but.WebkitAnimation = "clk2 0.2s linear 1 forwards";     
              pos++;     
              }    
            else {     
              but.WebkitAnimation = "aclk2 0.2s linear 1 forwards";     
              pos--;     
              }   
              break;  
          case 2:  
              if(x<80 ) {     
                but.WebkitAnimation = "aclk1 0.2s linear 1 forwards";     
                pos--;     
              }    
              break;  
        }  
      window.location.href="./knb.php?mod=" + pos;  
     }   
    </script>    
  </body>
</html>     
Lecture du code à suivre

vendredi 17 juillet 2015

Commutateur 3 positions

Cette page http://sin.nexgate.ch/knb2/knb.html illustre le résultat du code qui suit. La position du commutateur - 0, 1 ou 2 - est enregistrée ici http://sin.nexgate.ch/knb2/knb.txt. Le script php invoqué et réalisant l'enregistrement est similaire à celui du billet Un potentiomètre sur une page web.
<!doctype html> 
<html> 
 <head> 
  <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
  <title>knob</title> 
  <style> 
    #cmt { 
      left: 20px;  
      top: 60px; 
      position: absolute;
      width:120px;    
    } 
    #lef { 
      left: 7px; 
      top:50px;
      width:20px; 
    }
    #med { 
      left: 53px; 
      top:25px;
      width:50px; 
    }
    #rig { 
      left: 130px; 
      top:50px;
      width:20px; 
    }
    .lab { 
      background-color: grey;
      border-color: black;
      border-radius: 15px;
      color:white; 
      font-family:verdana; 
      position: absolute; 
      text-align: center;
      box-shadow: 4px 4px 2px #373737;
    } 
  </style> 
 </head> 
  <body onload="rot2php(event)"> 
    <img id="cmt" src="http://sin.nexgate.ch/knb2/knb.jpg" onclick="rot2php(event)"> 
    <span class="lab" id="med">Auto</span> 
    <span class="lab" id="lef">0</span>
    <span class="lab" id="rig">1</span> 
    <script> 
    var pos=0; 
    function rot2php(event) { 
      var x = event.clientX; 
      var but=document.getElementById("cmt").style; 
      if(x<80 && pos>0) { 
        but.WebkitTransform += "rotate(-45deg)"; 
        pos--; 
      }
      else
        if(x>80 && pos<2) { 
          but.WebkitTransform += "rotate(45deg)"; 
          pos++; 
      } 
      window.location.href="./knb.php?mod=" + pos; 
    } 
    </script> 
  </body> 
</html> 
Lecture du code à suivre

Interrupteur animé à glissière sur une page web

Le code suivant affiche un interrupteur cliquable et changeant de position graduellement. Ceci est facilité avec les scripts CSS3 et Javascript. La position, 0 ou 1, est enregistrée dans le fichier texte: http://sin.nexgate.ch/bt3/bts.txt. Rendu ici: http://sin.nexgate.ch/bt3/bts.html.
La technique consiste à afficher une partie de cette image dans un cadre de dimensions données.
<!doctype html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>switch slide</title>
    <style>
      #sw {
        height:52px;
        background-repeat:no-repeat;
        border-radius: 5px;
        width: 176px;
      }
      @-webkit-keyframes on2off {
        from  {background: url(./sw10.jpg) -13px -18px;}
        to {background: url(./sw10.jpg) -114px -18px;}
      }
      @-webkit-keyframes off2on {
        from {background: url(./sw10.jpg) -114px -18px;}
        to  {background: url(./sw10.jpg) -13px -18px;}
      }
    </style>
  </head>
  <body onload="tog()">
    <div id="sw" onclick="tog()"></div>
    <script> 
      var key=0;
      function tog() { 
        var but=document.getElementById("sw").style; 
        if(key==1) but.WebkitAnimation = "off2on 0.5s forwards";
          else but.WebkitAnimation = "on2off 0.5s forwards"; 
        window.location.href="./bts.php?st=" + key;
        key= (++key & 1);
      }
    </script> 
  </body>
</html>
Lecture du code bientôt

jeudi 16 juillet 2015

Potentiomètre rotatif sur page web

Le rotation est rendue possible avec le style CSS3. Javascript ajoute le dynamisme en modifiant l'angle de rotation au clic sur le bouton. Puis un autre script semblable à celui du billet Un potentiomètre sur une page web est invoqué pour enregistrer la position du potentiomètre. Ces pages web compatibles avec le navigateur Chrome illustrent cela : http://sin.nexgate.ch/knb/knb.html et http://sin.nexgate.ch/knb/knb.txt
<!doctype html>
<html>
 <head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>knob</title>
  <style>
    #knb {
      left: 39px; 
      position: absolute; 
      top: 34px; 
      width:120px;   
    }
    #inf {
      background-color: grey;
      color:white;
      font-family:verdana;
      left: 85px;
      position: absolute;
      top:165px;
      width:20px;
    }
  </style>
 </head>
  <body>
    <img id="plast" width="180px" src="http://sin.nexgate.ch/knb/ech.jpg">
    <img id="knb" src="http://sin.nexgate.ch/knb/knob.png" onclick="rot2php(event)">
    <span id="inf">0</span>
    <script>
    var cnt=0;
    function rot2php(event) {
      var x = event.clientX;
      var but=document.getElementById("knb").style;
      if(x<100 && cnt>0) {
        but.WebkitTransform += "rotate(-15deg)";
        cnt += -1;
      }
      if(x>100 && cnt<16 ) {
        but.WebkitTransform += "rotate(15deg)";
        cnt += 1;
      }
      document.getElementById("inf").innerHTML=cnt;
      window.location.href="./knb.php?st="+cnt;
    }
    </script>
  </body>
</html>

Lecture du script HTML

Il y a 3 éléments visibles sur la page web :
  • Ligne 25, une image qui représente la graduation
  • Ligne 26, une image représentant le bouton rotatif
  • Ligne 27, une étiquette, position de 0 à 16, déclarée par l'élément <span>. Sa largeur est déterminée via le script CSS
Le bouton déclaré en second est posé sur la graduation et sera donc cliquable. Et lorsqu'il le sera, son attribut onclick déclenchera l'exécution de la fonction rot2php() décrite ensuite.

Lecture du script CSS

En lignes 7 à 12, les attributs position, left et top du bouton identifié knb le superposent sur l'image de la graduation. La largeur du bouton est déterminée par l'attribut width. Inutile de déterminer sa hauteur car le navigateur s'en charge adoptant ainsi les proportions d'image.

Lecture du script Javascript

En ligne 29, la variable globale cnt contient le nombre qui s'affichera dans l'élément <span>. C'est la position horaire du bouton. Ex : à 0 correspond à la position de butée gauche et à 16 la position de butée droite.

A partir de la ligne 30 est déclarée la fonction rot2php(). Elle fait tourner le bouton selon la valeur de la variable cnt et selon le clic.

Cette fonction accepte le paramètre event, intégrant les coordonnées de la souris. En effet selon l'endroit du clic, le bouton tournera dans un sens ou dans l'autre. En ligne 31, la variable locale x est affectée de l'abscisse (distance horizontale) de l'endroit du clic. La distance est mesurée en pixels depuis le bord gauche de l'image du bouton.

En ligne 32 la variable but représente l'attribut style de l'élément identifié knb : le bouton. On racccourcit le code qui suit ainsi.

Vient la première alternative en ligne 33. Si x<100 c'est à dire clic sur la partie gauche du bouton et si cnt>0 c'est à dire le bouton n'est pas un butée gauche alors :
  • Ligne 34 on fait tourner le bouton de 15 degrés dans le sens anti-horaire
  • Ligne 35, on retranche 1 de la variable cnt
L'autre alternative en lignes 27 à 40 s'interpréte de façon similaire. 

Ligne 41 actualisation de l'affichage de la variable cnt dans l'élément <span> : l'étiquette.

Ligne 42, transmission de la variable cnt au script knb.php qui se charge de l'enregistrer sur le serveur distant. Voir script semblable sur le billet Un potentiomètre sur une page web 

mardi 14 juillet 2015

Un bouton sur une page web (encore)

On reprend le billet "Un bouton sur une page web" mais la technique ici est différente car elle met le Javascript à l'honneur avec pour résultat davantage de réactivité en cas de connexion lente. Le script délivré plus bas est illustré ici http://sin.nexgate.ch/bt2/bt.html et le résultat, l'état du bouton : 0 ou 1, est enregistré sur le serveur ici http://sin.nexgate.ch/bt2/bt.txt pour un usage ultérieur. Le script bt.php invoqué plus bas et réalisant l'enregistrement de l'état du bouton n'est pas le propos mais reste consultable sur l'autre billet.
<!doctype html>
<html>
 <head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>button</title>
 </head>
  <body onload="togphp()">
    <img id="btn" width="80">
    <script>
      document.getElementById("btn").addEventListener("click", togphp);
      function togphp() {
        var imgon="http://sin.nexgate.ch/bt2/btnon.jpg";
        var imgoff="http://sin.nexgate.ch/bt2/btnoff.jpg";
        var img=document.getElementById("btn");
        if(img.src==imgoff) {
            img.src=imgon;         
            window.location.href="./bt.php?st=1";
        }
        else {
          img.src=imgoff;
          window.location.href="./bt.php?st=0";
        }
      }
    </script>
  </body>
</html>

Lecture du code HTML

Il n'y a qu'un seul élément visible sur la page, déclaré par la balise<img> en ligne 8. Son attribut src définissant l'URL de l'image sera affecté plus bas par le code Javascript. C'est lui qui la déterminera selon les clics de souris sur ordinateur ou les touches sur smartphone. Son autre attribut width="80" détermine la largeur de l'image. Sa hauteur non définie est laissée au choix du navigateur qui gardera alors ses proportions intactes.

L'attribut onload de l'élément <body> en ligne 7, lance la fonction tophp() quand le chargement de la page est terminé. Cette fonction Javascript est décrite ensuite. Elle détermine l'attribut src, URL de l'image à associer à l'élément <img>.

Lecture du code Javascript

Donné aux lignes 9 à 24, il change l'image de l'interrupteur à chaque clic et lance l'enregistrement de son état en invoquant le script bt.php.

La ligne 10 s'exécute au chargement de la page, elle associe l'image identifiée "btn" à la fonction nommée togphp() et détaillée quelques lignes en-dessous. Celle-ci sera appelée à l'instant du clic (click). 

La ligne 11 est la déclaration de la fonction togphp(). Cette fonction s'exécutera lorsqu'elle sera invoquée. Deux variables imgon et imgoff  y sont d'abord déclarées et affectées en lignes 12 et 13. Il s'agit des URL correspondant aux deux images, une pour chaque état de l'interrupteur : btnon.jpg et btnoff.jpg. La troisième variable img représente l'élément <img> identifié par son attribut id="btn". Ceci simplifie les scripts qui suivent.

Et on termine par l'alternative if else. Sa condition en ligne 15 compare la valeur de img.src - URL de l'image cliquée - à l'URL correspondant à l'état off. Si il y a égalité, ==,  alors on change l'image avec l'URL imgon : ligne 16. On appelle en ligne 17 ensuite le script bt.php en lui transmettant à la suite de son URL le paramètre st affecté de 1 qui est bien l'état de l'interrupteur suivant le clic. Ce script se charge d'enregistrer le 1 sur le serveur distant comme indiqué auparavant.

Ce qui suit le else en ligne 19 est alors facile à interpréter.




Lire un nombre décimal depuis une page web

Il s'agit d'importer un octet dans une carte Yun Arduino et enregistré sur la page web http://sin.nexgate.ch/slid/slid.txt. Cette autre page http://sin.nexgate.ch/slid/sligau.html détermine le nombre décimal. La carte est programmée en langage C++, programme simple livré dessous, et met à profit ses structures de communication avec le web via wifi. Son intégration dans un réseau local n'est pas traitée ici et l'application intégrant cette fonction n'est pas le propos du billet.
#include <Bridge.h>  
#include <HttpClient.h>  
void setup() {  
  Serial.begin(9600);  
  Bridge.begin();  
}  
void loop() {  
  HttpClient client;  
  float n = 0;  
  client.get("http://sin.nexgate.ch/slid/slid.txt");  
  while (client.available()) {  
    n = client.parseFloat();  
  }  
  Serial.println(n, 1);  
  delay(5000);  
}

Lecture du code

  • En ligne n°1 on déclare la bibliothèque Bridge.h. Elle comporte les fonctions de communication entre les deux processeurs de la carte. Il y a celui qui exécute le programme décrit au-dessus et l'autre qui s'occupe de la communication avec le web.
  • Le seconde ligne déclare la bibliothèque HttpClient.h qui assure la mise en oeuvre des protocoles de communication avec le web.
  • Le segment setup() commence à la ligne 3 et ne s'exécute qu'une seule fois
    • Ligne 4, déclaration de la bibliothèque Serial, et configuration à 9600 bits par seconde, de la liaison série entre carte Yun et ordinateur via cordon USB
    • Ligne 5, déclaration de la liaison série entre processeurs de la carte
Le segment loop() est une boucle s'exécutant indéfiniment
  • Ligne 8, déclaration d'un objet nommé client selon la classe HttpClient. Préférer les variables à portée locale.
  • Ligne 9, variable n est un nombre à virgule flottante initialisé à 0
  • Ligne 10, envoi d'une requête au fichier enregistré à l'URL http://sin.nexgate.ch/slid/slid.txt. Ce fichier texte contient une chaîne de caractères, image d'un nombre compris entre 0 et 255.
  • Lignes 11, 12 et 13 : boucle s'exécutant si un caractère au moins est reçu par la liaison série entre processeurs (réponse venant du web). En ligne 12 tous les caractères issus de cette liaison sont lus et interprétés ensemble, fonction parseFloat(), comme un nombre décimal. Ce nombre est alors affecté à la variable n. La fonction available() est le nombre de caractères reçus et décrémenté jusqu'à 0, par la fonction client.parseFloat(). La boucle while s'interrompt alors car il n'y a plus de caractère à lire c'est à dire quand available() égale 0.
  • En ligne 14 on affiche le nombre n issu du web dans le terminal de l'IDE Arduino. Le second paramètre, 1, est le nombre de ses décimales que l'on souhaite voir afficher. Cette ligne pourra être placée en commentaire en la faisant précéder de // car elle n'a d'intérêt qu'en phase de développement pour s'assurer que le nombre n est correctement affecté. On fera de même avec la ligne 4 qui empêche le fonctionnement du programme dans le cas où la carte ne serait pas reliée à l'ordinateur !
  • delay(5000) est une pause de 5s. Sans cette instruction une nouvelle requête suivrait immédiatement et dans ce cas le serveur hébergeant le fichier texte ne tarderait pas à refuser de répondre : Error 403

Potentiomètre et jauge

Le code suivant s'appuie sur le billet "un  potentiomètre sur une page web" et ajoute une jauge. On peut se faire une idée du résultat avec le navigateur Chrome ici http://sin.nexgate.ch/slid/sligau.html. Le script est livré à la suite et pourrait faire fonction de thermostat. La consigne de température est enregistrée ici http://sin.nexgate.ch/slid/slid.txt par le script php invoqué et analysé dans l'autre billet.
<!doctype html>
<html>
 <head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>slider & gauge</title>
  <style>
    #pot {
      left: -50px;
      position: absolute;
      top: 70px;
      -webkit-transform: rotate(-90deg);
    }
    #gaug {
      left: 40px;
      position: absolute;
      top: 5px;
      width:160px;
    }
  </style>
  <script src="https://www.google.com/jsapi?
    autoload={'modules':[{'name':'visualization','version':'1','packages':['gauge']}]}">
  </script>
  <script>
    google.load('visualization', '1', {packages: ['gauge']});
    google.setOnLoadCallback(drawGauge);
    var gaugeOptions = {min: 10, max: 30, greenFrom:18, greenTo: 20, 
      yellowFrom: 20, yellowTo: 22, redFrom: 22, redTo: 30, minorTicks: 5};
    var gauge;
    function drawGauge() {
      gaugeData = new google.visualization.DataTable();
      gaugeData.addColumn('number', 'Celsius');
      gaugeData.addRows(1); 
      gaugeData.setCell(0, 0, 0); 
      gauge = new google.visualization.Gauge(document.getElementById('gaug'));
      gauge.draw(gaugeData, gaugeOptions);
    }
  </script>
 </head>
  <body>
    <input  type="range" min="100" max="300" value="0" id="pot">
    <div id="gaug"></div>
    <script>
      document.getElementById("pot").addEventListener("mousemove", drawArrow);
      document.getElementById("pot").addEventListener("mouseup", send2php); 
      function send2php() {
        var x=document.getElementById("pot").value/10;
        window.location.href="./slid.php?byte=" + x;
      }
      function drawArrow() {
        var x=document.getElementById("pot").value/10;
        gaugeData.setValue(0, 0, x);
        gauge.draw(gaugeData, gaugeOptions);
      }
    </script>
  </body>
</html>

Deux éléments HTML visibles

L'élément <body> déclare deux éléments visibles sur la page web, lignes 40 et 41 :
  • Le potentiomètre obtenu avec la déclaration <input> et les attributs :
    • type="range" définit la forme : potentiomètre
    • min="100" est la valeur correspondant au curseur en butée basse : 10.0°C
    • max="300" est la valeur correspondant au curseur en butée haute : 30.0°C
    • value="0" force la position du curseur au chargement de la page en butée basse
    • id="pot" identifie l'élément, le potentiomètre
  • La jauge confinée dans l'élément <div> identifié avec l'attribut id="gaug"

Javascript

Il y a trois éléments <script>:
  • En lignes 20 à 22, déclaration de la librairie des classes, méthodes et propriétés mises à contribution pour le tracé des jauges.
  • En lignes 23 à 37, on distingue:
    • Ligne 25, appel de la méthode (fonction) drawGauge() déclarée ensuite. L'appel aura lieu lorsque le chargement de la page sera terminé.
    • Lignes 26 et 27, déclaration et affectation de la variable gaugeOptions (vecteur). Simplement, on définit ici l'échelle (10 à 30), les couleurs dans l'échelle, les divisions toutes les 5 unités.
    • Ligne 28, déclaration de la variable gauge. C'est l'objet représentant la jauge!
    • Lignes 29 à 36, déclaration de la fonction drawGauge() qui s'exécutera quand elle sera appelée. On retient 3 items seulement:
      • Ligne 31, Celsius est le mot s'affichant dans la jauge
      • Ligne 33, le 3ième 0 est la valeur affichée par la jauge au chargement de la page
      • Ligne 34, gaug est l'identificateur de l'élément <div> où la jauge est dessinée
  • Lignes 42 à 54
    • Ligne 43, exécutée au chargement de la page, associe au potentiomètre "pot", la fonction nommée drawArrow() détaillée ensuite. Celle-ci sera exécutée lorsque le pointeur de souris se déplacera sur lui (mousemove)
    • Ligne 44, exécutée également au chargement de la page, associe la fonction send2php() qui sera exécutée à l'instant où le bouton de la souris sera relâché au-dessus du potentiomètre (mouseup)
    • Lignes 49 à 53, la fonction drawArrow() s'exécutera quand elle sera appelée. Elle déclare et affecte la variable x de la valeur délivrée par le potentiomètre. En butée haute, il délivrerait 300 mais x serait alors affectée de 30 représentant la température maximale désirée. X est transmise à la fonction setValue() en ligne 51 puis en ligne 52 la fonction draw() actualise le dessin de la jauge.
    • Lignes 45 à 48, la fonction send2php() s'exécutera quand elle sera appelée. Elle affecte la variable locale x puis appelle la page web nommée slid.php (située dans le même répertoire) à laquelle on acolle la chaîne de caractères "?byte=" suivi de la valeur du potentiomètre. Dans le cas où il  serait tout en haut, la requête HTTP serait : slid.php?byte=30. Il s'agirait alors de passer le paramètre nommé byte de valeur 30 au script php selon la méthode GET c'est à dire à la suite de l'URL de la page appelée.

CSS

Il s'agit des lignes intégrées à l'élément <style>. La ligne 11 oriente le potentiomètre verticalement et le dirige de façon à ce que son curseur en bas corresponde à sa valeur 0. Cette ligne est compatible avec le navigateur Chrome.
Les autres lignes disposent le potentiomètre et la jauge aux endroits désirés sur la page web.

PHP

Le script est détaillé dans le billet "un  potentiomètre sur une page web"

mercredi 8 juillet 2015

Lire un octet depuis une page web

Il s'agit d'importer un octet dans une carte Yun Arduino et enregistré sur la page web http://sin.nexgate.ch/slid/slid.txt. Cette autre page http://sin.nexgate.ch/slid/slid.html détermine l'octet. La carte est programmée en langage C++, programme simple livré dessous, et met à profit ses structures de communication avec le web via wifi. Son intégration dans un réseau local n'est pas traitée ici et l'application intégrant cette fonction n'est pas le propos de ce billet.
#include <Bridge.h>
#include <HttpClient.h>
byte n = 0;
void setup() {
  Serial.begin(9600);
  Bridge.begin();
}
void loop() {
  HttpClient client;
  client.get("http://sin.nexgate.ch/slid/slid.txt");
  while (client.available()) {
    n = client.parseInt();
  }
  Serial.println(n);
  delay(5000);
}

Lecture du code

  • Première ligne, on déclare la bibliothèque Bridge.h. Elle comporte les fonctions de communication entre les deux processeurs de la carte. Il y a celui qui exécute le programme décrit au-dessus et l'autre qui s'occupe de la communication avec le web.
  • Le seconde ligne déclare la bibliothèque HttpClient.h qui assure la mise en oeuvre des protocoles de communication avec le web.
  • Ligne 3, variable n, globale est un octet initialisée à 0
  • Le segment setup() commence à la ligne 4 et ne s'exécute qu'une seule fois
    • Ligne 5, déclaration de la bibliothèque Serial, et configuration à 9600 bits par seconde, de la liaison série entre carte Yun et ordinateur via cordon USB
    • Ligne 6, déclaration de la liaison série entre processeurs de la carte
Le segment loop() est une boucle s'exécutant indéfiniment
  • Ligne 9, déclaration d'un objet nommé client selon la classe HttpClient. La déclaration aurait pu être globale comme l'octet n. Préférer les variables à portée locale comme ici.
  • Ligne 10, envoi d'une requête au fichier enregistré à l'URL http://sin.nexgate.ch/slid/slid.txt. Ce fichier texte contient une chaîne de caractères, image d'un nombre compris entre 0 et 255.
  • Lignes 11, 12 et 13 : boucle s'exécutant si un caractère au moins est reçu par la liaison série entre processeurs (réponse venant du web). En ligne 12 tous les caractères issus de cette liaison sont lus et interprétés ensemble, fonction client.parseInt(), comme un nombre entier. Ce nombre est alors affecté à la variable n. La fonction client.available() est le nombre de caractères reçus et décrémenté jusqu'à 0, par la fonction client.parseInt(). La boucle while s'interrompt alors car il n'y a plus de caractère à lire c'est à dire quand client.available() égale 0.
  • En ligne 14 on affiche le nombre issu du web, n, dans le terminal de l'IDE Arduino. Cette ligne pourra être placée en commentaire en la faisant précéder de // car elle n'a d'intérêt qu'en phase de développement pour s'assurer que le nombre n est correctement affecté. On fera de même avec la ligne 5 qui empêche le fonctionnement du programme dans le cas où la carte n'est pas reliée à l'ordinateur !
  • delay(5000) est une pause de 5s. Sans cette instruction une nouvelle requête suivrait immédiatement et dans ce cas le serveur hébergeant le fichier texte ne tarderait pas à refuser de répondre : Error 403

lundi 6 juillet 2015

Un potentiomètre sur une page web

Le potentiomètre rectiligne acquiert un octet, valeur comprise entre 0 et 255. La valeur est ensuite enregistrée sur un serveur pour usage ultérieur. Cette page http://sin.nexgate.ch/slid/slid.html illustre le propos. L'enregistrement a lieu dans ce document texte http://sin.nexgate.ch/slid/slid.txt. Le script met à contribution des codes html, css et javascript.
Un troisième script php cette fois est analysé plus bas.
<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>slider</title>
    <style>
      #pot {
        left: -20px;
        position: absolute;
        top: 90px;
        -webkit-transform: rotate(-90deg);
      }
      #info {
        background-color: grey;
        color:white;
        font-family:verdana;
        left: 12px;
        position: absolute;
      }
    </style>
  </head>
  <body>
    <p id="info">0</p>
    <input  type="range" max="255" value="0" id="pot">
    <script>
      document.getElementById("pot").addEventListener("mousemove", ind);
      document.getElementById("pot").addEventListener("mouseup", send2php); 
      function send2php() {
        window.location.href="./slid.php?byte=" + document.getElementById("pot").value;
      }
      function ind() {
        document.getElementById('info').innerHTML = document.getElementById('pot').value;
      }
    </script>
  </body>
</html>

Deux éléments HTML visibles

L'élément <body> déclare deux éléments visibles sur la page web :
  • L'indicateur de valeur obtenu avec  l'élément <p> affichant 0 au chargement de la page et identifié avec l'attribut id="info"'
  • Le potentiomètre obtenu avec la déclaration <input> et les attributs :
    • type="range" définit la forme : potentiomètre
    • max="255" est la valeur correspondant au curseur en butée haute
    • value="0" force la position du curseur au chargement de la page en butée basse
    • id="pot" identifie l'élément, le potentiomètre

Javascript

L'élément <script> déclare le comportement des éléments HTML, l'un vis-à-vis de l'autre.
  • A la ligne 26, on associe à l'élément identifié "pot", la fonction nommée ind() et détaillée quelques lignes en-dessous. Celle-ci sera exécutée lorsque le pointeur de souris (mouse) se déplacera (move) sur le potentiomètre.
  • A la ligne 27, c'est la fonction send2php() qui sera exécutée mais à l'instant où le bouton de la souris sera relâché (mouseup).
  • La fonction ind() en ligne 31 ne comporte qu'une seule instruction en ligne 32. Celle-ci affecte à l'intérieur (inner) de l'élément <p> soit entre ses balises <p> et </p>, la valeur, value, de la position du curseur, "pot"
  • L'unique instruction de la fonction send2php() en ligne 29 consiste à ouvrir la page web nommée slid.php (située dans le même répertoire) à laquelle on acolle la chaîne de caractères "?byte=" suivi de la valeur du curseur. Dans le cas où le curseur serait tout en haut, la requête HTTP serait : slid.php?byte=255. Il s'agit alors de passer le paramètre nommé byte de valeur 255 au script php selon la méthode GET c'est à dire à la suite de l'URL de la page appelée.

CSS

Il s'agit des lignes intégrées à l'élément <style>. La ligne 11 oriente le potentiomètre verticalement et le dirige de façon à ce que son curseur en bas corresponde à sa valeur 0. Cette ligne est compatible avec le navigateur Chrome.
Les autres lignes disposent le potentiomètre et l'indicateur aux endroits désirés sur la page web et déterminent les couleurs de l'indicateur.

PHP

<?php
  $file = fopen("slid.txt", "w");
  fwrite($file, $_GET['byte']);
  fclose($file); 
  header("location:javascript://history.go(-1)");
?>
Le script est enregistré dans le fichier nommé slid.php et est appelé par la page slid.html. Sa fonction est d'enregistrer dans le fichier texte nommé slid.txt, la valeur du paramètre nommé byte qui lui est passé à la suite de son URL (méthode GET). Exemple, la ligne entrée dans le champ adresse du navigateur : slid.php?byte=200 enregistrera 200 dans le fichier slid.txt. Faites l'essai !

  • La ligne 1 déclare que le code qui suit jusqu'à la ligne ?> obéit à la syntaxe du langage php.
  • La ligne 2 déclare l'ouverture du fichier texte en mode - w - c'est à dire en écriture. Selon le mode w, si le fichier contenait déjà une valeur, elle serait effacée lors de la nouvelle écriture ou si le fichier n'existait pas, il serait créé.
  • Le ligne 3 réalise 2 opérations
    • Lecture du paramètre byte selon la méthode GET avec $_GET['byte']
    • Ecriture du paramètre dans le fichier slid.txt
  • La ligne 4 ferme le fichier.
  • La ligne 5, indique au navigateur d'afficher sa page antérieure. C'est la page appelante !
Cette page php est donc discrète car à peine appelée, la page appelante s'affiche de nouveau et ceci très rapidement ce qui rend l'exécution du script php invisible même.


samedi 4 juillet 2015

Allumer une led via le web

Il s'agit de lire un fichier du web pour allumer une led bien réelle. La petite carte Yun Arduino est mise à contribution. Elle est programmée en language C++, programme très simple livré dessous.

Cette carte met à profit des structures de communication avec le web via wifi. Son intégration dans un réseau local n'est pas traitée ici.
#include <Bridge.h>
#include <HttpClient.h>
char c = 0;

void setup() {
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  Bridge.begin();
}

void loop() {
  HttpClient client;
  client.get("http://sin.nexgate.ch/btn/btn.txt");
  while (client.available()) {
    c = client.read();
  }

  if (c == '1') {
    digitalWrite(13, HIGH);
  }
  else {
    digitalWrite(13, LOW);
  }
  delay(5000);
}

Lecture du code

Pour commencer on déclare la bibliothèque Bridge.h en ligne 1 Elle comporte les fonctions de communication entre les deux processeurs de la carte. Il y a celui qui exécute le programme décrit au-dessus et l'autre qui s'occupe de la communication avec le web.

Le seconde ligne déclare la bibliothèque HttpClient.h qui assure la mise en oeuvre des protocoles de communication via le web.

Ligne 3, variable c, globale et initialisée à 0.

Le segment setup() ne s'exécute qu'une seule fois
  • broche 13 de la carte est déclarée comme une sortie, capable donc de produire un  courant électrique. C'est sur cette broche qu'est connectée une led soudée sur la carte.
  • En ligne 7, cette led est forcée à LOW c'est à dire qu'on l'éteint.
  • Ligne 8, La communication entre processeurs est lancée.
Le segment loop() s'exécute indéfiniment
  • Ligne 12, déclaration d'un objet nommé client selon la classe HttpClient. La déclaration aurait sans doute due être globale comme la variable c. Pas d'importance.
  • Ligne 13, envoi d'une requête au fichier enregistré à l'URL http://sin.nexgate.ch/btn/btn.txt. Ce fichier texte contient "1" ou "0", c'est tout, indiquant l'état, allumé ou éteint, que l'on souhaite donner à la led.
  • Lignes 14, 15 et 16 : on attend qu'un caractère soit reçu par la liaison série entre processeurs. Le caractère transmis est "1" ou "0" selon ce qui est lu dans le fichier texte distant et est affecté à la variable c. La fonction client.available() est le nombre de caractères reçus, 1, et est décrémenté, 0, par la lecture client.read(). La répétitive while s'interrompt quand il n'y a plus de caractères à lire c'est à dire quand client.available() égale 0.
  • Vient ensuite l'alternative, lignes 18 à 23. Selon le caractère c, on allume - HIGH - ou on éteint - LOW - la led.
  • delay(5000) est une pause de 5s. Sans cette instruction une nouvelle requête suivrait et dans ce cas le serveur hébergeant le fichier finirait par refuser de répondre : Error 403.

vendredi 3 juillet 2015

Un bouton sur une page web

La page php décrite dessous acquiert une consigne binaire depuis un bouton dessiné sur la page web.
L'état du bouton (0, 1) est enregistré sur le serveur web distant. Cette page web est accessible ici : http://sin.nexgate.ch/btn/but1.php et l'état est enregistré ici http://sin.nexgate.ch/btn/btn.txt. Cet enregistrement sera utilisé ultérieurement pour commander ce qu'on voudra et fera l'objet d'un autre billet.

Deux fichiers-images sont nécessaires. Ce sont ici les fichiers swon.jpg et swoff.jpg correspondant aux états ON ou OFF du bouton.

<DOCTYPE html>
  <html>
    <head>
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Toggle</title>
     </head>
    <body>
      <?php
        $file = fopen("btn.txt", "w");
        $but=$_GET["st"];
        if ($but=="on") {
          $but="off";
          $src="./swoff.jpg";
          fwrite($file, "0");
        }
        else {
          $but="on";
          $src="./swon.jpg";
          fwrite($file, "1");
        }
        fclose($file);
     ?>
       <img src="<?php echo $src ?>" width="100" onClick="window.location.href='./but1.php?st=<?php echo $but?>'">
    </body>
</html>

Lecture du code

Le code html est très simple car il n'intègre dans sa partie visible, <body>, qu'une seule balise <img> qui déclare l'image du bouton changeant selon son état. C'est ce que le code php doit réaliser.

En ligne 4 : Les attributs de la balise html  <meta> permettent l'affichage responsive et donc adapté aux différents écrans dont les smartphones et tablettes.

Le code php est imbriqué au code html en trois endroits.

Premier code php

  • Le premier code php, en ligne 9, ouvre en écriture avec l'option w, le fichier nommé btn.txt. Le choix du format texte est réfléchi car il facilitera par la suite l'extraction des données enregistrées. L'accès avec l'option w efface les données antérieures s'il y en avait, au moment de l'écriture. Si le fichier n'existe pas, il sera créé à cette occasion.
  • En ligne 10, on enregistre le paramètre passé au fichier but1.php dans la variable php $but. Par exemple la requête but1.php?st=on affectera $but de la valeur on. Le paramètre st représente l'état du bouton avant l'appel de la page web.
  • Ligne 11, on interroge la variable $but : le paramètre est-il égal à on ?
  • S'il égale on alors, lignes 12, 13 et 14 :
    • On change la valeur de $but par off
    • La variable $src est affectée de la chaîne de caractères swoff.jpg. C'est le nom du fichier-image à afficher plus bas. Image du bouton en position OFF. 
    • On écrit 0 dans le fichier btn.txt
  • Si st égale off - lignes 17 à 19 - lecture similaire.
  • Ligne 21 : fermeture du fichier texte car l'écriture est terminée.

Second code php

  • Ce script php apparaît en ligne 23 et détermine l'image à afficher.
  • Imbriqué dans l'élément <img>, il s'agit de définir quelle image affecter à cette balise. 
  • Dans le cas où $src égale swoff.jpg, ce code php <?php echo $src ?> doit se lire swoff.jpg en code html. 
  • La ligne de code html devient donc <img src="swoff.jpg"... ce qui est conforme à la syntaxe de la balise html.

Troisième code php

  • Ce code est également inclus dans la balise <img> et relance la page php quand l'image du bouton est cliquée.
  • Le second attribut est onClick="window.location.href='./but1.php?st=<?php echo $but?>'"
  • Toujours dans le cas de l'affichage de l'image swoff.jpg où $but égale off, en remplaçant le script php par sa traduction html, on peut lire  onClick="window.location.href='./but1.php?st=off'"
  • Ce second attribut onClick="window.location.href='./but1.php?st=off'" lance la requête d'URL but1.php?st=off c'est à dire que la page web but1.php est relancée mais avec cette fois le paramètre st égal à off

C'est alors le bouton en position ON qui sera affiché sur la page web but1.php