Paso 8: código
/ * Dispositivo de entrada de teclado de TiltKey - A basado en inclinación. Escrito por Alec Robinson. Publicado bajo licencia Creative Commons Atribución Compartir-igual. * / #include < LiquidCrystal.h > LiquidCrystal lcd (7, 8, 9, 10, 11, 12); int valores [] = {665, 533, 555, //a 580, 340, 533, //b 415, 285, 502, //c 230, 385, 460, //d 200, 510, 460, //e 270, 710, 500, //f 440, 774, 497, //g 632, 673, 525, //h 570, 525, 680, //i 385, 547, 745, //j 220, 511, 630, //k 300, 520, 280, //l 480, 513, 265, //m 640, 500, 380, //n 510, 700, 340 //o 470, 370, 330, //p 400, 340, 650, //q 400, 700, 680, //r 650, 470, 450, //s 660, 600, 500, //t 640, 570, 610, //u 633, 470, 600, //v 200, 460, 515, //w 200, 610, 540, 600, //x 250, 340, //y //and 230, 515, 360 //z}; Todos los caracteres de posiciones int = 1; 1 = Letras 2 = números y símbolos int umbral = 45; El margen de los usuarios de error int shakethresh = 265; Umbral para determinar agitación char Letras [] = {'a', 'b', 'c', sería ', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', soy ', ' n ', 'o', 'p', 'q', 'r', de ', ' t ', 'u', 'v', 'w', 'x', 'y', 'z'}; char los números [] = {KEY_RETURN, KEY_UP_ARROW, '0', '1', '2', 3', '4', KEY_DOWN_ARROW, KEY_LEFT_ARROW, '5', '6', '7', '8', KEY_RIGHT_ARROW, '9', '/', '. ',', ',';', 39, ' [', ']', '=', '-'}; char shiftnumbers [] = {32, 'w', ')', '!', ' '#', '$', 's', 'a', '%', '^', '&', '*', 'd', '(', '?', '>', '<', ':', '"', '{', '}', '+', '_'}; int cuenta = 0; int prevx, prevy, prevz; Permite determinar la agitación. Compara anterior xs y ys y zs a los actuales, y si la distancia es más que shakethresh, sacudió. void setup () {lcd.begin (16, 2); Serial.Begin(9600); Keyboard.Begin(); analogReference(EXTERNAL); Delay(2000); Prevx = analogRead(0); prevy = analogRead(1); prevz = analogRead(2); } void loop () {boolean cambio =! digitalRead(3); int x = analogRead(0); int y = analogRead(1); int z = analogRead(2); int testingnum = 0; lcd.clear(); si (charset == 1) {mientras que (testingnum/3 < = 26) {//Compares corriente coordina a los [valores] si (x > = valores [testingnum] - umbral & & x < = valores [testingnum] + umbral & & y > = valores umbral de [testingnum + 1] - & & y < = valores [testingnum + 1] + umbral & & z > = valores umbral de [testingnum + 2] - & & z < = valores [ testingnum + 2] + umbral) {lcd.setCursor(0,0); si (! cambio) lcd.print(letters[testingnum/3]); más lcd.print(char(letters[testingnum/3]-32)); //Capital Serial.println(letters[testingnum/3]); si (! digitalRead(2)) {si (! cambio) Keyboard.write(letters[testingnum/3]); más Keyboard.write(letters[testingnum/3]-32); //Capital}} testingnum += 3; }} Si (charset == 2) //Numbers y símbolos {mientras que (testingnum/3 < = 24) {si (x > = valores [testingnum] - umbral & & x < = valores [testingnum] + umbral & & y > = valores umbral de [testingnum + 1] - & & y < = valores [testingnum + 1] + umbral & & z > = valores umbral de [testingnum + 2] - & & z < = valores [testingnum + 2] + umbral) {lcd.setCursor(0,0); si (! cambio) lcd.print(char(numbers[testingnum/3])); más lcd.print(char(shiftnumbers[testingnum/3])); Serial.println(Numbers[testingnum/3]); Si (! digitalRead(2)) {si (! cambio) Keyboard.write(numbers[testingnum/3]); más Keyboard.write(shiftnumbers[testingnum/3]);}} testingnum += 3; }} Serial.print("\n"); Serial.Print("\n"); lcd.setCursor (0, 1); Si (charset == 1) lcd.print("Letters"); Si (charset == 2) lcd.print ("números + símbolos"); Si (cuenta > 12) si (x > prevx + shakethresh || x < prevx - shakethresh || y > prevy + shakethresh || y < prevy - shakethresh || z > prevz + shakethresh || z < prevz - shakethresh) {//Shaking si (charset == 1) Keyboard.write(32); //Space si (charset == 2) Keyboard.write(8); //Backspace delay(250); cuenta = 0;} prevx = x; prevy = y; prevz = z; Si (! digitalRead(4)) {charset ++; si (charset == 3) conjunto de caracteres = 1;} delay(150); cuenta ++; }