HiPi::Interface::MAX7219LEDStrip
This module provides an interface to MAX7219 LED Strips.
It uses HiPi::Device::MAX7219 to drive the matrix modules.
The library creates a virtual buffer of unlimited size onto which you can write text for scrolling around matrix display.
Examples
Methods
- new
- write_string
- get_string_extents
- show
- clear
- set_pixel
- set_col
- fill
- set_intensity
- scroll
- scroll_horizontal
- scroll_vertical
- scroll_to
- set_clear_on_exit
- set_mirror
- set_rotate180
- width
- height
Create a new instance of HiPi::Interface::MAX7219LEDStrip
You should specify the number of 8x8 matrices in your strip using the segments param.
You can also pass a secific device name if your strip is not connected to '/dev/spidev0.0'
use HiPi::Interface::MAX7219LEDStrip;
my $strip = HiPi::Interface::MAX7219LEDStrip->new(
segments => 8,
devicename => '/dev/spidev0.0'
);
Write a string to the buffer. Returns the length, in pixels, of the written string.
- $text: The text string to write
- $x : Position the text along x (default 0)
- $y : Position the text along y (default 0)
# Write a string to the buffer starting at the top left
my $len = $strip->write_string("Bilge!", 0, 0 );
Returns the length, in pixels, of the string without writing it to the buffer.
- $text: The text string
my $len = $strip->get_string_extents( "Bilge!" );
Output the buffer to the display
A copy of the buffer will be scrolled and rotated according to settings before being drawn to the display.
$strip->show();
Clears the buffer of all settings and resets to its startup size:
- Width = segments x 8
- Height = 8
$strip->clear();
Set the state of a single pixel in the buffer. If the pixel falls outside the current buffer size, the buffer will be grown automatically.
- $x: The x position of the pixel to set
- $y: The y position of the pixel to set
- $state: 1 or 0, == on or off ( default 1 )
$strip->set_pixel(13,5,1);
Set a whole column of the buffer. Only useful when not scrolling vertically
- $x: The x position of the column to set
- $columnbyte: An 8-bit integer, the 7 least significant bits correspond to each row
# set bottom 4 pixels in column 3 (index 2) to on
$strip->set_col( 2, 0b00001111 );
# set all pixels in column 3 (index 2) to on
$strip->set_col( 2, 0b01111111 );
Fill the entire current buffer setting all pixels on or off. Note, that unlike the 'clear' method, setting all pixels to 0 using 'fill' preserves buffer size and all other settings.
- $state: 1 or 0, set all pixels on or off
$strip->fill ( 1 );
Set the display brightness.
- $value: intensity setting between 0 and 15
$strip->set_intensity( 2 )
Scroll the buffer. Will scroll by 1 pixel horizontal if no arguments are supplied.
- $x: amount to scroll in x direction
- $y: amount to scroll in y direction
# scroll 1 pixel in x direction ( the default ) $strip->scroll(); # scroll 1 pixel in y direction $strip->scroll( 0, 1 ); # scroll 1 pixel in both directions $strip->scroll( 1, 1 );
Scroll the buffer horizontally by $amount
- $amount: amount to scroll in x direction ( default 1 )
# scroll 1 pixel in x direction $strip->scroll_horizontal( 1 );
Scroll the buffer vertically by $amount
- $amount: amount to scroll in y direction ( default 1 )
# scroll 1 pixel in y direction $strip->scroll_vertical( 1 );
Scroll buffer to given x, y position
- $x: x position to scroll to
- $y: y position to scroll to
$strip->scroll_to( 15, 12);
Set whether the display should be cleared on exit. Set this to 0 if you want to display a fixed message after your script exits. By default, the matrix strip will be cleared when your script exits.
$strip->set_clear_on_exit( 0 );
Set whether the display should be flipped left to right (mirrored) when drawn
$strip->set_mirror( 1 );
Set whether the display should be rotated 180 degrees when drawn
$strip->set_rotate180( 1 );
Returns the current width of the buffer.
my $w = $strip->width();
Returns the current height of the buffer.
my $h = $strip->height();
Examples
Advanced Scrolling Example
Advanced scrolling example which displays a message line-by-line and then skips back to the beginning
#!/usr/bin/perl
use strict;
use warnings;
use HiPi::Interface::MAX7219LEDStrip;
my $strip = HiPi::Interface::MAX7219LEDStrip->new( segments => 8, devicename => '/dev/spidev0.0' );
print q(Advanced Scrolling
Advanced scrolling example which displays a message line-by-line
and then skips back to the beginning.
Press Ctrl+C to exit.
);
my $rewind = 1;
my $delay = 30;
my $line_height = $strip->pixel_height + 2;
my $offset_left = 0;
my @lines = ("Fifteen men on the dead man's chest",
"Yo ho ho, and a bottle of rum!",
"Drink and the devil had done for the rest",
"Yo ho ho, and a bottle of rum!",
"But one man of her crew alive,",
"Yo ho ho, and a bottle of rum!",
"What put to sea with seventy-five",
"Yo ho ho, and a bottle of rum!");
my $numlines = scalar( @lines );
my @lengths = ( 0 ) x $numlines;
for (my $i = 0; $i < @lines; $i ++ ) {
$lengths[$i] = $strip->write_string( $lines[$i], $offset_left, $line_height * $i );
$offset_left += $lengths[$i];
}
my $current_line = 0;
$strip->set_intensity(1);
$strip->show;
$strip->sleep_milliseconds( 1000 );
while (1) {
my $starttime = time;
my $pos_x = 0;
my $pos_y = 0;
for ( my $current_line = 0; $current_line < $numlines; $current_line ++) {
$strip->sleep_milliseconds( $delay * 10 );
for (my $y = 0; $y < $lengths[$current_line]; $y ++) {
$strip->scroll(1,0);
$pos_x += 1;
$strip->sleep_milliseconds( $delay );
$strip->show();
}
if ( $current_line == $numlines - 1 && $rewind ) {
for ( my $y = 0; $y < $pos_y; $y ++ ) {
$strip->scroll(- int($pos_x/$pos_y), - 1);
$strip->show();
$strip->sleep_milliseconds( $delay );
}
$strip->scroll_to(0,0);
$strip->show();
$strip->sleep_milliseconds( $delay );
my $endtime = time;
$starttime = time;
} else {
for (my $i = 0; $i < $line_height; $i++) {
$strip->scroll(0,1);
$pos_y += 1;
$strip->show();
$strip->sleep_milliseconds( $delay );
}
}
}
}
1;
Clock
Displays the time in hours, minutes and seconds
#!/usr/bin/perl
use strict;
use warnings;
use HiPi::Interface::MAX7219LEDStrip;
my $strip = HiPi::Interface::MAX7219LEDStrip->new( segments => 8, devicename => '/dev/spidev0.0' );
print q(Clock
Displays the time in hours, minutes and seconds
Press Ctrl+C to exit.
);
my $offsetx = 0;
my $offsety = 0;
while(1) {
$strip->clear();
my($sec,$min,$hour) = localtime(time);
$strip->write_string( sprintf('%02d:%02d:%02d', $hour, $min, $sec ), $offsetx ,$offsety );
$strip->show;
$strip->sleep_milliseconds( 50 );
}
1;
Fading text
Uses the brightness control to fade between messages.
#!/usr/bin/perl
use strict;
use warnings;
use HiPi::Interface::MAX7219LEDStrip;
my $strip = HiPi::Interface::MAX7219LEDStrip->new( segments => 8, devicename => '/dev/spidev0.0' );
print q(Fading Text
Uses the intensity control to fade between messages.
Press Ctrl+C to exit
);
my @strings = ("One", "Two", "Three", "Four");
my $string = 0;
my $shown = 1;
my $intensity = 0;
my $direction = 1;
while(1) {
$strip->set_intensity($intensity);
if( $intensity == 0 ) {
$direction = 1;
$strip->clear();
$strip->write_string($strings[$string]);
$string += 1;
$string %= scalar @strings;
$strip->show();
}
$intensity += $direction;
if( $intensity > 15 ) {
$direction = -1;
$intensity = 14;
}
$strip->sleep_milliseconds( 100 );
}
1;
Graph
Plots random numbers scross the screen in a bar graph.
#!/usr/bin/perl
use strict;
use warnings;
use HiPi::Interface::MAX7219LEDStrip;
my $strip = HiPi::Interface::MAX7219LEDStrip->new( segments => 8, devicename => '/dev/spidev0.0' );
print q(Graph
Plots random numbers scross the screen in a bar graph.
Press Ctrl+C to exit.
);
my @graph = ();
my $filled = 0;
while(1) {
$strip->clear();
push @graph, int(rand(7));
while( @graph > 64 ) {
shift @graph;
}
for (my $x = 0; $x < @graph; $x ++ ) {
if ($filled ) {
# bar graph
$strip->set_col($x + ($strip->width- scalar @graph ), (
0,
0b1000000,
0b1100000,
0b1110000,
0b1111000,
0b1111100,
0b1111110,
0b1111111)[$graph[$x]] );
} else {
# plot
$strip->set_col($x, 1 << ( 7 - $graph[$x] ));
}
}
$strip->show();
$strip->sleep_milliseconds( 50 );
}
1;
Sine Wave
Displays a sine wave across your LED strip.
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes;
use HiPi::Interface::MAX7219LEDStrip;
my $strip = HiPi::Interface::MAX7219LEDStrip->new( segments => 8, devicename => '/dev/spidev0.0' );
print q(Sine Wave
Displays a sine wave across your LED strip.
Press Ctrl+C to exit.
);
my $x = 0;
while (1) {
$strip->clear();
my $t = Time::HiRes::time() * 10;
for ( my $x = 0; $x < $strip->width; $x ++) {
my $y = int((sin($t + ($x/2.5)) + 1) * 3.5);
$strip->set_pixel($x, $y, 1);
}
$strip->show();
$strip->sleep_milliseconds( 50 );
}
1;
Thermal
Displays the temperature measured from thermal zone 0, using /sys/class/thermal/thermal_zone0/temp
#!/usr/bin/perl
use strict;
use warnings;
use HiPi::Interface::MAX7219LEDStrip;
my $strip = HiPi::Interface::MAX7219LEDStrip->new( segments => 8, devicename => '/dev/spidev0.0' );
print q(Thermal
Displays the temperature measured from thermal zone 0 using
/sys/class/thermal/thermal_zone0/temp
Press Ctrl+C to exit.
);
my $delay = 1000;
while(1) {
$strip->clear();
my $path = '/sys/class/thermal/thermal_zone0/temp';
my $temp_raw = qx(cat $path);
chomp( $temp_raw );
my $temp = $temp_raw / 1000.0;
$strip->write_string( sprintf('%.2fc', $temp ) );
$strip->show;
$strip->sleep_milliseconds( $delay );
}
1;
Vertical Text
Scrolls text messages vertically.
#!/usr/bin/perl
use strict;
use warnings;
use HiPi::Interface::MAX7219LEDStrip;
my $strip = HiPi::Interface::MAX7219LEDStrip->new( segments => 8, devicename => '/dev/spidev0.0' );
print q(Vertical Text
Scrolls text messages vertically.
Press Ctrl+C to exit.
);
my @lines = ( 'One 1', 'Two 2', 'Three 3', 'Four 4', 'Five 5', 'Six 6', 'Seven 7', 'Eight 8' );
my $line_height = 8;
for(my $i = 0; $i < @lines; $i ++ ) {
$strip->write_string( $lines[$i], 0, $i * $line_height);
}
$strip->show;
while (1) {
$strip->sleep_milliseconds( 1000 );
my $iter = 0;
while( $iter < $line_height ) {
$iter++;
$strip->scroll_vertical();
$strip->show();
$strip->sleep_milliseconds( 50 );
}
}
1;