Introduction: I2C Relay Met Arduino IDE
I order a nice relayboard but there was no ArduinoIDE instruction, just Raspberry Pi e.o. I find out how to use it with Arduino and wanna share it so you can save that time.
Original RaspberryPi example:
wiki.52pi.com/index.php/DockerPi_4_Channel_Relay_SKU:_EP-0099
Nice thing is that you can stack up to 4 boards. So you can use max. 4 x 4 = 16 relay's on one I2C bus.
There are also some cons:
- little terminas, don't fit 1 mm2 wire
you cannot change the wiring of the bottom connectors when they are stacked together
But still handy board's.
Step 1: Wirering
In the pictures you can see the wirering.
The 52Pi needs both 5V (for relay's) en 3.3V ( I2C chip ).
So 5 wires needed:
- GND to GND
- 5 V to 5 V
- 3.3 V to 3.3 V
- SLA to SLA
- SCL to SCL
If you use an Arduino UNO or other 5 V be ware of the max 3,6 V from the I2C controller ! Use resistors or else to lower the 5 V out of the Arduino PIN's !
Step 2: Simple Code Example:
/* Arduino IDE (ESP) example for I2C relaisboard.
* By Laurens Korste <a href="http://www.boktorrobotica.nl" rel="nofollow"> www.boktorrobotica.nl
</a>
* free to use.
*/
#include <Wire.h> // for I2C communication
void setup() {
// this rule not for UNO or boards with dedicated I2C pins
Wire.begin(D1, D2); // join i2c bus with SDA=D1 and SCL=D2 for NodeMCU
}
void loop() {
Wire.beginTransmission(0x10);/* begin transmitting to I2C adress 10 ( to change also to 11, 12 or 13 ) */
Wire.write(0x01); /* choice relais 1 ( out of 4 ) on board 10 ( also 0x02, 0x03, 0x04 ) */
Wire.write(0xFF); /* set relais 1 on board 10 to ON. all numbers > 0 will do so */
Wire.endTransmission(); /* stop transmitting */
delay(3000);
Wire.beginTransmission(0x10); /* */
Wire.write(0x01);
Wire.write(0x00); /* set relais 1 on board 10 to OFF */
Wire.endTransmission(); /* stop transmitting */
delay(3000);
}Attachments
Step 3: Four Relay Test Code
/* sketch by Laurens Korste for Arduino (ESP / NodeMCU)
* But other boards will do also
* <a href="http://www.boktorrobotica.nl" rel="nofollow"> www.boktorrobotica.nl </a>
* In this skeych al the 4 relay's will be activated en deactivated
*/
#include <Wire.h> // for I2C communication
void setup() {
Serial.begin(115200); // begin serial for debug (9600 for UNO)
Wire.begin(D1, D2); // join i2c bus with SDA=D1 and SCL=D2 of NodeMCU no need for UNO
}
void loop() {
for (int i=1; i<=4; i++){
Wire.beginTransmission(0x10); // begin with device address
Wire.write(i); // choice the relais
Wire.write(0xFF); // send the "on" code FF (every count from 01 to FF will do)
Wire.endTransmission(); // stop transmitting
Serial.write(i);
Serial.println(" aan ");
delay(1000);
Wire.beginTransmission(0x10); // begin with device address
Wire.write(i);
Wire.write(0x00); // Send the "off" code
Wire.endTransmission(); // stop transmitting
Serial.write(i);
Serial.println(" uit ");
delay(1000);
}
}Attachments
Step 4: My Project
I have written a code to operate my 3 shutters.
This can be done with switches but also with the BLYNK app, See image.
- One short press will start moving one shutter ( or stop it when it's moving ).
- One long press and all three shutters open ( or close or stop ).
- Double pressure: the shutters go to the "holes" position.
As can be seen in the picture, I also integrated a temperature and light sensor.
Now everything on a good base PCB and neatly in a box.
Step 5: Call a Relay With One Command
It is useful if you only need one command to activate or deactivate a relay. Below is a function that can do this (with lowbyte and highbyte).
/* sketch by Laurens Korste for Arduino (ESP / NodeMCU) with I2C relaysboard<br>
* But other boards will do also
* href="http://www.boktorrobotica.nl ; www.boktorrobotica.nl
* https://wiki.52pi.com/index.php/DockerPi_4_Channel_Relay_SKU:_EP-0099 ; www.boktorrobotica.nl
* In this sketch the relay will be activated by one call;
*//
#include <Wire.h> // for I2C communication
// Relays declaratie. 4 PCB's Per PCB 4 relays possible. In this sketch only two PCB
// PCB and relays are merged so that they can be called with one command
const byte PutOn=0xFF; //command to switch on
const byte PutOff=0x00; //comand to switch off
const word Relay1bord1=0x1001; //you can chance the names by example Relay1
const word Relay2bord1=0x1002; //you can chance the names by example Relay2
const word Relay3bord1=0x1003; //you can chance the names by example Relay3
const word Relay4bord1=0x1004; //you can chance the names by example Relay4
const word Relay1bord2=0x1101; //you can chance the names by example Relay5
const word Relay2bord2=0x1102; //you can chance the names by example Relay6
const word Relay3bord2=0x1103; //you can chance the names by example Relay7
const word Relay4bord2=0x1104; //you can chance the names by example Relay8
const word Relay1bord3=0x1201; //you can chance the names by example Relay9
const word Relay2bord4=0x1302; //you can chance the names by example Relay14
void setup() {<br> Serial.begin(115200); // begin serial for debug (9600 for UNO)
Wire.begin(D1, D2); // join i2c bus with SDA=D1 and SCL=D2 of NodeMCU no need for UNO
}
void loop() { // to switch relay 4 on PCB 2 on
RelayActie(Relay4bord2,PutOn);
delay(1000); // to switch relay 4 on PCB 2 off
RelayActie(Relay4bord2,PutOff);
delay(1000);
}
void RelayActie(word Relay, byte OnOrOff){
Wire.beginTransmission (highByte(Relay));
Wire.write (lowByte(Relay));
Wire.write (OnOrOff);
Wire.endTransmission();
}




