打开一个 Raspberry Pi I2C 连接的继电器将关闭另一个继电器

Turning One Raspberry Pi I2C Connected Relay On Turns the Other Relay Off

目前,我有两个 2 通道 1 安培 SPDT 信号继电器控制器通过 I2C 连接到我的 Raspberry Pi 3,当我当前 运行 打开一个继电器的功能时,另一个将同时关闭(一个或另一个打开)。此外,我关闭继电器 1 的按钮和我关闭继电器 2 的按钮将关闭两个继电器。

我的程序是以 windows 形式编写的 (visual studio),我正在通过 Dll 导入访问 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);

}

这里是Relay 1 Off的代码,我不会post Relay 2 On/Off 因为基本一样,Relay2On只是在[=14之后加了一个data += 1; =].两种 'Off' 方法都会导致两个继电器都关闭。

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);
}

我想要的只是按照描述执行的方法,调用方法时打开继电器 1。当调用 Relay1Off 时,只关闭继电器 1。我敢肯定它很简单,但是正如我上面所说的,C 对我来说是很新的。

提前感谢您的贡献。

我不知道花哨的 ioctl 是如何工作的,但我会尝试在此函数之外进行所有初始化,包括将所有 GPIO 设置为输出。

您应该只调用一个函数来 set/clear 一个中继。我会做这样的事情来开始:

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);
}

你传入你想要控制的继电器,以及enable/disable的布尔值。如果您将数据变量设置为静态,它将 "remember" 从函数调用到函数调用的值。 enable/disable sets/clears 您传入的任何继电器的位 (0-7)。