我們們在玩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}, // 通道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 }
上面的程式碼中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 // 初始化選擇引腳,選擇通道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 }
開啟串列埠監視器,效果如下:
讀取到sig值了,你想幹嘛就幹嘛了。詳細資料也可以去廠商看看文件 。