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

时间:2019-07-17 20:23:31

标签: c raspberry-pi hardware i2c smbus

当前,我有两个通过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对我来说还是很新的。

在此先感谢您的贡献。

1 个答案:

答案 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)中传递的任何中继的位。