#include <assert.h>
const byte addrPins[] = {53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23};
const byte nbPins = sizeof addrPins / sizeof * addrPins;
static_assert((nbPins <= 16), "too many pins. Max is 16");
static_assert((nbPins >= 1), "Not enough pins. Min is 1");
uint16_t previousAddress = 0;
void printAddress(uint16_t addr) {
Serial.print(F("address :"));
for (int b = nbPins - 1; b >= 0; b--) {
Serial.print(bitRead(addr, b));
}
Serial.println();
}
uint16_t readAddress() {
uint16_t sample = 0;
for (int i = 0; i < nbPins; i++) {
if (digitalRead(addrPins[i]) == LOW) bitSet(sample, nbPins-1-i); // INPUT_PULLUP so LOW means selected
}
return sample;
}
void setup() {
for (byte p : addrPins) pinMode(p, INPUT_PULLUP);
Serial.begin(115200);
Serial.println(F("Ready"));
}
void loop() {
uint16_t currentAddress = readAddress();
if (currentAddress != previousAddress) {
previousAddress = currentAddress;
printAddress(currentAddress);
}
}