nanoFramework.Iot.Device.Charlieplex 1.2.931

Prefix Reserved
dotnet add package nanoFramework.Iot.Device.Charlieplex --version 1.2.931
                    
NuGet\Install-Package nanoFramework.Iot.Device.Charlieplex -Version 1.2.931
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="nanoFramework.Iot.Device.Charlieplex" Version="1.2.931" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="nanoFramework.Iot.Device.Charlieplex" Version="1.2.931" />
                    
Directory.Packages.props
<PackageReference Include="nanoFramework.Iot.Device.Charlieplex" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add nanoFramework.Iot.Device.Charlieplex --version 1.2.931
                    
#r "nuget: nanoFramework.Iot.Device.Charlieplex, 1.2.931"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package nanoFramework.Iot.Device.Charlieplex@1.2.931
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=nanoFramework.Iot.Device.Charlieplex&version=1.2.931
                    
Install as a Cake Addin
#tool nuget:?package=nanoFramework.Iot.Device.Charlieplex&version=1.2.931
                    
Install as a Cake Tool

Charlieplex Segment binding

Charliplexing is a multiplexing scheme that enables controlling a significantly larger number of LEDs or other load or sensor than a more traditional wiring scheme would allow. Charlieplexing enables addressing up to n^2-n LEDs where n is the number of pins available. For example, 3 pins can be used to address up to 6 LEDs, 4 pins can address 12, and 5 pins can address 20. That sounds great, however charlieplexed circuits are hard to wire due to their complexity.

An even bigger challenge is that the scheme (at least in its basic form) only allows for lighting a single LED at once. On the face of it, that would seem to be a big problem. Don't worry. The LEDs change very quickly such that the eye is tricked into thinking multiple LEDs are lit at the same time. This means that your code that cannot be doing something else while the LEDs are lit. This is why the API accepts timing information. This is not what you'd expect if you are used to lighting LEDs directly from GPIO pins or via a shift register.

Show dotnet: Animating 40 LEDs with charlieplexing demonstrates using this binding.

Usage

The following code sample demonstrates addressing 6 LEDs with 3 pins.


var pins = new int[] { 6, 13, 19 };
var ledCount = 6;
var charlie = new CharlieplexSegment(pins, ledCount);

for (int i = 0; i < ledCount; i++)
{
    // will keep lit for 500ms
    charlie.Write(i, 1, 500);
    charlie.Write(i, 0);
}

The charlieplex-test sample exercises a broader use of the API.

Using with LEDs

The following image demonstrates a 3-pin charlieplex circuit, which is the starting point for charlieplexing. There are 6 LEDs in the circuit in groups of two. In each group of two, the LEDs connect to the same two GPIO pins, but with the opposite polarity (anode and cathodes are switched).

charlieplex

Video

Using with an LED bar graph

The image above demonstrates using LEDs within a charlieplex circuit. LEDs are straightforward to use since you can switch their anode/cathode orientation. You cannot do that with an LED bar graph since the anode and cathode legs are fixed. Instead, you need to create your own circuit on a breadboard, and then feed that to the appropriate legs. That's what you see happening in the image below.

charlieplex

Video

Circuit addressing scheme

The CharlieplexSegment type uses an addressing scheme that can be thought of as depth then breadth. Between each pair of pins, there are a pair of LEDs or other loads. The first LED is placed anode-first and the second is placed cathode-first. You start with the first two pins for the first pair of LEDs, and then the second and third pins for the second pair. This continues until you run out of pins. After that, you start from the first pin again, but this time pair with the third pin. This pattern continues until you reach the desired number of LEDs or run out of pins.

It is critical to understand the difference between anode (typically longer) and cathode legs of LEDs. You will be checking these with each placement.

The binding includes an API that returns a description of the circuit you need to use. The sample calls this API and prints this information to the terminal, using the same pins as the code example above. This information is very helpful to have to configure the circuit correctly.

Node 0 -- Anode: 6; Cathode: 13
Node 1 -- Anode: 13; Cathode: 6
Node 2 -- Anode: 13; Cathode: 19
Node 3 -- Anode: 19; Cathode: 13
Node 4 -- Anode: 6; Cathode: 19
Node 5 -- Anode: 19; Cathode: 6

The tests in CharlieplexLayout.cs call this same API and demonstrate the circuit address scheme with varying numbers of pins.

Given a 6 LED circut, charlie.Write(5,1) will light LED6 in the diagram. The API uses a 0-based scheme. As a result, charlie.Write(6,1) will throw an exception.

Two LED charlieplex circuit

This image demonstrates a 2-pin circuit. There isn't any reason to use a 2-pin charlieplex circuit other than as a learning exercise.

Three LED charlieplex circuit

This image demonstrates a 3-pin circuit.

Six LED charliplex circuit

This image demonstrates a 6-pin circuit.

The Controlling 20 Led's From 5 Arduino Pins Using Charlieplexing includes larger wiring diagrams that match the scheme used by this binding.

Alternatives

The alternative to a charlieplex circuit is a shift register. See SN74HC595 -- 8-Bit Shift Register. A shift register is even more efficient at using pins than a charlieplex circuit, and is simpler to configure.

Product Compatible and additional computed target framework versions.
.NET Framework net is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.931 210 11/10/2025
1.2.907 185 10/2/2025
1.2.869 277 4/2/2025
1.2.864 242 4/2/2025
1.2.852 250 3/11/2025
1.2.833 190 2/27/2025
1.2.829 183 2/27/2025
1.2.822 191 2/26/2025
1.2.775 198 2/4/2025
1.2.772 196 2/4/2025
1.2.762 202 2/1/2025
1.2.755 187 1/31/2025
1.2.737 159 1/13/2025
1.2.718 171 12/30/2024
1.2.696 178 12/16/2024
1.2.673 214 10/23/2024
1.2.662 189 10/11/2024
1.2.631 193 8/28/2024
1.2.590 192 7/17/2024
1.2.570 228 6/14/2024
1.2.560 207 5/29/2024
1.2.552 203 5/17/2024
1.2.548 208 5/15/2024
1.2.536 207 4/15/2024
1.2.514 227 3/22/2024
1.2.436 299 11/10/2023
1.2.416 159 11/8/2023
1.2.329 243 5/26/2023
1.2.313 254 5/12/2023
1.2.308 238 5/11/2023
1.2.302 284 5/10/2023
1.2.297 260 5/3/2023
1.2.273 337 3/17/2023
1.2.212 442 1/5/2023
1.2.208 416 1/3/2023
1.2.203 415 12/28/2022
1.2.159 485 11/14/2022
1.2.153 513 11/5/2022
1.2.141 491 10/25/2022
1.2.128 513 10/22/2022
1.2.122 542 10/12/2022
1.2.114 514 10/8/2022
1.2.95 546 9/22/2022
1.2.87 601 9/15/2022
1.2.73 546 9/8/2022
1.1.116.8772 551 6/24/2022
1.1.113.2032 577 6/23/2022
1.1.3 652 4/15/2022
1.1.1 564 4/14/2022
1.0.300 583 3/31/2022
1.0.288-preview.114 236 3/25/2022
1.0.288-preview.113 250 3/25/2022
1.0.288-preview.100 256 3/19/2022
1.0.288-preview.99 228 3/18/2022
1.0.288-preview.98 253 3/18/2022
1.0.288-preview.94 236 3/15/2022
1.0.288-preview.93 233 3/15/2022
1.0.288-preview.90 266 3/11/2022
1.0.288-preview.87 233 3/10/2022
1.0.288-preview.86 242 3/8/2022
1.0.288-preview.65 231 2/18/2022
1.0.288-preview.48 287 2/4/2022
1.0.288-preview.41 262 1/31/2022
1.0.288-preview.29 270 1/28/2022
1.0.288-preview.20 255 1/27/2022
1.0.288-preview.19 250 1/27/2022
1.0.288-preview.5 254 1/24/2022
1.0.288-preview.3 247 1/21/2022
1.0.288-preview.1 245 1/21/2022
1.0.272 286 1/10/2022
1.0.259 448 12/9/2021
1.0.218 349 10/18/2021
1.0.195 496 10/1/2021
1.0.136 357 7/17/2021
1.0.135 314 7/16/2021
1.0.134 300 7/15/2021
1.0.133 310 7/14/2021
1.0.131 322 7/8/2021
1.0.121 340 6/29/2021
1.0.120 341 6/29/2021
1.0.119 378 6/28/2021
1.0.118 327 6/20/2021
1.0.112 365 6/16/2021
1.0.110 360 6/9/2021
1.0.109 288 6/8/2021
1.0.106 345 6/1/2021
1.0.104 419 5/29/2021
1.0.63 302 5/26/2021
1.0.40 338 5/24/2021