/*THE WORKING VERSION OF THE 4 BUTTON KEYBOARD LAYOUT RedWire->| | ____________ | L1 L2 | | | | | | L3 L4 | | | ------------ | | | | ---- L1 = buttonState3, b4, v1, var + 5 L2 = buttonState1, b2, v3, var - 1 L3 = buttonState, b1, v2, var + 1 L3 = buttonState2, b3, v4, var + 10 */ //Ints for counting multipress int v1 = 0; int v2 = 0; int v3 = 0; int v4 = 0; //ints for button pins (only b1 - 4 are in use) const int b1 = 2; const int b2 = 3; const int b3 = 4; const int b4 = 5; const int b5 = 6; const int b6 = 7; //int for counting number and submit int var = 0; int subvar = 0; //Not sure what this does, but don't want to delete it int ptrue = 0; //ints for counting button presses int buttonState = 0; int lastButtonState = 0; int buttonState1 = 0; int lastButtonState1 = 0; int buttonState2 = 0; int lastButtonState2 = 0; int buttonState3 = 0; int lastButtonState3 = 0; //ints for debouncing each button long debounceDelay = 50; long lastDebounceTime = 0; int state = 0; long lastDebounceTime1 = 0; int state1 = 0; long lastDebounceTime2 = 0; int state2 = 0; long lastDebounceTime3 = 0; int state3 = 0; /* the pins are set up as inputs and then set high, so that when the button is grounded it will notice it and count it as a button press. this way, there are no resistors needed for the curcuit. The button should be connected from the pin, to the button, to ground, like this: PIN# --> Pin1 of button |--| -- Ground ^ Button | */ void setup() { Serial.begin(9600); Serial.println("Begin Typing"); pinMode(b1, INPUT); pinMode(b2, INPUT); pinMode(b3, INPUT); pinMode(b4, INPUT); pinMode(b5, INPUT); pinMode(b6, INPUT); digitalWrite(b1, HIGH); digitalWrite(b2, HIGH); digitalWrite(b3, HIGH); digitalWrite(b4, HIGH); digitalWrite(b5, HIGH); digitalWrite(b6, HIGH); } void loop() { state3 = digitalRead(b4); //read if grounded or not if ((millis() - lastDebounceTime3) > debounceDelay) { //if the button has not been pressed within debouncetime, do... buttonState3 = digitalRead(b4); if (buttonState3 != lastButtonState3) { //if the button is different from before (it was pessed) do... if (buttonState3 == HIGH) { //if the switch was released, do... lastDebounceTime3 = millis(); v1 = 0; //reset the multipress counter, so it does not count it as a press after you release the button } else { //if switch pressed, do... var = var + 5; //setting for what the button does lastDebounceTime3 = millis(); //reset the last debounce v1 = 1; //set multipress variable to one, or, pressed } } } //the same goes for this state = digitalRead(b1); if ((millis() - lastDebounceTime) > debounceDelay) { buttonState = digitalRead(b1); if (buttonState != lastButtonState) { if (buttonState == HIGH) { lastDebounceTime = millis(); v2 = 0; } else { var = var + 1; lastDebounceTime = millis(); v2 = 1; } } } //and this state1 = digitalRead(b2); if ((millis() - lastDebounceTime1) > debounceDelay) { buttonState1 = digitalRead(b2); if (buttonState1 != lastButtonState1) { if (buttonState1 == HIGH) { lastDebounceTime1 = millis(); v3 = 0; } else { var = var - 1; lastDebounceTime1 = millis(); v3 = 1; } } } //... and this state2 = digitalRead(b3); if ((millis() - lastDebounceTime2) > debounceDelay) { buttonState2 = digitalRead(b3); if (buttonState2 != lastButtonState2) { if (buttonState2 == HIGH) { lastDebounceTime2 = millis(); v4 = 0; } else { var = var + 10; lastDebounceTime2 = millis(); v4 = 1; } } } characters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; if (subvar == 1) { if (var <= sizeof(characters) && var > 0) { Serial.print(characters[var - 1]); } subvar = 0; var = 0; } // this whole section controls what letters correspond to what numbers, // and when to send the letter out if (var == 1) { //if the variable is 1, if (subvar == 1) { //and, if you pressed the submit button, Serial.print('A'); //print the letter 'A' (A is the first letter in the alphabet) subvar = 0; //reset the submit button so it doesnt happen forever var = 0; //reset the variable, so you can count to the next word. } } // i know everything above could've been done with a map, but, i didn't do it like that. //this next code part control all the multipress. if (v1 == 1) { //if one of the two buttons in the multipress section was pressed, if (v3 == 1) { //and the second button in the multipress section was pressed, subvar = 1; //do what you want that multipres section to do. In this case, it was //presss the top two buttons to submit the number. v1 = 0; //reset multipress button stats v3 = 0; //ya, again var = var - 5; //take into account what would normall happen to the variable. //the top two button can add + 5 and - 1, so doing - 5 and + 1 will reset the //variable to what it would normally be. var = var + 1; //the same here too } } //the same goes for the below code, but with different buttons for //multipress, and different actions based on that if (v2 == 1) { if (v4 == 1) { Serial.print(" "); v2 = 0; v4 = 0; var = var + 1; var = - 5; } } if (v3 == 1) { if (v4 == 1) { Serial.println(""); v3 = 0; v4 = 0; var = var + 1; var = var - 10; } } if (v1 == 1) { if (v2 == 1) { Serial.print("."); v1 = 0; v2 = 0; var = var - 1; var = var - 5; } } //reset the button states. not sure if i still need these, but dont want to risk deleting them. // lastButtonState = buttonState; lastButtonState1 = buttonState1; lastButtonState2 = buttonState2; lastButtonState3 = buttonState3; }