<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://replica.wiki.extremist.software/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BillyBuggy</id>
	<title>Noisebridge - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://replica.wiki.extremist.software/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BillyBuggy"/>
	<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/wiki/Special:Contributions/BillyBuggy"/>
	<updated>2026-04-05T01:19:40Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.13</generator>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Processing_Class&amp;diff=8687</id>
		<title>Processing Class</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Processing_Class&amp;diff=8687"/>
		<updated>2009-11-26T21:33:46Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: /* Processing language class */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Processing language class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When:  Thursday, December 10th -- 6pm to 9pm (proposed time)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Where:  Noisebridge&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What:  Intro to the Processing Programming Language: simple interactive graphics and animation for everyone!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:REV_still.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Start programming graphics and animation with Processing (http://www.processing.org), an easy-to-learn, free, open-source programming environment. Processing is great for beginners who are learning to program, and powerful enough for professionals to use as a design tool.&lt;br /&gt;
&lt;br /&gt;
Creative people have made many interesting projects in Processing, some with just tiny amounts of code! Here are some examples.&lt;br /&gt;
&lt;br /&gt;
Recently, the Tiny Sketch competition has Processing entries that are all under 200 characters; here&#039;s the winner:&lt;br /&gt;
&lt;br /&gt;
http://www.openprocessing.org/visuals/?visualID=3512&lt;br /&gt;
&lt;br /&gt;
Casey Reas, one of the founders of the Processing project, had several pieces in the Gray Area Foundation for the Arts inaugural exhibit , all made with Processing (scroll down to Main Gallery: C.E.B. Reas):&lt;br /&gt;
&lt;br /&gt;
http://www.gaffta.org/2009/08/23/inaugural-exhibition-open/&lt;br /&gt;
&lt;br /&gt;
One of my favorites: Rob Hodgin&#039;s REV iTunes visualizer:&lt;br /&gt;
&lt;br /&gt;
http://vimeo.com/2120027&lt;br /&gt;
&lt;br /&gt;
(The last two require a lot more code, of course!)&lt;br /&gt;
&lt;br /&gt;
Processing is based on the Java programming language. One important advantage: it is trivial to export your Processing work into a Java applet or application. People can view your work easily through a web browser, on multiple platforms, without having the Processing environment.&lt;br /&gt;
&lt;br /&gt;
This will be a 3-hour, hands-on beginners&#039; session on programming with Processing. We&#039;ll go over the basics of programming and graphics, working with geometric shapes and images, and controlling animation and movement.&lt;br /&gt;
We&#039;ll play with a lot of examples and learn to customize and extend them, so bring a computer (Linux, Mac OSX and Windows are all supported), preferably with Java loaded. If you haven&#039;t done much programming before, and/or need help setting up the Processing environment, it might be a good idea to come on time.&lt;br /&gt;
&lt;br /&gt;
Bio:&lt;br /&gt;
&lt;br /&gt;
Bill Hsu builds and works with interactive audiovisual systems in performance. He is on sabbatical from the Department of Computer Science &lt;br /&gt;
at San Francisco State University, where he teaches computer music, computer architecture, and intro. to programming for CS and non-CS majors. Feel free to email me (whsu at sfsu.edu) for more information. Website: http://userwww.sfsu.edu/~whsu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please add your name below if you are interested in coming to the class (no committment implied)&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* Bill Hsu (instructor)&lt;br /&gt;
* Zedd&lt;br /&gt;
* Jason Dusek&lt;br /&gt;
* [http://www.0xdeadbeef.com/weblog/ Christopher Blizzard]&lt;br /&gt;
* &#039;&#039;your name here&#039;&#039;&lt;br /&gt;
* Scott E W&lt;br /&gt;
* katyalaia&lt;br /&gt;
* Jack Perkins p.s. http://www.openprocessing.org/visuals/?visualID=3512&lt;br /&gt;
* Burt Herman (@burtherman)&lt;br /&gt;
* Jesse Zbikowski&lt;br /&gt;
* Bill Nye&lt;br /&gt;
&lt;br /&gt;
[[category:events]]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=User:BillyBuggy&amp;diff=5058</id>
		<title>User:BillyBuggy</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=User:BillyBuggy&amp;diff=5058"/>
		<updated>2009-05-19T09:38:32Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://lh3.ggpht.com/nye22g/SJSi6zsrUOI/AAAAAAAADbs/mDq6xAM3z8c/s144/100_0325--Bill_Korea_May_2007.jpg]&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://lh3.ggpht.com/nye22g/SJSi6zsrUOI/AAAAAAAADbs/mDq6xAM3z8c/s144/100_0325--Bill_Korea_May_2007.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For information about OpenHeartLib, see [https://noisebridge.net/wiki/OpenHeartLib]. &amp;lt;br/&amp;gt;&lt;br /&gt;
For my gentle introduction to Evil Mad Scientist&#039;s Meggy Jr kit, see [https://www.noisebridge.net/wiki/MeggyJrDemo]. &amp;lt;br/&amp;gt;&lt;br /&gt;
For info on my 2009 Maker Faire &amp;quot;Search and Rescue Robot&amp;quot; project, see [                 http://home.comcast.net/~nye22/SearchRescueRobot.txt].&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=User:BillyBuggy&amp;diff=5057</id>
		<title>User:BillyBuggy</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=User:BillyBuggy&amp;diff=5057"/>
		<updated>2009-05-19T09:34:49Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://lh3.ggpht.com/nye22g/SJSi6zsrUOI/AAAAAAAADbs/mDq6xAM3z8c/s144/100_0325--Bill_Korea_May_2007.jpg]&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://lh3.ggpht.com/nye22g/SJSi6zsrUOI/AAAAAAAADbs/mDq6xAM3z8c/s144/100_0325--Bill_Korea_May_2007.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For information about OpenHeartLib, see [https://noisebridge.net/wiki/OpenHeartLib]. &amp;lt;br/&amp;gt;&lt;br /&gt;
For my gentle introduction to Evil Mad Scientist&#039;s Meggy Jr kit, see [https://www.noisebridge.net/wiki/MeggyJrDemo].&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MeggyJrDemo&amp;diff=3630</id>
		<title>MeggyJrDemo</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MeggyJrDemo&amp;diff=3630"/>
		<updated>2009-03-17T04:37:56Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===== Introduction =====&lt;br /&gt;
In January 2009 I built a&lt;br /&gt;
[http://www.evilmadscientist.com/article.php/meggyjr Meggy Jr RGB]&lt;br /&gt;
kit designed by Windell Oskay (of Evil Mad Scientists Laboratory).&lt;br /&gt;
===== Standard Arduino main program: =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int main(void) {&lt;br /&gt;
    setup();&lt;br /&gt;
    for (;;)&lt;br /&gt;
      loop();&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Simplified Meggy API (partial): =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;MeggyJrSimple.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EmptyScreen();      Turn off all LEDs&lt;br /&gt;
&lt;br /&gt;
DrawPx(x,y,color);  Turn on LED (x=0~7, y=0~7, color=0~15)&lt;br /&gt;
                                ( x=0,y=0 is lower left )&lt;br /&gt;
&lt;br /&gt;
ShowScreen();       Copy (double) buffer array to display&lt;br /&gt;
                    video array&lt;br /&gt;
&lt;br /&gt;
SetAuxLEDs(N);      Set top LEDs: N=1:FarLeft, N=255:AllOn&lt;br /&gt;
&lt;br /&gt;
CheckButtonsDown(); Check which buttons currently pressed.&lt;br /&gt;
                    Sets six (global) variables:&lt;br /&gt;
                      Button_A, Button_B, Button_Up,&lt;br /&gt;
                      Button_Down, Button_Left, Button_Right&lt;br /&gt;
                    if (Button_Left || Button_Up ) ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Regular Arduino calls still available: =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  delay(N);         Delay execution N msec.&lt;br /&gt;
  millis();         Return current time in msec.&lt;br /&gt;
  random(X);        Return random number in [0,X)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Colors for DrawPx(): =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 Dark&lt;br /&gt;
  1 Red       8 DimRed&lt;br /&gt;
  2 Orange    9 DimOrange&lt;br /&gt;
  3 Yellow   10 DimYellow&lt;br /&gt;
  4 Green    11 DimGreen&lt;br /&gt;
             12 DimAqua&lt;br /&gt;
  5 Blue     13 DimBlue    &lt;br /&gt;
  6 Violet   14 DimViolet&lt;br /&gt;
  7 White    15 FullOn&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Simple looping using function delay() =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  void setup() {&lt;br /&gt;
    MeggyJrSimpleSetup();&lt;br /&gt;
  }&lt;br /&gt;
  void loop() {&lt;br /&gt;
    DrawPx(7, 7, FullOn);&lt;br /&gt;
    ShowScreen();&lt;br /&gt;
    delay(100);          // #1&lt;br /&gt;
    DrawPx(7, 7, Dark);&lt;br /&gt;
    ShowScreen();&lt;br /&gt;
    delay(500);          // #2&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Same loop over frames, w/o using function delay() =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned long gLastTime;&lt;br /&gt;
byte          gWhichDelay;&lt;br /&gt;
int           gDelayMsec;&lt;br /&gt;
void setup() {&lt;br /&gt;
  MeggyJrSimpleSetup();&lt;br /&gt;
  gLastTime   = millis();&lt;br /&gt;
  gWhichDelay = 2;   // Waiting at: =1: first  delay(),&lt;br /&gt;
                     //             =2: second delay()&lt;br /&gt;
  gDelayMsec  = 500;&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( millis() &amp;gt; gLastTime + gDelayMsec ) {&lt;br /&gt;
    if ( gWhichDelay == 1 ) {&lt;br /&gt;
      DrawPx(7, 7, Dark);&lt;br /&gt;
      ShowScreen();&lt;br /&gt;
      gDelayMsec  = 500;&lt;br /&gt;
      gWhichDelay = 2;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      DrawPx(7, 7, FullOn);&lt;br /&gt;
      ShowScreen();&lt;br /&gt;
      gDelayMsec  = 100;&lt;br /&gt;
      gWhichDelay = 1;&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== References =====&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/meggyjr Meggy Jr Product Description -- http://www.evilmadscientist.com/article.php/meggyjr]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MeggyJrDemo&amp;diff=3629</id>
		<title>MeggyJrDemo</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MeggyJrDemo&amp;diff=3629"/>
		<updated>2009-03-16T22:50:45Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===== Introduction =====&lt;br /&gt;
I built a [http://www.evilmadscientist.com/article.php/meggyjr Meggy Jr RGB]&lt;br /&gt;
kit designed by Windell Oskay (Evil Mad Scientists Laboratory).&lt;br /&gt;
===== Standard Arduino main program: =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int main(void) {&lt;br /&gt;
    setup();&lt;br /&gt;
    for (;;)&lt;br /&gt;
      loop();&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Simplified Meggy API (part): =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;MeggyJrSimple.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EmptyScreen();      Turn off all LED&lt;br /&gt;
&lt;br /&gt;
DrawPx(x,y,color);  Turn on LED (x=0~7, y=0~7, color=0~15)&lt;br /&gt;
                                ( x=0,y=0 is lower left )&lt;br /&gt;
&lt;br /&gt;
ShowScreen();       Copy buffer array to display video array&lt;br /&gt;
&lt;br /&gt;
SetAuxLEDs(N);      Set top LEDs: N=1:FarLeft, N=255:AllOn&lt;br /&gt;
&lt;br /&gt;
CheckButtonsDown(); Check which buttons currently pressed.&lt;br /&gt;
                    Sets six (global) variables:&lt;br /&gt;
                      Button_A, Button_B, Button_Up,&lt;br /&gt;
                      Button_Down, Button_Left, Button_Right&lt;br /&gt;
                    if (Button_Left || Button_Up ) ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Regular Arduino calls still available: =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  delay(N);         Delay N msec.&lt;br /&gt;
  millis();         Current time in msec.&lt;br /&gt;
  random(X);        Random number in [0,X)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Colors for DrawPx(): =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 Dark&lt;br /&gt;
  1 Red       8 DimRed&lt;br /&gt;
  2 Orange    9 DimOrange&lt;br /&gt;
  3 Yellow   10 DimYellow&lt;br /&gt;
  4 Green    11 DimGreen&lt;br /&gt;
             12 DimAqua&lt;br /&gt;
  5 Blue     13 DimBlue    &lt;br /&gt;
  6 Violet   14 DimViolet&lt;br /&gt;
  7 White    15 FullOn&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Looping with delay() =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  void setup() {&lt;br /&gt;
    MeggyJrSimpleSetup();&lt;br /&gt;
  }&lt;br /&gt;
  void loop() {&lt;br /&gt;
    DrawPx(7, 7, FullOn);&lt;br /&gt;
    ShowScreen();&lt;br /&gt;
    delay(100);          // #1&lt;br /&gt;
    DrawPx(7, 7, Dark);&lt;br /&gt;
    ShowScreen();&lt;br /&gt;
    delay(500);          // #2&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Program looping over frames w/o delay() =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned long gLastTime;&lt;br /&gt;
byte          gWhichDelay;&lt;br /&gt;
int           gDelayMsec;&lt;br /&gt;
void setup() {&lt;br /&gt;
  MeggyJrSimpleSetup();&lt;br /&gt;
  gLastTime   = millis();&lt;br /&gt;
  gWhichDelay = 2;   // Waiting at: =1: first  delay(),&lt;br /&gt;
                     //             =2: second delay()&lt;br /&gt;
  gDelayMsec  = 500;&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( millis() &amp;gt; gLastTime + gDelayMsec ) {&lt;br /&gt;
    if ( gWhichDelay == 1 ) {&lt;br /&gt;
      DrawPx(7, 7, Dark);&lt;br /&gt;
      ShowScreen();&lt;br /&gt;
      gDelayMsec  = 500;&lt;br /&gt;
      gWhichDelay = 2;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      DrawPx(7, 7, FullOn);&lt;br /&gt;
      ShowScreen();&lt;br /&gt;
      gDelayMsec  = 100;&lt;br /&gt;
      gWhichDelay = 1;&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== References =====&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/meggyjr Meggy Jr Product Description -- http://www.evilmadscientist.com/article.php/meggyjr]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MeggyJrDemo&amp;diff=3628</id>
		<title>MeggyJrDemo</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MeggyJrDemo&amp;diff=3628"/>
		<updated>2009-03-16T22:46:57Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===== Introduction =====&lt;br /&gt;
I built a [http://www.evilmadscientist.com/article.php/meggyjr Meggy Jr RGB]&lt;br /&gt;
kit designed by Windell Oskay (Evil Mad Scientists Laboratory).&lt;br /&gt;
===== Standard Arduino main program: =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int main(void) {&lt;br /&gt;
    setup();&lt;br /&gt;
    for (;;)&lt;br /&gt;
      loop();&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Simplified Meggy API (part): =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;MeggyJrSimple.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EmptyScreen();      Turn off all LED&lt;br /&gt;
&lt;br /&gt;
DrawPx(x,y,color);  Turn on LED (x=0~7, y=0~7, color=0~15)&lt;br /&gt;
                                ( x=0,y=0 is lower left )&lt;br /&gt;
&lt;br /&gt;
ShowScreen();       Copy buffer array to display video array&lt;br /&gt;
&lt;br /&gt;
SetAuxLEDs(N);      Set top LEDs: N=1:FarLeft, N=255:AllOn&lt;br /&gt;
&lt;br /&gt;
CheckButtonsDown()  Check which buttons currently pressed.&lt;br /&gt;
                    Sets six (global) variables:&lt;br /&gt;
                      Button_A, Button_B, Button_Up,&lt;br /&gt;
                      Button_Down, Button_Left, Button_Right&lt;br /&gt;
                    if (Button_Left || Button_Up ) ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Regular Arduino calls still available: =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  delay(N);         Delay N msec.&lt;br /&gt;
  millis();         Current time in msec.&lt;br /&gt;
  random(X);        Random number in [0,X)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Colors for DrawPx(): =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 Dark&lt;br /&gt;
  1 Red       8 DimRed&lt;br /&gt;
  2 Orange    9 DimOrange&lt;br /&gt;
  3 Yellow   10 DimYellow&lt;br /&gt;
  4 Green    11 DimGreen&lt;br /&gt;
             12 DimAqua&lt;br /&gt;
  5 Blue     13 DimBlue    &lt;br /&gt;
  6 Violet   14 DimViolet&lt;br /&gt;
  7 White    15 FullOn&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Looping with delay() =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  void setup() {&lt;br /&gt;
    MeggyJrSimpleSetup();&lt;br /&gt;
  }&lt;br /&gt;
  void loop() {&lt;br /&gt;
    DrawPx(7, 7, FullOn);&lt;br /&gt;
    ShowScreen();&lt;br /&gt;
    delay(100);          // #1&lt;br /&gt;
    DrawPx(7, 7, Dark);&lt;br /&gt;
    ShowScreen();&lt;br /&gt;
    delay(500);          // #2&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Program looping over frames w/o delay() =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned long gLastTime;&lt;br /&gt;
byte          gWhichDelay;&lt;br /&gt;
int           gDelayMsec;&lt;br /&gt;
void setup() {&lt;br /&gt;
  MeggyJrSimpleSetup();&lt;br /&gt;
  gLastTime   = millis();&lt;br /&gt;
  gWhichDelay = 2;   // Waiting at: =1: first  delay(),&lt;br /&gt;
                     //             =2: second delay()&lt;br /&gt;
  gDelayMsec  = 500;&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( millis() &amp;gt; gLastTime + gDelayMsec ) {&lt;br /&gt;
    if ( gWhichDelay == 1 ) {&lt;br /&gt;
      DrawPx(7, 7, Dark);&lt;br /&gt;
      ShowScreen();&lt;br /&gt;
      gDelayMsec  = 500;&lt;br /&gt;
      gWhichDelay = 2;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      DrawPx(7, 7, FullOn);&lt;br /&gt;
      ShowScreen();&lt;br /&gt;
      gDelayMsec  = 100;&lt;br /&gt;
      gWhichDelay = 1;&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== References =====&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/meggyjr Meggy Jr Product Description -- http://www.evilmadscientist.com/article.php/meggyjr]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MeggyJrDemo&amp;diff=3627</id>
		<title>MeggyJrDemo</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MeggyJrDemo&amp;diff=3627"/>
		<updated>2009-03-16T22:42:10Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: New page: ===== Introduction ===== I built a [http://www.evilmadscientist.com/article.php/meggyjr Meggy Jr RGB] kit designed by Windell Oskay (Evil Mad Scientists Laboratory). ===== Standard Arduino...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===== Introduction =====&lt;br /&gt;
I built a [http://www.evilmadscientist.com/article.php/meggyjr Meggy Jr RGB]&lt;br /&gt;
kit designed by Windell Oskay (Evil Mad Scientists Laboratory).&lt;br /&gt;
===== Standard Arduino main program: =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int main(void) {&lt;br /&gt;
    setup();&lt;br /&gt;
    for (;;)&lt;br /&gt;
      loop();&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Simplified Meggy API (part): =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #include &amp;lt;MeggyJrSimple.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  EmptyScreen();      Turn off all LED&lt;br /&gt;
&lt;br /&gt;
  DrawPx(x,y,color);  Turn on LED (x=0~7, y=0~7, color=0~15)&lt;br /&gt;
                                  ( x=0,y=0 is lower left )&lt;br /&gt;
&lt;br /&gt;
  ShowScreen();       Copy buffer array to display video array&lt;br /&gt;
&lt;br /&gt;
  SetAuxLEDs(N);      Set top LEDs: N=1:FarLeft, N=255:AllOn&lt;br /&gt;
&lt;br /&gt;
  CheckButtonsDown()  Check which buttons currently pressed.&lt;br /&gt;
                      Sets six (global) variables:&lt;br /&gt;
                        Button_A, Button_B, Button_Up,&lt;br /&gt;
                        Button_Down, Button_Left, Button_Right&lt;br /&gt;
                      if (Button_Left || Button_Up ) ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Regular Arduino calls still available: =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  delay(N);           Delay N msec.&lt;br /&gt;
  long millis();      Current time in msec.&lt;br /&gt;
  random(X);          Random number in [0,X)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Colors for DrawPx(): =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 Dark&lt;br /&gt;
  1 Red       8 DimRed&lt;br /&gt;
  2 Orange    9 DimOrange&lt;br /&gt;
  3 Yellow   10 DimYellow&lt;br /&gt;
  4 Green    11 DimGreen&lt;br /&gt;
             12 DimAqua&lt;br /&gt;
  5 Blue     13 DimBlue    &lt;br /&gt;
  6 Violet   14 DimViolet&lt;br /&gt;
  7 White    15 FullOn&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Looping with delay() =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  void setup() {&lt;br /&gt;
    MeggyJrSimpleSetup();&lt;br /&gt;
  }&lt;br /&gt;
  void loop() {&lt;br /&gt;
    DrawPx(7, 7, FullOn);&lt;br /&gt;
    ShowScreen();&lt;br /&gt;
    delay(100);          // #1&lt;br /&gt;
    DrawPx(7, 7, Dark);&lt;br /&gt;
    ShowScreen();&lt;br /&gt;
    delay(500);          // #2&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Program looping over frames w/o delay() =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  unsigned long gLastTime;&lt;br /&gt;
  byte          gWhichDelay;&lt;br /&gt;
  int           gDelayMsec;&lt;br /&gt;
  void setup() {&lt;br /&gt;
    MeggyJrSimpleSetup();&lt;br /&gt;
    gLastTime   = millis();&lt;br /&gt;
    gWhichDelay = 2;   // Waiting at: =1: first  delay(),&lt;br /&gt;
                       //             =2: second delay()&lt;br /&gt;
    gDelayMsec  = 500;&lt;br /&gt;
  }&lt;br /&gt;
  void loop() {&lt;br /&gt;
    if ( millis() &amp;gt; gLastTime + gDelayMsec ) {&lt;br /&gt;
      if ( gWhichDelay == 1 ) {&lt;br /&gt;
        DrawPx(7, 7, Dark);&lt;br /&gt;
        ShowScreen();&lt;br /&gt;
        gDelayMsec  = 500;&lt;br /&gt;
        gWhichDelay = 2;&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        DrawPx(7, 7, FullOn);&lt;br /&gt;
        ShowScreen();&lt;br /&gt;
        gDelayMsec  = 100;&lt;br /&gt;
        gWhichDelay = 1;&lt;br /&gt;
      }&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== References =====&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/meggyjr Meggy Jr Product Description -- http://www.evilmadscientist.com/article.php/meggyjr]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=OpenHeartLib&amp;diff=3264</id>
		<title>OpenHeartLib</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=OpenHeartLib&amp;diff=3264"/>
		<updated>2009-02-20T20:14:27Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At the [[Noisebridge]]  soldering party on Valentine&#039;s Day, February 14 2009,&lt;br /&gt;
thanks to the gracious assistance of Mitch, Christie, Andy, and many others,&lt;br /&gt;
I built a [http://www.jimmieprodgers.com/openheart Jimmie Rodgers&#039; Open Heart]&lt;br /&gt;
Arduino LED thingy.  This kit is a passive LED I/O device and needs a separate&lt;br /&gt;
Arduino board to operate.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;I posted a video demonstrating the eight sections of my main sketch&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;(listed below) at http://www.youtube.com/watch?v=WIUIz8DRLxg .&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
While I simply adore the&lt;br /&gt;
[http://www.jimmieprodgers.com/OpenHeartProgrammer.html Open Heart Animation Programmer] Flash .swf application,&lt;br /&gt;
I decided to take a look at the code it generates&lt;br /&gt;
and write a small C++ class for the Arduino Development Environment,&lt;br /&gt;
that lets you control the Open Heart LED&#039;s by calling simple functions.&lt;br /&gt;
&lt;br /&gt;
(Note, I am relatively new to Arduino coding and would appreciate&lt;br /&gt;
comments from others; you cannot hurt my feelings! :-) )&lt;br /&gt;
&lt;br /&gt;
The class library consists of only two files (besides your &amp;quot;main&amp;quot; sketch file):&lt;br /&gt;
  * .../hardware/libraries/OpenHeartLib/OpenHeartLib.h&lt;br /&gt;
  * .../hardware/libraries/OpenHeartLib/OpenHeartLib.cpp&lt;br /&gt;
&lt;br /&gt;
(The wiki will not let me upload a .zip so send me email at nye2@email.com&lt;br /&gt;
and I will email you file OpenHeartLib.zip containing these two files and&lt;br /&gt;
my eight-section main sketch.)&lt;br /&gt;
&lt;br /&gt;
===== File OpenHeartLib.h  (slightly simplified) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WConstants.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class OpenHeart {&lt;br /&gt;
public:&lt;br /&gt;
  OpenHeart();&lt;br /&gt;
  void setPinMap( byte pin1, byte pin2, byte pin3,&lt;br /&gt;
                  byte pin4, byte pin5, byte pin6 );&lt;br /&gt;
  void turnOnLed( byte led );&lt;br /&gt;
  void alloff();&lt;br /&gt;
private:&lt;br /&gt;
  static byte pin1, pin2, pin3, pin4, pin5, pin6;&lt;br /&gt;
  static byte heartpins[27][2];&lt;br /&gt;
  static byte allpins[];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== File OpenHeartLib.cpp  (slightly simplified) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::pin1=1, OpenHeart::pin2=2, OpenHeart::pin3=3,&lt;br /&gt;
     OpenHeart::pin4=4, OpenHeart::pin5=5, OpenHeart::pin6=6;&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::heartpins[27][2] = {&lt;br /&gt;
  {pin3, pin1}, {pin1, pin3}, {pin2, pin1}, {pin1, pin2}, {pin3, pin4},&lt;br /&gt;
  {pin4, pin1}, {pin1, pin4}, {pin1, pin5}, {pin6, pin1}, {pin1, pin6},&lt;br /&gt;
  {pin6, pin2}, {pin4, pin3}, {pin3, pin5}, {pin5, pin3}, {pin5, pin1},&lt;br /&gt;
  {pin2, pin5}, {pin5, pin2}, {pin2, pin6}, {pin4, pin5}, {pin5, pin4},&lt;br /&gt;
  {pin3, pin2}, {pin6, pin5}, {pin5, pin6}, {pin4, pin6}, {pin2, pin3},&lt;br /&gt;
  {pin6, pin4}, {pin4, pin2}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::allpins[7];   // Gets indexed 1~6, 0 is unused.&lt;br /&gt;
&lt;br /&gt;
OpenHeart::OpenHeart() {};&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::setPinMap( byte pin1, byte pin2, byte pin3,&lt;br /&gt;
                           byte pin4, byte pin5, byte pin6 ) {&lt;br /&gt;
  allpins[1] = pin1;&lt;br /&gt;
  allpins[2] = pin2;&lt;br /&gt;
  allpins[3] = pin3;&lt;br /&gt;
  allpins[4] = pin4;&lt;br /&gt;
  allpins[5] = pin5;&lt;br /&gt;
  allpins[6] = pin6;&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;27 ; k++ ) {&lt;br /&gt;
    heartpins[k][0] = allpins[ heartpins[k][0] ];&lt;br /&gt;
    heartpins[k][1] = allpins[ heartpins[k][1] ];&lt;br /&gt;
  }&lt;br /&gt;
  OpenHeart::pin1 = pin1;&lt;br /&gt;
  OpenHeart::pin2 = pin2;&lt;br /&gt;
  OpenHeart::pin3 = pin3;&lt;br /&gt;
  OpenHeart::pin4 = pin4;&lt;br /&gt;
  OpenHeart::pin5 = pin5;&lt;br /&gt;
  OpenHeart::pin6 = pin6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::turnOnLed (byte led) {&lt;br /&gt;
  byte pospin = heartpins[led][0];&lt;br /&gt;
  byte negpin = heartpins[led][1];&lt;br /&gt;
  pinMode      (pospin, OUTPUT);&lt;br /&gt;
  pinMode      (negpin, OUTPUT);&lt;br /&gt;
  digitalWrite (pospin, HIGH  );&lt;br /&gt;
  digitalWrite (negpin, LOW   );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::alloff() {&lt;br /&gt;
  for( byte i=1 ; i&amp;lt;7 ; i++ )&lt;br /&gt;
    pinMode (allpins[i], INPUT);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the two actual source files contains the Open Heart Animation&lt;br /&gt;
Programmer-generated comment lines:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//**************************************************************//&lt;br /&gt;
//  Name    : Charlieplexed Heart control                       //&lt;br /&gt;
//  Author  : Jimmie P Rodgers   www.jimmieprodgers.com         //&lt;br /&gt;
//  Date    : 08 Feb, 2008  Last update on 02/13/08             //&lt;br /&gt;
//  Version : 1.3                                               //&lt;br /&gt;
//  Notes   : Uses Charlieplexing techniques to light up        //&lt;br /&gt;
//          : a matrix of 27 LEDs in the shape of a heart       //&lt;br /&gt;
//          : project website: www.jimmieprodgers.com/openheart //&lt;br /&gt;
//**************************************************************//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following minimal &amp;quot;main&amp;quot; sketch shows a simple usage&lt;br /&gt;
of the OpenHearLib class.  It simply flashes the 27 LEDs one at a time:&lt;br /&gt;
&lt;br /&gt;
(In all of the sample sketches here, you likely have to modify the pin&lt;br /&gt;
arguments to setPinMap().  These are the same pin mappings that you fill&lt;br /&gt;
in after clicking on &amp;quot;Generate&amp;quot; in the Open Heart Animation Programmer.)&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde  (section NN=1, simplified) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
OpenHeart ht = OpenHeart();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;27 ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay (100);     // (msec)&lt;br /&gt;
    ht.alloff ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes it is better to use variables instead of sprinkling constants&lt;br /&gt;
throughout your code, as shown in the above code rewritten:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde  (section NN=1) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
OpenHeart ht = OpenHeart();&lt;br /&gt;
int  gDelayTime = 100;  // (msec) &#039;g&#039; stands for &amp;quot;global&amp;quot;.&lt;br /&gt;
byte gkmax      = 27;   // Number of LEDs&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay (gDelayTime);&lt;br /&gt;
    ht.alloff ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all you wanted to do with your Arduino was flash the LEDs, the above&lt;br /&gt;
code is fine.  But if you need to do some other computations, such as at&lt;br /&gt;
the end of your function loop(), you would not want to put your cpu&lt;br /&gt;
in massive &amp;quot;wait&amp;quot; states with those delay() calls.  Instead, you can &amp;quot;unroll&amp;quot;&lt;br /&gt;
the &#039;&#039;for&#039;&#039; loop and use something like:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde  (section NN=2) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
    if  ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
      ht.turnOnLed (gk);&lt;br /&gt;
    else {&lt;br /&gt;
      ht.alloff();&lt;br /&gt;
      gk++;&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gk = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of how charlieplexing works, you can only turn on one LED at a time&lt;br /&gt;
with method turnOnLed().  To make it &#039;&#039;appear&#039;&#039; that more than one LED is&lt;br /&gt;
on at the same time, you have to multiplex at high speed:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde  (section NN=5) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  gDelayTime = 300;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
int kstart[] = { 23,  4,  0 };   // Three groups of LED&#039;s&lt;br /&gt;
int kend  [] = { 27, 23,  4 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;3 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        if ( j == 1 )     // Twinkle the middle LED group (ie, flash slower).&lt;br /&gt;
          delay( 5 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the complete &amp;quot;main&amp;quot; test sketch, where you must select one of the eight&lt;br /&gt;
sections by setting the &#039;&#039;&#039;#define NN&#039;&#039;&#039; value:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde  (complete) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//# NN=1 -- With delay().&lt;br /&gt;
//# NN=2 -- Looping over frames w/o delay().&lt;br /&gt;
//# NN=3 -- DOUBLE Looping with delay().&lt;br /&gt;
//# NN=4 -- Program DOUBLE looping over frames w/o delay().&lt;br /&gt;
//# NN=5 -- Simultaneous with tiny delay().&lt;br /&gt;
//# NN=6 -- Two flickering groups.&lt;br /&gt;
//# NN=7 -- Purely random, one LED at a time.&lt;br /&gt;
//# NN=8 -- Sequential concentric ring groups -- BEATING HEART!&lt;br /&gt;
&lt;br /&gt;
#define NN 8    /* Pick which section below to compile and execute. */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenHeart ht = OpenHeart();   // OpenHeart is a class.&lt;br /&gt;
&lt;br /&gt;
#if (NN == 1)&lt;br /&gt;
//--- With delay(). &#039;g&#039; is for &amp;quot;global&amp;quot;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;   // Number of Open Heart LED&#039;s&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay        (gDelayTime);&lt;br /&gt;
    ht.alloff    ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 2)&lt;br /&gt;
//--- Looping over frames w/o delay().&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
    if  ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
      ht.turnOnLed (gk);&lt;br /&gt;
    else {&lt;br /&gt;
      ht.alloff();&lt;br /&gt;
      gk++;&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gk = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 3)&lt;br /&gt;
//--- DOUBLE Looping with delay()&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gjmax      = 3;&lt;br /&gt;
byte gkmax      = 9;&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for   ( byte j=0 ; j&amp;lt;gjmax ; j++ ) {&lt;br /&gt;
    for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
      ht.turnOnLed( j*gkmax + k );&lt;br /&gt;
      delay       ( gDelayTime );&lt;br /&gt;
      ht.alloff   ();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 4)&lt;br /&gt;
//--- Program DOUBLE looping over frames w/o delay()&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gjmax      = 3;&lt;br /&gt;
byte gkmax      = 9;&lt;br /&gt;
byte gj         = 0;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
  gLastTime = millis();  // Not needed unless above executes too early.&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if   ( gj &amp;lt; gjmax ) {&lt;br /&gt;
    if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
      if ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
        ht.turnOnLed(gj*9 + gk);&lt;br /&gt;
      else {&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
        gk++;&lt;br /&gt;
        gLastTime = millis();&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      gk = 0;  // Restart inner.&lt;br /&gt;
      gj++;    // Increment outer.&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gj = 0;    // Restart outer.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 5)&lt;br /&gt;
//--- Simultaneous with tiny delay()&lt;br /&gt;
int  gDelayTime = 300;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
//int kstart[] = {  0, 11, 23 };   // Top to bottom.&lt;br /&gt;
//int kend  [] = { 11, 23, 27 };&lt;br /&gt;
//int kstart[] = { 23, 11,  0 };   // Bottom to top.&lt;br /&gt;
//int kend  [] = { 27, 23, 11 };&lt;br /&gt;
  int kstart[] = { 23,  4,  0 };   // Bot-to-top many lights in top group&lt;br /&gt;
  int kend  [] = { 27, 23,  4 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;3 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        if ( j == 1 )     // Twinkle the middle LED group (ie, flash slower).&lt;br /&gt;
          delay( 5 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 6)&lt;br /&gt;
//--- Two flickering groups.&lt;br /&gt;
int  gDelayTime = 1000;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
  int kstart[] = { 11,  0 };          // 16/11 ~ 1.5&lt;br /&gt;
  int kend  [] = { 27, 11 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;2 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        delay( j==0 ? 4 : 6 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 7)&lt;br /&gt;
//--- Purely random, one LED at a time.&lt;br /&gt;
int  gDelayTime = 1;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  int k = random(27);&lt;br /&gt;
  ht.turnOnLed( k );&lt;br /&gt;
  delay( gDelayTime );&lt;br /&gt;
  ht.alloff();&lt;br /&gt;
  delay( gDelayTime );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 8)&lt;br /&gt;
//--- Sequential concentric ring groups -- BEATING HEART!&lt;br /&gt;
int gDelayTime = 250;&lt;br /&gt;
byte rings[][13] = { { 0,  1,  2,  3,  4, 10, 11, 17, 18, 22, 23, 25, 26},&lt;br /&gt;
                     { 5,  6,  7,  8,  9, 12, 16, 19, 21, 24, 99, 99, 99},&lt;br /&gt;
                     {13, 14, 15, 20, 99, 99, 99, 99, 99, 99, 99, 99, 99},&lt;br /&gt;
                     { 5,  6,  7,  8,  9, 12, 16, 19, 21, 24, 99, 99, 99}&lt;br /&gt;
                   };&lt;br /&gt;
byte ringsN[ ] = { 13, 10, 4, 10 };  // Number of non-99 in each row above.&lt;br /&gt;
byte Nrings = 4;&lt;br /&gt;
byte ringNo = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  byte k;&lt;br /&gt;
  if ( ringNo &amp;lt; Nrings ) {&lt;br /&gt;
    k = 0;&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      byte led = rings [ringNo][k];&lt;br /&gt;
      if ( led != 99 ) {&lt;br /&gt;
        ht.turnOnLed( led );&lt;br /&gt;
        delay( 10 * (ringsN[0]+0.0)/ringsN[ringNo] );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
      k = (k+1) % ringsN[ringNo];&lt;br /&gt;
    }&lt;br /&gt;
    ringNo++;&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  } else&lt;br /&gt;
    ringNo = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//# Charlieplexing&lt;br /&gt;
//# ++++++++++++++&lt;br /&gt;
//#   From: http://www.instructables.com/id/Charlieplexing-LEDs--The-theory&lt;br /&gt;
//#&lt;br /&gt;
//#   0v/5v/open A -----[R]-----*-----*-----*-----*    LED ||  A  |  B  |  C&lt;br /&gt;
//#                             |     |     |     |    ======================&lt;br /&gt;
//#                           1 V   2 ^     |     |     1      1     0    XXX&lt;br /&gt;
//#                             |     |     |     |     2      0     1    XXX&lt;br /&gt;
//#   0v/5v/open B -----[R]-----*-----*   5 V   6 ^     3     XXX    1     0&lt;br /&gt;
//#                             |     |     |     |     4     XXX    0     1&lt;br /&gt;
//#                           3 V   4 ^     |     |     5      1    XXX    0&lt;br /&gt;
//#                             |     |     |     |     6      0    XXX    1&lt;br /&gt;
//#   0v/5v/open C -----[R]-----*-----*-----*-----*&lt;br /&gt;
&lt;br /&gt;
//# Open Heart LED Numbers&lt;br /&gt;
//#   [     0  1     2  3    ]&lt;br /&gt;
//#   [  4  5  6  7  8  9 10 ]&lt;br /&gt;
//#   [ 11 12 13 14 15 16 17 ]&lt;br /&gt;
//#   [    18 19 20 21 22    ]&lt;br /&gt;
//#   [       23 24 25       ]&lt;br /&gt;
//#   [          26          ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=OpenHeartLib&amp;diff=3263</id>
		<title>OpenHeartLib</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=OpenHeartLib&amp;diff=3263"/>
		<updated>2009-02-20T18:42:07Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At the [[Noisebridge]]  soldering party on Valentine&#039;s Day, February 14 2009,&lt;br /&gt;
thanks to the gracious assistance of Mitch, Christie, Andy, and many others,&lt;br /&gt;
I built a [http://www.jimmieprodgers.com/openheart Jimmie Rodgers&#039; Open Heart]&lt;br /&gt;
Arduino LED thingy.  This kit is a passive LED I/O device and needs a separate&lt;br /&gt;
Arduino board to operate.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;I posted a video demonstrating the eight sections of my main sketch&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;(listed below) at http://www.youtube.com/watch?v=WIUIz8DRLxg .&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
While I simply adore the&lt;br /&gt;
[http://www.jimmieprodgers.com/OpenHeartProgrammer.html Open Heart Animation Programmer] Flash .swf application,&lt;br /&gt;
I decided to take a look at the code it generates&lt;br /&gt;
and write a small C++ class for the Arduino Development Environment,&lt;br /&gt;
that lets you control the Open Heart LED&#039;s by calling simple functions.&lt;br /&gt;
&lt;br /&gt;
(Note, I am relatively new to Arduino coding and would appreciate&lt;br /&gt;
comments from others; you cannot hurt my feelings! :-) )&lt;br /&gt;
&lt;br /&gt;
The class library consists of only two files (besides your &amp;quot;main&amp;quot; sketch file):&lt;br /&gt;
  * .../hardware/libraries/OpenHeartLib/OpenHeartLib.h&lt;br /&gt;
  * .../hardware/libraries/OpenHeartLib/OpenHeartLib.cpp&lt;br /&gt;
&lt;br /&gt;
===== File OpenHeartLib.h  (slightly simplified) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WConstants.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class OpenHeart {&lt;br /&gt;
public:&lt;br /&gt;
  OpenHeart();&lt;br /&gt;
  void setPinMap( byte pin1, byte pin2, byte pin3,&lt;br /&gt;
                  byte pin4, byte pin5, byte pin6 );&lt;br /&gt;
  void turnOnLed( byte led );&lt;br /&gt;
  void alloff();&lt;br /&gt;
private:&lt;br /&gt;
  static byte pin1, pin2, pin3, pin4, pin5, pin6;&lt;br /&gt;
  static byte heartpins[27][2];&lt;br /&gt;
  static byte allpins[];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== File OpenHeartLib.cpp  (slightly simplified) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::pin1=1, OpenHeart::pin2=2, OpenHeart::pin3=3,&lt;br /&gt;
     OpenHeart::pin4=4, OpenHeart::pin5=5, OpenHeart::pin6=6;&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::heartpins[27][2] = {&lt;br /&gt;
  {pin3, pin1}, {pin1, pin3}, {pin2, pin1}, {pin1, pin2}, {pin3, pin4},&lt;br /&gt;
  {pin4, pin1}, {pin1, pin4}, {pin1, pin5}, {pin6, pin1}, {pin1, pin6},&lt;br /&gt;
  {pin6, pin2}, {pin4, pin3}, {pin3, pin5}, {pin5, pin3}, {pin5, pin1},&lt;br /&gt;
  {pin2, pin5}, {pin5, pin2}, {pin2, pin6}, {pin4, pin5}, {pin5, pin4},&lt;br /&gt;
  {pin3, pin2}, {pin6, pin5}, {pin5, pin6}, {pin4, pin6}, {pin2, pin3},&lt;br /&gt;
  {pin6, pin4}, {pin4, pin2}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::allpins[7];   // Gets indexed 1~6, 0 is unused.&lt;br /&gt;
&lt;br /&gt;
OpenHeart::OpenHeart() {};&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::setPinMap( byte pin1, byte pin2, byte pin3,&lt;br /&gt;
                           byte pin4, byte pin5, byte pin6 ) {&lt;br /&gt;
  allpins[1] = pin1;&lt;br /&gt;
  allpins[2] = pin2;&lt;br /&gt;
  allpins[3] = pin3;&lt;br /&gt;
  allpins[4] = pin4;&lt;br /&gt;
  allpins[5] = pin5;&lt;br /&gt;
  allpins[6] = pin6;&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;27 ; k++ ) {&lt;br /&gt;
    heartpins[k][0] = allpins[ heartpins[k][0] ];&lt;br /&gt;
    heartpins[k][1] = allpins[ heartpins[k][1] ];&lt;br /&gt;
  }&lt;br /&gt;
  OpenHeart::pin1 = pin1;&lt;br /&gt;
  OpenHeart::pin2 = pin2;&lt;br /&gt;
  OpenHeart::pin3 = pin3;&lt;br /&gt;
  OpenHeart::pin4 = pin4;&lt;br /&gt;
  OpenHeart::pin5 = pin5;&lt;br /&gt;
  OpenHeart::pin6 = pin6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::turnOnLed (byte led) {&lt;br /&gt;
  byte pospin = heartpins[led][0];&lt;br /&gt;
  byte negpin = heartpins[led][1];&lt;br /&gt;
  pinMode      (pospin, OUTPUT);&lt;br /&gt;
  pinMode      (negpin, OUTPUT);&lt;br /&gt;
  digitalWrite (pospin, HIGH  );&lt;br /&gt;
  digitalWrite (negpin, LOW   );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::alloff() {&lt;br /&gt;
  for( byte i=1 ; i&amp;lt;7 ; i++ )&lt;br /&gt;
    pinMode (allpins[i], INPUT);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the two actual source files contains the Open Heart Animation&lt;br /&gt;
Programmer-generated comment lines:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//**************************************************************//&lt;br /&gt;
//  Name    : Charlieplexed Heart control                       //&lt;br /&gt;
//  Author  : Jimmie P Rodgers   www.jimmieprodgers.com         //&lt;br /&gt;
//  Date    : 08 Feb, 2008  Last update on 02/13/08             //&lt;br /&gt;
//  Version : 1.3                                               //&lt;br /&gt;
//  Notes   : Uses Charlieplexing techniques to light up        //&lt;br /&gt;
//          : a matrix of 27 LEDs in the shape of a heart       //&lt;br /&gt;
//          : project website: www.jimmieprodgers.com/openheart //&lt;br /&gt;
//**************************************************************//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following minimal &amp;quot;main&amp;quot; sketch shows a simple usage&lt;br /&gt;
of the OpenHearLib class.  It simply flashes the 27 LEDs one at a time:&lt;br /&gt;
&lt;br /&gt;
(In all of the sample sketches here, you likely have to modify the pin&lt;br /&gt;
arguments to setPinMap().  These are the same pin mappings that you fill&lt;br /&gt;
in after clicking on &amp;quot;Generate&amp;quot; in the Open Heart Animation Programmer.)&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde  (section NN=1, simplified) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
OpenHeart ht = OpenHeart();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;27 ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay (100);     // (msec)&lt;br /&gt;
    ht.alloff ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes it is better to use variables instead of sprinkling constants&lt;br /&gt;
throughout your code, as shown in the above code rewritten:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde  (section NN=1) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
OpenHeart ht = OpenHeart();&lt;br /&gt;
int  gDelayTime = 100;  // (msec) &#039;g&#039; stands for &amp;quot;global&amp;quot;.&lt;br /&gt;
byte gkmax      = 27;   // Number of LEDs&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay (gDelayTime);&lt;br /&gt;
    ht.alloff ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all you wanted to do with your Arduino was flash the LEDs, the above&lt;br /&gt;
code is fine.  But if you need to do some other computations, such as at&lt;br /&gt;
the end of your function loop(), you would not want to put your cpu&lt;br /&gt;
in massive &amp;quot;wait&amp;quot; states with those delay() calls.  Instead, you can &amp;quot;unroll&amp;quot;&lt;br /&gt;
the &#039;&#039;for&#039;&#039; loop and use something like:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde  (section NN=2) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
    if  ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
      ht.turnOnLed (gk);&lt;br /&gt;
    else {&lt;br /&gt;
      ht.alloff();&lt;br /&gt;
      gk++;&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gk = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of how charlieplexing works, you can only turn on one LED at a time&lt;br /&gt;
with method turnOnLed().  To make it &#039;&#039;appear&#039;&#039; that more than one LED is&lt;br /&gt;
on at the same time, you have to multiplex at high speed:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde  (section NN=5) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  gDelayTime = 300;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
int kstart[] = { 23,  4,  0 };   // Three groups of LED&#039;s&lt;br /&gt;
int kend  [] = { 27, 23,  4 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;3 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        if ( j == 1 )     // Twinkle the middle LED group (ie, flash slower).&lt;br /&gt;
          delay( 5 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the complete &amp;quot;main&amp;quot; test sketch, where you must select one of the eight&lt;br /&gt;
sections by setting the &#039;&#039;&#039;#define NN&#039;&#039;&#039; value:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde  (complete) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//# NN=1 -- With delay().&lt;br /&gt;
//# NN=2 -- Looping over frames w/o delay().&lt;br /&gt;
//# NN=3 -- DOUBLE Looping with delay().&lt;br /&gt;
//# NN=4 -- Program DOUBLE looping over frames w/o delay().&lt;br /&gt;
//# NN=5 -- Simultaneous with tiny delay().&lt;br /&gt;
//# NN=6 -- Two flickering groups.&lt;br /&gt;
//# NN=7 -- Purely random, one LED at a time.&lt;br /&gt;
//# NN=8 -- Sequential concentric ring groups -- BEATING HEART!&lt;br /&gt;
&lt;br /&gt;
#define NN 8    /* Pick which section below to compile and execute. */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenHeart ht = OpenHeart();   // OpenHeart is a class.&lt;br /&gt;
&lt;br /&gt;
#if (NN == 1)&lt;br /&gt;
//--- With delay(). &#039;g&#039; is for &amp;quot;global&amp;quot;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;   // Number of Open Heart LED&#039;s&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay        (gDelayTime);&lt;br /&gt;
    ht.alloff    ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 2)&lt;br /&gt;
//--- Looping over frames w/o delay().&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
    if  ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
      ht.turnOnLed (gk);&lt;br /&gt;
    else {&lt;br /&gt;
      ht.alloff();&lt;br /&gt;
      gk++;&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gk = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 3)&lt;br /&gt;
//--- DOUBLE Looping with delay()&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gjmax      = 3;&lt;br /&gt;
byte gkmax      = 9;&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for   ( byte j=0 ; j&amp;lt;gjmax ; j++ ) {&lt;br /&gt;
    for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
      ht.turnOnLed( j*gkmax + k );&lt;br /&gt;
      delay       ( gDelayTime );&lt;br /&gt;
      ht.alloff   ();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 4)&lt;br /&gt;
//--- Program DOUBLE looping over frames w/o delay()&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gjmax      = 3;&lt;br /&gt;
byte gkmax      = 9;&lt;br /&gt;
byte gj         = 0;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
  gLastTime = millis();  // Not needed unless above executes too early.&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if   ( gj &amp;lt; gjmax ) {&lt;br /&gt;
    if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
      if ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
        ht.turnOnLed(gj*9 + gk);&lt;br /&gt;
      else {&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
        gk++;&lt;br /&gt;
        gLastTime = millis();&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      gk = 0;  // Restart inner.&lt;br /&gt;
      gj++;    // Increment outer.&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gj = 0;    // Restart outer.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 5)&lt;br /&gt;
//--- Simultaneous with tiny delay()&lt;br /&gt;
int  gDelayTime = 300;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
//int kstart[] = {  0, 11, 23 };   // Top to bottom.&lt;br /&gt;
//int kend  [] = { 11, 23, 27 };&lt;br /&gt;
//int kstart[] = { 23, 11,  0 };   // Bottom to top.&lt;br /&gt;
//int kend  [] = { 27, 23, 11 };&lt;br /&gt;
  int kstart[] = { 23,  4,  0 };   // Bot-to-top many lights in top group&lt;br /&gt;
  int kend  [] = { 27, 23,  4 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;3 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        if ( j == 1 )     // Twinkle the middle LED group (ie, flash slower).&lt;br /&gt;
          delay( 5 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 6)&lt;br /&gt;
//--- Two flickering groups.&lt;br /&gt;
int  gDelayTime = 1000;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
  int kstart[] = { 11,  0 };          // 16/11 ~ 1.5&lt;br /&gt;
  int kend  [] = { 27, 11 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;2 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        delay( j==0 ? 4 : 6 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 7)&lt;br /&gt;
//--- Purely random, one LED at a time.&lt;br /&gt;
int  gDelayTime = 1;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  int k = random(27);&lt;br /&gt;
  ht.turnOnLed( k );&lt;br /&gt;
  delay( gDelayTime );&lt;br /&gt;
  ht.alloff();&lt;br /&gt;
  delay( gDelayTime );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 8)&lt;br /&gt;
//--- Sequential concentric ring groups -- BEATING HEART!&lt;br /&gt;
int gDelayTime = 250;&lt;br /&gt;
byte rings[][13] = { { 0,  1,  2,  3,  4, 10, 11, 17, 18, 22, 23, 25, 26},&lt;br /&gt;
                     { 5,  6,  7,  8,  9, 12, 16, 19, 21, 24, 99, 99, 99},&lt;br /&gt;
                     {13, 14, 15, 20, 99, 99, 99, 99, 99, 99, 99, 99, 99},&lt;br /&gt;
                     { 5,  6,  7,  8,  9, 12, 16, 19, 21, 24, 99, 99, 99}&lt;br /&gt;
                   };&lt;br /&gt;
byte ringsN[ ] = { 13, 10, 4, 10 };  // Number of non-99 in each row above.&lt;br /&gt;
byte Nrings = 4;&lt;br /&gt;
byte ringNo = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  byte k;&lt;br /&gt;
  if ( ringNo &amp;lt; Nrings ) {&lt;br /&gt;
    k = 0;&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      byte led = rings [ringNo][k];&lt;br /&gt;
      if ( led != 99 ) {&lt;br /&gt;
        ht.turnOnLed( led );&lt;br /&gt;
        delay( 10 * (ringsN[0]+0.0)/ringsN[ringNo] );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
      k = (k+1) % ringsN[ringNo];&lt;br /&gt;
    }&lt;br /&gt;
    ringNo++;&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  } else&lt;br /&gt;
    ringNo = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//# Charlieplexing&lt;br /&gt;
//# ++++++++++++++&lt;br /&gt;
//#   From: http://www.instructables.com/id/Charlieplexing-LEDs--The-theory&lt;br /&gt;
//#&lt;br /&gt;
//#   0v/5v/open A -----[R]-----*-----*-----*-----*    LED ||  A  |  B  |  C&lt;br /&gt;
//#                             |     |     |     |    ======================&lt;br /&gt;
//#                           1 V   2 ^     |     |     1      1     0    XXX&lt;br /&gt;
//#                             |     |     |     |     2      0     1    XXX&lt;br /&gt;
//#   0v/5v/open B -----[R]-----*-----*   5 V   6 ^     3     XXX    1     0&lt;br /&gt;
//#                             |     |     |     |     4     XXX    0     1&lt;br /&gt;
//#                           3 V   4 ^     |     |     5      1    XXX    0&lt;br /&gt;
//#                             |     |     |     |     6      0    XXX    1&lt;br /&gt;
//#   0v/5v/open C -----[R]-----*-----*-----*-----*&lt;br /&gt;
&lt;br /&gt;
//# Open Heart LED Numbers&lt;br /&gt;
//#   [     0  1     2  3    ]&lt;br /&gt;
//#   [  4  5  6  7  8  9 10 ]&lt;br /&gt;
//#   [ 11 12 13 14 15 16 17 ]&lt;br /&gt;
//#   [    18 19 20 21 22    ]&lt;br /&gt;
//#   [       23 24 25       ]&lt;br /&gt;
//#   [          26          ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=OpenHeartLib&amp;diff=3259</id>
		<title>OpenHeartLib</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=OpenHeartLib&amp;diff=3259"/>
		<updated>2009-02-19T09:27:59Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At the [[Noisebridge]]  soldering party on Valentine&#039;s Day, February 14 2009,&lt;br /&gt;
thanks to the gracious assistance of Mitch, Christie, Andy, and many others,&lt;br /&gt;
I built a [http://www.jimmieprodgers.com/openheart Jimmie Rodgers&#039; Open Heart].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube&amp;gt;Nad5AJaIcBI&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
While I simply adore the&lt;br /&gt;
[http://www.jimmieprodgers.com/OpenHeartProgrammer.html Open Heart Animation Programmer],&lt;br /&gt;
I decided to take a look at the code it generates&lt;br /&gt;
and write a small C++ class for the Arduino Development Environment,&lt;br /&gt;
that lets you control the Open Heart LED&#039;s by calling simple functions.&lt;br /&gt;
&lt;br /&gt;
The class library consists of only two files (besides your &amp;quot;main&amp;quot; sketch file):&lt;br /&gt;
  * .../hardware/libraries/OpenHeartLib/OpenHeartLib.h&lt;br /&gt;
  * .../hardware/libraries/OpenHeartLib/OpenHeartLib.cpp&lt;br /&gt;
&lt;br /&gt;
===== File OpenHeartLib.h =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WConstants.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class OpenHeart {&lt;br /&gt;
public:&lt;br /&gt;
  OpenHeart();&lt;br /&gt;
  void setPinMap( byte pin1, byte pin2, byte pin3,&lt;br /&gt;
                  byte pin4, byte pin5, byte pin6 );&lt;br /&gt;
  void turnOnLed( byte led );&lt;br /&gt;
  void alloff();&lt;br /&gt;
private:&lt;br /&gt;
  static byte pin1, pin2, pin3, pin4, pin5, pin6;&lt;br /&gt;
  static byte heartpins[27][2];&lt;br /&gt;
  static byte allpins[];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== File OpenHeartLib.cpp =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::pin1=1, OpenHeart::pin2=2, OpenHeart::pin3=3,&lt;br /&gt;
     OpenHeart::pin4=4, OpenHeart::pin5=5, OpenHeart::pin6=6;&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::heartpins[27][2] = {&lt;br /&gt;
  {pin3, pin1}, {pin1, pin3}, {pin2, pin1}, {pin1, pin2}, {pin3, pin4},&lt;br /&gt;
  {pin4, pin1}, {pin1, pin4}, {pin1, pin5}, {pin6, pin1}, {pin1, pin6},&lt;br /&gt;
  {pin6, pin2}, {pin4, pin3}, {pin3, pin5}, {pin5, pin3}, {pin5, pin1},&lt;br /&gt;
  {pin2, pin5}, {pin5, pin2}, {pin2, pin6}, {pin4, pin5}, {pin5, pin4},&lt;br /&gt;
  {pin3, pin2}, {pin6, pin5}, {pin5, pin6}, {pin4, pin6}, {pin2, pin3},&lt;br /&gt;
  {pin6, pin4}, {pin4, pin2}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::allpins[7];   // Gets indexed 1~6, 0 is unused.&lt;br /&gt;
&lt;br /&gt;
OpenHeart::OpenHeart() {};&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::setPinMap( byte pin1, byte pin2, byte pin3,&lt;br /&gt;
                           byte pin4, byte pin5, byte pin6 ) {&lt;br /&gt;
  allpins[1] = pin1;&lt;br /&gt;
  allpins[2] = pin2;&lt;br /&gt;
  allpins[3] = pin3;&lt;br /&gt;
  allpins[4] = pin4;&lt;br /&gt;
  allpins[5] = pin5;&lt;br /&gt;
  allpins[6] = pin6;&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;27 ; k++ ) {&lt;br /&gt;
    heartpins[k][0] = allpins[ heartpins[k][0] ];&lt;br /&gt;
    heartpins[k][1] = allpins[ heartpins[k][1] ];&lt;br /&gt;
  }&lt;br /&gt;
  OpenHeart::pin1 = pin1;&lt;br /&gt;
  OpenHeart::pin2 = pin2;&lt;br /&gt;
  OpenHeart::pin3 = pin3;&lt;br /&gt;
  OpenHeart::pin4 = pin4;&lt;br /&gt;
  OpenHeart::pin5 = pin5;&lt;br /&gt;
  OpenHeart::pin6 = pin6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::turnOnLed (byte led) {&lt;br /&gt;
  byte pospin = heartpins[led][0];&lt;br /&gt;
  byte negpin = heartpins[led][1];&lt;br /&gt;
  pinMode      (pospin, OUTPUT);&lt;br /&gt;
  pinMode      (negpin, OUTPUT);&lt;br /&gt;
  digitalWrite (pospin, HIGH  );&lt;br /&gt;
  digitalWrite (negpin, LOW   );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::alloff() {&lt;br /&gt;
  for( byte i=1 ; i&amp;lt;7 ; i++ )&lt;br /&gt;
    pinMode (allpins[i], INPUT);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the two actual source files contains the Open Heart Animation&lt;br /&gt;
Programmer-generated comment lines:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//**************************************************************//&lt;br /&gt;
//  Name    : Charlieplexed Heart control                       //&lt;br /&gt;
//  Author  : Jimmie P Rodgers   www.jimmieprodgers.com         //&lt;br /&gt;
//  Date    : 08 Feb, 2008  Last update on 02/13/08             //&lt;br /&gt;
//  Version : 1.3                                               //&lt;br /&gt;
//  Notes   : Uses Charlieplexing techniques to light up        //&lt;br /&gt;
//          : a matrix of 27 LEDs in the shape of a heart       //&lt;br /&gt;
//          : project website: www.jimmieprodgers.com/openheart //&lt;br /&gt;
//**************************************************************//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following minimal &amp;quot;main&amp;quot; sketch shows a simple usage&lt;br /&gt;
of the OpenHearLib class.  It simply flashes the 27 LEDs one at a time:&lt;br /&gt;
&lt;br /&gt;
(In all of the sample sketches here, you likely have to modify the pin&lt;br /&gt;
arguments to setPinMap().  These are the same pin mappings that you fill&lt;br /&gt;
in after clicking on &amp;quot;Generate&amp;quot; in the Open Heart Animation Programmer.)&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde (section NN=1, simplified) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
OpenHeart ht = OpenHeart();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;27 ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay (100);     // (msec)&lt;br /&gt;
    ht.alloff ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes it is better to use variables instead of sprinkling constants&lt;br /&gt;
throughout your code, as shown in the above code rewritten:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde (section NN=1) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
OpenHeart ht = OpenHeart();&lt;br /&gt;
int  gDelayTime = 100;  // (msec) &#039;g&#039; stands for &amp;quot;global&amp;quot;.&lt;br /&gt;
byte gkmax      = 27;   // Number of LEDs&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay (gDelayTime);&lt;br /&gt;
    ht.alloff ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all you wanted to do with your Arduino was flash the LEDs, the above&lt;br /&gt;
code is fine.  But if you need to do some other computations, such as at&lt;br /&gt;
the end of your function loop(), you would not want to put your cpu&lt;br /&gt;
in massive &amp;quot;wait&amp;quot; states with those delay() calls.  Instead, you can &amp;quot;unroll&amp;quot;&lt;br /&gt;
the &#039;&#039;for&#039;&#039; loop and use something like:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde (section NN=2) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
    if  ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
      ht.turnOnLed (gk);&lt;br /&gt;
    else {&lt;br /&gt;
      ht.alloff();&lt;br /&gt;
      gk++;&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gk = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of how charlieplexing works, you can only turn on one LED at a time&lt;br /&gt;
with method turnOnLed().  To make it &#039;&#039;appear&#039;&#039; that more than one LED is&lt;br /&gt;
on at the same time, you have to multiplex at high speed:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde (section NN=5) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  gDelayTime = 300;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
int kstart[] = { 23,  4,  0 };   // Three groups of LED&#039;s&lt;br /&gt;
int kend  [] = { 27, 23,  4 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;3 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        if ( j == 1 )     // Twinkle the middle LED group (ie, flash slower).&lt;br /&gt;
          delay( 5 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the complete &amp;quot;main&amp;quot; test sketch, where you must select one of the eight&lt;br /&gt;
sections by setting the &#039;&#039;&#039;#define NN&#039;&#039;&#039; value:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde (complete) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//# NN=1 -- With delay().&lt;br /&gt;
//# NN=2 -- Looping over frames w/o delay().&lt;br /&gt;
//# NN=3 -- DOUBLE Looping with delay().&lt;br /&gt;
//# NN=4 -- Program DOUBLE looping over frames w/o delay().&lt;br /&gt;
//# NN=5 -- Simultaneous with tiny delay().&lt;br /&gt;
//# NN=6 -- Two flickering groups.&lt;br /&gt;
//# NN=7 -- Purely random, one LED at a time.&lt;br /&gt;
//# NN=8 -- Sequential concentric ring groups -- BEATING HEART!&lt;br /&gt;
&lt;br /&gt;
#define NN 8    /* Pick which section below to compile and execute. */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenHeart ht = OpenHeart();   // OpenHeart is a class.&lt;br /&gt;
&lt;br /&gt;
#if (NN == 1)&lt;br /&gt;
//--- With delay(). &#039;g&#039; is for &amp;quot;global&amp;quot;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;   // Number of Open Heart LED&#039;s&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay        (gDelayTime);&lt;br /&gt;
    ht.alloff    ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 2)&lt;br /&gt;
//--- Looping over frames w/o delay().&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
    if  ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
      ht.turnOnLed (gk);&lt;br /&gt;
    else {&lt;br /&gt;
      ht.alloff();&lt;br /&gt;
      gk++;&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gk = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 3)&lt;br /&gt;
//--- DOUBLE Looping with delay()&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gjmax      = 3;&lt;br /&gt;
byte gkmax      = 9;&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for   ( byte j=0 ; j&amp;lt;gjmax ; j++ ) {&lt;br /&gt;
    for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
      ht.turnOnLed( j*gkmax + k );&lt;br /&gt;
      delay       ( gDelayTime );&lt;br /&gt;
      ht.alloff   ();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 4)&lt;br /&gt;
//--- Program DOUBLE looping over frames w/o delay()&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gjmax      = 3;&lt;br /&gt;
byte gkmax      = 9;&lt;br /&gt;
byte gj         = 0;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
  gLastTime = millis();  // Not needed unless above executes too early.&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if   ( gj &amp;lt; gjmax ) {&lt;br /&gt;
    if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
      if ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
        ht.turnOnLed(gj*9 + gk);&lt;br /&gt;
      else {&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
        gk++;&lt;br /&gt;
        gLastTime = millis();&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      gk = 0;  // Restart inner.&lt;br /&gt;
      gj++;    // Increment outer.&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gj = 0;    // Restart outer.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 5)&lt;br /&gt;
//--- Simultaneous with tiny delay()&lt;br /&gt;
int  gDelayTime = 300;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
//int kstart[] = {  0, 11, 23 };   // Top to bottom.&lt;br /&gt;
//int kend  [] = { 11, 23, 27 };&lt;br /&gt;
//int kstart[] = { 23, 11,  0 };   // Bottom to top.&lt;br /&gt;
//int kend  [] = { 27, 23, 11 };&lt;br /&gt;
  int kstart[] = { 23,  4,  0 };   // Bot-to-top many lights in top group&lt;br /&gt;
  int kend  [] = { 27, 23,  4 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;3 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        if ( j == 1 )&lt;br /&gt;
          delay( 5 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 6)&lt;br /&gt;
//--- Two flickering groups.&lt;br /&gt;
int  gDelayTime = 1000;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
  int kstart[] = { 11,  0 };          // 16/11 ~ 1.5&lt;br /&gt;
  int kend  [] = { 27, 11 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;2 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        delay( j==0 ? 4 : 6 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 7)&lt;br /&gt;
//--- Purely random, one LED at a time.&lt;br /&gt;
int  gDelayTime = 1;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  int k = random(27);&lt;br /&gt;
  ht.turnOnLed( k );&lt;br /&gt;
  delay( gDelayTime );&lt;br /&gt;
  ht.alloff();&lt;br /&gt;
  delay( gDelayTime );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 8)&lt;br /&gt;
//--- Sequential concentric ring groups -- BEATING HEART!&lt;br /&gt;
int gDelayTime = 250;&lt;br /&gt;
byte rings[][13] = { { 0,  1,  2,  3,  4, 10, 11, 17, 18, 22, 23, 25, 26},&lt;br /&gt;
                     { 5,  6,  7,  8,  9, 12, 16, 19, 21, 24, 99, 99, 99},&lt;br /&gt;
                     {13, 14, 15, 20, 99, 99, 99, 99, 99, 99, 99, 99, 99},&lt;br /&gt;
                     { 5,  6,  7,  8,  9, 12, 16, 19, 21, 24, 99, 99, 99}&lt;br /&gt;
                   };&lt;br /&gt;
byte ringsN[ ] = { 13, 10, 4, 10 };  // Number of non-99 in each row above.&lt;br /&gt;
byte Nrings = 4;&lt;br /&gt;
byte ringNo = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  byte k;&lt;br /&gt;
  if ( ringNo &amp;lt; Nrings ) {&lt;br /&gt;
    k = 0;&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      byte led = rings [ringNo][k];&lt;br /&gt;
      if ( led != 99 ) {&lt;br /&gt;
        ht.turnOnLed( led );&lt;br /&gt;
        delay( 10 * (ringsN[0]+0.0)/ringsN[ringNo] );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
      k = (k+1) % ringsN[ringNo];&lt;br /&gt;
    }&lt;br /&gt;
    ringNo++;&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  } else&lt;br /&gt;
    ringNo = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//# Charlieplexing&lt;br /&gt;
//# ++++++++++++++&lt;br /&gt;
//#   From: http://www.instructables.com/id/Charlieplexing-LEDs--The-theory&lt;br /&gt;
//#&lt;br /&gt;
//#   0v/5v/open A -----[R]-----*-----*-----*-----*    LED ||  A  |  B  |  C&lt;br /&gt;
//#                             |     |     |     |    ======================&lt;br /&gt;
//#                           1 V   2 ^     |     |     1      1     0    XXX&lt;br /&gt;
//#                             |     |     |     |     2      0     1    XXX&lt;br /&gt;
//#   0v/5v/open B -----[R]-----*-----*   5 V   6 ^     3     XXX    1     0&lt;br /&gt;
//#                             |     |     |     |     4     XXX    0     1&lt;br /&gt;
//#                           3 V   4 ^     |     |     5      1    XXX    0&lt;br /&gt;
//#                             |     |     |     |     6      0    XXX    1&lt;br /&gt;
//#   0v/5v/open C -----[R]-----*-----*-----*-----*&lt;br /&gt;
&lt;br /&gt;
//# Open Heart LED Numbers&lt;br /&gt;
//#   [     0  1     2  3    ]&lt;br /&gt;
//#   [  4  5  6  7  8  9 10 ]&lt;br /&gt;
//#   [ 11 12 13 14 15 16 17 ]&lt;br /&gt;
//#   [    18 19 20 21 22    ]&lt;br /&gt;
//#   [       23 24 25       ]&lt;br /&gt;
//#   [          26          ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=OpenHeartLib&amp;diff=3251</id>
		<title>OpenHeartLib</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=OpenHeartLib&amp;diff=3251"/>
		<updated>2009-02-18T09:24:15Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At the [[Noisebridge]]  soldering party on Valentine&#039;s Day, February 14 2009,&lt;br /&gt;
thanks to the gracious assistance of Mitch, Christie, Andy, and many others,&lt;br /&gt;
I built a [http://www.jimmieprodgers.com/openheart Jimmie Rodgers&#039; Open Heart].&lt;br /&gt;
&lt;br /&gt;
While I simply adore the&lt;br /&gt;
[http://www.jimmieprodgers.com/OpenHeartProgrammer.html Open Heart Animation Programmer],&lt;br /&gt;
I decided to take a look at the code it generates&lt;br /&gt;
and write a small C++ class for the Arduino Development Environment,&lt;br /&gt;
that lets you control the Open Heart LED&#039;s by calling simple functions.&lt;br /&gt;
&lt;br /&gt;
The class library consists of only two files (besides your &amp;quot;main&amp;quot; sketch file):&lt;br /&gt;
  * .../hardware/libraries/OpenHeartLib/OpenHeartLib.h&lt;br /&gt;
  * .../hardware/libraries/OpenHeartLib/OpenHeartLib.cpp&lt;br /&gt;
&lt;br /&gt;
===== File OpenHeartLib.h =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WConstants.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class OpenHeart {&lt;br /&gt;
public:&lt;br /&gt;
  OpenHeart();&lt;br /&gt;
  void setPinMap( byte pin1, byte pin2, byte pin3,&lt;br /&gt;
                  byte pin4, byte pin5, byte pin6 );&lt;br /&gt;
  void turnOnLed( byte led );&lt;br /&gt;
  void alloff();&lt;br /&gt;
private:&lt;br /&gt;
  static byte pin1, pin2, pin3, pin4, pin5, pin6;&lt;br /&gt;
  static byte heartpins[27][2];&lt;br /&gt;
  static byte allpins[];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== File OpenHeartLib.cpp =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::pin1=1, OpenHeart::pin2=2, OpenHeart::pin3=3,&lt;br /&gt;
     OpenHeart::pin4=4, OpenHeart::pin5=5, OpenHeart::pin6=6;&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::heartpins[27][2] = {&lt;br /&gt;
  {pin3, pin1}, {pin1, pin3}, {pin2, pin1}, {pin1, pin2}, {pin3, pin4},&lt;br /&gt;
  {pin4, pin1}, {pin1, pin4}, {pin1, pin5}, {pin6, pin1}, {pin1, pin6},&lt;br /&gt;
  {pin6, pin2}, {pin4, pin3}, {pin3, pin5}, {pin5, pin3}, {pin5, pin1},&lt;br /&gt;
  {pin2, pin5}, {pin5, pin2}, {pin2, pin6}, {pin4, pin5}, {pin5, pin4},&lt;br /&gt;
  {pin3, pin2}, {pin6, pin5}, {pin5, pin6}, {pin4, pin6}, {pin2, pin3},&lt;br /&gt;
  {pin6, pin4}, {pin4, pin2}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::allpins[7];   // Gets indexed 1~6, 0 is unused.&lt;br /&gt;
&lt;br /&gt;
OpenHeart::OpenHeart() {};&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::setPinMap( byte pin1, byte pin2, byte pin3,&lt;br /&gt;
                           byte pin4, byte pin5, byte pin6 ) {&lt;br /&gt;
  allpins[1] = pin1;&lt;br /&gt;
  allpins[2] = pin2;&lt;br /&gt;
  allpins[3] = pin3;&lt;br /&gt;
  allpins[4] = pin4;&lt;br /&gt;
  allpins[5] = pin5;&lt;br /&gt;
  allpins[6] = pin6;&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;27 ; k++ ) {&lt;br /&gt;
    heartpins[k][0] = allpins[ heartpins[k][0] ];&lt;br /&gt;
    heartpins[k][1] = allpins[ heartpins[k][1] ];&lt;br /&gt;
  }&lt;br /&gt;
  OpenHeart::pin1 = pin1;&lt;br /&gt;
  OpenHeart::pin2 = pin2;&lt;br /&gt;
  OpenHeart::pin3 = pin3;&lt;br /&gt;
  OpenHeart::pin4 = pin4;&lt;br /&gt;
  OpenHeart::pin5 = pin5;&lt;br /&gt;
  OpenHeart::pin6 = pin6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::turnOnLed (byte led) {&lt;br /&gt;
  byte pospin = heartpins[led][0];&lt;br /&gt;
  byte negpin = heartpins[led][1];&lt;br /&gt;
  pinMode      (pospin, OUTPUT);&lt;br /&gt;
  pinMode      (negpin, OUTPUT);&lt;br /&gt;
  digitalWrite (pospin, HIGH  );&lt;br /&gt;
  digitalWrite (negpin, LOW   );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::alloff() {&lt;br /&gt;
  for( byte i=1 ; i&amp;lt;7 ; i++ )&lt;br /&gt;
    pinMode (allpins[i], INPUT);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the two actual source files contains the Open Heart Animation&lt;br /&gt;
Programmer-generated comment lines:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//**************************************************************//&lt;br /&gt;
//  Name    : Charlieplexed Heart control                       //&lt;br /&gt;
//  Author  : Jimmie P Rodgers   www.jimmieprodgers.com         //&lt;br /&gt;
//  Date    : 08 Feb, 2008  Last update on 02/13/08             //&lt;br /&gt;
//  Version : 1.3                                               //&lt;br /&gt;
//  Notes   : Uses Charlieplexing techniques to light up        //&lt;br /&gt;
//          : a matrix of 27 LEDs in the shape of a heart       //&lt;br /&gt;
//          : project website: www.jimmieprodgers.com/openheart //&lt;br /&gt;
//**************************************************************//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following minimal &amp;quot;main&amp;quot; sketch shows a simple usage&lt;br /&gt;
of the OpenHearLib class.  It simply flashes the 27 LEDs one at a time:&lt;br /&gt;
&lt;br /&gt;
(In all of the sample sketches here, you likely have to modify the pin&lt;br /&gt;
arguments to setPinMap().  These are the same pin mappings that you fill&lt;br /&gt;
in after clicking on &amp;quot;Generate&amp;quot; in the Open Heart Animation Programmer.)&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde (section NN=1, simplified) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
OpenHeart ht = OpenHeart();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;27 ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay (100);     // (msec)&lt;br /&gt;
    ht.alloff ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes it is better to use variables instead of sprinkling constants&lt;br /&gt;
throughout your code, as shown in the above code rewritten:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde (section NN=1) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
OpenHeart ht = OpenHeart();&lt;br /&gt;
int  gDelayTime = 100;  // (msec) &#039;g&#039; stands for &amp;quot;global&amp;quot;.&lt;br /&gt;
byte gkmax      = 27;   // Number of LEDs&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay (gDelayTime);&lt;br /&gt;
    ht.alloff ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all you wanted to do with your Arduino was flash the LEDs, the above&lt;br /&gt;
code is fine.  But if you need to do some other computations, such as at&lt;br /&gt;
the end of your function loop(), you would not want to put your cpu&lt;br /&gt;
in massive &amp;quot;wait&amp;quot; states with those delay() calls.  Instead, you can &amp;quot;unroll&amp;quot;&lt;br /&gt;
the &#039;&#039;for&#039;&#039; loop and use something like:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde (section NN=2) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
    if  ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
      ht.turnOnLed (gk);&lt;br /&gt;
    else {&lt;br /&gt;
      ht.alloff();&lt;br /&gt;
      gk++;&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gk = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of how charlieplexing works, you can only turn on one LED at a time&lt;br /&gt;
with method turnOnLed().  To make it &#039;&#039;appear&#039;&#039; that more than one LED is&lt;br /&gt;
on at the same time, you have to multiplex at high speed:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde (section NN=5) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  gDelayTime = 300;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
int kstart[] = { 23,  4,  0 };   // Three groups of LED&#039;s&lt;br /&gt;
int kend  [] = { 27, 23,  4 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;3 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        if ( j == 1 )     // Twinkle the middle LED group (ie, flash slower).&lt;br /&gt;
          delay( 5 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the complete &amp;quot;main&amp;quot; test sketch, where you must select of the eight&lt;br /&gt;
sections by setting the &#039;&#039;&#039;#define NN&#039;&#039;&#039; value:&lt;br /&gt;
&lt;br /&gt;
===== File Bill_OpenHeartMain.pde (complete) =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//# NN=1 -- With delay().&lt;br /&gt;
//# NN=2 -- Looping over frames w/o delay().&lt;br /&gt;
//# NN=3 -- DOUBLE Looping with delay().&lt;br /&gt;
//# NN=4 -- Program DOUBLE looping over frames w/o delay().&lt;br /&gt;
//# NN=5 -- Simultaneous with tiny delay().&lt;br /&gt;
//# NN=6 -- Two flickering groups.&lt;br /&gt;
//# NN=7 -- Purely random, one LED at a time.&lt;br /&gt;
//# NN=8 -- Sequential concentric ring groups -- BEATING HEART!&lt;br /&gt;
&lt;br /&gt;
#define NN 8    /* Pick which section below to compile and execute. */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenHeart ht = OpenHeart();   // OpenHeart is a class.&lt;br /&gt;
&lt;br /&gt;
#if (NN == 1)&lt;br /&gt;
//--- With delay(). &#039;g&#039; is for &amp;quot;global&amp;quot;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;   // Number of Open Heart LED&#039;s&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay        (gDelayTime);&lt;br /&gt;
    ht.alloff    ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 2)&lt;br /&gt;
//--- Looping over frames w/o delay().&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
    if  ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
      ht.turnOnLed (gk);&lt;br /&gt;
    else {&lt;br /&gt;
      ht.alloff();&lt;br /&gt;
      gk++;&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gk = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 3)&lt;br /&gt;
//--- DOUBLE Looping with delay()&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gjmax      = 3;&lt;br /&gt;
byte gkmax      = 9;&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for   ( byte j=0 ; j&amp;lt;gjmax ; j++ ) {&lt;br /&gt;
    for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
      ht.turnOnLed( j*gkmax + k );&lt;br /&gt;
      delay       ( gDelayTime );&lt;br /&gt;
      ht.alloff   ();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 4)&lt;br /&gt;
//--- Program DOUBLE looping over frames w/o delay()&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gjmax      = 3;&lt;br /&gt;
byte gkmax      = 9;&lt;br /&gt;
byte gj         = 0;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
  gLastTime = millis();  // Not needed unless above executes too early.&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if   ( gj &amp;lt; gjmax ) {&lt;br /&gt;
    if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
      if ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
        ht.turnOnLed(gj*9 + gk);&lt;br /&gt;
      else {&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
        gk++;&lt;br /&gt;
        gLastTime = millis();&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      gk = 0;  // Restart inner.&lt;br /&gt;
      gj++;    // Increment outer.&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gj = 0;    // Restart outer.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 5)&lt;br /&gt;
//--- Simultaneous with tiny delay()&lt;br /&gt;
int  gDelayTime = 300;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
//int kstart[] = {  0, 11, 23 };   // Top to bottom.&lt;br /&gt;
//int kend  [] = { 11, 23, 27 };&lt;br /&gt;
//int kstart[] = { 23, 11,  0 };   // Bottom to top.&lt;br /&gt;
//int kend  [] = { 27, 23, 11 };&lt;br /&gt;
  int kstart[] = { 23,  4,  0 };   // Bot-to-top many lights in top group&lt;br /&gt;
  int kend  [] = { 27, 23,  4 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;3 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        if ( j == 1 )&lt;br /&gt;
          delay( 5 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 6)&lt;br /&gt;
//--- Two flickering groups.&lt;br /&gt;
int  gDelayTime = 1000;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
  int kstart[] = { 11,  0 };          // 16/11 ~ 1.5&lt;br /&gt;
  int kend  [] = { 27, 11 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;2 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        delay( j==0 ? 4 : 6 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 7)&lt;br /&gt;
//--- Purely random, one LED at a time.&lt;br /&gt;
int  gDelayTime = 1;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  int k = random(27);&lt;br /&gt;
  ht.turnOnLed( k );&lt;br /&gt;
  delay( gDelayTime );&lt;br /&gt;
  ht.alloff();&lt;br /&gt;
  delay( gDelayTime );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 8)&lt;br /&gt;
//--- Sequential concentric ring groups -- BEATING HEART!&lt;br /&gt;
int gDelayTime = 250;&lt;br /&gt;
byte rings[][13] = { { 0,  1,  2,  3,  4, 10, 11, 17, 18, 22, 23, 25, 26},&lt;br /&gt;
                     { 5,  6,  7,  8,  9, 12, 16, 19, 21, 24, 99, 99, 99},&lt;br /&gt;
                     {13, 14, 15, 20, 99, 99, 99, 99, 99, 99, 99, 99, 99},&lt;br /&gt;
                     { 5,  6,  7,  8,  9, 12, 16, 19, 21, 24, 99, 99, 99}&lt;br /&gt;
                   };&lt;br /&gt;
byte ringsN[ ] = { 13, 10, 4, 10 };  // Number of non-99 in each row above.&lt;br /&gt;
byte Nrings = 4;&lt;br /&gt;
byte ringNo = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  byte k;&lt;br /&gt;
  if ( ringNo &amp;lt; Nrings ) {&lt;br /&gt;
    k = 0;&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      byte led = rings [ringNo][k];&lt;br /&gt;
      if ( led != 99 ) {&lt;br /&gt;
        ht.turnOnLed( led );&lt;br /&gt;
        delay( 10 * (ringsN[0]+0.0)/ringsN[ringNo] );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
      k = (k+1) % ringsN[ringNo];&lt;br /&gt;
    }&lt;br /&gt;
    ringNo++;&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  } else&lt;br /&gt;
    ringNo = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//# Charlieplexing&lt;br /&gt;
//# ++++++++++++++&lt;br /&gt;
//#   From: http://www.instructables.com/id/Charlieplexing-LEDs--The-theory&lt;br /&gt;
//#&lt;br /&gt;
//#   0v/5v/open A -----[R]-----*-----*-----*-----*    LED ||  A  |  B  |  C&lt;br /&gt;
//#                             |     |     |     |    ======================&lt;br /&gt;
//#                           1 V   2 ^     |     |     1      1     0    XXX&lt;br /&gt;
//#                             |     |     |     |     2      0     1    XXX&lt;br /&gt;
//#   0v/5v/open B -----[R]-----*-----*   5 V   6 ^     3     XXX    1     0&lt;br /&gt;
//#                             |     |     |     |     4     XXX    0     1&lt;br /&gt;
//#                           3 V   4 ^     |     |     5      1    XXX    0&lt;br /&gt;
//#                             |     |     |     |     6      0    XXX    1&lt;br /&gt;
//#   0v/5v/open C -----[R]-----*-----*-----*-----*&lt;br /&gt;
&lt;br /&gt;
//# Open Heart LED Numbers&lt;br /&gt;
//#   [     0  1     2  3    ]&lt;br /&gt;
//#   [  4  5  6  7  8  9 10 ]&lt;br /&gt;
//#   [ 11 12 13 14 15 16 17 ]&lt;br /&gt;
//#   [    18 19 20 21 22    ]&lt;br /&gt;
//#   [       23 24 25       ]&lt;br /&gt;
//#   [          26          ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=OpenHeartLib&amp;diff=3246</id>
		<title>OpenHeartLib</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=OpenHeartLib&amp;diff=3246"/>
		<updated>2009-02-18T04:37:38Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: New page: At the Noisebridge  soldering party on Valentine&amp;#039;s Day, February 14 2009, thanks to the gracious assistance of Mitch, Christie, Andy, and many others, I built a [http://www.jimmieprodg...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At the [[Noisebridge]]  soldering party on Valentine&#039;s Day, February 14 2009,&lt;br /&gt;
thanks to the gracious assistance of Mitch, Christie, Andy, and many others,&lt;br /&gt;
I built a [http://www.jimmieprodgers.com/openheart Jimmie Rodgers&#039; Open Heart].&lt;br /&gt;
&lt;br /&gt;
While I simply adore the&lt;br /&gt;
[http://www.jimmieprodgers.com/OpenHeartProgrammer.html Open Heart Animation Programmer],&lt;br /&gt;
I decided to take a look at the code it generates&lt;br /&gt;
and write a small C++ class for the Arduino Development Environment,&lt;br /&gt;
that lets you control the Open Heart LED&#039;s by calling simple functions.&lt;br /&gt;
&lt;br /&gt;
The class library consists of only two files (besides your &amp;quot;main&amp;quot; sketch file):&lt;br /&gt;
  * .../hardware/libraries/OpenHeartLib/OpenHeartLib.h&lt;br /&gt;
  * .../hardware/libraries/OpenHeartLib/OpenHeartLib.cpp&lt;br /&gt;
&lt;br /&gt;
=== File OpenHeartLib.h ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WConstants.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class OpenHeart {&lt;br /&gt;
public:&lt;br /&gt;
  OpenHeart();&lt;br /&gt;
  void setPinMap( byte pin1, byte pin2, byte pin3,&lt;br /&gt;
                  byte pin4, byte pin5, byte pin6 );&lt;br /&gt;
  void turnOnLed( byte led );&lt;br /&gt;
  void alloff();&lt;br /&gt;
private:&lt;br /&gt;
  static byte pin1, pin2, pin3, pin4, pin5, pin6;&lt;br /&gt;
  static byte heartpins[27][2];&lt;br /&gt;
  static byte allpins[];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== File OpenHeartLib.cpp ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::pin1=1, OpenHeart::pin2=2, OpenHeart::pin3=3,&lt;br /&gt;
     OpenHeart::pin4=4, OpenHeart::pin5=5, OpenHeart::pin6=6;&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::heartpins[27][2] = {&lt;br /&gt;
  {pin3, pin1}, {pin1, pin3}, {pin2, pin1}, {pin1, pin2}, {pin3, pin4},&lt;br /&gt;
  {pin4, pin1}, {pin1, pin4}, {pin1, pin5}, {pin6, pin1}, {pin1, pin6},&lt;br /&gt;
  {pin6, pin2}, {pin4, pin3}, {pin3, pin5}, {pin5, pin3}, {pin5, pin1},&lt;br /&gt;
  {pin2, pin5}, {pin5, pin2}, {pin2, pin6}, {pin4, pin5}, {pin5, pin4},&lt;br /&gt;
  {pin3, pin2}, {pin6, pin5}, {pin5, pin6}, {pin4, pin6}, {pin2, pin3},&lt;br /&gt;
  {pin6, pin4}, {pin4, pin2}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
byte OpenHeart::allpins[7];   // Gets indexed 1~6, 0 is unused.&lt;br /&gt;
&lt;br /&gt;
OpenHeart::OpenHeart() {};&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::setPinMap( byte pin1, byte pin2, byte pin3,&lt;br /&gt;
                           byte pin4, byte pin5, byte pin6 ) {&lt;br /&gt;
  allpins[1] = pin1;&lt;br /&gt;
  allpins[2] = pin2;&lt;br /&gt;
  allpins[3] = pin3;&lt;br /&gt;
  allpins[4] = pin4;&lt;br /&gt;
  allpins[5] = pin5;&lt;br /&gt;
  allpins[6] = pin6;&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;27 ; k++ ) {&lt;br /&gt;
    heartpins[k][0] = allpins[ heartpins[k][0] ];&lt;br /&gt;
    heartpins[k][1] = allpins[ heartpins[k][1] ];&lt;br /&gt;
  }&lt;br /&gt;
  OpenHeart::pin1 = pin1;&lt;br /&gt;
  OpenHeart::pin2 = pin2;&lt;br /&gt;
  OpenHeart::pin3 = pin3;&lt;br /&gt;
  OpenHeart::pin4 = pin4;&lt;br /&gt;
  OpenHeart::pin5 = pin5;&lt;br /&gt;
  OpenHeart::pin6 = pin6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::turnOnLed (byte led) {&lt;br /&gt;
  byte pospin = heartpins[led][0];&lt;br /&gt;
  byte negpin = heartpins[led][1];&lt;br /&gt;
  pinMode      (pospin, OUTPUT);&lt;br /&gt;
  pinMode      (negpin, OUTPUT);&lt;br /&gt;
  digitalWrite (pospin, HIGH  );&lt;br /&gt;
  digitalWrite (negpin, LOW   );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OpenHeart::alloff() {&lt;br /&gt;
  for( byte i=1 ; i&amp;lt;7 ; i++ )&lt;br /&gt;
    pinMode (allpins[i], INPUT);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following minimal &amp;quot;main&amp;quot; sketch shows a simple usage&lt;br /&gt;
of the OpenHearLib class.  It simply flashes the 27 LEDs one at a time:&lt;br /&gt;
&lt;br /&gt;
=== File Bill_OpenHeartMain.pde (section NN=1, simplified) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
OpenHeart ht = OpenHeart();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;27 ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay (100);     // (msec)&lt;br /&gt;
    ht.alloff ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes it is better to use variables instead of sprinkling constants&lt;br /&gt;
throughout your code, as shown in the above code rewritten:&lt;br /&gt;
&lt;br /&gt;
=== File Bill_OpenHeartMain.pde (section NN=1) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
OpenHeart ht = OpenHeart();&lt;br /&gt;
int  gDelayTime = 100;  // (msec) &#039;g&#039; stands for &amp;quot;global&amp;quot;.&lt;br /&gt;
byte gkmax      = 27;   // Number of LEDs&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay (gDelayTime);&lt;br /&gt;
    ht.alloff ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all you wanted to do with your Arduino was flash the LEDs, the above&lt;br /&gt;
code is fine.  But if you need to do some other computations, such as at&lt;br /&gt;
the end of your function loop(), you would not want to put your cpu&lt;br /&gt;
in massive &amp;quot;wait&amp;quot; states with those delay() calls.  Instead, you can &amp;quot;unroll&amp;quot;&lt;br /&gt;
the &#039;&#039;for&#039;&#039; loop and use something like:&lt;br /&gt;
&lt;br /&gt;
=== File Bill_OpenHeartMain.pde (section NN=2) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
    if  ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
      ht.turnOnLed (gk);&lt;br /&gt;
    else {&lt;br /&gt;
      ht.alloff();&lt;br /&gt;
      gk++;&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gk = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of how charlieplexing works, you can only turn on one LED at a time&lt;br /&gt;
with method turnOnLed().  To make it &#039;&#039;appear&#039;&#039; that more than one LED is&lt;br /&gt;
on at the same time, you have to multiplex at high speed:&lt;br /&gt;
&lt;br /&gt;
=== File Bill_OpenHeartMain.pde (section NN=5) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  gDelayTime = 300;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
int kstart[] = { 23,  4,  0 };   // Three groups of LED&#039;s&lt;br /&gt;
int kend  [] = { 27, 23,  4 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;3 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        if ( j == 1 )     // Twinkle the middle LED group (ie, flash slower).&lt;br /&gt;
          delay( 5 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the complete &amp;quot;main&amp;quot; test sketch, with one of eight sections&lt;br /&gt;
selected by setting the &#039;&#039;&#039;#define NN&#039;&#039;&#039; value:&lt;br /&gt;
&lt;br /&gt;
=== File Bill_OpenHeartMain.pde (complete) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//# NN=1 -- With delay().&lt;br /&gt;
//# NN=2 -- Looping over frames w/o delay().&lt;br /&gt;
//# NN=3 -- DOUBLE Looping with delay().&lt;br /&gt;
//# NN=4 -- Program DOUBLE looping over frames w/o delay().&lt;br /&gt;
//# NN=5 -- Simultaneous with tiny delay().&lt;br /&gt;
//# NN=6 -- Two flickering groups.&lt;br /&gt;
//# NN=7 -- Purely random, one LED at a time.&lt;br /&gt;
//# NN=8 -- Sequential concentric ring groups -- BEATING HEART!&lt;br /&gt;
&lt;br /&gt;
#define NN 8    /* Pick which section below to compile and execute. */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;OpenHeartLib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenHeart ht = OpenHeart();   // OpenHeart is a class.&lt;br /&gt;
&lt;br /&gt;
#if (NN == 1)&lt;br /&gt;
//--- With delay(). &#039;g&#039; is for &amp;quot;global&amp;quot;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;   // Number of Open Heart LED&#039;s&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
    ht.turnOnLed (k);&lt;br /&gt;
    delay        (gDelayTime);&lt;br /&gt;
    ht.alloff    ();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 2)&lt;br /&gt;
//--- Looping over frames w/o delay(). &#039;g&#039; is for &amp;quot;global&amp;quot;&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gkmax      = 27;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
    if  ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
      ht.turnOnLed (gk);&lt;br /&gt;
    else {&lt;br /&gt;
      ht.alloff();&lt;br /&gt;
      gk++;&lt;br /&gt;
      gLastTime = millis();&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gk = 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#elif (NN == 3)&lt;br /&gt;
//--- DOUBLE Looping with delay()&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gjmax      = 3;&lt;br /&gt;
byte gkmax      = 9;&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for   ( byte j=0 ; j&amp;lt;gjmax ; j++ ) {&lt;br /&gt;
    for ( byte k=0 ; k&amp;lt;gkmax ; k++ ) {&lt;br /&gt;
      ht.turnOnLed( j*gkmax + k );&lt;br /&gt;
      delay       ( gDelayTime );&lt;br /&gt;
      ht.alloff   ();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 4)&lt;br /&gt;
//--- Program DOUBLE looping over frames w/o delay()&lt;br /&gt;
int  gDelayTime = 100;&lt;br /&gt;
byte gjmax      = 3;&lt;br /&gt;
byte gkmax      = 9;&lt;br /&gt;
byte gj         = 0;&lt;br /&gt;
byte gk         = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
  gLastTime = millis();  // Not needed unless above executes too early.&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if   ( gj &amp;lt; gjmax ) {&lt;br /&gt;
    if ( gk &amp;lt; gkmax ) {&lt;br /&gt;
      if ( millis() &amp;lt; gLastTime + gDelayTime )&lt;br /&gt;
        ht.turnOnLed(gj*9 + gk);&lt;br /&gt;
      else {&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
        gk++;&lt;br /&gt;
        gLastTime = millis();&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      gk = 0;  // Restart inner.&lt;br /&gt;
      gj++;    // Increment outer.&lt;br /&gt;
    }&lt;br /&gt;
  } else&lt;br /&gt;
    gj = 0;    // Restart outer.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 5)&lt;br /&gt;
//--- Simultaneous with tiny delay()&lt;br /&gt;
int  gDelayTime = 300;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
//int kstart[] = {  0, 11, 23 };   // Top to bottom.&lt;br /&gt;
//int kend  [] = { 11, 23, 27 };&lt;br /&gt;
//int kstart[] = { 23, 11,  0 };   // Bottom to top.&lt;br /&gt;
//int kend  [] = { 27, 23, 11 };&lt;br /&gt;
  int kstart[] = { 23,  4,  0 };   // Bot-to-top many lights in top group&lt;br /&gt;
  int kend  [] = { 27, 23,  4 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;3 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        if ( j == 1 )&lt;br /&gt;
          delay( 5 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 6)&lt;br /&gt;
//--- Two flickering groups.&lt;br /&gt;
int  gDelayTime = 1000;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
  int kstart[] = { 11,  0 };          // 16/11 ~ 1.5 &lt;br /&gt;
  int kend  [] = { 27, 11 };&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  for ( byte j=0 ; j&amp;lt;2 ; j++ ) {&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      for ( byte k=kstart[j] ; k&amp;lt;kend[j] ; k++ ) {&lt;br /&gt;
        ht.turnOnLed( k );&lt;br /&gt;
        delay( j==0 ? 4 : 6 );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 7)&lt;br /&gt;
//--- Purely random, one LED at a time.&lt;br /&gt;
int  gDelayTime = 1;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  int k = random(27);&lt;br /&gt;
  ht.turnOnLed( k );&lt;br /&gt;
  delay( gDelayTime );&lt;br /&gt;
  ht.alloff();&lt;br /&gt;
  delay( gDelayTime );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#elif (NN == 8)&lt;br /&gt;
//--- Sequential concentric ring groups -- BEATING HEART!&lt;br /&gt;
int gDelayTime = 250;&lt;br /&gt;
byte rings[][13] = { { 0,  1,  2,  3,  4, 10, 11, 17, 18, 22, 23, 25, 26},&lt;br /&gt;
                     { 5,  6,  7,  8,  9, 12, 16, 19, 21, 24, 99, 99, 99},&lt;br /&gt;
                     {13, 14, 15, 20, 99, 99, 99, 99, 99, 99, 99, 99, 99},&lt;br /&gt;
                     { 5,  6,  7,  8,  9, 12, 16, 19, 21, 24, 99, 99, 99}&lt;br /&gt;
                   };&lt;br /&gt;
byte ringsN[ ] = { 13, 10, 4, 10 };  // Number of non-99 in each row above.&lt;br /&gt;
byte Nrings = 4;&lt;br /&gt;
byte ringNo = 0;&lt;br /&gt;
unsigned long gLastTime = millis();&lt;br /&gt;
void setup() {&lt;br /&gt;
  ht.setPinMap( 4, 5, 3, 2, 7, 6 );&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  byte k;&lt;br /&gt;
  if ( ringNo &amp;lt; Nrings ) {&lt;br /&gt;
    k = 0;&lt;br /&gt;
    while ( millis() &amp;lt; gLastTime + gDelayTime ) {&lt;br /&gt;
      byte led = rings [ringNo][k];&lt;br /&gt;
      if ( led != 99 ) {&lt;br /&gt;
        ht.turnOnLed( led );&lt;br /&gt;
        delay( 10 * (ringsN[0]+0.0)/ringsN[ringNo] );&lt;br /&gt;
        ht.alloff();&lt;br /&gt;
      }&lt;br /&gt;
      k = (k+1) % ringsN[ringNo];&lt;br /&gt;
    }&lt;br /&gt;
    ringNo++;&lt;br /&gt;
    gLastTime = millis();&lt;br /&gt;
  } else&lt;br /&gt;
    ringNo = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//# Charlieplexing&lt;br /&gt;
//# ++++++++++++++&lt;br /&gt;
//#   From: http://www.instructables.com/id/Charlieplexing-LEDs--The-theory&lt;br /&gt;
//# &lt;br /&gt;
//#   0v/5v/open A -----[R]-----*-----*-----*-----*    LED ||  A  |  B  |  C&lt;br /&gt;
//#                             |     |     |     |    ======================&lt;br /&gt;
//#                           1 V   2 ^     |     |     1      1     0    XXX&lt;br /&gt;
//#                             |     |     |     |     2      0     1    XXX&lt;br /&gt;
//#   0v/5v/open B -----[R]-----*-----*   5 V   6 ^     3     XXX    1     0&lt;br /&gt;
//#                             |     |     |     |     4     XXX    0     1&lt;br /&gt;
//#                           3 V   4 ^     |     |     5      1    XXX    0&lt;br /&gt;
//#                             |     |     |     |     6      0    XXX    1&lt;br /&gt;
//#   0v/5v/open C -----[R]-----*-----*-----*-----*&lt;br /&gt;
&lt;br /&gt;
//# Open Heart LED Numbers&lt;br /&gt;
//#   [     0  1     2  3    ]&lt;br /&gt;
//#   [  4  5  6  7  8  9 10 ]&lt;br /&gt;
//#   [ 11 12 13 14 15 16 17 ]&lt;br /&gt;
//#   [    18 19 20 21 22    ]&lt;br /&gt;
//#   [       23 24 25       ]&lt;br /&gt;
//#   [          26          ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=User:Bill_Nye&amp;diff=2300</id>
		<title>User:Bill Nye</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=User:Bill_Nye&amp;diff=2300"/>
		<updated>2008-11-14T18:20:21Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: New page: In spite of having a name &amp;quot;slightly&amp;quot; similar to the Science Guy, I do not know much about making smoke come out of oversized test tubes.  Rather, I started in Electrical Engineering as an ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In spite of having a name &amp;quot;slightly&amp;quot; similar to the Science Guy,&lt;br /&gt;
I do not know much about making smoke come out of oversized test&lt;br /&gt;
tubes.  Rather, I started in Electrical Engineering as an analog&lt;br /&gt;
integrated circuit designer, graduated with an advanced degree&lt;br /&gt;
in the area of CAD for IC design at Berkeley, worked in chip CAD&lt;br /&gt;
software development for 15 years, then made a career switch&lt;br /&gt;
that led to the Multimedia Masters program at Cal State East&lt;br /&gt;
Bay, graduating in 2003.  Shortly thereafter, 3 of my 4 thesis&lt;br /&gt;
group members began a small startup to develop the (offline)&lt;br /&gt;
interactive motion-based multiplayer HatManDo games (see&lt;br /&gt;
http://www.epsilonactive.com), which has been at Maker Faire&lt;br /&gt;
(twice).&lt;br /&gt;
&lt;br /&gt;
I also like Flash Actionscript, PHP, computer-music (eg Reason,&lt;br /&gt;
ChucK, KeyKit), Max-MSP-Jitter, camera and sensor-based Art projects,&lt;br /&gt;
and volleyball.&lt;br /&gt;
&lt;br /&gt;
I am interested in collaboration on technically-based art projects,&lt;br /&gt;
and am currently learning Arduino and AVR programming.  I have&lt;br /&gt;
a Make Controller board (given to me by David and Liam) and a&lt;br /&gt;
Propeller Starter Kit.&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Oscilloscopes&amp;diff=2287</id>
		<title>Oscilloscopes</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Oscilloscopes&amp;diff=2287"/>
		<updated>2008-11-14T00:02:19Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: /* How many? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Oscilloscopes = &lt;br /&gt;
&lt;br /&gt;
=== When? === &lt;br /&gt;
&lt;br /&gt;
Sunday, november 16th, 3:00PM to 4:30PM. &lt;br /&gt;
&lt;br /&gt;
=== Who? ===&lt;br /&gt;
&lt;br /&gt;
David Stafford (me! http://www.ugcs.caltech.edu/~dstaff/david.jpg) and anyone who decides to help me will be teaching the class. &lt;br /&gt;
&lt;br /&gt;
Anyone who already has minimal electronics experiance.  If you&#039;ve built even very basic circuits before, you&#039;re probably fit for this class.&lt;br /&gt;
&lt;br /&gt;
=== How many? ===&lt;br /&gt;
&lt;br /&gt;
We will have three oscilloscopes for the class. Six people can work in teams of two.  If someone&lt;br /&gt;
can lend an oscilloscope for the class, we can have 8 people.  Please sign up below and write something about what you want to learn so I can better target the class. &lt;br /&gt;
&lt;br /&gt;
* Jacob (I&#039;m just along for the ride, I&#039;d like to better my understanding of triggers, etc)&lt;br /&gt;
* [[User:Adi|adi]] (I&#039;m a digital scope boy livin&#039; in an analog scope world)&lt;br /&gt;
* slot 3 [[User:jstockford|jim]] i can bring a scope &lt;br /&gt;
* slot 4 [[User:rachel|Rachel]]&lt;br /&gt;
* slot 5 daniela&lt;br /&gt;
* slot 6 [[User:BillyBuggy|BillyBuggy]] I can bring a 2-channel, very easy-to-understand Oscilloscope. Will it be needed? (I don&#039;t want to carry it on Bart if I don&#039;t have to.)  Mail me at nye2@email.com, thanks.&lt;br /&gt;
* slot 7&lt;br /&gt;
* slot 8&lt;br /&gt;
&lt;br /&gt;
=== What? ===&lt;br /&gt;
&lt;br /&gt;
Topics to be covered include:&lt;br /&gt;
* Basics: how a CRT scope works&lt;br /&gt;
* Probe selection and calibration&lt;br /&gt;
* Measuring a constant voltage&lt;br /&gt;
* Changing voltages: triggering, AC versus DC coupling &lt;br /&gt;
* Looking at multiple signals&lt;br /&gt;
* Measuring complex signals: more triggering techniques. &lt;br /&gt;
&lt;br /&gt;
You&#039;ll work in pairs analyzing various aspects of a simple 555 oscilator circuit and an EL wire&lt;br /&gt;
driver.  The class should take between 60 and 90 minutes. I epxect 90% of the class to be hands on&lt;br /&gt;
with little or no &amp;quot;lecture&amp;quot; time.&lt;br /&gt;
&lt;br /&gt;
[[catagory:events]]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Hack_your_Hardware&amp;diff=2257</id>
		<title>Hack your Hardware</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Hack_your_Hardware&amp;diff=2257"/>
		<updated>2008-11-12T20:46:00Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: /* Interested folks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Workshop proposal: &#039;&#039;&#039;Hack your Hardware&#039;&#039;&#039; [[User:Jtfoote|Jtfoote]] 14:11, 7 November 2008 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;No user-serviceable parts inside&amp;quot; -- we call bullshit on that!&lt;br /&gt;
&lt;br /&gt;
Bring in your hardware yearning to reach its maximum potential (or give its life for spare parts). We give you permission to take things apart, see what&#039;s inside, and improve them. Most electronics failures are caused by bad connections or simple mechanical problems: we&#039;ll show you what to look for and how to fix them. Favorite gadget busted? Don&#039;t throw it away; fix it! (Or at least autopsy it for the good of science!) &lt;br /&gt;
&lt;br /&gt;
Possible projects:&lt;br /&gt;
&lt;br /&gt;
* Add an extra iPod input jack to your clock radio or computer speakers&lt;br /&gt;
* Add a USB hub to a desk lamp (or a bobblehead doll, or a stuffed toy, or...)&lt;br /&gt;
* Hotrod your IR remote control to extend the range&lt;br /&gt;
* Extract DC motors and other good stuff from that CD player found on the sidewalk&lt;br /&gt;
* Fix that funky power jack on your old laptop so you can give it to Mom&lt;br /&gt;
* Add another headphone jack (or FM transmitter?) to your laptop&lt;br /&gt;
* Add a LED backlight or tasklight to a keyboard or a handheld game&lt;br /&gt;
* Add a secondary switch or a dimmer to a power strip&lt;br /&gt;
* A one-wire hack turns a discarded ATX PSU into a benchtop power supply &lt;br /&gt;
* Replace the tired nicads in your electric toothbrush (or power screwdriver, or other rechargeable gizmo)&lt;br /&gt;
* Hotrod your favorite power screwdriver with Li+ batteries&lt;br /&gt;
* Circuit-bend that electronic toy for an even more annoying sound&lt;br /&gt;
&lt;br /&gt;
You will have more and better ideas. Bring them and share! (I personally will be adding a pilot light to my desoldering gun so I can tell when it&#039;s plugged in and thus burninatingly hot.)&lt;br /&gt;
&lt;br /&gt;
Yes this could be dangerous, and we may break things. That&#039;s how we learn.&lt;br /&gt;
&lt;br /&gt;
== Interested folks ==&lt;br /&gt;
&lt;br /&gt;
[[User:Jtfoote|Jtfoote]]&lt;br /&gt;
&lt;br /&gt;
[[User:turkshead|Shannon]]&lt;br /&gt;
&lt;br /&gt;
[[User:Bill Nye|BillyBuggy]]&lt;br /&gt;
&lt;br /&gt;
==When?==&lt;br /&gt;
&lt;br /&gt;
Not  yet scheduled, likely after the soldering workshop&lt;br /&gt;
&lt;br /&gt;
 Week 1: Take things apart, determine problems, solutions, necessary parts to obtain.&lt;br /&gt;
 Week 2: Having obtained parts, put things back together and smoke-test (if it doesn&#039;t smoke, it passes!)&lt;br /&gt;
&lt;br /&gt;
Your comments and suggestions are a crucial part of this: thanks in advance&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Hack_your_Hardware&amp;diff=2256</id>
		<title>Hack your Hardware</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Hack_your_Hardware&amp;diff=2256"/>
		<updated>2008-11-12T20:44:41Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: /* Interested folks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Workshop proposal: &#039;&#039;&#039;Hack your Hardware&#039;&#039;&#039; [[User:Jtfoote|Jtfoote]] 14:11, 7 November 2008 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;No user-serviceable parts inside&amp;quot; -- we call bullshit on that!&lt;br /&gt;
&lt;br /&gt;
Bring in your hardware yearning to reach its maximum potential (or give its life for spare parts). We give you permission to take things apart, see what&#039;s inside, and improve them. Most electronics failures are caused by bad connections or simple mechanical problems: we&#039;ll show you what to look for and how to fix them. Favorite gadget busted? Don&#039;t throw it away; fix it! (Or at least autopsy it for the good of science!) &lt;br /&gt;
&lt;br /&gt;
Possible projects:&lt;br /&gt;
&lt;br /&gt;
* Add an extra iPod input jack to your clock radio or computer speakers&lt;br /&gt;
* Add a USB hub to a desk lamp (or a bobblehead doll, or a stuffed toy, or...)&lt;br /&gt;
* Hotrod your IR remote control to extend the range&lt;br /&gt;
* Extract DC motors and other good stuff from that CD player found on the sidewalk&lt;br /&gt;
* Fix that funky power jack on your old laptop so you can give it to Mom&lt;br /&gt;
* Add another headphone jack (or FM transmitter?) to your laptop&lt;br /&gt;
* Add a LED backlight or tasklight to a keyboard or a handheld game&lt;br /&gt;
* Add a secondary switch or a dimmer to a power strip&lt;br /&gt;
* A one-wire hack turns a discarded ATX PSU into a benchtop power supply &lt;br /&gt;
* Replace the tired nicads in your electric toothbrush (or power screwdriver, or other rechargeable gizmo)&lt;br /&gt;
* Hotrod your favorite power screwdriver with Li+ batteries&lt;br /&gt;
* Circuit-bend that electronic toy for an even more annoying sound&lt;br /&gt;
&lt;br /&gt;
You will have more and better ideas. Bring them and share! (I personally will be adding a pilot light to my desoldering gun so I can tell when it&#039;s plugged in and thus burninatingly hot.)&lt;br /&gt;
&lt;br /&gt;
Yes this could be dangerous, and we may break things. That&#039;s how we learn.&lt;br /&gt;
&lt;br /&gt;
== Interested folks ==&lt;br /&gt;
&lt;br /&gt;
[[User:Jtfoote|Jtfoote]]&lt;br /&gt;
&lt;br /&gt;
[[User:turkshead|Shannon]]&lt;br /&gt;
&lt;br /&gt;
[[User:BillyBuggy|Bill Nye]]&lt;br /&gt;
&lt;br /&gt;
==When?==&lt;br /&gt;
&lt;br /&gt;
Not  yet scheduled, likely after the soldering workshop&lt;br /&gt;
&lt;br /&gt;
 Week 1: Take things apart, determine problems, solutions, necessary parts to obtain.&lt;br /&gt;
 Week 2: Having obtained parts, put things back together and smoke-test (if it doesn&#039;t smoke, it passes!)&lt;br /&gt;
&lt;br /&gt;
Your comments and suggestions are a crucial part of this: thanks in advance&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Introduction_to_the_AVR_Microcontroller&amp;diff=2105</id>
		<title>Introduction to the AVR Microcontroller</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Introduction_to_the_AVR_Microcontroller&amp;diff=2105"/>
		<updated>2008-11-03T20:38:19Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: /* Interested People (sign up here): */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview: ==&lt;br /&gt;
&lt;br /&gt;
An introduction to the Atmel AVR family of microcontrollers by [[User:Mightyohm|Jeff]] and [[User:Maltman23|Mitch]]&lt;br /&gt;
&lt;br /&gt;
== Interested People (sign up here): ==&lt;br /&gt;
* Daniela Steinsapir&lt;br /&gt;
* [[User:Michiexile|Michiexile]]&lt;br /&gt;
* [[User:Arcanology|Al]]&lt;br /&gt;
* [[User:kripto|MarkC]]&lt;br /&gt;
* [[User:Rigel|Rigel]]&lt;br /&gt;
* [[User:elgreengeeto|Skory]]&lt;br /&gt;
* [[User:Ioerror|Jacob]]&lt;br /&gt;
* [[User:Matt|MattP]]&lt;br /&gt;
* [[User:rachel|rachel]]&lt;br /&gt;
* [[User:Adi|adi]]&lt;br /&gt;
* [[User:JSharp|J]]&lt;br /&gt;
* [[User:BillyBuggy|BillyBuggy]]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Introduction_to_the_AVR_Microcontroller&amp;diff=2104</id>
		<title>Introduction to the AVR Microcontroller</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Introduction_to_the_AVR_Microcontroller&amp;diff=2104"/>
		<updated>2008-11-03T20:37:37Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: /* Interested People (sign up here): */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview: ==&lt;br /&gt;
&lt;br /&gt;
An introduction to the Atmel AVR family of microcontrollers by [[User:Mightyohm|Jeff]] and [[User:Maltman23|Mitch]]&lt;br /&gt;
&lt;br /&gt;
== Interested People (sign up here): ==&lt;br /&gt;
* Daniela Steinsapir&lt;br /&gt;
* [[User:Michiexile|Michiexile]]&lt;br /&gt;
* [[User:Arcanology|Al]]&lt;br /&gt;
* [[User:kripto|MarkC]]&lt;br /&gt;
* [[User:Rigel|Rigel]]&lt;br /&gt;
* [[User:elgreengeeto|Skory]]&lt;br /&gt;
* [[User:Ioerror|Jacob]]&lt;br /&gt;
* [[User:Matt|MattP]]&lt;br /&gt;
* [[User:rachel|rachel]]&lt;br /&gt;
* [[User:Adi|adi]]&lt;br /&gt;
* [[User:JSharp|J]]&lt;br /&gt;
* [[User:BillyBuggy|Bill]]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Introduction_to_the_AVR_Microcontroller&amp;diff=2103</id>
		<title>Introduction to the AVR Microcontroller</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Introduction_to_the_AVR_Microcontroller&amp;diff=2103"/>
		<updated>2008-11-03T20:36:50Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: /* Interested People (sign up here): */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview: ==&lt;br /&gt;
&lt;br /&gt;
An introduction to the Atmel AVR family of microcontrollers by [[User:Mightyohm|Jeff]] and [[User:Maltman23|Mitch]]&lt;br /&gt;
&lt;br /&gt;
== Interested People (sign up here): ==&lt;br /&gt;
* Daniela Steinsapir&lt;br /&gt;
* [[User:Michiexile|Michiexile]]&lt;br /&gt;
* [[User:Arcanology|Al]]&lt;br /&gt;
* [[User:kripto|MarkC]]&lt;br /&gt;
* [[User:Rigel|Rigel]]&lt;br /&gt;
* [[User:elgreengeeto|Skory]]&lt;br /&gt;
* [[User:Ioerror|Jacob]]&lt;br /&gt;
* [[User:Matt|MattP]]&lt;br /&gt;
* [[User:rachel|rachel]]&lt;br /&gt;
* [[User:Adi|adi]]&lt;br /&gt;
* [[User:JSharp|J]]&lt;br /&gt;
* [[User:BillyBuggy]]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=User:BillyBuggy&amp;diff=1803</id>
		<title>User:BillyBuggy</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=User:BillyBuggy&amp;diff=1803"/>
		<updated>2008-10-22T02:20:52Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://lh3.ggpht.com/nye22g/SJSi6zsrUOI/AAAAAAAADbs/mDq6xAM3z8c/s144/100_0325--Bill_Korea_May_2007.jpg]&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://lh3.ggpht.com/nye22g/SJSi6zsrUOI/AAAAAAAADbs/mDq6xAM3z8c/s144/100_0325--Bill_Korea_May_2007.jpg&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=User:BillyBuggy&amp;diff=1802</id>
		<title>User:BillyBuggy</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=User:BillyBuggy&amp;diff=1802"/>
		<updated>2008-10-22T02:19:44Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://lh3.ggpht.com/nye22g/SJSi6zsrUOI/AAAAAAAADbs/mDq6xAM3z8c/s144/100_0325--Bill_Korea_May_2007.jpg]&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;table style=&amp;quot;width:auto;&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;http://picasaweb.google.com/lh/photo/vve_tBA1PAoqFwoK_wlQow&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;http://lh3.ggpht.com/nye22g/SJSi6zsrUOI/AAAAAAAADbs/mDq6xAM3z8c/s144/100_0325--Bill_Korea_May_2007.jpg&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;font-family:arial,sans-serif; font-size:11px; text-align:right&amp;quot;&amp;gt;From &amp;lt;a href=&amp;quot;http://picasaweb.google.com/nye22g/Korea_May_2007&amp;quot;&amp;gt;Korea_May_2007&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=User:BillyBuggy&amp;diff=1801</id>
		<title>User:BillyBuggy</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=User:BillyBuggy&amp;diff=1801"/>
		<updated>2008-10-22T02:18:16Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: New page: [http://lh3.ggpht.com/nye22g/SJSi6zsrUOI/AAAAAAAADbs/mDq6xAM3z8c/s144/100_0325--Bill_Korea_May_2007.jpg]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://lh3.ggpht.com/nye22g/SJSi6zsrUOI/AAAAAAAADbs/mDq6xAM3z8c/s144/100_0325--Bill_Korea_May_2007.jpg]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Processing_Workshop_2&amp;diff=1800</id>
		<title>Processing Workshop 2</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Processing_Workshop_2&amp;diff=1800"/>
		<updated>2008-10-22T02:07:28Z</updated>

		<summary type="html">&lt;p&gt;BillyBuggy: /* Interest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interest ==&lt;br /&gt;
*[[User:Endenizen|Brian Ferrell]]&lt;br /&gt;
*[[gba]]&lt;br /&gt;
*[[turkshead]]&lt;br /&gt;
*[[BillyBuggy]]&lt;br /&gt;
[[Category:Processing]][[category:events]]&lt;/div&gt;</summary>
		<author><name>BillyBuggy</name></author>
	</entry>
</feed>