IoT Prototyping with Arduino, Particle Photon and IFTTT - tamberg.org

17 downloads 117 Views 3MB Size Report
(Connecting Web-‐enabled devices to each other). How the Internet ..... If it works, change the HTTP request path and
IoT  Prototyping  with  Arduino,   Particle  Photon  and  IFTTT [email protected]   CC  BY-­‐SA  tamberg.org   September  2015

Internet  of  Things  (IoT) Computers  with  sensors  and  actuators   connected  through  Internet  protocols   Instead  of  just  reading  and  editing  virtual   resources,  we  can  now  measure  and   manipulate  physical  properties   The  Internet  starts  pervading  the  real  world

Topics  of  this  workshop Getting  started
 (Setup  and  programming  of  IoT  hardware)   Measuring  and  manipulating
 (Physical  computing:  sensors  and  actuators)   Connecting  your  device  to  the  Internet
 (IoT:  monitoring  sensors,  controlling  actuators)   Mash-­‐ups  with  3rd  party  services  and  devices   (Connecting  Web-­‐enabled  devices  to  each  other)   How  the  Internet  works  under  the  hood   (Some  definitions  and  details,  in  case  you  wonder) Questions?  Just  ask  /  Use  Google  /  Help  each  other

Choosing  your  hardware We  use  Arduino  and  Particle  Photon  hardware   Both  speak  the  same  programming  language   Arduino  is  a  classic  and  easier  to  set  up   Know  Arduino?  Try  the  Photon! Note:  Check  arduino.cc  and  particle.io  to  learn  more

Getting  started The  IDE  (Integrated  Development  Environment)   allows  you  to  program  your  board,  i.e.  “make  it   do  something  new”
 You  edit  a  program  on  your  computer,  then   upload  it  to  your  board  where  it’s  stored  in  the   program  memory  (flash)  and  executed  in  RAM Note:  Once  it  has  been  programmed,  your  board   can  run  on  its  own,  without  another  computer

Getting  started  with  Arduino

To  install  the  Arduino  IDE  and  connect  your  Arduino   board  to  your  computer  via  USB,  see   http://arduino.cc/en/Guide/MacOSX  or   http://arduino.cc/en/Guide/Windows  or   http://arduino.cc/playground/Learning/Linux   Or  install  https://codebender.cc/static/plugin  and   use  the  https://codebender.cc/  online  IDE Note:  Codebender  is  great,  but  has  some  limitations

Getting  started  with  Photon To  install  the  Particle  CLI  and  connect  your  Photon   board  to  your  computer  via  USB,  see   https://docs.particle.io/guide/getting-­‐started/ connect/photon/   Then  access  the  Particle  IDE  online  at  https:// build.particle.io/   Or  use  the  Atom  IDE  https://www.particle.io/dev Note:  There  is  an  app  for  Photon  setup,  but  the   command  line  interface  (CLI)  is  more  robust

Hello  (serial  output) void  setup  ()  {  //  runs  once  

   Serial.begin(9600);  //  set  baud  rate   }   void  loop  ()  {  //  runs  again  and  again  

   Serial.println("Hello");  //  print  Hello   } Note:  type  this  source  code  into  your  IDE  and   upload  it  to  the  device,  then  check  the  next  slide

Serial  output  with  Arduino Click  the  Serial  Monitor  icon  to  see  serial  output,  and   make  sure  the  baud  rate  (e.g.  9600)  matches  your  code

Note:  Serial  output  is  great  to  debug  your  program

Serial  output  with  Photon  on  Mac Open  a  terminal,  connect  the  Photon  to  USB,  and  type   $  screen  /dev/tty.u   On  Linux   Then  hit  TAB  to  find  the  USB  device  name   it's  /dev/ ttyACM $  screen  /dev/tty.usbmodem1431   Add  the  baud  rate  matching  your  source  code   $  screen  /dev/tty.usbmodem1431  9600   And  hit  RETURN  to  see  the  output

Note:  Serial  output  is  great  to  debug  your  program

Serial  output  with  Photon  on  PC Install  TeraTerm  https://en.osdn.jp/projects/ttssh2
 /releases/  and  follow  https://learn.sparkfun.com/tutorials
 /terminal-­‐basics/tera-­‐term-­‐windows  to  see  the  output

Note:  Serial  output  is  great  to  debug  your  program

Examples  on  Bitbucket The  source  code  of  the  following  examples  is   available  on  Bitbucket,  a  source  code  repository   Download  the  ZIP  from  https://bitbucket.org/
 tamberg/iotworkshop/get/tip.zip   Or  browse  code  online  at  https://bitbucket.org/
 tamberg/iotworkshop/src/tip   Note:  use  the  Raw  button  to  see  files  as  plain  text

Measuring  and  manipulating

Measuring  and  manipulating IoT  hardware  has  an  interface  to  the  real  world   GPIO  (General  Purpose  Input/Output)  pins   Measure:  read  sensor  value  from  input  pin   Manipulate:  write  actuator  value  to  output  pin   Inputs  and  outputs  can  be  digital  or  analog

The  LED

+ Anode

-­‐ Cathode

+

The  LED  (Light  Emitting  Diode)   is  a  simple  digital  actuator   LEDs  have  a  short  leg  (-­‐)  and  a  long  leg  (+)   and  it  matters  how  they  are  oriented  in  a  circuit   To  prevent  damage,  LEDs  are  used  together  with   a  1KΩ  resistor  (or  anything  from  300Ω  to  2KΩ)

-­‐

The  resistor Resistors  are  the  workhorse  of  electronics   Resistance  is  measured  in  Ω  (Ohm)   A  resistors  orientation  does  not  matter   A  resistors  Ω  value  is  color-­‐coded  right  on  it Note:  color  codes  are  great,  but  it’s  easier  to  use  a   multi-­‐meter  if  you’ve  got  one,  and  just  measure  Ω

The  breadboard A  breadboard  lets  you  wire  electronic   components  without  any  soldering   Its  holes  are  connected   “under  the  hood”  as     shown  here

Wiring  a  LED  with  Arduino Note:  the  additional   1K  Ω  resistor  should   be  used  to  prevent   damage  to  the  pins  /   LED  if  it’s  reversed The  long  leg  of  the   LED  is  connected  to   pin  D7,  the  short  leg   to  ground  (GND)


Wiring  a  LED  with  Photon Note:  the  additional   1K  Ω  resistor  should   be  used  to  prevent   damage  to  the  pins  /   LED  if  it’s  reversed The  long  leg  of  the   LED  is  connected  to   pin  D7,  the  short  leg   to  ground  (GND)


Controlling  a  LED  (digital  output) int  ledPin  =  7;  

       pinMode(ledPin,  OUTPUT);  

Note:  blinking  a  LED   is  the  Hello  World  of   embedded  software

}   void  loop  ()  {  

Set  ledPin  as  wired   in  your  LED  circuit

void  setup  ()  {  

       digitalWrite(ledPin,  HIGH);          delay(500);  //  wait  500ms          digitalWrite(ledPin,  LOW);          delay(500);   }

HIGH  =  digital  1  (5V)   means  LED  is  on,   LOW  =  digital  0  (0V)   means  LED  is  off

Controlling  a  relay  (digital  output)

Note:  the  relay  shield  uses  pins  D0-­‐D3  for  the  relays

The  switch A  switch  is  a  simple,  digital  sensor   Switches  come  in  different  forms,  but  all  of  them   in  some  way  open  or  close  a  gap  in  a  wire   The  pushbutton  switch  has  four  legs  for  easier   mounting,  but  only  two  of  them  are  needed Note:  you  can  also  easily  build  your  own  switches,   for  inspiration  see  e.g.  http://vimeo.com/2286673

Wiring  a  switch  with  Arduino Note:  the  resistor  in   this  setup  is  called   pull-­‐down  ‘cause  it   pulls  the  pin  voltage   down  to  GND  (0V)  if   the  switch  is  open Pushbutton  switch   10K  Ω  resistor   5V   GND   D2  (max  input  5V!)

Wiring  a  switch  with  Photon Note:  the  resistor  in   this  setup  is  called   pull-­‐down  ‘cause  it   pulls  the  pin  voltage   down  to  GND  (0V)  if   the  switch  is  open Pushbutton  switch   10K  Ω  resistor   VIN  =  4.8V  out   GND   D2  (max  input  5V!)

Reading  a  switch  (digital  input) int  sensorPin  =  2;  //  e.g.  button  switch   void  setup  ()  {  

       Serial.begin(9600);  //  set  baud  rate          pinMode(sensorPin,  INPUT);   }  

Open  the  IDE  serial   monitor  or  terminal   to  see  log  output

void  loop  ()  {  

       int  sensorValue  =  digitalRead(sensorPin);          Serial.println(sensorValue);  //  print  0  or  1   }

Switching  a  LED int  switchPin  =  2;   int  ledPin  =  7;  //  or  13     void  setup  ()  {          pinMode(switchPin,  INPUT);          pinMode(ledPin,  OUTPUT);   }   void  loop  ()  {          int  switchValue  =  digitalRead(switchPin);          if  (switchValue  ==  0)  {                  digitalWrite(ledPin,  LOW);          }  else  {  //  switchValue  ==  1                  digitalWrite(ledPin,  HIGH);                          }   }

Note:  figure  out  the   wiring  or  just  use   the  built-­‐in  LED,  i.e.   pin  13  on  Arduino   and  D7  on  Photon The  code  inside  an  if   statement  is  only   executed  if  the  con-­‐ dition  is  true,  else  is   executed  otherwise

The  LDR A  photoresistor  or  LDR  (light   dependent  resistor)  is  a   resistor  whose  resistance   depends  on  light  intensity An  LDR  can  be  used  as  a  simple,  analog  sensor   The  orientation  of  an  LDR  does  not  matter

Wiring  an  LDR  with  Arduino Note:  this  setup  is  a   voltage-­‐divider,  as   the  5V  total  voltage   is  divided  between   LDR  and  resistor  to   keep  0V  <  A0  <  2.5V Photoresistor  (LDR)   10K  Ω  resistor   5V   GND   A0

Wiring  an  LDR  with  Photon Note:  this  setup  is  a   voltage-­‐divider,  as   the  total  voltage  is   divided  between   LDR  and  resistor  to   keep  0V  <  A0  <  2.5V Photoresistor  (LDR)   10K  Ω  resistor   VIN  =  4.8V  out   GND   A0

Reading  an  LDR  (analog  input) int  sensorPin  =  A0;  //  LDR  or  other  analog  sensor   void  setup  ()  {  

       Serial.begin(9600);  //  set  baud  rate   }  

Open  the  IDE  serial   monitor  or  terminal   to  see  log  output

void  loop  ()  {  

       int  sensorValue  =  analogRead(sensorPin);          Serial.println(sensorValue);  //  print  value   }

Note:  use  e.g.  Excel  to  visualize  values  over  time

The  Servo A  servo  motor  takes  an   input  between  0  and  180   which  is  translated  into  a   motor  position  in  degrees A  servo  is  a  analog  actuator   To  create  an  analog  output  for  the  servo,  the   device  uses  pulse  width  modulation  (PWM)

Wiring  a  Servo  with  Arduino

Note:  PWM  pins  on   Arduino  are  those   with  a  ~  symbol 5V   GND   D3  (PWM)

Wiring  a  Servo  with  Photon

Note:  PWM  pins  on   Photon  are  D0  -­‐  D3,   A4  and  A5 VIN  =  4.8V  out   GND   D3  (PWM)

Controlling  a  Servo  (PWM  output) #include    //  remove  this  line  on  the  Photon   Servo  servo;  //  create  a  new  Servo  object   int  servoPin  =  3;  //  a  PWM  pin   void  setup  ()  {  

       servo.attach(servoPin);   }   void  loop  ()  {          for  (int  pos  =  0;  pos     Examples  >  Ethernet  >  WebClient   byte  mac[]  =  {  ...  };  //  MAC  from  sticker  on  shield   IPAddress  ip(...);  //  set  a  unique  IP  or  just  ignore   If  it  works,  change  the  HTTP  request  path  and  host Note:  open  the  serial  monitor  window  to  see  output

Web  client  with  Arduino  (CC3000) Install  the  library  http://learn.adafruit.com/
 adafruit-­‐cc3000-­‐wifi/cc3000-­‐library-­‐software   then  open  File  >  Examples  >  Adafruit_CC3000  >   WebClient   #define  WLAN_SSID  "..."  //  set  local  Wi-­‐Fi  name   #define  WLAN_PASS  "..."  //  set  Wi-­‐Fi  password   If  it  works,  change  the  WEBSITE  and  WEBPAGE Note:  open  the  serial  monitor  window  to  see  output

Web  client  with  Photon The  Particle  Photon  has  built-­‐in  Wi-­‐Fi.  See  Getting   Started  with  Photon,  or  press  SETUP  for  3s  and  set   up  SSID  and  password  of  a  new  local  network  with   $  particle  setup  wifi   In  the  Particle  IDE,  go  to  Libraries  >  Community   Libraries  >  HttpClient  and  click  Use  This  Example
 If  it  works,  change  request  hostname  and  path Note:  open  the  serial  monitor  window  to  see  output

Monitoring  connected  sensors

ThingSpeak  with  Curl The  ThingSpeak  service  lets  you  store,  monitor   and  share  sensor  data  in  open  formats.  Sign  up   at  https://thingspeak.com/  to  create  a  channel   and  get  API  keys,  then  try  the  following:   $  curl  -­‐vX  POST  http://api.thingspeak.com/ update?key=WRITE_API_KEY&field1=42   $  curl  -­‐v  http://api.thingspeak.com/channels/ CHANNEL_ID/feed.json?key=READ_API_KEY

ThingSpeak  with  Arduino  (Ethernet) Copy  &  paste  the  code  https://github.com/iobridge/
 ThingSpeak-­‐Arduino-­‐Examples/blob/master/Ethernet/ Arduino_to_ThingSpeak.ino   Note:  use  Raw  to  get  text byte  mac[]  =  {  ...  };  //  MAC  from  sticker  on  shield   String  writeApiKey  =  "..."  //  from  channel  API  keys   Analog  input  expected  on  pin  A0,  e.g.  from  an  LDR   See  https://thingspeak.com/channels/CHANNEL_ID

ThingSpeak  with  Arduino  (CC3000) Open  File  >  Examples  >  Adafruit_CC3000  >   WebClient  and  set  WLAN_SSID  and  WLAN_PASS   as  before,  then  change  web  site  and  page  to   #define  WEBSITE  "api.thingspeak.com"   #define  WEBPAGE  "/update? key=WRITE_API_KEY&field1=42"   If  it  works,  replace  42  with  analog  input,  e.g.  from  an   LDR  using  something  like  +  String(analogRead(A0))   See  https://thingspeak.com/channels/CHANNEL_ID Note:  this  example  requires  a  bit  of  programming

ThingSpeak  with  Photon In  the  Particle  IDE,  go  to  Libraries  >  Community   Libraries  >  ThingSpeak  and  click  Use  This  Example   Replace  YOUR-­‐CHANNEL-­‐KEY  with  a  write  API  key   If  it  works,  replace  int  rand  =  ...  with  analog  input,   e.g.  from  an  LDR  on  pin  A0   See  https://thingspeak.com/channels/CHANNEL_ID

Controlling  connected  actuators

The  NeoPixel

A  multi-­‐color  LED  with  a  chip  in  each  pixel  that   can  be  controlled  with  a  (PWM-­‐based)  library Foto:  adafruit.com

Wiring  a  NeoPixel  with  Arduino Note:  PWM  pins  on   Arduino  are  those   with  a  ~  symbol Flat  side  of  the  LED   is  left  on  this  picture 5V   GND   D6  (PWM)

Wiring  a  NeoPixel  with  Photon Note:  PWM  pins  on   Photon  are  D0  -­‐  D3,   A4  and  A5 Flat  side  of  the  LED   is  left  on  this  picture VIN  =  4.8V  out   GND   D2  (PWM)

Testing  a  NeoPixel  with  Arduino Install  the  library  https://github.com/adafruit/
 Adafruit_NeoPixel  then  open  File  >  Examples  >   Adafruit_Neopixel  >  strandtest   Adafruit_NeoPixel  strip  =  Adafruit_NeoPixel(1,  PIN,   NEO_GRB  +  NEO_KHZ400);   If  it  works,  replace  loop  content  with  strip.setPixel
 Color(0,  strip.Color(0,  255,  0));  strip.show(); Note:  the  rapid  blinking  is  intended  for  LED  strands

Testing  a  NeoPixel  with  Photon In  the  Particle  IDE,  go  to  Libraries  >  Community   Libraries  >  NeoPixel  and  click  Use  This  Example   #define  PIXEL_COUNT  1  //  10   #define  PIXEL_TYPE  WS2811  //  WS2812B   If  it  works,  remove  the  for  loops  and  try
 strip.setPixelColor(0,  strip.Color(0,  255,  0)); Note:  the  pixel  is  set  green,  red,  blue  (GRB),  not  RGB

Connected  LED  with  Arduino  (Ethernet) Sign  up  at  https://yaler.net/  to  get  a  relay  domain   https://bitbucket.org/tamberg/iotworkshop/src/ tip/Arduino/NeoPixelWebService/ NeoPixelWebService.ino   $  curl  –vX  PUT  http://RELAY_DOMAIN.try.yaler.net
 /led/color/ee6600 Note:  replace  RELAY_DOMAIN  with  your  relay  domain

Connected  LED  with  Arduino  (CC3000) Sign  up  at  https://yaler.net/  to  get  a  relay  domain   https://bitbucket.org/tamberg/iotworkshop/src/ tip/Arduino/NeoPixelWebServiceCc3k/ NeoPixelWebServiceCc3k.ino   $  curl  –vX  PUT  http://RELAY_DOMAIN.try.yaler.net
 /led/color/ee6600 Note:  replace  RELAY_DOMAIN  with  your  relay  domain

Connected  LED  with  Photon https://bitbucket.org/tamberg/iotworkshop/src/ tip/ParticlePhoton/NeoPixelWebService/ NeoPixelWebService.ino  (include  NeoPixel  library)   $  curl  -­‐vX  POST  https://api.particle.io/v1/devices/ DEVICE_ID/led  -­‐d  access_token=ACCESS_TOKEN  -­‐d   args=330033

Note:  the  Particle  Cloud  API  simplifies  Web  services  

Mash-­‐ups

IFTTT If  This  Then  That  (IFTTT)  is  a  mash-­‐up  platform   An  IFTTT  Recipe  connects  two  Web  services  (or  a   service  and  a  device)  using  their  Web  APIs   The  IFTTT  Maker  Channel  uses  Webhooks   (outgoing  HTTP  requests)  to  call  your  device,  and   you  can  use  Web  requests  to  trigger  IFTTT,  the   Particle  Channel  (for  Photon)  explains  itself

IFTTT  Do  Button  with  Arduino Connect  the  Maker  Channel  at  https://ifttt.com/maker   Get  the  Do  Button  App,  tap  '+'  >  Channels  >  Maker  >     Create  a  new  recipe  >  Make  a  Web  request  >  ...  then   go  to  https://ifttt.com/myrecipes/do  for  convenience  

URL:  http://RELAY_DOMAIN.try.yaler.net/led?color=330033   Method:  POST   Content  Type:  application/x-­‐www-­‐form-­‐urlencoded

IFTTT  Do  Button  with  Photon Connect  the  Particle  channel  at  https://ifttt.com/particle   Get  the  Do  Button  App,  tap  '+'  >  Channels  >  Particle  >     Create  a  New  Recipe  >  Call  a  function  and  select,  e.g.
 led  on  DEVICE_NAME   Set  the  with  input  field  to  a  color  value,  e.g.  330033

IFTTT  Recipes Once  a  recipe  works,  you  can  publish  it  (hiding   unneeded  fields)  for  everybody  to  clone,  e.g.   https://ifttt.com/recipes/320868-­‐light-­‐up-­‐ arduino-­‐led-­‐at-­‐sunset   https://ifttt.com/recipes/320870-­‐light-­‐up-­‐ photon-­‐led-­‐at-­‐sunset   Note:  "Do"  recipes  cannot  be  published  for  now

How  the  Internet  works  in  detail If  you  wonder  what  TCP/IP,  HTTP  or  DNS  means  -­‐   or  care  about  the  difference  between  protocol,   data  format  and  API,  read  on...

Protocols Parties  need  to  agree  on  how  to  exchange  data     (communicating  =  exchanging  data  according  to  a   protocol)   e.g.  Ethernet  links  local  computers  physically,   TCP/IP  is  the  foundation  of  the  Internet,  and   HTTP  is  the  protocol  that  enables  the  Web Note:  protocols  are  layered,  e.g.  HTTP  messages   transported  in  TCP/IP  packets  sent  over  Ethernet

TCP/IP IP  (Internet  Protocol)  deals  with  host  addressing   (each  host  has  an  IP  address)  and  packet  routing   TCP  (Transmission  Control  Protocol):  connection   oriented,  reliable  data  stream  (packets  in-­‐order,   errors  corrected,  duplicates  removed,  discarded   or  lost  packets  resent)  from  client  to  server Note:  DHCP  assigns  an  IP  address  to  your  device   which  is  mapped  to  the  device’s  MAC  address  

HTTP HTTP  (Hypertext  Transfer  Protocol)  enables  the   distributed,  collaborative  system  we  call  the  Web   The  client  sends  an  HTTP  request,
 the  server  replies  with  a  response   HTTP  Message  =  Request|Response   Request  =  (GET|POST|…)  Path  CRLF  *(Header  CRLF)  CRLF  Body   Response  =  "HTTP/1.1"  (200|404|…)  CRLF  *(Header  CRLF)  CRLF  Body   CRLF  =  "\r\n"   (Read  the  spec:  http://tools.ietf.org/html/rfc2616)

Note:  HTTP  is  human  readable,  i.e.  it’s  easy  to  debug

URIs The  URI  (Uniform  Resource  Identifier)  is  a  string  of   characters  used  to  identify  a  resource   http://blog.tamberg.org/2011-­‐10-­‐17/side-­‐projects.html   scheme

authority  =  host  [‘:’  port]

path

(Read  the  spec:  http://tools.ietf.org/html/rfc3986)  

QR  codes,  NFC  tags  can  contain  a  machine  readable  URI   IoT:  URIs  can  refer  to  things  or  their  physical  properties Note:  good  URIs  can  be  hand-­‐written  on  a  napkin   and  re-­‐typed  elsewhere,  without  any  ambiguity

DNS DNS  (Domain  Name  System)  maps  Internet   domain  names  to  one  or  more  IP  addresses   Try  it  in  your  desktop  computer  terminal,  e.g.   $  nslookup  google.com   173.194.35.6  … Note:  if  your  device  doesn’t  support  DNS  you  can   connect  to  the  server’s  IP,  but  beware  of  changes  

Data  formats Parties  need  to  agree  on  what  is  valid  content   (parsing  =  reading  individual  content  tokens)   CSV:  easy  to  parse,  suited  for  tables,  old  school   JSON:  easy  to  parse,  de  facto  standard   XML:  used  by  many  services,  W3C  standard   Semi-­‐structured  text,  e.g.  Twitter’s  @user,  #tag   Binary  formats,  e.g.  PNG,  MP3,  …

RSS In  addition  to  generic  data  formats  like  CSV,   JSON,  XML  there  are  refinements  that  add   semantics  to  the  document   RSS  (or  Atom)  is  a  data  format  for  lists  of  items   Invented  for  blogs,  RSS  is  great  for  data  feeds Note:  RSS  documents  are  also  XML  documents,   but  not  all  XML  documents  contain  valid  RSS

HTML HTML  (Hypertext  Markup  Language)  is  a  data   format  describing  how  a  Web  page  should  be   structured  and  displayed   Look  at  the  HTML  (and  Javascript)  code  of  any   Web  page  with  "view  source"  in  your  browser Note:  HTML  documents  are  not  always  valid  XML   documents,  but  Web  browsers  are  very  forgiving

APIs An  API  (Application  Programming  Interface),  is   an  agreement  between  clients  and  providers  of  a   service  on  how  to  access  a  service,  how  to  get   data  out  of  it  or  put  data  into  it   The  UI  (User  Interface)  of  a  service  is  made  for   humans,  the  API  is  made  for  other  computers Note:  good  APIs  are  documented  or  self-­‐explanatory  

REST REST  (Representational  State  Transfer)  is  a  style   of  designing  an  API  so  that  it  is  easy  to  use   REST  APIs  use  HTTP  methods  (GET,  PUT,  POST,   DELETE)  to  let  you  perform  actions  on  resources   REST  APIs  can  be  explored  by  following  links Note:  good  Web  UIs  are  often  built  following  the   same  principles,  therefore  REST  APIs  feel  natural  

Learning  more Electronics:  Ohm’s  law,  Kirchhoff’s  current  and  voltage   law  (KCL  &  KVL),  Make:  Electronics  by  Charles  Platt   Interaction  Design:  Smart  Things  by  Mike  Kuniavsky,   Designing  Connected  Products  by  Claire  Rowland  et  al.   Physical  Computing:  Making  Things  Talk  by  Tom  Igoe   REST:  RESTful  Web  Services  by  Leonard  Richardson   Programming:  read  other  people’s  code,  e.g.  on  GitHub   IoT:  Designing  the  Internet  of  Things  by  Adrian  McEwen   and  Hakim  Cassimally,  Postscapes.com,  IoTList.co Note:  MechArtLab  Zürich  has  an  OpenLab  on  Tuesdays

Reducing  E-­‐waste Tired  of  hacking?     Donate  your  hardware…   e.g.  MechArtLab   Hohlstrasse  52   8004  Zürich

Thank  you [email protected]   twitter.com/tamberg   tamberg.org  

Slides  online  at  http://goo.gl/n3hCbK  

Suggest Documents