打开一个 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)。
目前,我有两个 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)。