// Kerl Mera //
// Multiplexing button to serial monitor

const int s0 = 8; // Digital select pins
const int s1 = 9;
const int s2 = 10;
const int s3 = 11;
const int sig = 2; // Analog read pin

boolean buttonActive[] = {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false};

int buttonState[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW,LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
int lastButtonState[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW,LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};   // the previous reading from the input pin

long lastDebounceTime[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time;

void setup() {
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(sig, INPUT);

  digitalWrite(s0, LOW);
  digitalWrite(s1, LOW);
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);

  Serial.begin(9600);
}

void loop() {

  for(int i = 0; i < 16; i++) {
    buttonState[i] = cdRead(i);
    if(buttonState[i] > 0)
    Serial.println(buttonState[i]);

    if (buttonState[i] == 1 && lastButtonState[i] == 0) {
      lastDebounceTime[i] = millis();
    } 

    if((millis() - lastDebounceTime[i]) > debounceDelay) {
      if(buttonState[i] == HIGH && buttonActive[i] == false) {
        Serial.print("Pressed: ");
        Serial.println((int) i);
        buttonActive[i] = true;
      } 
      else if(buttonState[i] == LOW) {
        buttonActive[i] = false; 
      }
    }

    lastButtonState[i] = buttonState[i];
  }

  delay(500);
}

void cdSelect(unsigned int ch) {

  switch (ch) {
  case 0: 
    digitalWrite(s0, LOW); 
    digitalWrite(s1, LOW); 
    digitalWrite(s2, LOW); 
    digitalWrite(s3, LOW); 
    break;
  case 1: 
    digitalWrite(s0, HIGH); 
    digitalWrite(s1, LOW); 
    digitalWrite(s2, LOW); 
    digitalWrite(s3, LOW); 
    break;
  case 2: 
    digitalWrite(s0, LOW); 
    digitalWrite(s1, HIGH); 
    digitalWrite(s2, LOW); 
    digitalWrite(s3, LOW); 
    break;
  case 3: 
    digitalWrite(s0, HIGH); 
    digitalWrite(s1, HIGH); 
    digitalWrite(s2, LOW); 
    digitalWrite(s3, LOW); 
    break;
  case 4: 
    digitalWrite(s0, LOW); 
    digitalWrite(s1, LOW); 
    digitalWrite(s2, HIGH); 
    digitalWrite(s3, LOW); 
    break;
  case 5: 
    digitalWrite(s0, HIGH); 
    digitalWrite(s1, LOW); 
    digitalWrite(s2, HIGH); 
    digitalWrite(s3, LOW); 
    break;
  case 6: 
    digitalWrite(s0, LOW); 
    digitalWrite(s1, HIGH); 
    digitalWrite(s2, HIGH); 
    digitalWrite(s3, LOW); 
    break;
  case 7: 
    digitalWrite(s0, HIGH); 
    digitalWrite(s1, HIGH); 
    digitalWrite(s2, HIGH);
    digitalWrite(s3, LOW);
    break;
  case 8: 
    digitalWrite(s0, LOW); 
    digitalWrite(s1, LOW); 
    digitalWrite(s2, LOW);
    digitalWrite(s3, HIGH);
    break;
  case 9: 
    digitalWrite(s0, HIGH); 
    digitalWrite(s1, LOW); 
    digitalWrite(s2, LOW);
    digitalWrite(s3, HIGH);
    break;
  case 10: 
    digitalWrite(s0, LOW); 
    digitalWrite(s1, HIGH); 
    digitalWrite(s2, LOW);
    digitalWrite(s3, HIGH);
    break;
  case 11: 
    digitalWrite(s0, HIGH); 
    digitalWrite(s1, HIGH); 
    digitalWrite(s2, LOW);
    digitalWrite(s3, HIGH);
    break;
  case 12: 
    digitalWrite(s0, LOW); 
    digitalWrite(s1, LOW); 
    digitalWrite(s2, HIGH);
    digitalWrite(s3, HIGH);
    break;
  case 13: 
    digitalWrite(s0, HIGH); 
    digitalWrite(s1, LOW); 
    digitalWrite(s2, HIGH);
    digitalWrite(s3, HIGH);
    break;
  case 14: 
    digitalWrite(s0, LOW); 
    digitalWrite(s1, HIGH); 
    digitalWrite(s2, HIGH);
    digitalWrite(s3, HIGH);
    break;
  case 15: 
    digitalWrite(s0, HIGH); 
    digitalWrite(s1, HIGH); 
    digitalWrite(s2, HIGH);
    digitalWrite(s3, HIGH);
    break;
  default: 
    break;
  } 

  
}

unsigned short cdRead(unsigned int ch) {
  cdSelect(ch);
  delay(10); 
  return analogRead(A0);
  //return digitalRead(sig); // Read the analog pin 
}
$abcdeabcde151015202530354045505560fghijfghij