DIY hem LED transit-tecken (2 / 2 steg)
Steg 2:
Source Code
Som vanligt börjar jag med källkoden, som är på github. Här är en lokal spegel, bara i fall källkoden för en lappat nästa Muni pärla är här.
Hur man kör
Det finns en liten dokumentation i README-filen, och prov kommandorader finns i daemon startskriptet för denna spec. i princip, du väljer ett stopp på nextmuni.com att ta reda på ditt stop-ID, och köra client/client.rb--stopId 12345. Alternativt kan du köra en morgon instrumentpanel genom att ange upp till två linjer och hållplatser i texten och lägga till URL för att hämta väder fromweather.gov:
PI konfigurationsanteckningar
Under den första körningen, ansluta mus, tangentbord och Wi-Fi-kort via USB-navet. Följa upp guiden komma igång att ladda ner första bilden på SD-kortet. Starta upp, installera standard Raspbian Debian-baserade distributioner. Väljer "automatisk stöveln skrivbordsmiljö på uppstått" när frågat. Även om du inte behöver det, är det det enklaste sättet att konfigurera Wi-Fi. En gång på skrivbordet, välj "Wi-Fi konfigurationen" under en av menyerna nås via Start-knappen och konfigurera WiFi-kortet du in för att ansluta till routern. Se till att du också konfigurera den att starta WiFi automatiskt vid uppstart. Konfigurera SSH-server och se till att den startar vid uppstart. Antingen konfigurera hostname eller skriva ner IP-adress. Starta om och försök till SSH från en annan maskin. Om detta fungerar, koppla från mus, tangentbord och HDMI: du inte behöver dem längre. Git installeras via sudo lämplig-få installera git, Hämta källorna och följ README instruktionerna för att installera language runtimes. Spela med skriptet kommandoradsflaggor till räkna ut vad du vill köra och konfigurera en daemon genom att installera initskript. När tillräckligt säker i återhämtningsförmåga setup, montera detta på din vägg.
Resultat
Så lösningen hjälpte: jag slutat igång som japanska skolpojke, och började styra min morgon förhalning, alltför. Som en bonus, jag hade en ungefärlig uppskattning av hur mycket det skulle kosta skattebetalarna för att programmera detta tecken, och, naturligtvis, jag hade mycket roligt, också. Slutligen, jag har nu en töntig post i mitt vardagsrum... även om det ser andra som en ström av aktiekurser och inte av Muni ankomsttider.
Anteckningar
Resten är mindre "heta" sektioner, beskriver min erfarenhet med de verktyg som jag används för jobbet.
Ruby
Raspberry Pi: s standard Linux, som Debians derivat, innehålla anständig stöd för Ruby, inklusive 1,9. vilket är lite gammal redan, dock. Det tar Pi flera sekunder att ladda tolken och ett dussin av pärlor som jag behövde för detta tecken, men det är OK eftersom programmet bara startar upp en gång när systemet drivs upp.
LED-tecken
Så skylten jag använde enligt en Perl API, så skulle det vara naturligt att skriva klientprogram i Perl, alltför... inte riktigt. Medan jag har en massa erfarenhet programmering i Perl, jag skulle mycket hellre föredra skriver på ett mer intressant språk, Python eller Ruby. Det var en av anledningarna till varför jag skrev en liten vinjett över Perl API, så att jag kunde exec detta enkla program från något annat språk. En annan anledning till varför jag skrev detta API var att skylten inte stöder två rader text i dess inbyggda renderare. API kan du leverera en textrad, och tecknet kommer gärna göra det, och även lägga till vissa effekter, men jag ville ha två linjer i ett mindre teckensnitt i stället. API har inte en "render bild" funktion, men skylten kan du skapa dina egna teckensnitt glyfer, och infoga dem i text. Självklara idén att skriva ut en 16 x 96 "symbol" fungerade. Omslaget gör exakt. Skylten kan också loopa igenom flera bilder--precis som det verkliga Muni tecknet. API är detta mycket lätt att programmera: detta sker automatiskt när du skickar flera meddelanden. Integration med Pi gick smidigt: bara använda $sign -> Skicka (enhet = > "/ dev/ttyUSB0"); i ditt program. Det fanns flera glitches, dock. För det första centreras varje glyph automatiskt, om det inte är större än ca 80 pixlar bred, i vilket fall det är justerad till vänster. Loopa igenom olikt arrangera i rak linje meddelanden ser dåligt, så jag tvinga alla bilder jag skicka till tecknet som 16 x 96, stoppning dem med svarta pixlar. För det andra, det finns inget sätt att stänga av tecknet programmässigt. För att driva bort det, behöver jag fysiskt ta bort USB-anslutningen och stänga av eftersom det börjar med batteriet annars. Sign tillverkarens avsikt var förmodligen att du inte programmera skylten ofta, så programmerar det en gång och sedan slå på och stänga manuellt. Men vi är programmerare också; fungerar inte runt saker våra bröd och smör? Visa en helt svart bild gjorde susen för att tecknet "inaktivera". Det tredje jag uppdatera tecken varje 30 sekunder för att säkerställa lägligt prognos, men det tar 1-2 sekunder att uppdatera skylten. Jag skicka antar att detta beror på att skylten innehåller sin egen CPU och programmering, eller eftersom jag inte försökte att spela med Funktionsargument. Även om dess inre VVS förmodligen påverkar uppdateringshastighet, och jag såg exempel på lasta alla synkroniseringen och blinkande lampor till Raspberry Pi fullständigt med olika, mer låg nivå tecken, det skulle vara alltför tidskrävande för mig att bry sig om. Jag vet inte hur länge skylten kommer att vara när det är omprogrammeras två gånger en minut. Hittills är jag ganska nöjd med Bright LED-tecken jag använde och dess API.
Font Rendering
Jag förväntas spendera noll tid på font rendering, men det tog mycket längre tid än väntat. Tja, jag planerar att skriva min egen enkla dopfunten återgäldande motor, men flera dolda stenar väntade på mig under den tunna sanden. Först, jag kunde inte hitta ett "raster" teckensnitt som är bara en uppsättning bitmappar. Jag slutade ladda ner "pixelated" TTF teckensnitt och gör dem med FontConfig bibliotek. Jag ville inte tecknet har en hel del av beroenden, så jag pre-rendeded glyfer på min Pi i en ready-to-use sätt med detta skript, och skrev ett litet bibliotek för att driva dem. Det roligaste är att jag lätt kan lägga till nya glyfer, såsom nederbörd indikatorer. Vi tar också en hel del font rendering för givet, som arrangera i rak linje till center, ordet inslagning, kerning. Jag genomfört några av dem på ett mycket enkelt sätt (i Ruby!) men jag känner att ett par fler funktioner skulle göra mig ragequit till förmån för en riktig font rendering biblioteket istället.
Åtkomst till Muni förutsägelser
En annan anledning till att jag valde Ruby var Muni biblioteket i Ruby, färdiga att använda för att få prognoser från NextBus systemet. Eller så jag tänkte: biblioteket saknar vissa funktioner, till exempel raffinering vägar eller att få prognoser för alla vägar i stopp (detta är vad en Muni skylt visar). Det drog också i den hela järnväg stacken bara vill visa snyggt formaterad tid sträng! (som, konvertera intervallet i sekunder till något fancy som "över 1 timme"). Jag fast några av dessa saker och bundled pärla med den ursprungliga källan för din bekvämlighet eftersom det var lättare än forking det och lägga in en officiell databas.
Ange routeConfig!
Tydligen, officiella Muni monitorer arbetar med samma lydelse: routeConfig är något av kommandona API NextBus tjänst.
Hur som helst, NextBus systemet har en trevlig API, som är till synes fri att använda om användningen begränsas eller fördelas mellan klienter. En leker av denna webbplats, nextmuni.com ägnas åt SF Muni. Det enda jag hittade var namnen på de
Väderprognos hämtning
Åh, ja, här kommer den enkla biten,"tänkte jag när jag klar med allt annat, och beslutat att kasta i väderprognoser. Jag hade fel på ett mycket intressant sätt. Det visade sig, väderprognoser API: er inte är oftast gratis. De webbplatser som jag hittade på toppen av Google söka alla obligatoriska registreringar och inklusive din personliga nyckel till alla API-anrop. Många hade gratis begränsad versioner men krävs betalning för varje timme prognos-- och jag var främst intresserad av villkoren på en specifik plats på en viss tid av dagen (San Francisco väder är inte mycket stabil). Inte för att jag är motståndare till betaltjänster i sig, eller för att analysera webbsidor med regexps, men jag behöver inte att mycket från dem att betala, gör jag? Jag fortsatte med en fri regering weather.gov tjänst, som faktiskt är ganska cool trots webbdesign av förra seklet. Tjänsten är begränsad till USA, men San Francisco Muni förutsägelser är inte mycket användbar utanför landet heller. För att använda den, måste du ge en länk till XML-tabellen för din stad/område, som skulle se ut så här: http://forecast.weather.gov/MapClick.php?lat=37.77493 & lon =-122.41942 & FcstType = digitalDWML. Jag använder inte deras API, eftersom det är en fullt utvecklad tvål, och inte ingen har tid för detta.