我想使用7h4c595(8个IO)来控制8个继电器。
我尝试使用0b00000000 ,它工作正常。
但我不知道如何将值转换为这种二进制值。
关于此的几乎为0的知识。抱歉
我知道下面的代码不正确,但似乎可以正常工作。
问题:74hc595的q0控制着第二个继电器,而不是第一个。
而q1正在控制第三继电器。
应该类似于q0-> 1st,q1-> 2nd,等等。
很抱歉打扰您。
[代码]
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);
}
}
答案 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