咱们在玩arduino或stm32、esp8266时,有时会遇到板子模拟口不够用的情况,这个时候CD74HC4067就派上用场了,它可以将16路数字/模拟信号通过4数字+1模拟=5口来读取。
引脚c0--c15为输入口,接任意外部设备;s0-s3接板子数字口,用于发送读取信号编码;sig接板子模拟口,用于读取信号;EN口接数字口,用于发送禁用/启用命令,如果一直都是启用,此口可以不接。
- 1 // 定义选择引脚的编号 by longware
- 2 int s0 = 2;
- 3 int s1 = 3;
- 4 int s2 = 4;
- 5 int s3 = 5;
- 6
- 7 // 定义SIG引脚的编号
- 8 int SIG_pin = A0;
- 9
- 10 void setup() {
- 11 // 设置选择引脚为输出模式
- 12 pinMode(s0, OUTPUT);
- 13 pinMode(s1, OUTPUT);
- 14 pinMode(s2, OUTPUT);
- 15 pinMode(s3, OUTPUT);
- 16
- 17 // 设置SIG引脚为输入模式
- 18 pinMode(SIG_pin, INPUT);
- 19
- 20 // 初始化串口通信
- 21 Serial.begin(9600);
- 22 }
- 23
- 24 void loop() {
- 25 // 循环读取16个输入信号的值
- 26 for (int i = 0; i < 16; i++) {
- 27
- 28 // 调用readMux函数,传入通道编号,返回输入信号的值
- 29 int value = readMux(i);
- 30
- 31 // 在串口监视器中打印通道编号和输入信号的值
- 32 Serial.print(",C");
- 33 Serial.print(i);
- 34 Serial.print("=");
- 35 Serial.print(value);
- 36
- 37 // 延时
- 38 delay(20);
- 39 }
- 40 Serial.println(" ");
- 41
- 42 // 延时
- 43 delay(500);
- 44 }
- 45
- 46 // 定义一个函数,用来读取74HC4067的某个通道的输入信号的值
- 47 int readMux(int channel) {
- 48
- 49 // 定义一个二维数组,用来存储16个通道对应的选择引脚的状态
- 50 int muxChannel[16][4] = {
- 51 {0, 0, 0, 0}, // 通道0
- 52 {1, 0, 0, 0}, // 通道1
- 53 {0, 1, 0, 0}, // 通道2
- 54 {1, 1, 0, 0}, // 通道3
- 55 {0, 0, 1, 0}, // 通道4
- 56 {1, 0, 1, 0}, // 通道5
- 57 {0, 1, 1, 0}, // 通道6
- 58 {1, 1, 1, 0}, // 通道7
- 59 {0, 0, 0, 1}, // 通道8
- 60 {1, 0, 0, 1}, // 通道9
- 61 {0, 1, 0, 1}, // 通道10
- 62 {1, 1, 0, 1}, // 通道11
- 63 {0, 0, 1, 1}, // 通道12
- 64 {1, 0, 1, 1}, // 通道13
- 65 {0, 1, 1, 1}, // 通道14
- 66 {1, 1, 1, 1} // 通道15
- 67 };
- 68
- 69 // 循环设置选择引脚的状态,根据通道编号和二维数组的值
- 70 for (int i = 0; i < 4; i++) {
- 71 digitalWrite(s0 + i, muxChannel[channel][i]);
- 72 }
- 73
- 74 // 读取SIG引脚的模拟值
- 75 int value = analogRead(SIG_pin);
- 76
- 77 // 返回读取的值 by longware
- 78 return value;
- 79 }
- 1 // 定义74HC4067引脚连接到Arduino的引脚 by longware
- 2 const int S0 = 2;
- 3 const int S1 = 3;
- 4 const int S2 = 4;
- 5 const int S3 = 5;
- 6 const int SIG_PIN = A0; // 74HC4067的信号引脚连接到Arduino的模拟输入A0
- 7
- 8 void setup() {
- 9 // 设置74HC4067选择引脚为输出
- 10 pinMode(S0, OUTPUT);
- 11 pinMode(S1, OUTPUT);
- 12 pinMode(S2, OUTPUT);
- 13 pinMode(S3, OUTPUT);
- 14
- 15 // 设置信号引脚为输入
- 16 pinMode(SIG_PIN, INPUT);
- 17
- 18 // 初始化选择引脚,选择通道0
- 19 digitalWrite(S0, LOW);
- 20 digitalWrite(S1, LOW);
- 21 digitalWrite(S2, LOW);
- 22 digitalWrite(S3, LOW);
- 23
- 24 // 打开串口通信
- 25 Serial.begin(9600);
- 26 }
- 27
- 28 void loop() {
- 29
- 30 // 循环读取16个通道的值
- 31 for (int channel = 0; channel < 16; ++channel) {
- 32
- 33 // 设置74HC4067选择通道
- 34 selectChannel(channel);
- 35
- 36 // 读取信号引脚的值并打印到串口
- 37 int sensorValue = analogRead(SIG_PIN);
- 38 Serial.print(",C");
- 39 Serial.print(channel);
- 40 Serial.print("=");
- 41 Serial.print(sensorValue);
- 42
- 43 // 等待一段时间,可根据需要调整
- 44 delay(20);
- 45 }
- 46 Serial.println(" ");
- 47
- 48
- 49 delay(500);
- 50 }
- 51
- 52 // 设置74HC4067选择通道的函数 by longware
- 53 void selectChannel(int channel) {
- 54
- 55 // 使用二进制表示选择通道
- 56 digitalWrite(S0, (channel & B0001) > 0);
- 57 digitalWrite(S1, (channel & B0010) > 0);
- 58 digitalWrite(S2, (channel & B0100) > 0);
- 59 digitalWrite(S3, (channel & B1000) > 0);
- 60 }