2016-06-03 16:11:10 -04:00
|
|
|
/*THE WORKING VERSION OF THE 4 BUTTON KEYBOARD
|
2016-06-03 16:11:37 -04:00
|
|
|
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
|
|
|
|
*/
|
2016-06-03 16:11:10 -04:00
|
|
|
//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,
|
2016-06-03 16:11:37 -04:00
|
|
|
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 |
|
|
|
|
*/
|
2016-06-03 16:11:10 -04:00
|
|
|
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
|
2016-06-03 16:11:37 -04:00
|
|
|
}
|
2016-06-03 16:11:10 -04:00
|
|
|
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;
|
2016-06-03 16:11:37 -04:00
|
|
|
}
|
2016-06-03 16:11:10 -04:00
|
|
|
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;
|
2016-06-03 16:11:37 -04:00
|
|
|
}
|
2016-06-03 16:11:10 -04:00
|
|
|
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;
|
2016-06-03 16:11:37 -04:00
|
|
|
}
|
2016-06-03 16:11:10 -04:00
|
|
|
else {
|
|
|
|
var = var + 10;
|
|
|
|
lastDebounceTime2 = millis();
|
|
|
|
v4 = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-06-03 16:25:35 -04:00
|
|
|
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;
|
|
|
|
}
|
2016-06-03 16:11:37 -04:00
|
|
|
// this whole section controls what letters correspond to what numbers,
|
|
|
|
// and when to send the letter out
|
2016-06-03 16:11:10 -04:00
|
|
|
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.
|
|
|
|
}
|
|
|
|
}
|
2016-06-03 16:11:37 -04:00
|
|
|
// 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,
|
2016-06-03 16:11:10 -04:00
|
|
|
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.
|
2016-06-03 16:11:37 -04:00
|
|
|
//the top two button can add + 5 and - 1, so doing - 5 and + 1 will reset the
|
2016-06-03 16:11:10 -04:00
|
|
|
//variable to what it would normally be.
|
|
|
|
var = var + 1; //the same here too
|
|
|
|
}
|
|
|
|
}
|
2016-06-03 16:11:37 -04:00
|
|
|
//the same goes for the below code, but with different buttons for
|
2016-06-03 16:11:10 -04:00
|
|
|
//multipress, and different actions based on that
|
|
|
|
if (v2 == 1) {
|
|
|
|
if (v4 == 1) {
|
|
|
|
Serial.print(" ");
|
|
|
|
v2 = 0;
|
|
|
|
v4 = 0;
|
|
|
|
var = var + 1;
|
|
|
|
var = - 5;
|
|
|
|
}
|
2016-06-03 16:11:37 -04:00
|
|
|
}
|
|
|
|
if (v3 == 1) {
|
2016-06-03 16:11:10 -04:00
|
|
|
if (v4 == 1) {
|
|
|
|
Serial.println("");
|
|
|
|
v3 = 0;
|
|
|
|
v4 = 0;
|
|
|
|
var = var + 1;
|
|
|
|
var = var - 10;
|
|
|
|
}
|
2016-06-03 16:11:37 -04:00
|
|
|
}
|
|
|
|
if (v1 == 1) {
|
2016-06-03 16:11:10 -04:00
|
|
|
if (v2 == 1) {
|
|
|
|
Serial.print(".");
|
|
|
|
v1 = 0;
|
|
|
|
v2 = 0;
|
|
|
|
var = var - 1;
|
|
|
|
var = var - 5;
|
|
|
|
}
|
2016-06-03 16:11:37 -04:00
|
|
|
}
|
2016-06-03 16:11:10 -04:00
|
|
|
//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;
|
|
|
|
}
|