咱们在玩arduino或stm32、esp8266时,有时会遇到板子模拟口不够用的情况,这个时候CD74HC4067就派上用场了,它可以将16路数字/模拟信号通过4数字+1模拟=5口来读取。
这货长这样,还有一种是纯芯片的,就是上面黑色的那块。
引脚c0–c15为输入口,接任意外部设备;s0-s3接板子数字口,用于发送读取信号编码;sig接板子模拟口,用于读取信号;EN口接数字口,用于发送禁用/启用命令,如果一直都是启用,此口可以不接。
16个口,板子不是通过0、1、2、3……这样的口令读取的,他有类似的命令表格,通过s0-s3发送命令,就能在sig读取了。命令表如下:
我是买来片子自己焊的,之前我有一个路边五金店买的40w电烙铁、几块钱的焊锡丝,焊得跟狗啃似的:
朋友说,烙铁和焊锡丝都不对,不适合。于是重买了南京华夏银星牌的20w尖头烙铁,6337焊锡丝(带助焊剂),流动性好,色泽光亮。
我试了一下,果然“技艺大增”,哈哈,下面这个焊点,我还是满意的。
我在多路复用板子上接了2个4键电容键盘、滑动电位器、旋钮电位器、按钮开关,如下:
通过如下代码即可读取:
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}, // 通道052 {1, 0, 0, 0}, // 通道153 {0, 1, 0, 0}, // 通道254 {1, 1, 0, 0}, // 通道355 {0, 0, 1, 0}, // 通道456 {1, 0, 1, 0}, // 通道557 {0, 1, 1, 0}, // 通道658 {1, 1, 1, 0}, // 通道759 {0, 0, 0, 1}, // 通道860 {1, 0, 0, 1}, // 通道961 {0, 1, 0, 1}, // 通道1062 {1, 1, 0, 1}, // 通道1163 {0, 0, 1, 1}, // 通道1264 {1, 0, 1, 1}, // 通道1365 {0, 1, 1, 1}, // 通道1466 {1, 1, 1, 1} // 通道1567 };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 longware78 return value;79 }
上面的代码中muxChannel数组列举了通道命令,也可以通过移位来实现,如下面的selectChannel函数。
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 // 初始化选择引脚,选择通道019 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 longware53 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 }
打开串口监视器,效果如下:
读取到sig值了,你想干嘛就干嘛了。详细资料也可以去厂商看看文档 。