Irrduino: gestire l’impianto di irrigazione con Arduino, Android e Dart

Di - 23 March 2013 - in
Post image for Irrduino: gestire l’impianto di irrigazione con Arduino, Android e Dart

Nell’articolo di oggi presentiamo Irrduino, un interessante esperimento di domotica che impiega le tecnologie Arduino, Android, App Engine, Python e Dart. Irrduino — sviluppato da +Shannon Behrens e +Joe Fernandez — permette di controllare via internet il proprio sistema di irrigazione attraverso un’applicazione Android o un client web in Dart, “LawnVille”, di cui vedremo fra breve alcune interessanti porzioni di codice.

Il sistema è composto da 3 elementi:

  • IrrduinoServer, applicazione App Engine scritta in python alla quale si può accedere con LawnVille, il client web in Dart
  • IrrduinoDroid, applicazione per Android
  • IrrduinoController, il controller per interfacciarsi ad una scheda Arduino

Vediamo come funziona il client web LawnVille che si trova al percorso irrduino/IrrduinoServer/static/dart/lawndart.dart e che l’autore commenta ironicamente con “This is like FarmVille, but it actually works.” .

Screenshot

Iniziamo dalle librerie necessarie:

import 'dart:async';
import 'dart:collection';
import 'dart:html';

In dart:collection è definita la classe Queue, utilizzata per accodare l’avvio degli eventi:

  Queue _actionQueue;

  . . .

  void _executeActionQueue() {
    window.console.log("_executeActionQueue");
    window.console.log("_actionQueue.length: ${_actionQueue.length}");
    if (_actionQueue.isEmpty) {
      window.console.log("Nothing to do");
      window.console.log("_waitingForTimer = false");
      _waitingForTimer = false;
      _idle();
    } else {
      window.console.log("There is work to do");
      var action = _actionQueue.removeFirst();
      _doAction(action);
      window.console.log("_waitingForTimer = true");
      _waitingForTimer = true;
      new Timer(new Duration(milliseconds: TIMER_INTERVAL),
                _executeActionQueue);
    }
  }

La funzione _waterRpc(int zone) comunica al server la zona del prato da irrigare con una semplice HTTP Request:

  void _waterRpc(int zone) {
    var req = new HttpRequest();
    int secs = (TIMER_INTERVAL * SECS_PER_MS).toInt();
    req.open("POST", "/?water-zone=true&zone=${zone}&secs=${secs}", true);
    req.onReadyStateChange.listen((Event e) {
      if (req.readyState == 4) {
        if (req.status == 200) {
          window.console.log("Watering was successful");
        } else {
          window.console.log("Watering was unsuccessful");
        }
      }
    });
    req.send();
  }

Per le animazioni viene utilizzato un Timer, definito nella libreria dart:async, e un oggetto window.requestAnimationFrame, definito in dart:html:

 void _repositionDroid(int x, int y, [Callback callback = null]) {
    x -= (HALF * DROID_WIDTH).toInt();
    y -= DROID_HEIGHT;
    _droid.src = "/static/images/droid-jetpack-on-front.png";
    _droid.style.left = "${x}px";
    _droid.style.top = "${y}px";
    new Timer(new Duration(milliseconds: REPOSITION_DURATION), () {
      if (callback != null) {
        callback();
      } else {
        _droid.src = "/static/images/droid-waiting-front.png";
      }
    });
  }

  void _startAnimationLoop() {
    _animationStartTime = new DateTime.now().millisecondsSinceEpoch;
    window.requestAnimationFrame(_animationLoop);
  }

  void _animationLoop(int timestamp) {
    _animationProgress = timestamp - _animationStartTime;
    for (Callback callback in _animationCallbacks.values) {
      callback();
    }
    window.requestAnimationFrame(_animationLoop);
  }

Per maggiori informazioni sul lato elettronico del sistema si può consultare il Blog di Joe Fernandez, mentre il codice sorgente completo di Irrduino è disponibile su Google Code.

Fonte | Dart News & Updates

Leave a Reply

Claudio d'Angelis Articolo scritto da

Programmatore e studente di Informatica, appassionato di musica, web e sistemi UNIX. Collabora con Googlab dall'Ottobre 2012.

Contatta l'autore

Previous post:

Next post: