有時候會遇到要控制的腳位很多但是腳位不夠用的情況這個時候就要用模塊來擴充他的腳位

下面的範例是透過I2C同時控制兩個MCP23017,透過輸入指令讓對應的腳位HIGH或LOW,程

式沒什麼好說明的,因為寫法很暴力直接但也好理解

 

根據涵式庫的定義,第一到八支腳為GPA0~GPA7,第九到十六支腳為GPB0~GPB7

 

先說明接線:

MCP23017腳位圖

VDD --> arduino 5V

VSS -->arduino GND

SCK -->arduino SCL

SDA -->arduino SDA

RESET -->arduino 5V

A2 --> 依所選的I2C位址選擇H 或 L

A1 --> 依所選的I2C位址選擇H 或 L

A0 --> 依所選的I2C位址選擇H 或 L

範例程式的位址是0X24,0X25

 

image

下面是I2C位址的說明

image

 

下面是程式碼:

#include <Adafruit_MCP23017.h>

Adafruit_MCP23017 mcp1; 
Adafruit_MCP23017 mcp2;
/* 
addr 0 = A2 low , A1 low , A0 low  000
addr 1 = A2 low , A1 low , A0 high 001
addr 2 = A2 low , A1 high , A0 low  010
addr 3 = A2 low , A1 high , A0 high  011
addr 4 = A2 high , A1 low , A0 low  100
addr 5 = A2 high , A1 low , A0 high  101
addr 6 = A2 high , A1 high , A0 low  110
addr 7 = A2 high, A1 high, A0 high 111
*/

#define addr1 4 // A2 high , A1 low , A0 low  100
#define addr2 5 //A2 high , A1 low , A0 high  101

void setup() 
  {
    Serial.begin(115200); 
    mcp1.begin(addr1);
    mcp2.begin(addr2);
    

    mcp1.pinMode(0, OUTPUT); 
    mcp1.pinMode(1, OUTPUT); 
    mcp1.pinMode(2, OUTPUT); 
    mcp1.pinMode(3, OUTPUT); 
    mcp1.pinMode(4, OUTPUT); 
    mcp1.pinMode(5, OUTPUT); 
    mcp1.pinMode(6, OUTPUT); 
    mcp1.pinMode(7, OUTPUT); 
    mcp1.pinMode(8, OUTPUT); 
    mcp1.pinMode(9, OUTPUT); 
    mcp1.pinMode(10, OUTPUT); 
    mcp1.pinMode(11, OUTPUT); 
    mcp1.pinMode(12, OUTPUT); 
    mcp1.pinMode(13, OUTPUT); 
    mcp1.pinMode(14, OUTPUT); 
    mcp1.pinMode(15, OUTPUT); 
    
    mcp2.pinMode(0, OUTPUT); 
    mcp2.pinMode(1, OUTPUT); 
    mcp2.pinMode(2, OUTPUT); 
    mcp2.pinMode(3, OUTPUT); 
    mcp2.pinMode(4, OUTPUT); 
    mcp2.pinMode(5, OUTPUT); 
    mcp2.pinMode(6, OUTPUT); 
    mcp2.pinMode(7, OUTPUT); 
    mcp2.pinMode(8, OUTPUT); 
    mcp2.pinMode(9, OUTPUT); 
    mcp2.pinMode(10, OUTPUT); 
    mcp2.pinMode(11, OUTPUT); 
    mcp2.pinMode(12, OUTPUT); 
    mcp2.pinMode(13, OUTPUT); 
    mcp2.pinMode(14, OUTPUT); 
    mcp2.pinMode(15, OUTPUT); 

 

  } 

  void loop(){

    String s = "";
    while (Serial.available()) {
        char c = Serial.read();
        if(c!='\n'){
            s += c;
        }
        delay(5);    // 沒有延遲的話 UART 串口速度會跟不上Arduino的速度,會導致資料不完整
    }

    if(s!=""){
        //Serial.println(s);
        //address 24
        if(s=="AC101\r")
        {
         mcp1.digitalWrite(0,HIGH);
         Serial.println("AC101"); 
        }
        else if(s=="AO101\r")
        {
         mcp1.digitalWrite(0,LOW);
         Serial.println("AO101");
        }
        else if(s=="AC102\r")
        {
         mcp1.digitalWrite(1,HIGH);
         Serial.println("AC102");
        }
        else if(s=="AO102\r")
        {
         mcp1.digitalWrite(1,LOW);
         Serial.println("AO102");
        }
        else if(s=="AC103\r")
        {
         mcp1.digitalWrite(2,HIGH);
         Serial.println("AC103");
        }
        else if(s=="AO103\r")
        {
         mcp1.digitalWrite(2,LOW);
         Serial.println("AO103");
        }
        else if(s=="AC104\r")
        {
         mcp1.digitalWrite(3,HIGH);
         Serial.println("AC104");
        }
        else if(s=="AO104\r")
        {
         mcp1.digitalWrite(3,LOW);
         Serial.println("AO104");
        }
        else if(s=="AC105\r")
        {
         mcp1.digitalWrite(4,HIGH);
         Serial.println("AC105");
        }
        else if(s=="AO105\r")
        {
         mcp1.digitalWrite(4,LOW);
         Serial.println("AO105");
        }
        else if(s=="AC106\r")
        {
         mcp1.digitalWrite(5,HIGH);
         Serial.println("AC106");
        }
        else if(s=="AO106\r")
        {
         mcp1.digitalWrite(5,LOW);
         Serial.println("AO106");
        }
        else if(s=="AC107\r")
        {
         mcp1.digitalWrite(6,HIGH);
         Serial.println("AC107");
        }
        else if(s=="AO107\r")
        {
         mcp1.digitalWrite(6,LOW);
         Serial.println("AO107");
        }
        else if(s=="AC108\r")
        {
         mcp1.digitalWrite(7,HIGH);
         Serial.println("AC108");
        }
        else if(s=="AO108\r")
        {
         mcp1.digitalWrite(7,LOW);
         Serial.println("AO108");
        }
        else if(s=="AC109\r")
        {
         mcp1.digitalWrite(8,HIGH);
         Serial.println("AC109");
        }
        else if(s=="AO109\r")
        {
         mcp1.digitalWrite(8,LOW);
         Serial.println("AO109");
        }
        else if(s=="AC110\r")
        {
         mcp1.digitalWrite(9,HIGH);
         Serial.println("AC110");
        }
        else if(s=="AO110\r")
        {
         mcp1.digitalWrite(9,LOW);
         Serial.println("AO110");
        }
        else if(s=="AC111\r")
        {
         mcp1.digitalWrite(10,HIGH);
         Serial.println("AC111");
        }
        else if(s=="AO111\r")
        {
         mcp1.digitalWrite(10,LOW);
         Serial.println("AO111");
        }
        else if(s=="AC112\r")
        {
         mcp1.digitalWrite(11,HIGH);
         Serial.println("AC112");
        }
        else if(s=="AO112\r")
        {
         mcp1.digitalWrite(11,LOW);
         Serial.println("AO112");
        }
        else if(s=="AC113\r")
        {
         mcp1.digitalWrite(12,HIGH);
         Serial.println("AC113");
        }
        else if(s=="AO113\r")
        {
         mcp1.digitalWrite(12,LOW);
         Serial.println("AO113");
        }
        else if(s=="AC114\r")
        {
         mcp1.digitalWrite(13,HIGH);
         Serial.println("AC114");
        }
        else if(s=="AO114\r")
        {
         mcp1.digitalWrite(13,LOW);
         Serial.println("AO114");
        }
        else if(s=="AC115\r")
        {
         mcp1.digitalWrite(14,HIGH);
         Serial.println("AC115");
        }
        else if(s=="AO115\r")
        {
         mcp1.digitalWrite(14,LOW);
         Serial.println("AO115");
        }
        else if(s=="AC116\r")
        {
         mcp1.digitalWrite(15,HIGH);
         Serial.println("AC116");
        }
        else if(s=="AO116\r")
        {
         mcp1.digitalWrite(15,LOW);
         Serial.println("AO116");
        }
        //address 24
        //address 25
        if(s=="BC201\r")
        {
         mcp2.digitalWrite(0,HIGH);
         Serial.println("BC201"); 
        }
        else if(s=="BO201\r")
        {
         mcp2.digitalWrite(0,LOW);
         Serial.println("BO201");
        }
        else if(s=="BC202\r")
        {
         mcp2.digitalWrite(1,HIGH);
         Serial.println("BC202");
        }
        else if(s=="BO202\r")
        {
         mcp2.digitalWrite(1,LOW);
         Serial.println("BO202");
        }
        else if(s=="BC203\r")
        {
         mcp2.digitalWrite(2,HIGH);
         Serial.println("BC203");
        }
        else if(s=="BO203\r")
        {
         mcp2.digitalWrite(2,LOW);
         Serial.println("BO203");
        }
        else if(s=="BC204\r")
        {
         mcp2.digitalWrite(3,HIGH);
         Serial.println("BC204");
        }
        else if(s=="BO204\r")
        {
         mcp2.digitalWrite(3,LOW);
         Serial.println("BO204");
        }
        else if(s=="BC205\r")
        {
         mcp2.digitalWrite(4,HIGH);
         Serial.println("BC205");
        }
        else if(s=="BO205\r")
        {
         mcp2.digitalWrite(4,LOW);
         Serial.println("BO205");
        }
        else if(s=="BC206\r")
        {
         mcp2.digitalWrite(5,HIGH);
         Serial.println("BC206");
        }
        else if(s=="BO206\r")
        {
         mcp2.digitalWrite(5,LOW);
         Serial.println("BO206");
        }
        else if(s=="BC207\r")
        {
         mcp2.digitalWrite(6,HIGH);
         Serial.println("BC207");
        }
        else if(s=="BO207\r")
        {
         mcp2.digitalWrite(6,LOW);
         Serial.println("BO207");
        }
        else if(s=="BC208\r")
        {
         mcp2.digitalWrite(7,HIGH);
         Serial.println("BC208");
        }
        else if(s=="BO208\r")
        {
         mcp2.digitalWrite(7,LOW);
         Serial.println("BO208");
        }
        else if(s=="BC209\r")
        {
         mcp2.digitalWrite(8,HIGH);
         Serial.println("BC209");
        }
        else if(s=="BO209\r")
        {
         mcp2.digitalWrite(8,LOW);
         Serial.println("BO209");
        }
        else if(s=="BC210\r")
        {
         mcp2.digitalWrite(9,HIGH);
         Serial.println("BC210");
        }
        else if(s=="BO210\r")
        {
         mcp2.digitalWrite(9,LOW);
         Serial.println("BO210");
        }
        else if(s=="BC211\r")
        {
         mcp2.digitalWrite(10,HIGH);
         Serial.println("BC211");
        }
        else if(s=="BO211\r")
        {
         mcp2.digitalWrite(10,LOW);
         Serial.println("BO211");
        }
        else if(s=="BC212\r")
        {
         mcp2.digitalWrite(11,HIGH);
         Serial.println("BC212");
        }
        else if(s=="BO212\r")
        {
         mcp2.digitalWrite(11,LOW);
         Serial.println("BO212");
        }
        else if(s=="BC213\r")
        {
         mcp2.digitalWrite(12,HIGH);
         Serial.println("BC213");
        }
        else if(s=="BO213\r")
        {
         mcp2.digitalWrite(12,LOW);
         Serial.println("BO213");
        }
        else if(s=="BC214\r")
        {
         mcp2.digitalWrite(13,HIGH);
         Serial.println("BC214");
        }
        else if(s=="BO214\r")
        {
         mcp2.digitalWrite(13,LOW);
         Serial.println("BO214");
        }
        else if(s=="BC215\r")
        {
         mcp2.digitalWrite(14,HIGH);
         Serial.println("BC215");
        }
        else if(s=="BO215\r")
        {
         mcp2.digitalWrite(14,LOW);
         Serial.println("BO215");
        }
        else if(s=="BC216\r")
        {
         mcp2.digitalWrite(15,HIGH);
         Serial.println("BC216");
        }
        else if(s=="BO216\r")
        {
         mcp2.digitalWrite(15,LOW);
         Serial.println("BO216");
        }
        //address 25
        else{}
        
        
    }
}

arrow
arrow
    創作者介紹
    創作者 凶王 的頭像
    凶王

    凶王的部落

    凶王 發表在 痞客邦 留言(0) 人氣()