2016-11-04 33 views
0

我有以下代碼。繼電器引腳與負載的作用不同

void setup(){ 
    pinMode(14, OUTPUT); 
    digitalWrite(14, HIGH); //Relay 
} 
void loop(){ 
    if (!digitalRead(14)){ 
     digitalWrite(10,HIGH); //LED 
     digitalWrite(11,LOW); //LED 
    }else{ 
     digitalWrite(10, LOW); 
     digitalWrite(11, HIGH); 
    } 
} 

在代碼的另一部分繼電器引腳改變狀態,我監視與改變的希望寄託在迴路中的digitalRead部分導致是基於狀態。

現在很難的部分。除非將繼電器連接到磁鐵,否則所有這些都可以工作。這是一個非常複雜的門鎖控制系統。由於某種原因,Maglock連接到接力端,Arduino的表現完全不同。一旦繼電器發生變化,它就會慢慢爬行。在此之前一切正常,但一旦繼電器被激活,就會導致它減速。

我無法弄清的是,爲什麼一切都好,沒有副作用的繼電器觸發,直到負載連接到它。

任何想法?或者更好的監測繼電器狀態的方法? (不將其僞變量存儲在變量中)

回答

1

您將引腳14設置爲OUTPUT,但您試圖使用digitalRead來讀取它。

你想知道的是存儲端口值的寄存器的值。

你可以去簡單的方法,並使用附配的變量存儲這樣的引腳的狀態:

bool state = true; 
void setup(){ 
    pinMode(14, OUTPUT); 
    digitalWrite(14, state); //Relay 
} 

void loop(){ 
    if (!state){ 
    digitalWrite(10,HIGH); //LED 
    digitalWrite(11,LOW); //LED 
    }else{ 
    digitalWrite(10, LOW); 
    digitalWrite(11, HIGH); 
    } 
} 

並據此相應地使state修改編輯的代碼的其餘部分。

'最難理解'的解決方案是讀取寄存器值。由於您使用的是引腳14(與引腳A0相同),因此您必須查看端口C。根據端口操作的Arduino參考(鏈接在我的答案結尾處)。 所以你可以這樣做:

void setup(){ 
    pinMode(14, OUTPUT); 
    digitalWrite(14, HIGH); //Relay 
} 

void loop(){ 
    if (!BitRead(PORTC,0)){ //Reads bit 0 of the register of PORTC (wich is the state of pin14) 
    digitalWrite(10,HIGH); //LED 
    digitalWrite(11,LOW); //LED 
    }else{ 
    digitalWrite(10, LOW); 
    digitalWrite(11, HIGH); 
    } 
} 

這種解決方案更優雅,是你所需要的東西。這可能比較困難,所以如果你將來不記得這個,你總是可以使用「狀態」變量方法。

參考Bit Read OperationArduino Reference on port manipulation瞭解更多信息。

+0

這看起來不錯,我會嘗試。但你怎麼知道14是A0並且對應於C0?我讀了你提供的頁面,並沒有看到你是如何將引腳14翻譯成那個。這Arduino是一個兆,如果這改變了一切。 – TheValyreanGroup

+0

@TheValyreanGroup您可以谷歌「Arduino Uno引腳」,也有引腳名稱,如'PC0',這意味着'PORTC'輸出或啓用上拉,'PINC'用於讀取實際輸入和'DDRC'的方向。您可以在'ATMega328p'數據表中找到所有的詳細信息。 – KIIV

+0

在鏈接中,我給出了它的全部內容:https://www.arduino.cc/en/Reference/PortManipulation 我引用:「PORTC映射到Arduino模擬引腳0到5「。和「有關Arduino引腳號到端口和位的完整映射,請參見您的芯片圖:ATmega8,ATmega168。(請注意,端口的某些位可能用於I/O之外的其他位置;小心不要更改寄存器位的值對應於它們。)「 所以你可以按照鏈接到你的芯片版本,或者你甚至可以谷歌它@KIIV說。 – rovda