Library for I2C 4 channel relay module
Dependents: K9_Head_Controller
MultiChannelRelay.cpp
- Committer:
- SomeRandomBloke
- Date:
- 2020-09-08
- Revision:
- 0:661beaa91d83
File content as of revision 0:661beaa91d83:
/* MultiChannelRelay.h Seeed multi channel relay library Copyright (c) 2018 Seeed Technology Co., Ltd. Author : lambor Create Time : June 2018 Change Log : This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "MultiChannelRelay.h" MultiChannelRelay::MultiChannelRelay(I2C *i2c, uint8_t slave_adr) : _i2c(i2c) //, _i2cAddr(slave_adr) { channel_state = 0; _i2cAddr = slave_adr << 1; } uint8_t MultiChannelRelay::getFirmwareVersion(void) { char cmd[2]; cmd[0] = CMD_READ_FIRMWARE_VER; sendToDevice( cmd, 1, 1, 10 ); return cmd[0]; } void MultiChannelRelay::changeI2CAddress(uint8_t old_addr, uint8_t new_addr) { char cmd[2]; cmd[0] = CMD_SAVE_I2C_ADDR; cmd[1] = new_addr; sendToDevice( cmd, 2, 0, 10 ); _i2cAddr = new_addr; } uint8_t MultiChannelRelay::getChannelState(void) { return channel_state; } void MultiChannelRelay::channelCtrl(uint8_t state) { channel_state = state; char cmd[2]; cmd[0] = CMD_CHANNEL_CTRL; cmd[1] = channel_state; sendToDevice( cmd, 2, 0, 10 ); } void MultiChannelRelay::turn_on_channel(uint8_t channel) { channel_state |= (1 << (channel - 1)); char cmd[2]; cmd[0] = CMD_CHANNEL_CTRL; cmd[1] = channel_state; sendToDevice( cmd, 2, 0, 10 ); } void MultiChannelRelay::turn_off_channel(uint8_t channel) { channel_state &= ~(1 << (channel - 1)); char cmd[2]; cmd[0] = CMD_CHANNEL_CTRL; cmd[1] = channel_state; sendToDevice( cmd, 2, 0, 10 ); } /** Send a request to the chip, perform a wait and get response * @param cmd Pointer to character array containing request, no line endings needed * @param reqSize Size of the request in characters * @param respSize Size of the response in bytes, must be at least 1 character * @param msWait Delay between sending request and reading response in mS * @return true/false to indicate command was processed sucessfully or not, true success, false failure */ bool MultiChannelRelay::sendToDevice( char *cmd, int reqSize, int respSize, long msWait ) { bool retstat = false; int result = -10; _i2c->frequency(100000); _i2c->lock(); result = _i2c->write(_i2cAddr, cmd, reqSize); if ( result ) { _i2c->unlock(); return retstat; } wait_us( msWait * 100 ); if( respSize == 0 ) { _i2c->unlock(); return true; } result = _i2c->read(_i2cAddr, cmd, respSize); _i2c->unlock(); if ( result ) { } else retstat = true; return retstat; }