2015/03/24

Arduino SNMP溫度監控: 多工器讀值

多工器簡單的說就是同一時間內從八個來源選擇一個
要控制多工器需要三隻訊號線(2^3 = 8)

我買到的是CD4051BE,Google DataSheet後可以找到接腳圖



Pin16: VDD接5V
Pin6,7,8: 接地GND
Pin9~11: 控制線,接到Arduino 2(A), 3(B), 4(C)
Pin 1,2,4,5,12~15就是訊號輸入的地方(0~7)

C B A  Channel
0 0 0  0
0 0 1  1
0 1 0  2
0 1 1  3
1 0 0  4
1 0 1  5
1 1 0  6
1 1 1  7


新版本的IDE多了個好用的指令:
bitRead( 數字 , 哪個位元 );

舉例來說,想要取得控制線訊號,只要這樣寫
A =  bitRead( 數字 , 0 );   // 0是最低位元
B =  bitRead( 數字 , 1 ); 
C =  bitRead( 數字 , 2 );

可以來寫程式了

  1. 在程式前端加上多工器的操作變數宣告
    #define muxPINA 2
    #define muxPINB 3
    #define muxPINC 4
    int muxA = 0;
    int muxB = 0;
    int muxC = 0;
    int muxCount = 0;
    分別對應控制線腳位跟數值
  2. setup() 內加入 PinMode定義輸出腳
    pinMode(muxPINA, OUTPUT);
    pinMode(muxPINB, OUTPUT);
    pinMode(muxPINC, OUTPUT);
  3. loop() 內修改為這樣
    for( muxCount=0; muxCount<=7; muxCount++){
     muxA = bitRead(muxCount,0);
     muxB = bitRead(muxCount,1);
     muxC = bitRead(muxCount,2);
    
     //select mux pints
     digitalWrite(muxPINA, muxA);
     digitalWrite(muxPINB, muxB);
     digitalWrite(muxPINC, muxC);
    
     float temp;
     temp = Thermistor(analogRead(ThermistorPIN));
     Serial.print("MUX Port");
     Serial.print(muxCount);
     Serial.print("=> ");
     Serial.print("Celsius: "); 
     Serial.print(temp,3);
     Serial.println("");
    }
    Serial.println("");
    delay(2000);  
    

for迴圈從0跑到7,設定多工器的ABC控制訊號選擇想要的訊號
再在呼叫 Thermistor函式讀取溫度資料

就可以單靠一隻Analog Input讀取8個溫度值

下篇要來測試SNMP了


[Source Code]
https://github.com/Aspertw/ArduinoSNMPTemp/blob/master/ThermistorWithMUX.ino

1 則留言:

  1. COM OUT/IN 的位置寫上 const byte DHTPIN =2;就可以直接用#include的函式庫

    回覆刪除