/*
------------[CAUTION]------------
This is a matrix only working if one button is pressed at a time.
If you want to create one recognising multiple different buttonpresses at the same time => put diodes after each button.
Couldn't do that, because wokwi doesn't support diodes and the INPUT is distorted if using LEDs (Voltage devider formular doesn't work with them)
*/
#include <Arduino.h>
//#include "HDI.h"
#define COLUMNS 4
#define ROWS 3
int columns[COLUMNS] = {9, 8, 7, 6};
int rows[ROWS] = {12, 11, 10};
static boolean activatedColumns[COLUMNS] = {false, false, false, false};
int calculateOutput(int pColumn, int pRow){
return pRow * COLUMNS + (pColumn+1);
}
void resetActivatedColumnsArray(){
for(bool & activatedColumn : activatedColumns){
activatedColumn = false;
}
}
void scanRow(int pRow){
resetActivatedColumnsArray();
digitalWrite(pRow, HIGH);
for(int i = 0; i < COLUMNS; i++){
if(digitalRead(columns[i]) == HIGH){
activatedColumns[i] = true;
}
}
digitalWrite(pRow, LOW);
}
void setup(){
Serial.begin(9600);
Serial.println("Starting setup...");
for(int column : columns) {
pinMode(column, INPUT);
digitalWrite(column, LOW);
}
for(int row : rows){
pinMode(row, OUTPUT);
digitalWrite(row, LOW);
}
Serial.println("Finished setup...");
}
void loop(){
for(int r = 0; r < ROWS; r++){
scanRow(rows[r]);
for(int c = 0; c < COLUMNS; c++){
if(activatedColumns[c]){
Serial.println("PressedButton: " + String(calculateOutput(c, r)));
}
}
}
}