Skip to content

Commit d2ad0dd

Browse files
committed
Added AnalogMultiplexer library
1 parent 4ee6437 commit d2ad0dd

File tree

5 files changed

+268
-0
lines changed

5 files changed

+268
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <AnalogMultiplexer.h>
2+
3+
// Selected Arduino pins.
4+
enum {
5+
PIN_EN = 2, // The enable pin of the multiplexer.
6+
PIN_S0 = 3, // Channel selector pin 0.
7+
PIN_S1 = 4, // Channel selector pin 1.
8+
PIN_S2 = 5, // Channel selector pin 2.
9+
PIN_S3 = 6, // Channel selector pin 3.
10+
PIN_IO = A0 // Use here a pin that can work in analog & digital modes.
11+
};
12+
13+
AMxx4067 mux{ PIN_EN, PIN_S0, PIN_S1, PIN_S2, PIN_S3 }; // 16:1 Multiplexer.
14+
// Other possible types are:
15+
//AMxx4051 mux{ PIN_EN, PIN_S0, PIN_S1, PIN_S2 }; // 8:1 Multiplexer.
16+
//AMxx4052 mux{ PIN_EN, PIN_S0, PIN_S1 }; // Dual 4:1 Multiplexer.
17+
//AMxx4053 mux{ PIN_EN, PIN_S0 }; // Triple 2:1 Multiplexer.
18+
19+
void setup() {
20+
Serial.begin(9600);
21+
while (!Serial);
22+
23+
mux.pinMode(PIN_IO, INPUT); // PIN_IO will be used to read from the mux.
24+
mux.enable(); // Enable multiplexer.
25+
for (int channel = 0; channel < 16; channel++) {
26+
int value = mux.analogRead(channel); // Do analog read.
27+
Serial.println(value);
28+
}
29+
Serial.println();
30+
31+
mux.pinMode(PIN_IO, INPUT_PULLUP); // Enable weak pull up resistor.
32+
for (int channel = 0; channel < 16; channel++) {
33+
int value = mux.digitalRead(channel); // Do digital read.
34+
Serial.println(value);
35+
}
36+
Serial.println();
37+
38+
mux.pinMode(PIN_IO, OUTPUT); // Switch to write mode.
39+
for (int channel = 0; channel < 16; channel++) {
40+
int value = channel % 2;
41+
mux.digitalWrite(channel, value); // Do digital write (multiplexed).
42+
Serial.println(value);
43+
}
44+
Serial.println();
45+
mux.disable(); // Switch of multiplexer.
46+
}
47+
48+
void loop() { }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#######################################
2+
# Syntax Coloring Map for
3+
# AnalogMultiplexer
4+
#######################################
5+
6+
#######################################
7+
# Datatypes (KEYWORD1)
8+
#######################################
9+
10+
AnalogMultiplexer KEYWORD1
11+
AMxx40xx KEYWORD1
12+
AMxx4051 KEYWORD1
13+
AMxx4052 KEYWORD1
14+
AMxx4053 KEYWORD1
15+
AMxx4067 KEYWORD1
16+
17+
#######################################
18+
# Methods and Functions (KEYWORD2)
19+
#######################################
20+
21+
enable KEYWORD2
22+
disable KEYWORD2
23+
24+
#######################################
25+
# Constants (LITERAL1)
26+
#######################################
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=AnalogMultiplexer
2+
version=1.0.0
3+
author=Julian Sanin <[email protected]>
4+
maintainer=Julian Sanin <[email protected]>
5+
sentence=A library to interface with analog multiplexers.
6+
paragraph=Supports 4051, 4052, 4053, and 4067 series multiplexers.
7+
category=Uncategorized
8+
url=https://github.com/j54n1n/arduinorobot
9+
architectures=avr
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "AnalogMultiplexer.h"
2+
3+
AnalogMultiplexer::AnalogMultiplexer(uint8_t pinEnable) {
4+
_pinEnable = pinEnable;
5+
_pinCommon = NOT_A_PIN;
6+
/*Arduino*/::pinMode(_pinEnable, OUTPUT);
7+
}
8+
9+
void AnalogMultiplexer::enable() {
10+
/*Arduino*/::digitalWrite(_pinEnable, LOW);
11+
}
12+
13+
void AnalogMultiplexer::disable() {
14+
/*Arduino*/::digitalWrite(_pinEnable, HIGH);
15+
}
16+
17+
void AnalogMultiplexer::pinMode(uint8_t pinCommon, uint8_t mode) {
18+
if (NOT_A_PIN != digitalPinToPort(pinCommon)) {
19+
_pinCommon = pinCommon;
20+
/*Arduino*/::pinMode(_pinCommon, mode);
21+
} else {
22+
_pinCommon = NOT_A_PIN;
23+
}
24+
}
25+
26+
void AnalogMultiplexer::digitalWrite(uint8_t channel, uint8_t value) {
27+
if ((NOT_A_PIN != _pinCommon) && (NOT_A_PIN != selectChannel(channel))) {
28+
/*Arduino*/::digitalWrite(_pinCommon, value);
29+
}
30+
}
31+
32+
int AnalogMultiplexer::digitalRead(uint8_t channel) {
33+
if ((NOT_A_PIN != _pinCommon) && (NOT_A_PIN != selectChannel(channel))) {
34+
return /*Arduino*/::digitalRead(_pinCommon);
35+
}
36+
return LOW;
37+
}
38+
39+
int AnalogMultiplexer::analogRead(uint8_t channel) {
40+
if ((NOT_A_PIN != _pinCommon) && (NOT_A_PIN != selectChannel(channel))) {
41+
return /*Arduino*/::analogRead(_pinCommon);
42+
}
43+
return 0;
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
#ifndef ANALOG_MULTIPLEXER_H
2+
#define ANALOG_MULTIPLEXER_H
3+
4+
#include <Arduino.h>
5+
6+
/// <summary>CMOS Logic Analog Multiplexer and Demultiplexer.</summary>
7+
class AnalogMultiplexer {
8+
9+
/// <summary>Channel enable.</summary>
10+
uint8_t _pinEnable;
11+
12+
/// <summary>Channel common input or output.</summary>
13+
uint8_t _pinCommon;
14+
15+
protected:
16+
/// <summary>
17+
/// Select channel (from 0 to MAX) to be connected to common pin.
18+
/// </summary>
19+
virtual uint8_t selectChannel(uint8_t channel) = 0;
20+
21+
public:
22+
explicit AnalogMultiplexer(uint8_t pinEnable);
23+
24+
/// <summary>Enables the analog multiplexer channels.</summary>
25+
void enable();
26+
27+
/// <summary>Disables the analog multiplexer channels.</summary>
28+
void disable();
29+
30+
/// <summary>
31+
/// Configures the specified common channel pin to behave either as an input
32+
/// or an output.
33+
/// </summary>
34+
/// <param name="pinCommon">
35+
/// The pin number of whose mode you wish to set. The selected pin will be
36+
/// used for <see cref="AnalogMultiplexer::digitalRead" />,
37+
/// <see cref="AnalogMultiplexer::digitalWrite" />, and
38+
/// <see cref="AnalogMultiplexer::analogRead" />.
39+
/// </param>
40+
/// <param name="mode">
41+
/// <see cref="INPUT" />, <see cref="OUTPUT" />, or
42+
/// <see cref="INPUT_PULLUP" />.
43+
/// </param>
44+
void pinMode(uint8_t pinCommon, uint8_t mode);
45+
46+
/// <summary>
47+
/// Write a <see cref="HIGH" /> or a <see cref="LOW" /> value to a specified
48+
/// common channel pin.
49+
/// <seealso cref="AnalogMultiplexer::pinMode" />
50+
/// </summary>
51+
/// <param name="channel">
52+
/// The channel number.
53+
/// </param>
54+
/// <param name="value">
55+
/// <see cref="HIGH" /> or <see cref="LOW" />.
56+
/// </param>
57+
void digitalWrite(uint8_t channel, uint8_t value);
58+
59+
/// <summary>
60+
/// Reads the value from a specified common channel pin, either
61+
/// <see cref="HIGH" /> or <see cref="LOW" />.
62+
/// </summary>
63+
/// <param name="channel">
64+
/// The channel number of the multiplexer pin you want to read.
65+
/// </param>
66+
/// <returns>
67+
/// <see cref="HIGH" /> or <see cref="LOW" />.
68+
/// </returns>
69+
int digitalRead(uint8_t channel);
70+
71+
/// <summary>
72+
/// Reads the value from the specified common channel pin.
73+
/// </summary>
74+
/// <param name="channel">
75+
/// The channel number of the multiplexer pin you want to read.
76+
/// </param>
77+
/// <returns>
78+
/// 0 to 1023.
79+
/// </returns>
80+
int analogRead(uint8_t channel);
81+
};
82+
83+
/// <summary>
84+
/// Generic class for all types of analog mulitplexer with selector pins.
85+
/// </summary>
86+
template<typename... Args>
87+
class AMxx40xx : public AnalogMultiplexer {
88+
89+
enum { MAX_SELECTORS = sizeof...(Args) };
90+
91+
/// <summary>2^n selectors for each channel.</summary>
92+
uint8_t _pinSelectors[MAX_SELECTORS];
93+
94+
/// <summary>
95+
/// See <see cref="AnalogMultiplexer::selectChannel" />.
96+
/// </summary>
97+
uint8_t selectChannel(uint8_t channel) {
98+
if ((1 << MAX_SELECTORS) > channel) {
99+
for (uint8_t i = 0; i < MAX_SELECTORS; i++) {
100+
const uint8_t pinSelector = _pinSelectors[i];
101+
/*Arduino*/::digitalWrite(pinSelector, bitRead(channel, i));
102+
}
103+
return channel + 1;
104+
}
105+
return NOT_A_PIN;
106+
}
107+
108+
public:
109+
/// <summary>
110+
/// Setup an analog multiplexer with given enable pin and selector pins.
111+
/// </summary>
112+
AMxx40xx(uint8_t pinEnable, Args... pinSelector)
113+
: AnalogMultiplexer(pinEnable), _pinSelectors{pinSelector...} {
114+
for (uint8_t i = 0; i < MAX_SELECTORS; i++) {
115+
/*Arduino*/::pinMode(_pinSelectors[i], OUTPUT);
116+
}
117+
}
118+
};
119+
120+
/// <summary>
121+
/// 4051 Series Single 8:1 Analog Multiplexer.
122+
/// </summary>
123+
using AMxx4051 = AMxx40xx<uint8_t, uint8_t, uint8_t>;
124+
125+
/// <summary>
126+
/// 4052 Series Dual 4:1 Analog Multiplexer.
127+
/// </summary>
128+
using AMxx4052 = AMxx40xx<uint8_t, uint8_t>;
129+
130+
/// <summary>
131+
/// 4053 Series Triple 2:1 Analog Multiplexer. Assuming all 3 selectors are tied
132+
/// together.
133+
/// </summary>
134+
using AMxx4053 = AMxx40xx<uint8_t>;
135+
136+
/// <summary>
137+
/// 4067 Series Single 16:1 Analog Multiplexer.
138+
/// </summary>
139+
using AMxx4067 = AMxx40xx<uint8_t, uint8_t, uint8_t, uint8_t>;
140+
141+
#endif //ANALOG_MULTIPLEXER

0 commit comments

Comments
 (0)