Version 02 of Relay
This commit is contained in:
1 parent
ec078c0d00
commit
dd5a8b28f7
5 files changed
+343
-237
No files matched your search
+89
-81
@@ -1,102 +1,110 @@
|
||||
#include "I2CRelay.h"
|
||||
|
||||
I2CRelay::I2CRelay(uint8_t address, uint8_t sda, uint8_t scl)
|
||||
: _address(address), _sda(sda), _scl(scl) {}
|
||||
// Command codes
|
||||
#define CMD_SET_ADDR 0x01
|
||||
#define CMD_SET_NAME 0x02
|
||||
#define CMD_RELAY_SET 0x10
|
||||
#define CMD_RELAY_ALL 0x11
|
||||
#define CMD_RELAY_TIMER 0x12
|
||||
#define CMD_RELAY_ALL_TIMER 0x13
|
||||
|
||||
I2CRelay::I2CRelay(uint8_t sda, uint8_t scl)
|
||||
: _sda(sda), _scl(scl) {}
|
||||
|
||||
void I2CRelay::begin() {
|
||||
Wire.begin(_sda, _scl);
|
||||
}
|
||||
|
||||
void I2CRelay::setRelay(uint8_t relayNum, uint8_t state) {
|
||||
if (relayNum < 1 || relayNum > 8) return;
|
||||
Wire.beginTransmission(_address);
|
||||
Wire.write(0xA0);
|
||||
Wire.write(relayNum - 1); // Map 1-8 to 0-7
|
||||
Wire.write(state);
|
||||
Wire.endTransmission();
|
||||
}
|
||||
|
||||
void I2CRelay::setAllRelays(uint8_t state) {
|
||||
for (uint8_t i = 1; i <= 8; i++) {
|
||||
setRelay(i, state);
|
||||
delay(10);
|
||||
void I2CRelay::scan(Stream &out) {
|
||||
out.println("Scanning I2C bus...");
|
||||
uint8_t count = 0;
|
||||
for (uint8_t address = 1; address < 127; address++) {
|
||||
Wire.beginTransmission(address);
|
||||
uint8_t error = Wire.endTransmission();
|
||||
if (error == 0) {
|
||||
out.print("I2C device found at address 0x");
|
||||
if (address < 16) out.print("0");
|
||||
out.print(address, HEX);
|
||||
out.println(" !");
|
||||
count++;
|
||||
}
|
||||
delay(2);
|
||||
}
|
||||
}
|
||||
|
||||
void I2CRelay::setDeviceName(const String &name) {
|
||||
Wire.beginTransmission(_address);
|
||||
Wire.write(0xD0);
|
||||
for (uint8_t i = 0; i < name.length() && i < 24; i++) {
|
||||
Wire.write(name[i]);
|
||||
if (count == 0) {
|
||||
out.println("No I2C devices found.");
|
||||
} else {
|
||||
out.print("Scan complete, devices found: ");
|
||||
out.println(count);
|
||||
}
|
||||
Wire.endTransmission();
|
||||
out.println();
|
||||
}
|
||||
|
||||
void I2CRelay::setI2CAddress(uint8_t newAddr) {
|
||||
if (newAddr < 8 || newAddr > 119) return;
|
||||
Wire.beginTransmission(_address);
|
||||
Wire.write(0xC0);
|
||||
void I2CRelay::setSlaveAddress(uint8_t oldAddr, uint8_t newAddr, Stream &out) {
|
||||
Wire.beginTransmission(oldAddr);
|
||||
Wire.write(CMD_SET_ADDR);
|
||||
Wire.write(newAddr);
|
||||
Wire.endTransmission();
|
||||
out.print("Sent address change command: 0x");
|
||||
out.print(oldAddr, HEX);
|
||||
out.print(" -> 0x");
|
||||
out.println(newAddr, HEX);
|
||||
delay(1200); // Give slave time to restart
|
||||
}
|
||||
|
||||
String I2CRelay::getIdentification() {
|
||||
Wire.requestFrom(_address, (uint8_t)40);
|
||||
String id = "";
|
||||
void I2CRelay::setSlaveName(uint8_t addr, const char* newName, Stream &out) {
|
||||
Wire.beginTransmission(addr);
|
||||
Wire.write(CMD_SET_NAME);
|
||||
Wire.write((const uint8_t*)newName, strlen(newName));
|
||||
Wire.endTransmission();
|
||||
out.print("Sent name change command to 0x");
|
||||
out.print(addr, HEX);
|
||||
out.print(": ");
|
||||
out.println(newName);
|
||||
}
|
||||
|
||||
String I2CRelay::requestSlaveInfo(uint8_t addr) {
|
||||
Wire.requestFrom(addr, (uint8_t)40);
|
||||
String response = "";
|
||||
while (Wire.available()) {
|
||||
char c = Wire.read();
|
||||
id += c;
|
||||
response += c;
|
||||
}
|
||||
return id;
|
||||
return response;
|
||||
}
|
||||
|
||||
void I2CRelay::handleSerialCommand(const String &cmd) {
|
||||
if (cmd.startsWith("r ")) {
|
||||
int space1 = cmd.indexOf(' ');
|
||||
int space2 = cmd.indexOf(' ', space1 + 1);
|
||||
if (space1 > 0 && space2 > space1) {
|
||||
int relay = cmd.substring(space1 + 1, space2).toInt();
|
||||
int state = cmd.substring(space2 + 1).toInt();
|
||||
if (relay >= 1 && relay <= 8 && (state == 0 || state == 1)) {
|
||||
setRelay(relay, state);
|
||||
Serial.print("Relay ");
|
||||
Serial.print(relay);
|
||||
Serial.print(" set to ");
|
||||
Serial.println(state ? "ON" : "OFF");
|
||||
} else {
|
||||
Serial.println("Invalid relay number or state. Use 1-8 and 0/1.");
|
||||
}
|
||||
} else {
|
||||
Serial.println("Usage: r <relayNum 1-8> <0|1>");
|
||||
}
|
||||
} else if (cmd.startsWith("all ")) {
|
||||
int state = cmd.substring(4).toInt();
|
||||
if (state == 0 || state == 1) {
|
||||
setAllRelays(state);
|
||||
Serial.print("All relays set to ");
|
||||
Serial.println(state ? "ON" : "OFF");
|
||||
} else {
|
||||
Serial.println("Invalid state for all.");
|
||||
}
|
||||
} else if (cmd.startsWith("name ")) {
|
||||
String name = cmd.substring(5);
|
||||
setDeviceName(name);
|
||||
Serial.print("Device name set to: ");
|
||||
Serial.println(name);
|
||||
} else if (cmd.startsWith("addr ")) {
|
||||
int newAddr = cmd.substring(5).toInt();
|
||||
if (newAddr >= 8 && newAddr <= 119) {
|
||||
setI2CAddress(newAddr);
|
||||
Serial.print("I2C address set to: ");
|
||||
Serial.println(newAddr, HEX);
|
||||
} else {
|
||||
Serial.println("Invalid address.");
|
||||
}
|
||||
} else if (cmd == "id") {
|
||||
String id = getIdentification();
|
||||
Serial.print("ID: ");
|
||||
Serial.println(id);
|
||||
} else {
|
||||
Serial.println("Unknown command.");
|
||||
}
|
||||
// Relay control
|
||||
bool I2CRelay::setRelay(uint8_t addr, uint8_t relay, bool on) {
|
||||
Wire.beginTransmission(addr);
|
||||
Wire.write(CMD_RELAY_SET);
|
||||
Wire.write(relay);
|
||||
Wire.write(on ? 1 : 0);
|
||||
return Wire.endTransmission() == 0;
|
||||
}
|
||||
|
||||
bool I2CRelay::setAllRelays(uint8_t addr, bool on) {
|
||||
Wire.beginTransmission(addr);
|
||||
Wire.write(CMD_RELAY_ALL);
|
||||
Wire.write(on ? 1 : 0);
|
||||
return Wire.endTransmission() == 0;
|
||||
}
|
||||
|
||||
bool I2CRelay::setRelayTimer(uint8_t addr, uint8_t relay, uint32_t ms) {
|
||||
Wire.beginTransmission(addr);
|
||||
Wire.write(CMD_RELAY_TIMER);
|
||||
Wire.write(relay);
|
||||
Wire.write((uint8_t)(ms & 0xFF));
|
||||
Wire.write((uint8_t)((ms >> 8) & 0xFF));
|
||||
Wire.write((uint8_t)((ms >> 16) & 0xFF));
|
||||
Wire.write((uint8_t)((ms >> 24) & 0xFF));
|
||||
return Wire.endTransmission() == 0;
|
||||
}
|
||||
|
||||
bool I2CRelay::setAllRelaysTimer(uint8_t addr, uint32_t ms) {
|
||||
Wire.beginTransmission(addr);
|
||||
Wire.write(CMD_RELAY_ALL_TIMER);
|
||||
Wire.write((uint8_t)(ms & 0xFF));
|
||||
Wire.write((uint8_t)((ms >> 8) & 0xFF));
|
||||
Wire.write((uint8_t)((ms >> 16) & 0xFF));
|
||||
Wire.write((uint8_t)((ms >> 24) & 0xFF));
|
||||
return Wire.endTransmission() == 0;
|
||||
}
|
||||
+11
-11
@@ -6,22 +6,22 @@
|
||||
|
||||
class I2CRelay {
|
||||
public:
|
||||
I2CRelay(uint8_t address = 0x08, uint8_t sda = 8, uint8_t scl = 3);
|
||||
I2CRelay(uint8_t sda = SDA, uint8_t scl = SCL);
|
||||
|
||||
void begin();
|
||||
void setRelay(uint8_t relayNum, uint8_t state);
|
||||
void setAllRelays(uint8_t state);
|
||||
void setDeviceName(const String &name);
|
||||
void setI2CAddress(uint8_t newAddr);
|
||||
String getIdentification();
|
||||
void scan(Stream &out = Serial);
|
||||
void setSlaveAddress(uint8_t oldAddr, uint8_t newAddr, Stream &out = Serial);
|
||||
void setSlaveName(uint8_t addr, const char* newName, Stream &out = Serial);
|
||||
String requestSlaveInfo(uint8_t addr);
|
||||
|
||||
// Helper for command parsing (optional)
|
||||
void handleSerialCommand(const String &cmd);
|
||||
// Relay control
|
||||
bool setRelay(uint8_t addr, uint8_t relay, bool on);
|
||||
bool setAllRelays(uint8_t addr, bool on);
|
||||
bool setRelayTimer(uint8_t addr, uint8_t relay, uint32_t ms);
|
||||
bool setAllRelaysTimer(uint8_t addr, uint32_t ms);
|
||||
|
||||
private:
|
||||
uint8_t _address;
|
||||
uint8_t _sda;
|
||||
uint8_t _scl;
|
||||
uint8_t _sda, _scl;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user