Lo scopo di questo progetto inizialmente era quello di accendere e spegnere una lampadina 220V da una pagina Web.
A mano a mano che il progetto evolveva ho voluto inserire nel circuito un deviatore e le segnalazioni (via mail) di chi aveva spento/acceso (il web, il deviatore).
Per le segnalazioni via mail non ho usato il server Yun (non ci sono riuscito) ma, come si vede nel codice, ho inviato un post a un altro server PHP.

index.html

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>SECONDINO</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>  
    <style>
      body{width: 100%; text-align: center;}
      .button{width:200px; margin: auto; margin-top:24px;}
      label[for="rele"].ui-state-active {background: green none repeat scroll 0 0; color: white;}  /* cambio il css del pulsante, quando è attivo, si colora  */
      #tabs{width: 900px; margin:auto;}
    </style>
    <script>
      $(document).ready(function() {
          loadActualData(); // leggo i file scritti nel json per avere un aggiornamento dello stato delle porte del microprocessore.
          //invio i dati ad Arduino
          $('#rele').click(function(){interruttore(this,"3",$("#rele").attr("nextcommand"),$("#alimentatore").val());});
      });
      $(function() {
          $( "#drele" ).buttonset();
          $( "#tabs" ).tabs();
      });
    </script>
  </head>
  <body>
      <div id="tabs">
          <ul>
              <li><a href="#ui">Alimentazione con deviatore</a></li>
          </ul>
      <div id="ui">
          <div class="button" id="drele">
              <input type="checkbox" id="rele" nextcommand="high">
              <label id="labelrele" for="rele">Deviatore</label>
          </div>
          <input type="hidden" id="alimentatore"></div>
      </div>
    <script>
      function loadActualData(){ 
          $.getJSON("/data/get/",function(data){ //path dove vengono salvati i dati dallo scketch ti Arduino
            //alert (JSON.stringify(data));
            //per cambiare lo stato del pulsante e la colorazione devo modificare le proprietà del pulsante, l'attributo aria-pressed e le classi della label 
          	if((data.value.ALIMENTATORE)==="1" && (data.value.RELE)==="1"){$('#rele').prop('checked', true).attr('nextcommand','low');$('#labelrele').attr('aria-pressed', true).addClass('ui-state-active');};
			if((data.value.ALIMENTATORE)==="1" && (data.value.RELE)==="0"){$('#rele').prop('checked', true).attr('nextcommand','high');$('#labelrele').attr('aria-pressed', true).addClass('ui-state-active');};
			if((data.value.ALIMENTATORE)==="0" && (data.value.RELE)==="0"){$('#rele').attr('checked', false).attr('nextcommand','high');$('#labelrele').attr('aria-pressed', false).removeClass('ui-state-active');};
			if((data.value.ALIMENTATORE)==="0" && (data.value.RELE)==="1"){$('#rele').attr('checked', false).attr('nextcommand','low');$('#labelrele').attr('aria-pressed', false).removeClass('ui-state-active');};
			if((data.value.ALIMENTATORE)==="1"){$('#alimentatore').val("1");}else{$('#alimentatore').val("0");};
          });
          timeout=setTimeout("loadActualData()",4000);
      }
      
      function interruttore(elemento, pin, comando, alimentatore){
        //alert(comando);
          $.ajax({url : "/arduino/"+comando+pin+"&",
                 beforeSend: function(){refresh("stop");},
                 success: function(){refresh("start");}
                 });	  
      }

      function refresh(cosa){
          if (cosa=="start") {timeout=setTimeout("loadActualData()",4000);} else {clearTimeout(timeout);};
      }
      
  </script>
  </body>
</html>

Sketch


#include 
#include 
#include 
int RELE = 3; // PIN DEL RELE
int ALIMENTATORE = A0; //PIN DELL'ALIMENTATORE USO L'ANALOGICO PERCHE' QUESTO ALIMENTATORE QUANDO SI SPEGNE CI METTE CIRCA 2MIN AD ARRIVARE A O, QUINDI USO <1023 PER DETERMINARE SE E' SPENTO
String statoAlimentatore; //LO USO PER CAPIRE SE "LA LAMPADINA" E' ACCESA O SPENTA
String ultimoStatoAlimentatore="0"; //LO STATO INZIALE DELL'ALIMENTATORE
String fonte; //CLIENT WEB
String stato; //LO STATO DEL SISTEMA: ALIMENTATORE+RELE+CLIENT WEB
YunServer server;
void setup() {
  Serial.begin(9600);
  pinMode(RELE,OUTPUT);
  pinMode(ALIMENTATORE,INPUT);
  Bridge.begin();  
  server.begin();
}
void loop() {
  YunClient client = server.accept();
  if (String(analogRead(ALIMENTATORE))=="1023"){ 
    statoAlimentatore="1";  ///CAMBIO LO STATO DELL'ALIMENTATORE 
    Bridge.put("ALIMENTATORE",statoAlimentatore); // SCRIVO IN DATA/GET IL VALORE DELL'ALIMENTATORE
    Bridge.put("RELE",""+String(digitalRead(RELE))+"");
  } else {
    statoAlimentatore="0"; 
    Bridge.put("ALIMENTATORE",statoAlimentatore);
    Bridge.put("RELE",""+String(digitalRead(RELE))+"");
  }
  if (client) {
    process(client);
    client.stop();
  }
  if (statoAlimentatore!=ultimoStatoAlimentatore) {
    stato=statoAlimentatore+"-"+String(digitalRead(RELE))+"-"+fonte;
    Bridge.put("STATO",stato); //SCRIVO IND DATA/GET LO STATO DEL SISTEMA
    if(stato=="1-0-"){fonte="";inviaMail("ON DA TASTIERA");} //INVIO UNA MAIL A SECONDA DI CHI STA ACCENDENDO O SPEGNENDO
    if(stato=="0-0-"){fonte="";inviaMail("OFF DA TASTIERA");} //NON USO LO SWITCH PERCHE' NON VA SULLE STRINGHE
    if(stato=="0-1-W"){fonte="";inviaMail("OFF DA ARDUINO");}
    if(stato=="0-1-"){fonte="";inviaMail("OFF DA TASTIERA");}
    if(stato=="0-0-W"){fonte="";inviaMail("OFF DA ARDUINO");}
    if(stato=="1-1-W"){fonte="";inviaMail("ON DA ARDUINO");}
    if(stato=="1-1-"){fonte="";inviaMail("ON DA TASTIERA");}
    if(stato=="1-0-W"){fonte="";inviaMail("ON DA ARDUINO");}
    ultimoStatoAlimentatore=statoAlimentatore; //REIMPOSTO LO STATO E ASPETTO IL PROSSIMO CAMBIAMENTO
    };
  delay(500);
}
void process(YunClient client) {
  String command = client.readStringUntil('&'); // ULTIMO CARATTERE DELLA STRINGA INVIATA DAL BROWSER
  if (command == "high3") { 
    fonte="W"; 
    stato="";
    digitalWrite(3,HIGH);
    } else {
    fonte="W";
    stato="";
    digitalWrite(3,LOW);}
}
void inviaMail(String msg) {
  Process myscript;
  myscript.runShellCommand("curl --data \"msg="+msg+"\" http://ilvostroserver./arduino/sendmail.php");
}

Gallery

Linux provides a nice little command which makes our lives a lot easier.

GET:

with JSON:

curl -i -H “Accept: application/json” -H “Content-Type: application/json” -X GET http://hostname/resource

with XML:

curl -H “Accept: application/xml” -H “Content-Type: application/xml” -X GET http://hostname/resource

POST:

For posting data:

curl –data “param1=value1&param2=value2” http://hostname/resource

For file upload:

curl –form “fileupload=@filename.txt” http://hostname/resource

RESTful HTTP Post:

curl -X POST -d @filename http://hostname/resource

For logging into a site (auth):

curl -d “username=admin&password=admin&submit=Login” –dump-header headers http://localhost/Login
curl -L -b headers http://localhost/

Pretty-printing the curl results:

For JSON:

If you use npm and nodejs, you can install json package by running this command:

npm install -g json

Usage:

curl -i -H “Accept: application/json” -H “Content-Type: application/json” -X GET http://hostname/resource | json

If you use pip and python, you can install pjson package by running this command:

pip install pjson

Usage:

curl -i -H “Accept: application/json” -H “Content-Type: application/json” -X GET http://hostname/resource | pjson

If you use Python 2.6+, json tool is bundled within.

Usage:

curl -i -H “Accept: application/json” -H “Content-Type: application/json” -X GET http://hostname/resource | python -m json.tool

If you use gem and ruby, you can install colorful_json package by running this command:

gem install colorful_json

Usage:

curl -i -H “Accept: application/json” -H “Content-Type: application/json” -X GET http://hostname/resource | cjson

If you use apt-get (aptitude package manager of your Linux distro), you can install yajl-tools package by running this command:

sudo apt-get install yajl-tools

Usage:

curl -i -H “Accept: application/json” -H “Content-Type: application/json” -X GET http://hostname/resource | json_reformat

For XML:

If you use Linux with Debian/Gnome envrionment, install libxml2-utils:

sudo apt-get install libxml2-utils

Usage:

curl -H “Accept: application/xml” -H “Content-Type: application/xml” -X GET http://hostname/resource | xmllint –format –

or install tidy:

sudo apt-get install tidy

Usage:

curl -H “Accept: application/xml” -H “Content-Type: application/xml” -X GET http://hostname/resource | tidy -xml -i –

Saving the curl response to a file

curl http://hostname/resource >> /path/to/your/file

or

curl http://hostname/resource -o /path/to/your/file

For detailed description of the curl command, hit:

man curl

For details about options/switches of the curl command, hit:

curl -h

From: http://stackoverflow.com/questions/14978411/http-post-and-get-using-curl-in-linux

Usare Filezilla
Host: arduino.local
Protocollo: SFTP – SSH File Stransfer Protocol
Tipo di accesso: Normale
Utente: root
Password: arduino

path dove risiedono le pagine web
/mnt/sda1/arduino/www/nome dello sketch

COMANDO/RISPOSTA DAL SERVER
**********:~# telnet example.com:25
220 paganini32 authsmtp ESMTP server ready
HELO example.com
250 paganini32 hello [*.*.*.*], pleased to meet you
AUTH LOGIN
334 VXNlcm5hbWU6
utente base64
334 UGFzc3dvcmQ6
password base64
235 2.7.0 … authentication succeeded
MAIL FROM: info@example.com
250 2.1.0 sender ok
RCPT TO: luca@lucabartoli.it
250 2.1.5 recipient ok
DATA
354 enter mail, end with “.” on a line by itself
TEST INVIO MAIL
.

250 2.0.0 m9Mn1r01Y1QDmx6019QQNd mail accepted for delivery

myblink-screenoff myblink-screenonHo creato una pagina html con due pulsanti per accendere e spegnere un led giallo e uno verde. All’apertura della pagina leggo i dati di Arduino (/data/get) e stabilisco lo stato iniziale dei pulsanti (acceso o spento). Poi con un semplice click decido se accenderlo o spegnerlo. Nel caso il led sia acceso, il pulsante assume la colorazione del led. Lo sketch è molto intuitivo. E’ necessario salvare la pagina html in una cartella “www”, creata nello stesso folder del file.ino. Per accedervi dal browser http://ilNomeDelloYun.local/sd/ilNomedelloSketch.

index.html

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>SECONDINO</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>  
    <style>
      body{width: 100%; text-align: center;}
      .button{width:200px; margin: auto; margin-bottom:24px;}
      label[for="pin2"].ui-state-active {background: green none repeat scroll 0 0; color: white;}  /* cambio il css del pulsante, quando è attivo, si colora  */
      label[for="pin3"].ui-state-active {background: yellow none repeat scroll 0 0;} /* cambio il css del pulsante, quando è attivo, si colora  */
    </style>
    <script>
    $(document).ready(function() {
      loadActualData(); // leggo i file scritti nel json per avere un aggiornamento dello stato dei led//
      $('#pin2').click(function(){ if (this.checked) {$.ajax({url : "/arduino/high2\\"}); } else {$.ajax({url : "/arduino/low2\\"}); }}); //invio i dati ad Arduino
      $('#pin3').click(function(){ if (this.checked) {$.ajax({url : "/arduino/high3\\"}); } else {$.ajax({url : "/arduino/low3\\"});  }}); //invio i dati ad Arduino

    });

    $(function() {
       $( "#dpin2" ).buttonset(); //utilizzo il buttonset per utilizzare le proprietà delle checkbox
       $( "#dpin3" ).buttonset();
    });
    </script>
  </head>
  <body>
      <form>
          <div class="button" id="dpin2"><input type="checkbox" id="pin2"><label id="labelpin2" for="pin2">Led Green</label></div>
          <div class="button" id="dpin3"><input type="checkbox" id="pin3"><label id="labelpin3" for="pin3">Led Yellow</label></div>
      </form>
      <script>
      function loadActualData(){ 
        $.getJSON("/data/get/",function(data){ //path dove vengono salvati i dati dallo scketch ti Arduino
          //alert (JSON.stringify(data));
          //per cambiare lo stato del pulsante e la colorazione devo modificare le proprietà del pulsante, l'attributo aria-pressed e le classi della label 
          if((data.value.LED2)==="1"){$('#pin2').prop('checked', true);$('#labelpin2').attr('aria-pressed', true).addClass('ui-state-active');}else{$('#pin2').attr('checked', false);$('#labelpin2').attr('aria-pressed', false).removeClass('ui-state-active')};
          if((data.value.LED3)==="1"){$('#pin3').prop('checked', true);$('#labelpin3').attr('aria-pressed', true).addClass('ui-state-active'); }else{$('#pin3').attr('checked', false);$('#labelpin3').attr('aria-pressed', false).removeClass('ui-state-active');};
        });
         setTimeout("loadActualData()",3000); //richiedo un aggiornamento ogni 20secondi
      }
      
      </script>
  </body>
</html>

Sketch & Schema

collegamento


#include 
#include 
#include 
int LEDPIN3 = 3; // your LED PIN
int LEDPIN2 = 2; // your LED PIN
YunServer server;

void setup() {
  // Start our connection
  Serial.begin(9600);
  pinMode(LEDPIN2,OUTPUT);
  pinMode(LEDPIN3,OUTPUT);
  Bridge.begin();  
  server.begin();
}

void loop() {
  // Listen for clients
  YunClient client = server.accept();
  
  // Client exists?
  if (client) {
    // Lets process the request!
    process(client);
    client.stop();
  }
  delay(50);
}

void process(YunClient client) {
  // Collect user commands
  String command = client.readStringUntil('\\'); // load whole string
  // Turn on, Turn off
  if (command == "high3") {digitalWrite(3,HIGH);myput();}
  if (command == "low3") {digitalWrite(3,LOW);myput();}
  if (command == "high2") {digitalWrite(2,HIGH);myput();}
  if (command == "low2") {digitalWrite(2,LOW);myput();}
}


void myput(){
  Bridge.put("LED2",""+String(digitalRead(LEDPIN2))+"");
  Bridge.put("LED3",""+String(digitalRead(LEDPIN3))+"");
  }

https://www.arduino.cc/en/Main/Software, scaricare l’ultima versione Linux per Arduino YUN, unzip e copiare la bin su una scheda micro SD. Inserire la micro nello YUN.
Collegarsi allo YUN con il terminale: ssh root@arduino.local (arduino=il nome del dispositivo), password (arduino, se nuovo), run-sysupgrade /mnt/sda1/il nome della bin.

Upgrade: https://www.arduino.cc/en/Tutorial/YunSysupgrade,
Installare PHP: http://www.lucadentella.it/2013/12/05/yun-utilizzare-php/
Installare FTP: http://keepingitgreen.salmashups.com/p/using-ftp.html

Si può utilizzare la data di pubblicazione di un post per molti scopi, uno di quello è utilizzarla per pubblicizzare eventi futuri. Per questo però è necessario che la data di pubblicazione di un post non influisca sul giorno effettivo di pubblicazione.
Quindi per pubblicare un post con una data futura e quindi sfruttarne le caratteristiche è necessario scaricare questo plugin https://wordpress.org/plugins/the-future-is-now/. Con questo plugin la data del post non influirà più sull’effettiva data di pubblicazione.

remove_action('future_post', '_future_post_hook');
add_filter( 'wp_insert_post_data', 'futurenow_do_not_set_posts_to_future' );
function futurenow_do_not_set_posts_to_future( $data ) {
    if ( $data['post_status'] == 'future' && $data['post_type'] == 'post' )
        $data['post_status'] = 'publish';
    return $data;
}

Un esempio di come impaginare a colonne con html e css.
Nel mio caso ho utilizzato due div, uno per dividere in colonne e l’altro per dare l’altezza totale delle 4 colonne ed evitare che in automatico il browser riempia  l’ingombro suddividendo equamente il numero dellle righe. Testo giustificato e sillabato. Il tutto per un media > di 767px, altrimenti, colonna singola.

<div clas="four-columns"><div class=h400px">È universalmente riconosciuto...</div></div>
Questo il css
@media (min-width: 767px) {
div.h400px{height: 400px;}
div.four-columns{-webkit-column-count: 4; -moz-column-count: 4; column-count: 4; -webkit-column-gap: 18px; -moz-column-gap: 18px; 
column-gap: 18px;-webkit-column-rule: 1px solid lightblue; }}
È universalmente riconosciuto che un lettore che osserva il layout di una pagina viene distratto dal contenuto testuale se questo è leggibile.
Lo scopo dell’utilizzo del Lorem Ipsum è che offre una normale distribuzione delle lettere (al contrario di quanto avviene se si utilizzano brevi frasi ripetute, ad esempio “testo qui”), apparendo come un normale blocco di testo leggibile.
Molti software di impaginazione e di web design utilizzano Lorem Ipsum come testo modello. Molte versioni del testo sono state prodotte negli anni, a volte casualmente, a volte di proposito (ad esempio inserendo passaggi ironici).