IoTree

The IoT Christmas Tree

- Nipun Kanade

Just Another Humble Coder

@ThoughtWorks

WhatThe Good ??

is IoTree

This

IoTree

Is an internet connected tree which changes the colour of its decorative lights to what is requested to it on Twitter

Yo !! I'm all ears...

So how do we build it ?

Let's start with the Hardware

Blink the LED

import RPi.GPIO as GPIO
import time

def blink(pin):
	GPIO.output(pin, True)
	time.sleep(1)
	GPIO.output(pin, False)
	time.sleep(1)
	return

GPIO.setmode(GPIO.BCM)
GPIO.setup(22, GPIO.OUT)

for i in range(0,100):
	blink(22)

GPIO.cleanup()

The LEDisco

Let's do some PWM thingy and control the brightness of LEDs

import RPi.GPIO as GPIO
import time
import sys
pin = int(sys.argv[1])
freq = int(sys.argv[2])
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)
p = GPIO.PWM(pin, freq)
p.start(freq)
try:
	while True:
		for j in range(5,100):
			p.ChangeDutyCycle(j)
			time.sleep(0.01)
		for k in range(100,5,-1):	
			p.ChangeDutyCycle(k)
			time.sleep(0.01)
except KeyboardInterrupt:
	print "exiting"

except:
	print "I was murdered"

finally:
	p.stop()
	GPIO.cleanup()

Coloured de deLights

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. <- Ignore all these.

See this ->

import RPi.GPIO as GPIO
import time
import sys
led_pins = [int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3])]
colours  = [int(sys.argv[4]), int(sys.argv[5]), int(sys.argv[6])]
led_pin = []
GPIO.setmode(GPIO.BCM)
freq = 100

def toDutyCycle(colourCode):
	return colourCode*100/255

try:
	for i, pin in enumerate(led_pins):
        	GPIO.setup(pin, GPIO.OUT)
        	led_pin.append(GPIO.PWM(pin, freq))
        	led_pin[i].start(toDutyCycle(colours[i]))
        	led_pin[i].ChangeDutyCycle(toDutyCycle(colours[i]))

	while True:
		time.sleep(1)



except KeyboardInterrupt:
	print "exiting"

finally:
	for i, pin in enumerate(led_pin):
		pin.stop()
	GPIO.cleanup()

Ok..!! Let's setup the Twitter Stuff

 

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-setuptools
sudo easy_install pip
sudo pip install twython

Setup Twython for RPi

Register a Twitter app

Generate your consumer key and access tokens

Write the Hello Twitter App

#!/usr/bin/env python
import sys
from twython import Twython
CONSUMER_KEY = '** Your Key **'
CONSUMER_SECRET = '** Your Secret **'
ACCESS_KEY = '** Your Key **'
ACCESS_SECRET = '** Your Secret **'

client_args = {'verify': False}

api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET, client_args=client_args) 

api.update_status(status=sys.argv[1])

Integration Time

import RPi.GPIO as GPIO
import time
import sys
import pprint
from twython import Twython, TwythonError
import requests

freq = 100
rPin = 23
gPin = 24
bPin = 18

CONSUMER_KEY = '** Your Key **'
CONSUMER_SECRET = '** Your Secret **'
ACCESS_KEY = '** Your Key **'
ACCESS_SECRET = '** Your Secret **'

client_args = {'verify': False}

twitter = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET, client_args=client_args)
	


def setup():
	GPIO.setmode(GPIO.BCM)
	GPIO.setup(rPin, GPIO.OUT)
	GPIO.setup(gPin, GPIO.OUT)
	GPIO.setup(bPin, GPIO.OUT)
	return

def toDutyCycle(colourCode):
        return colourCode*100/255

def setLedColour(red, green, blue):
	r.ChangeDutyCycle(toDutyCycle(red))
	g.ChangeDutyCycle(toDutyCycle(green))
	b.ChangeDutyCycle(toDutyCycle(blue))
	return

def processTag(tag):
	tag = tag.lower()
	if tag == 'red':
		setLedColour(255,0,0)
	elif tag == 'lime':
		setLedColour(0,255,0)
	elif tag == 'blue':
		setLedColour(0,0,255)
	elif tag == 'aqua':
		setLedColour(0,255,255)
	elif tag == 'teal':
		setLedColour(0,255,128)
	elif tag == 'fuchsia':
		setLedColour(255,0,255)
	elif tag == 'maroon':
		setLedColour(128,0,0)
	elif tag == 'white':
		setLedColour(255,255,255)
	elif tag == 'silver':
		setLedColour(192,192,192)
	elif tag == 'gray':
		setLedColour(128,128,128)
	elif tag == 'yellow':
		setLedColour(255,255,0)
	elif tag == 'olive':
		setLedColour(128,128,0)
	elif tag == 'green':
		setLedColour(0,128,0)
	elif tag == 'navy':
		setLedColour(0,0,50)
	elif tag == 'purple':
		setLedColour(128,0,128)
	return



while True:

	try:
		setup()
		r = GPIO.PWM(rPin, freq)
		g = GPIO.PWM(gPin, freq)
		b = GPIO.PWM(bPin, freq)
		r.start(0)
		g.start(0)
		b.start(0)

		while True:
			time.sleep(10)
			results = twitter.cursor(twitter.search, q='%40theIoTree')
                        for tweet in results:
                            if tweet['entities']['hashtags']:
        		            data = [tag['text'].encode('ascii', 'ignore') for tag in tweet['entities']['hashtags']]				
        		            for tag in data:
					processTag(tag)
				    print data	
			    break		
	
	except KeyboardInterrupt:
		print "exiting"
	
	except Exception, e:
		print "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
		print str(e)
		processTag('red')
		time.sleep(4)
		processTag('black')

	finally:
		r.stop()
		g.stop()
		b.stop()
		GPIO.cleanup()

Final Code

Pictures !! 

more pictures !!

Video

Thats IT !!

Questions ??

Thanks

 

nipunk@thoughtworks.com

twitter : @kanadenipun

 

IoTree

By Nipun Kanade

Loading comments...

More from Nipun Kanade