#!/usr/bin/python import twitter, sys, time, pickle class Timeline: def __init__ (self): self.seen = set() self.cache = [] def add_to_cache (self, statuses): for d in [s.AsDict() for s in statuses]: if d["id"] not in self.seen: self.seen.add(d["id"]) self.cache.append(d) def __iter__ (self): return self def next (self): if len(self.cache) == 0: raise StopIteration else: return self.cache.pop() oauth_file = open("access_token.txt", "r") akey = oauth_file.readline().rstrip() asec = oauth_file.readline().rstrip() consumer_file = open("consumer_keys.txt", "r") ckey = consumer_file.readline().rstrip() csec = consumer_file.readline().rstrip() try: api = twitter.Api(consumer_key = ckey, consumer_secret = csec, access_token_key = akey, access_token_secret = asec) except Exception as e: print e else: try: timeline = pickle.load(open("timeline.dat")) except: timeline = Timeline() timeline.add_to_cache(api.GetUserTimeline("LE17RH")) print "Content-type: text/plain\n" try: x = timeline.next() print x["user"]["screen_name"] print x["text"] except StopIteration: pass pickle.dump(timeline, open("timeline.dat", "w"))The Timeline class is an iterator because in an earlier incarnation I was loading a lot of tweets and wanting to iterate over them, it isn't necessary for this program which just returns a plain text rendition of one username and message.
Code for the Arduino:
#include <SPI.h> #include <Ethernet.h> #include <LiquidCrystal.h> byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x7F, 0xB6 }; const IPAddress ip(143,210,109,74); const IPAddress dnsserver(143,210,12,154); const IPAddress server(143,210,108,92); const char get_header[] = "GET /cgi-bin/twittino.cgi"; const char server_header[] = "Host: 143.210.108.92 80"; EthernetClient client; LiquidCrystal lcd(8, 9, 17, 16, 15, 14); const int SDSELECT = 4; const int PIN_G = 21; // Pins on Mega board! const int PIN_R = 20; const int PIN_B = 19; void setup() { pinMode(PIN_R, OUTPUT); pinMode(PIN_G, OUTPUT); pinMode(PIN_B, OUTPUT); pinMode(SDSELECT, OUTPUT); digitalWrite(PIN_R, HIGH); digitalWrite(PIN_G, LOW); digitalWrite(PIN_B, HIGH); digitalWrite(SDSELECT, LOW); Serial.begin(9600); lcd.begin(16, 2); Ethernet.begin(mac, ip, dnsserver); delay(1000); digitalWrite(SDSELECT, HIGH); Serial.println(Ethernet.localIP()); digitalWrite(PIN_G, HIGH); } void loop() { static int counter = 1; char username[30]; char tweet[141]; Serial.println(counter++); if (client.connect(server, 80)) { // Serial.println("Connected"); // Make a HTTP request: client.println(get_header); client.println(server_header); client.println("Connection: close"); client.println(); int ulen = 0; int tlen = 0; boolean username_found = false; while (client.connected()) { if (client.available()) { char c = client.read(); if (!username_found) { if (c == '\n') { username_found = true; username[ulen] = '\0'; } else { if (c != '\n') username[ulen++] = c; } } else { if (c == '\n') { tweet[tlen++] = ' '; } else { tweet[tlen++] = c; } switch(c) { case 'R' : digitalWrite(PIN_R, LOW); break; case 'G' : digitalWrite(PIN_G, LOW); break; case 'B' : digitalWrite(PIN_B, LOW); break; case 'r' : digitalWrite(PIN_R, HIGH); break; case 'g' : digitalWrite(PIN_G, HIGH); break; case 'b' : digitalWrite(PIN_B, HIGH); break; } } } } client.stop(); // Serial.println("Disconnected"); tweet[tlen] = '\0'; if (ulen != 0 && tlen != 0) { Serial.print("Username : "); Serial.println(username); Serial.print("Tweet :\n"); Serial.println(tweet); lcd.setCursor(0, 0); for (int i=0; i < ulen; i++) { lcd.print(username[i]); } for (int i=0; i <= tlen; i++) { lcd.setCursor(0, 1); for (int j=0; j < 16; j++) { if (j + i < tlen) lcd.print(tweet[j+i]); } lcd.print(' '); delay(500); } } else { Serial.println("Nothing."); } } else { Serial.println("Connection failed."); } delay(10000); // Check every 10 seconds lcd.clear(); }
Things to note: the SD card, if present, needs to be deactivated (by setting SD_SELECT, pin 4, to LOW) before setting up the ethernet connection. In addition to the LCD panel, I have one of my RGB LED units connected, and if there is a capital R, G or B in the tweet, the appropriate colour is displayed (the lowercase equivalents turn the colour off). The username is displayed on the top row of the LCD panel, and the tweet scrolls along the bottom row.
No comments:
Post a Comment