使用74hc595(移出)的控制继电器

时间:2018-12-05 03:03:06

标签: arduino

我想使用7h4c595(8个IO)来控制8个继电器。

我尝试使用0b00000000 ,它工作正常。

但我不知道如何将值转换为这种二进制值

关于此的几乎为0的知识。抱歉

我知道下面的代码不正确,但似乎可以正常工作。

问题:74hc595的q0控制着第二个继电器,而不是第一个。

而q1正在控制第三继电器。

应该类似于q0-> 1st,q1-> 2nd,等等。

很抱歉打扰您。

enter image description here

[代码]

uint8_t switch0=0;// 0 = off
uint8_t switch1=1;// 1 = on
etc...
uint8_t switch7=1;//1-7 on

setup(){
    etc...
}
loop(){
    if(digitalWrite(btn1)==HIGH){
        switch0=1;//on
        switch1=0;//off
        etc...//1-7 off
    }
    //unit8_t sw=0b10000000; //turn 1st relay on when btn1 pressed
    uint8_t sw={switch0,switch1,....,switch7};
    for(int i=0;i<8;i++){
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, i);   
        digitalWrite(latchPin, HIGH);
    }
}

1 个答案:

答案 0 :(得分:1)

我会以类似的方式在avr / io.h中定义引脚的方式

constexpr uint8_t RELAY0 = 0;
constexpr uint8_t RELAY1 = 1;
// ...
constexpr uint8_t RELAY7 = 7;


loop() {
  uint8_t data = (switch0 << RELAY0) | (switch1 << RELAY1) | /* ... |*/ (switch7 << RELAY7);

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, data);   
  digitalWrite(latchPin, HIGH);

  delay(200); // or more
}

或者您可以使用单字节(uint8_t)一次存储所有开关。作为奖励,您可以直接通过shiftOut发送它。

uint8_t allSwitches = 0; // all relays disabled 

// turning relay x on (somewhere inside of function):
allSwitches |= _BV(x); // where x is number between 0 and 7 including

// turning relay x off:
allSwitches &= ~_BV(x);

// but you can set some of them and reset others in single step:
allSwitches = _BV(0) | _BV(5) | _BV(7);  // turns on relay 0, 5 and 7, rest will be turned off