diff --git a/Posts/Raspberry Pi Project: Color My Desk b/Posts/Raspberry Pi Project: Color My Desk new file mode 100644 index 0000000..6e1b291 --- /dev/null +++ b/Posts/Raspberry Pi Project: Color My Desk @@ -0,0 +1,98 @@ +Cross-posted from Will Makes Things +

Control Something

+Do you need to exercise some control over the physical world, but don't want to leave your computer? Well then, take a minute to set the color of my desk on a day of your choosing at http://colormydesk.com/ + +Yes, I backlit my desk and connected the lights to a server that anyone can control. + +[gallery ids="553,552,551,550,549"] +

THE BASICS

+ +If this is already too much for you, consider just going to the site and setting a color: http://colormydesk.com/. If you're really interested in that how / why, read on. +

THE NOT-SO-BASICS

+

Forcing the Pi to Fake PWM

+The first step was to get the Raspberry Pi to run some lights. Since the Pi doesn't have 3 PWM pins, I used this tutorial on using ServoBlaster for RGB lights. + +I ran into some issues and had to use Wheezy instead of Occidentalis because its kernel version, 3.2.7 was more up-to-date. Then I used the older version of ServoBlaster, instead of the one built for the newest 3.6.11 mainly because I didn't want to figure out how to upgrade the kernel. I used this thread to figure out kernel versions: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15011&p=278566 +

Building the Shield

+Once that was working, I soldered the basic circuit onto some proto board. I then realized I should've used my Raspberry Pi proto board instead of the regular Radio Shack one. But no worries, I hooked up some headers and a custom shield was born. +

CakePHP and a Web Server

+I built the CakePHP site on a separate web server because I didn't want the Pi to get overloaded. Besides, I'm a web developer and have plenty of server resources at my disposal. I then wrote some Python code on the Pi to pull the data from the site's JSON feed with some simple authentication to protect email addresses from the public. A crontab runs every day at 6pm ET to pull the data and turn the lights on. Another one runs at 11pm ET to turn them off. +

Translating Hex to ServoBlaster

+ServoBlaster allows you to set a 'servo position' from 0 - 249. Since a color value for each red, green, or blue, can only be between 0 - 255, I decided to simply clip the last 6 values (250, 251, etc...) down to a servo position of 249. What this really means is that anything above the hex value of F9, just looks like F9. #FFFFFF, is just #F9F9F9, a dimmer white. +

The Python Code

+[code] + +#!/usr/bin/env python + +import os + +import requests +import json +import datetime +import time + +import smtplib +# FUNCTIONS +def pwm(pin, angle): +angle = checkmax(angle) +print "servo[" + str(pin) + "][" + str(angle) + "]" +cmd = "echo " + str(pin) + "=" + str(angle) + " > /dev/servoblaster" +os.system(cmd) + +def checkmax(angle): #PWM can only handle 249 units, so we're simply cutting the hex values 250-255 down to 249 +if angle > 249: +angle = 249 +return angle + +def setcolor(hex): +pwm(5, int(hex[1:3],16)) +pwm(2, int(hex[3:5],16)) +pwm(0, int(hex[5:7],16)) + +# Define a Thank You Email +def send_email(): +SMTP_SERVER = 'smtp.gmail.com' +SMTP_PORT = 587 + +sender = '' +password = '' +recipient = data[0]['email_address'] +subject = 'Color My Desk: Thank you!' +body = 'Hey '+data[0]['name']+",<br /><br />"+"Thanks for setting my desk color to <span style='color:"+data[0]['color']+"'>" + data[0]['color'] + "</span> today! <br /><br />"+"You wrote: "+data[0]['details']+"<br /><br />"+"Will Wnekowicz" + +headers = ["From: " + sender, +"Subject: " + subject, +"To: " + recipient, +"MIME-Version: 1.0", +"Content-Type: text/html"] +headers = "\r\n".join(headers) + +session = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) + +session.ehlo() +session.starttls() +session.ehlo +session.login(sender, password) + +session.sendmail(sender, recipient, headers + "\r\n\r\n" + body) +session.quit() + +# Getting the JSON Feed +os.environ['TZ'] = 'America/New_York' +time.tzset() +r = requests.get('http://colormydesk.com/full_calendar/events/feed?start='+str(datetime.date.today())+'&api_secret=thesecret') +data = r.json() + +# Setting the Color of the Strip +if data: +setcolor(data[0]['color']) +send_email() +else: +setcolor("#7733F0") # default color if no color is scheduled, aka no one loves me. + +[/code]