Nyhets-rullare på LCD

I detta forum hör diskussioner gällande teknik i största allmänhet och hemautomation i synnerhet hemma.
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
finkman
Wannabe
Inlägg: 22
Blev medlem: 02 nov 2006, 01:45
Ort: Linköping

Nyhets-rullare på LCD

Inlägg av finkman »

Jahapp, köpte mig en lcd-skärm med onewire-drivkrets från shop.temperatur.nu.. Åter igen så visste jag inte riktigt vad jag skulle ha den till, men sånt brukar ju alltid lösa sig.. Det första projektet som jag tänkte berätta lite om är iallafall min nyhetsrullare..

Jag ville altså att nyheterna från t.ex. Dagens Nyheter skulle rulla förbi på min lcd-display.. Först var det ju till att få igång lcd'n, ganska lätt, bara att löda på pin-headern på själva display-delen och sedan plugga in den i onewire-drivkretsen. Kopplade sen in fem volt i entrådsnätet med hjälp av en spänningsinjektor.. Bara att koppla in drivkretsen så funkade det! Coolt. I och med att jag redan hade owfs installerat på min linuxburk så dök lcd'n upp som en mapp i dess filstruktur.

Därifrån så var det ju bara att skriva innehåll till de olika raderna på displayen, typ echo "Hello World" > /mnt/owfs/FF.8A0300000100/line20.0 , så dök det upp på displayen. Displayen var skapligt snabb märkte jag direkt, när jag tryckte enter så dröjde det inte mer än några hundradels sekunder innan displayen var uppdaterad. Perfekt till nyhetsrullaren, för att det ska kännas som att texten rullar förbi så krävs ganska hög uppdateringsfrekvens.. Såhär blev det att se ut iallafall.. Nyheten om jättedinosaurien scrollar förbi, men själva rullandet gör sig inte så bra på stillbild.. :D
onewiredisplay.JPG
La upp en video på youtube, men min kamera suger så det blev inte alls bra.. Det syns iallafall vad som händer på http://www.youtube.com/watch?v=JywTQ1jbX1A

För den som inte redan är uttråkad nog följer scriptet som gör jobbet i sin helhet här nedanför.. Perl blev det naturliga valet då jag ska börja jobba som perl-kodare om ett par veckor och behöver öva :) Scriptet fungerar på vilken rss-fil som helst som följer rss-standarden, bara att byta ut urlen mot valfri rss.. Det går dessutom att köra två samtidigt, till exempel DN på första raden och Expressen på andra raden.. bara att kopiera scriptet, byta rad till /mnt/owfs/FF.8A0300000100/line20.1 istället för .0 och byta rss'en till expressens. Kör igång bägge kopiorna på scriptet och poff så snurrar DN på första raden och Expressen på andra..

Kod: Markera allt

<newsticker.pl>
#!/usr/bin/env perl
use IO::Handle;
use XML::RSS;
use LWP::Simple;

#starta evighetsloop, rulla nyheter tills någon stänger av scriptet
while(1){

#skriv ut att det är dn's nyheter vi visar
$string = "DN";
my $rss = new XML::RSS;
#hämta hem dn's nyheter via deras rss-sajt... de 10 första nyheterna..
#hämtas på nytt efter varje varv.. Hoppas att inte DN misstycker att
#jag hämtar hem deras rss så ofta..
$content = get("http://www.dn.se/DNet/custom-jsp/rss.jsp?d=145&numItems=10");

#parsa rss'en
$rss->parse($content);


    foreach my $item (@{$rss->{'items'}}) {
        next unless defined($item->{'title'}) && defined($item->{'link'});
        #för varje nyhet i rss'en, ta titel-raden och lägg till den 
        #i strängen som ska scrollas förbi
        $string = $string." >> ".$item->{'title'};

        #byt ut å-ä-ö mot tecken som lcd'n klarar av att visa, å blir @,
        # ä byts mot ä, fast med lcd'ns teckentabell och ö byts mot ö fast
        # med lcd-displayens teckentabell.. 
        $string =~ s/å/@/;
        $string =~ s/ä/á/;
        $string =~ s/ö/ï/;
    }


#lägg till lite mellanslag först i strängen så att nyheterna rullar
# in från vänster..
$copy = "                   ".$string;
$a = 0;

# rulla ut hela nyhets-strängen på displayen!
while($a < length($copy)){

#öppna utfilen på displayen OBS! Byt sökvägen till ditt serienummer!!
open(OUTFILE, ">/mnt/owfs/FF.8A0300000100/line20.0");
#en liten perl-teknisk detalj, auto-flush är ett måste.
autoflush OUTFILE,1;

#skriv strängen till displayen, allt mellan $a och 20 tecken framåt
print OUTFILE substr($copy,$a,20);
close(OUTFILE);

#vänta 0.05s innan förflyttningen av strängen åt vänster
select(undef, undef, undef, 0.05);

#flytta strängen ett steg åt vänster
$a++;

#och så länge det finns tecken kvar i strängen, skriv ut den
# redan flyttade strängen en gång till..
}

#en liten bonus för att sudda bort det sista tecknet från displayen när 
# det aktuella varvet snurrat färdigt.  OBS! Byt sökvägen till ditt 
# serienummer!!
open(OUTFILE, ">/mnt/owfs/FF.8A0300000100/line20.0");
print OUTFILE " ";
close(OUTFILE);
}
<slut på fil>
Mer än så blir det inte för denna gång. Nästa projekt ska nog bli att styra ytterdörrens larmfunktion (se tråden "Linux, wap och Tellstick") med knapparna som sitter på sidan av display-styrkretsen.. Stay tuned! :)
Senast redigerad av finkman den 29 nov 2008, 18:31, redigerad totalt 2 gång.
bjorktorp
Gillar hemautomation
Inlägg: 47
Blev medlem: 13 feb 2007, 13:55
Ort: Gistad

Applåder, hurra, visslingar och rop

Inlägg av bjorktorp »

Jättebra finkman!

Tips, trix och inspiration till de mörka vinterkvällarna. Vad mer kan man begära. I will stay tuned for sure!

/Roger
Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Nyhets-rullare på LCD

Inlägg av Niklas »

Testade detta script på min LCD som är kopplad till en COM-portsadapter och hastigheten är det inga problem med. :-)
Tack!

Jag är väldigt dålig på att programmera för perl. Går det att få den så att den använder alla 4 rader för att visa nyheten över hela skärmen för att sedan byta till nästa nyhet? Så att den inte rullar menar jag.
Användarvisningsbild
Plutonium
Moderator
Inlägg: 1246
Blev medlem: 04 jan 2008, 02:34
Ort: Nossebro
Kontakt:

Re: Nyhets-rullare på LCD

Inlägg av Plutonium »

Kör du Linux, så är det inga problem att skriva ett bash skript med en loop som sleep mellan varje loop så att säga.
http://essunga.org
Moderator - Temperatur.nu
Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Nyhets-rullare på LCD

Inlägg av Niklas »

Plutonium skrev:Kör du Linux, så är det inga problem att skriva ett bash skript med en loop som sleep mellan varje loop så att säga.
Jag kör Linux och OWFS. Bash-script är inte min starka sida tyvärr. :)
Skriv svar