CTRL library / Object groups

Grouped rotary encoders

This sketch demonstrates the grouping of rotary encoders, with shared event handlers.

Groups offer another way to handle a large number of rotary encoders. They let you use one shared event handler. If we then provide the rotary encoders with some data, in the form of setters: setInteger(), setString() & setBoolean(), we can retrieve this data in the event handler and take action based on this data. Getting the data is done with the following getters: getInteger(), getString() & getBoolean().

The code

grouped_rotary_encoders.ino
#include <CtrlGroup.h>#include <CtrlEnc.h> // Create a rotary encoder group.CtrlGroup encoderGroup; // Create 2 rotary encoders with: clk pin number & dt pin number.CtrlEnc encoder1(2, 3);CtrlEnc encoder2(4, 5); // Define an onTurnLeft handler. This will be triggered by all rotary encoders registered to the group.void onTurnLeft(Groupable& encoder) {  // Retrieve the variables we need within this handler.  auto canPrint = encoder.getBoolean("canPrint");  auto id = encoder.getInteger("id");  auto name = encoder.getString("name");  // if the rotary encoder can print, we print to the serial monitor.  if (canPrint) {    Serial.print("Turn left encoder with id: ");    Serial.print(id);    Serial.print(" / Name: ");    Serial.println(name);  }} // Define an onTurnRight handler. This will be triggered by all rotary encoders registered to the group.void onTurnRight(Groupable& encoder) {  // Retrieve the variables we need within this handler.  bool canPrint = encoder.getBoolean("canPrint");  int id = encoder.getInteger("id");  String name = encoder.getString("name");  // if the rotary encoder can print, we print to the serial monitor.  if (canPrint) {    Serial.print("Turn right encoder with id: ");    Serial.print(id);    Serial.print(" / name: ");    Serial.println(name);  }} void setup() {  Serial.begin(9600);   // Register the onTurnLeft & onTurnRight handler with the group.  encoderGroup.setOnTurnLeft(onTurnLeft);  encoderGroup.setOnTurnRight(onTurnRight);   // Register the rotary encoders to the group.  encoder1.setGroup(&encoderGroup);  encoder2.setGroup(&encoderGroup);   // Set all variables needed for rotary encoder 1 & 2.  encoder1.setInteger("id", 0);  encoder1.setString("name", "Encoder 1");  encoder1.setBoolean("canPrint", true);  encoder2.setInteger("id", 1);  encoder2.setString("name", "Encoder 2");  encoder2.setBoolean("canPrint", true);} void loop() {  // Process all rotary encoders registered to the group.  encoderGroup.process();}