Arduino: aprire 15 officine di innovazione in Italia

Massimo Banzi, padre di Arduino, lancia un progetto che mi piace tantissimo: trovare 10.000 persone disposte a metterci 100€ a testa, e mettere in piedi 15 Officine Arduino in 12 mesi.

Massimo, io ci sto. Facciamolo! Per esempio a Como ci sono enormi spazi non utilizzati nella ex Caserma De Cristoforis, una Officina Arduino ci starebbe benissimo.

Visualizzazione ingrandita della mappa

Pubblicato in Senza categoria

Domotica con Arduino e Android

Il fine settimana è dedicato fisso alle meraviglie di Arduino: oggi ho trovato Domotic Home, un sito molto interessante che ti permette di controllare facilmente un Arduino connesso a internet (con lo shield Ethernet o con quello WiFi) in due modi:

  • via una interfaccia web
  • via una app gratuita di Android (wow!)

Una volta registrato sul sito, inserisci la configurazione IP del tuo Arduino, gli dici quali pin sono collegati a cosa, e il sito ti restituisce il codice semi-funzionante, che vanno corrette alcune chiamate che sono cambiate nella versione 1.0.

Mi si aprono mondi.

Pubblicato in Senza categoria

Il mio Arduino è WiFi

Continua la saga di Gaspar Torriero gone Arduino: l’ultimo capitolo si intitola “Il WiFi funziona, finalmente”, e non è stato semplice.

Prima di tutto ho dovuto saldare i piedini della scheda, ed è stata la mia prima volta con in mano un saldatore. Poi ho cominciato le mie prove, e non funzionava niente: dopo molto scartabellare tra forum e blog, ha finalmente trovato una libreria che funziona con il modulo WiFi e la versione 1.0 di Arduino (per la cronaca, è questa), dato che quella fornita dal fabbricante SparkFun non è aggiornata.

Insomma, sono a buon punto e il mio progetto Arduino, fammi il caffè è a un passo dalla realizzazione. Nel frattempo ho visto che nel reparto elettricità dell’Esselunga si vende un temporizzatore per apparecchi elettrici a meno di 10 €.

Pubblicato in Senza categoria

Arduino, stai fresco!

Il caldo è ormai dietro l’angolo e mi troverà pronto: ho collegato all’Arduino un ventilatore e l’ho programmato perché si accenda da solo oltre una certa temperatura. Ho aggiunto anche una luce che cambia colore a seconda della temperatura rilevata. Ingedienti:

  • Breadboard
  • Ventilatore
  • Arduino 2009
  • Sensore temperatura
  • Relè
  • Led RGB tipo anodo comune
  • Connettori assortiti

Prossimo passo: impostare la temperatura di accensione da una interfaccia web, e regolare la luce del led a seconda della luce ambiente.

Se è vero che code is poetry, quanto segue dopo il salto si colloca abbastanza sotto a capolavori come “La Vispa Teresa”. Sicuramente esistono altri dieci modi più eleganti per gestire le combinazioni di colori da associare alle diverse temperature, ma la mia ignoranza enciclopedica per ora non mi permette altro.

Se puoi e vuoi illuminarmi, ne sarò felice.

 int greenPin = 5;
 int redPin = 6;
 int bluePin = 4;
 int tPin = A2; // Temperature sensor pin
 int lPin = A1; // Light sensor pin
 int temp; // Temperature in C°
 int outPin = 9; // fan relais pin 
 int luce; // light in Lux; not used

void setup()
{
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(outPin, OUTPUT);

  analogWrite(redPin, 255);
  analogWrite(greenPin, 255);
  analogWrite(bluePin, 255);
//  Serial.begin(9600);

}

void loop()
{
  // from V to °C
  temp = ( 5.0 * analogRead(tPin) * 100.0) / 1024.0;
  // from V to Lux, not used
  luce = (analogRead(lPin) * 10000.0) / 1024.0;

  if(temp <= 18) {
    analogWrite(bluePin, 0);
    analogWrite(greenPin,255);
    analogWrite(redPin,255);
  }
  else if(temp == 19) {
    analogWrite(bluePin, 51);
    analogWrite(greenPin,255);
    analogWrite(redPin,255);
  }
  else if(temp == 20) {
    analogWrite(bluePin, 102);
    analogWrite(greenPin,255);
    analogWrite(redPin,255);
  }
  else if(temp == 21) {
    analogWrite(bluePin, 153);
    analogWrite(greenPin,153);
    analogWrite(redPin,255);
  }
  else if(temp == 22) {
    analogWrite(bluePin, 204);
    analogWrite(greenPin,102);
    analogWrite(redPin,255);
  }
  else if(temp == 23) {
    analogWrite(bluePin, 255);
    analogWrite(greenPin,51);
    analogWrite(redPin,255);
  }
  else if(temp == 24) {
    analogWrite(bluePin, 255);
    analogWrite(greenPin,0);
    analogWrite(redPin,255);
  }
  else if(temp == 25) {
    analogWrite(bluePin, 255);
    analogWrite(greenPin,51);
    analogWrite(redPin,255);
  }
  else if(temp == 26) {
    analogWrite(bluePin, 255);
    analogWrite(greenPin,102);
    analogWrite(redPin,204);
  }
  else if(temp == 27) {
    analogWrite(bluePin, 255);
    analogWrite(greenPin,153);
    analogWrite(redPin,153);
  }
  else if(temp == 28) {
    analogWrite(bluePin, 255);
    analogWrite(greenPin,204);
    analogWrite(redPin,102);
  }
  else if(temp == 29) {
    analogWrite(bluePin, 255);
    analogWrite(greenPin,255);
    analogWrite(redPin,51);
  }
  else if(temp >= 30) {
    analogWrite(bluePin, 255);
    analogWrite(greenPin,255);
    analogWrite(redPin,0);
  }
if(temp > 27) {
  digitalWrite(outPin, HIGH);
  }
  else {
    digitalWrite(outPin, LOW);
  }

delay(10000);
//  Serial.println(temp);
//  Serial.println();

}
Pubblicato in Senza categoria

Arduino, fammi il caffè! V0.1

Ho raggiunto i primi due obiettivi che mi ero posto con l’Arduino, ovvero

  1. prendere l’ora da internet tramite il Net Time Protocol
  2. accendere la macchina del caffè all’ora prefissata

Ma non è finita: adesso bisogna (bisogna!) che l’ora di accensione venga impostata via web, non inserita banalmente a mano nel codice. Per fare questo occorre che sia contemporaneamente attivo il cliente NTP e il server web, e grosse nubi si addensano sul mio orizzonte di entusiasta ignorante.

Inoltre non è bello che l’Arduino debba autisticamente chiedere l’ora a NTP ogni minuto: meglio sarebbe se chiedesse solo una volta al giorno per sincronizzare con un suo orologio interno.

Come dire che ho le sere impegnate fino a primavera. Il codice fino a questo punto, dopo il salto: come sempre, eventuali commenti, critiche e suggerimenti sono molto bene accetti.

/*
 Arduino, fammi il caffè! V.0.1
 
 created 4 Sep 2010 
 by Michael Margolis
 modified 17 Sep 2010
 by Tom Igoe
 modified 18 Feb 2012
 by Gaspar Torriero
 
 This code is in the public domain.

 */

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

int cHH; // current hour
int cMM; // current minute
int cSS; // current second
int outPin = 8; // connected to coffee machine via relè

// Enter a MAC address for your controller below
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()
{
  // Serial.begin(9600); // uncomment for testing
  digitalWrite(outPin, LOW);

  // start Ethernet and UDP
  if (Ethernet.begin(mac) == 0) {
    // Serial.println("Failed to configure Ethernet using DHCP"); // uncomment for testing
    // 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;  

    // 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 the hour, minute and second:
    cHH = (epoch  % 86400L) / 3600 + 1;
    cMM = (epoch  % 3600) / 60;
    cSS = epoch %60;

    /* uncomment for testing
    Serial.print("Local time is ");
    Serial.print(cHH);
    Serial.print(" hours, ");
    Serial.print(cMM);
    Serial.print(" minutes, and ");
    Serial.print(cSS);
    Serial.println(" seconds.");
    */

    // Turns on the coffee machine
    // at a fixed time.
    // Next goal: set time via web.
    if((cHH == 6) && (cMM > 44)) {
      digitalWrite(outPin, HIGH);
    }
  }
  // wait 60 seconds before asking for the time again
  // Next goal: let Arduino Keep the time
  // and synchronize daily.

  delay(60000); 

}

// 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();
}
Pubblicato in Senza categoria