Advertisement
Guest User

DIY Shifter Using Teensy 2.0

a guest
Dec 13th, 2013
587
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.94 KB | None | 0 0
  1. /*
  2. DIY Shifter
  3. Runs on a Teensy 2.0
  4. Wes Jurica - 2013
  5. */
  6.  
  7. #include <Bounce.h>
  8. #include <EEPROM.h>
  9. #include "MorseEnDecoder.h"
  10.  
  11. // Gear microswitches are connected to the following pins:
  12. #define gearR 0
  13. #define neutral 1
  14. #define gear1 2
  15. #define gear2 3
  16. #define gear3 4
  17. #define gear4 5
  18. #define gear5 6
  19. #define gear6 9
  20. #define gear7 8
  21.  
  22. int gearPins[8] = {gearR, gear1, gear2, gear3, gear4, gear5, gear6, gear7};
  23.  
  24. int currentGear = 1;
  25. int selectedGear = 1;
  26. int gearChangeDifference = 0;
  27.  
  28. int modeLed = 11;
  29. int modeButtonPin = 10;
  30. Bounce modeButton = Bounce(modeButtonPin, 35);
  31. int resetToNeutralPin = 12;
  32. Bounce resetToNeutralButton = Bounce(resetToNeutralPin, 35);
  33.  
  34. boolean isSequentialMode = false;
  35. int sequentialShiftDelay = 45;
  36.  
  37. morseEncoder morseOutput(modeLed);
  38. int morseIndex = 0;
  39. String had = "http://hackaday.com";
  40. String secret = "1n3n3n7";
  41. boolean isSecretUnlocked = false;
  42. String recentShifts[7] = {"#", "#", "#", "#", "#", "#", "#"};
  43. int recentShiftIndex = 0;
  44.  
  45. void setup()
  46. {
  47. pinMode(gear1, INPUT_PULLUP);
  48. pinMode(gear2, INPUT_PULLUP);
  49. pinMode(gear3, INPUT_PULLUP);
  50. pinMode(gear4, INPUT_PULLUP);
  51. pinMode(gear5, INPUT_PULLUP);
  52. pinMode(gear6, INPUT_PULLUP);
  53. pinMode(gear7, INPUT_PULLUP);
  54. pinMode(gearR, INPUT_PULLUP);
  55.  
  56. pinMode(modeButtonPin, INPUT_PULLUP);
  57. pinMode(modeLed, OUTPUT);
  58. pinMode(resetToNeutralPin, INPUT_PULLUP);
  59.  
  60. delay(3000);
  61.  
  62. isSequentialMode = EEPROM.read(0);
  63. digitalWrite(modeLed, isSequentialMode);
  64.  
  65. morseOutput.setspeed(26);
  66. }
  67.  
  68. void loop()
  69. {
  70. morse();
  71.  
  72. modeButtonPress();
  73. resetToNeutralButtonPress();
  74.  
  75. getSelectedGear();
  76. checkForNewGear();
  77.  
  78. delay(25); // replace with gear shift timer for no blocking
  79. }
  80.  
  81. void message(String nextGear)
  82. {
  83. if (recentShiftIndex < 6)
  84. {
  85. recentShifts[recentShiftIndex] = nextGear;
  86. recentShiftIndex++;
  87. }
  88. else
  89. {
  90. String recentShiftsString = "";
  91.  
  92. recentShifts[6] = nextGear;
  93.  
  94. for (int i = 0; i < 6; i++)
  95. {
  96. recentShiftsString += recentShifts[i];
  97. recentShifts[i] = recentShifts[i + 1];
  98. }
  99. recentShiftsString += nextGear;
  100.  
  101. if (recentShiftsString.equals(secret))
  102. {
  103. isSecretUnlocked = true;
  104. Keyboard.set_modifier(MODIFIERKEY_GUI);
  105. Keyboard.set_key1(KEY_S);
  106. Keyboard.send_now();
  107. delay(15);
  108. Keyboard.set_modifier(0);
  109. Keyboard.set_key1(0);
  110. Keyboard.send_now();
  111. delay(15);
  112. Keyboard.println("internet explorer");
  113. delay(2000);
  114. Keyboard.set_modifier(MODIFIERKEY_ALT);
  115. Keyboard.set_key1(KEY_D);
  116. Keyboard.send_now();
  117. delay(15);
  118. }
  119. }
  120. }
  121.  
  122. void morse()
  123. {
  124. if (isSecretUnlocked)
  125. {
  126. morseOutput.encode();
  127.  
  128. if(morseOutput.available())
  129. {
  130. morseOutput.write(had.charAt(morseIndex));
  131. morseOutput.encode();
  132. Keyboard.print(had.charAt(morseIndex));
  133. morseIndex++;
  134. }
  135. if (morseIndex > had.length() - 1)
  136. {
  137. morseIndex = 0;
  138. isSecretUnlocked = false;
  139. digitalWrite(modeLed, isSequentialMode);
  140. Keyboard.println("");
  141. }
  142. }
  143. }
  144.  
  145. void resetToNeutralButtonPress()
  146. {
  147. if (resetToNeutralButton.update())
  148. {
  149. if (resetToNeutralButton.fallingEdge())
  150. {
  151. if (isSequentialMode)
  152. {
  153. for (int i = 0; i < 10; i++)
  154. {
  155. Keyboard.print("z");
  156. delay(sequentialShiftDelay);
  157. }
  158.  
  159. Keyboard.print("a");
  160. delay(sequentialShiftDelay);
  161. }
  162. else
  163. {
  164. Keyboard.print("n");
  165. }
  166.  
  167. for (int i = 0; i < 5; i++)
  168. {
  169. digitalWrite(modeLed, HIGH);
  170. delay(200);
  171. digitalWrite(modeLed, LOW);
  172. delay(200);
  173. }
  174.  
  175. digitalWrite(modeLed, isSequentialMode);
  176. }
  177. }
  178. }
  179.  
  180. void modeButtonPress()
  181. {
  182. if (modeButton.update())
  183. {
  184. if (modeButton.fallingEdge())
  185. {
  186. if (isSequentialMode)
  187. {
  188. isSequentialMode = false;
  189. digitalWrite(modeLed, isSequentialMode);
  190. EEPROM.write(0, isSequentialMode);
  191. }
  192. else
  193. {
  194. isSequentialMode = true;
  195. digitalWrite(modeLed, isSequentialMode);
  196. EEPROM.write(0, isSequentialMode);
  197. }
  198. }
  199. }
  200. }
  201.  
  202. void pressGearKeys()
  203. {
  204. if (isSequentialMode)
  205. {
  206. for (int i = 0; i < abs(gearChangeDifference); i++)
  207. {
  208. if (gearChangeDifference > 0)
  209. {
  210. Keyboard.print("a");
  211. }
  212. else if (gearChangeDifference < 0)
  213. {
  214. Keyboard.print("z");
  215. }
  216.  
  217. delay(sequentialShiftDelay);
  218. }
  219. }
  220. else
  221. {
  222. String gearToPrint;
  223.  
  224. switch(selectedGear)
  225. {
  226. case gearR:
  227. gearToPrint = "R";//q");
  228. break;
  229. case neutral:
  230. gearToPrint = "n";//w");
  231. break;
  232. case gear1:
  233. gearToPrint = "1";//e");
  234. break;
  235. case gear2:
  236. gearToPrint = "2";//r");
  237. break;
  238. case gear3:
  239. gearToPrint = "3";//t");
  240. break;
  241. case gear4:
  242. gearToPrint = "4";//y");
  243. break;
  244. case gear5:
  245. gearToPrint = "5";//u");
  246. break;
  247. case gear6:
  248. gearToPrint = "6";//i");
  249. break;
  250. case gear7:
  251. gearToPrint = "7";//o");
  252. break;
  253. }
  254. Keyboard.print(gearToPrint);
  255.  
  256. message(gearToPrint);
  257. }
  258.  
  259. digitalWrite(modeLed, isSequentialMode);
  260. currentGear = selectedGear;
  261. }
  262.  
  263. void getSelectedGear()
  264. {
  265. for (int i = 0; i < sizeof(gearPins)/sizeof(int); i++)
  266. {
  267. if (digitalRead(gearPins[i]) == 0)
  268. {
  269. selectedGear = gearPins[i];
  270. return;
  271. }
  272. }
  273. selectedGear = neutral;
  274. }
  275.  
  276. void checkForNewGear()
  277. {
  278. if (currentGear == selectedGear)
  279. {
  280. gearChangeDifference = 0;
  281. }
  282. else
  283. {
  284. gearChangeDifference = selectedGear - currentGear;
  285. pressGearKeys();
  286. }
  287. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement