Schematic
Connect ESP32 NodeMCU v1.0 to 74HC4067 breakout board as shown below.
Arduino Sketch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | /****************************************************************************** Source: https://learn.sparkfun.com/tutorials/multiplexer-breakout-hookup-guide This sketch is modified from the code in the link above to demonstrate how to use the 16 Channel (74HC4067) Multiplexer Breakout to drive 16 outputs using 5 digital pins. 74HC4067 Hardware Hookup: Mux Breakout ----------- ESP32 NodeMCU-V1.0 S0 ------------------- 26 S1 ------------------- 25 S2 ------------------- 33 S3 ------------------- 32 Z -------------------- 3V3 VCC ------------------- 3V3 GND ------------------- GND ~EN ------------------- GND Note, analogWrite is not implemented on ESP32. See below link for more detail: https://github.com/espressif/arduino-esp32/issues/4 A work around example can be found at https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/AnalogOut/ledcWrite_RGB/ledcWrite_RGB.ino ******************************************************************************/ ///////////////////// // Pin Definitions // ///////////////////// const int selectPins[4] = {26, 25, 33, 32}; // S0~26, S1~25, S2~33, S3~32 const int zOutput = 27; // Connect common (Z) to 27 (PWM-capable) void setup() { // Set up the select pins, as outputs for (int i = 0; i < 4; i++) { pinMode(selectPins[i], OUTPUT); digitalWrite(selectPins[i], LOW); } pinMode(zOutput, OUTPUT); // Set up Z as an output } void loop() { // Cycle from pins Y0 to Y15 first for (int pin = 0; pin <= 15; pin++) { // Set the S0, S1, S2, and S3 pins to select our active output (Y0-Y15): selectMuxPin(pin); digitalWrite(zOutput, HIGH); delay(500); } // Now cycle from pins Y14 to Y1 for (int pin = 14; pin >= 1; pin--) { selectMuxPin(pin); // Select the pin digitalWrite(zOutput, HIGH); delay(500); } } // The selectMuxPin function sets the S0, S1, S2, and S3 pins // accordingly, given a pin from 0-15. void selectMuxPin(byte pin) { if (pin > 15) return; // Exit if pin is out of scope for (int i = 0; i < 4; i++) { // 1 byte = 8 bits // Assuming pin = 6 -> 00000110 // 00000110 & 00000001 -> 0, pin 26 = 0 // 00000110 & 00000010 -> 1, pin 25 = 1 // 00000110 & 00000100 -> 1, pin 33 = 1 // 00000110 & 00001000 -> 0, pin 32 = 0 if (pin & (1<<i)) digitalWrite(selectPins[i], HIGH); else digitalWrite(selectPins[i], LOW); } } |
The Result
--------------------------------------------------------------------------------------------------------------------------
ESP-IDF
To be implemented...
Reference:
http://tronixstuff.com/2013/08/05/part-review-74hc4067-16-channel-analog-multiplexerdemultiplexer/
http://blog.codebender.cc/2014/01/30/mux74hc4067/
Multiplexer Breakout Hookup Guide - 74HC4051 (8-channel analog multiplexer/demultiplexer)
https://learn.sparkfun.com/tutorials/multiplexer-breakout-hookup-guide
SparkFun Analog/Digital MUX Breakout - CD74HC4067
https://www.sparkfun.com/products/9056
Muxing Around With The CD74HC4067 + Arduino
http://bildr.org/2011/02/cd74hc4067-arduino/
https://github.com/espressif/arduino-esp32/issues/914
74HC4051D, 8-channel analog multiplexer/demultiplexer
https://www.nexperia.com/products/logic/switches-multiplexers-de-multiplexers/analog-switches/74HC4051D.html
--------------------------------------------------------------------------------------------------------------------------
Alternative Part
Remote 8-Bit I/O Expander for I2C Bus
https://www.ti.com/lit/ds/symlink/pcf8574.pdf
No comments:
Post a Comment