当前,我有两个通过I2C连接到我的Raspberry Pi 3的2通道1 Amp SPDT信号继电器控制器,当我当前运行该功能以打开一个继电器时,另一个继电器将同时关闭(一个或另一个打开)。另外,关闭继电器1的按钮和关闭继电器2的按钮将同时关闭两个继电器。
我的程序是用Windows窗体(Visual Studio)编写的,并且我正在通过Dll Import访问C共享库,但是我知道我的问题出在我的C库中。我对C以及转换的工作原理非常陌生,因此问题的根源在于代码的逻辑和结构。坦白说,我对如何正确编码感到困惑。
当前是打开继电器1的方法。它可以正确打开继电器,但同时也可以关闭继电器2。
void Relay1On() ***CURRENTLY TURNS OTHER OFF WHEN ACTIVATED***
{
// Create I2C bus
int file;
char *bus = "/dev/i2c-1";
if ((file = open(bus, O_RDWR)) < 0)
{
printf("Failed to open the bus. \n");
exit(1);
}
// Get I2C device, MCP23008 I2C address is 0x20(32)
ioctl(file, I2C_SLAVE, 0x20);
// Configure all pins of port as output (0x00)
char config[2] = {0};
config[0] = 0x00;
config[1] = 0x00;
write(file, config, 2);
//Turn the first relay on
char data = 0x01;
config[0] = 0x09;
config[1] = data;
write(file, config, 2);
}
这是继电器1关闭的代码,我不会发布继电器2的打开/关闭,因为它基本上是相同的,继电器2On在data += 1;
之后仅添加了char data = 0x01;
。两种“关闭”方法都会导致两个继电器都关闭。
void Relay1Off()
{
// Create I2C bus
int file;
char *bus = "/dev/i2c-1";
if ((file = open(bus, O_RDWR)) < 0)
{
printf("Failed to open the bus. \n");
exit(1);
}
// Get I2C device, MCP23008 I2C address is 0x20(32)
ioctl(file, I2C_SLAVE, 0x20);
// Configure all pins of port as output (0x00)
char config[2] = {0};
config[0] = 0x00;
config[1] = 0x00;
write(file, config, 2);
//Turn the first relay off *****Turns all off at the moment******
char data = 0xFE;
data = (data << 1);
config[0] = 0x09;
config[1] = data;
write(file, config, 2);
}
我想要做的就是按所述方法进行操作,请在调用该方法时打开Relay 1。调用Relay1Off时,仅关闭继电器1。我敢肯定这很简单,但是正如我在上面提到的,C对我来说还是很新的。
在此先感谢您的贡献。
答案 0 :(得分:0)
我不知道花式ioctl
的工作原理是什么,但我会尝试在此功能之外进行所有初始化,包括将所有GPIO设置为输出。
您可能应该只调用一个函数来设置/清除继电器。我会像这样开始:
void RelayOnOff(unsigned char relay, unsigned char enable)
{
//Init to all off
static unsigned char data = 0x00;
...
if (enable){
data |= ( 1 << relay );
}
else{
data &= ~( 1 << relay );
}
config[0] = 0x09;
config[1] = data;
write(file, config, 2);
}
您传入要控制的继电器,以及用于启用/禁用的布尔值。如果您将数据变量设置为静态,它将“记住”函数调用之间的值。启用/禁用设置/清除您在(0-7)中传递的任何中继的位。