Advertisement
Guest User

Untitled

a guest
Nov 30th, 2015
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.98 KB | None | 0 0
  1. //arduino nixie tube controller
  2. //port B register has 8 pins,
  3. //port B register ranging from bit 7 to bit 0
  4. //PORT B:
  5. //7 6 5 4 3 2 1 0
  6. //PB4 to PB7 control the active tube, 7 being the one most left, 4 being the outer right tube
  7. //PB0 to PB3 control the displayed number
  8.  
  9. int version = 1;
  10.  
  11. int lastNumber;
  12. int NumArr[4] = {1, 3, 3, 7};
  13.  
  14. int rotations = 0;
  15.  
  16. bool on = false;
  17. int numCount = 0;
  18. int numCountMax = 9000;
  19. int numCountOp = 0;
  20.  
  21. int cycleCount = 0;
  22. int nA0 = 0, nA1 = 0, nA2 = 0, nA3 = 0;
  23.  
  24. int rndFnc = 0;
  25.  
  26. int led = 13;
  27. //----ports for numbers
  28. int pb0 = 40;
  29. int pb1 = 41;
  30. int pb2 = 42;
  31. int pb3 = 43;
  32.  
  33. // ----------
  34. // ports for the selected tube
  35. int pb4 = 44;
  36. int pb5 = 45;
  37. int pb6 = 46;
  38. int pb7 = 47;
  39. //----------
  40.  
  41. void setup() {
  42. Serial.begin(9600);
  43.  
  44. attachInterrupt(4, rpmcount, FALLING);
  45.  
  46. pinMode(led, OUTPUT);
  47. pinMode(pb0, OUTPUT);
  48. pinMode(pb1, OUTPUT);
  49. pinMode(pb2, OUTPUT);
  50. pinMode(pb3, OUTPUT);
  51. pinMode(pb4, OUTPUT);
  52. pinMode(pb5, OUTPUT);
  53. pinMode(pb6, OUTPUT);
  54. pinMode(pb7, OUTPUT);
  55.  
  56. //nr 0
  57. digitalWrite(pb0, LOW); // turn the LED on (HIGH is the voltage level)
  58. digitalWrite(pb1, HIGH); // turn the LED on (HIGH is the voltage level)
  59. digitalWrite(pb2, LOW); // turn the LED on (HIGH is the voltage level)
  60. digitalWrite(pb3, HIGH); // turn the LED on (HIGH is the voltage level)
  61.  
  62. // all tubes
  63. digitalWrite(pb4, HIGH); // turn the LED on (HIGH is the voltage level)
  64. digitalWrite(pb5, HIGH); // turn the LED on (HIGH is the voltage level)
  65. digitalWrite(pb6, HIGH); // turn the LED on (HIGH is the voltage level)
  66. digitalWrite(pb7, HIGH); // turn the LED on (HIGH is the voltage level)
  67. delay(1000);
  68. }
  69. bool x = true;
  70.  
  71. void blinkLed()
  72. {
  73. if (x == true)
  74. {
  75. digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
  76. x = false;
  77. }
  78. else
  79. {
  80. digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
  81. x = true;
  82. }
  83. }
  84.  
  85. void processNumbers(int value)
  86. {
  87. NumArr[0] = value / 1000;
  88. NumArr[1] = (value % 1000)/100;
  89. NumArr[2] = ((value % 1000)%100)/10;
  90. NumArr[3] = ((value % 1000)%100)%10;
  91. }
  92.  
  93.  
  94. void rpmcount() //interrupt service routine ISR
  95. {
  96. rotations += 1;
  97. }
  98.  
  99. void readSpeed()
  100. {
  101. if (rotations > 1)
  102. {
  103. on = true;
  104. }
  105. else
  106. {
  107. on = false;
  108. }
  109. processNumbers(map(rotations, 31, 82, 870, 2300));
  110. //Serial.println(rotations);
  111.  
  112. rotations = 0;
  113. blinkLed();
  114. }
  115.  
  116.  
  117. void cycleNumber(int funct)
  118. {
  119. //funct 1 cycle initial values
  120. //funct 2 display random unmbers from 0 to 9999
  121. //funct 0 count from 0 to max and back
  122. //funct 3 shift initial val
  123. if (funct == 2)
  124. {
  125. int rnd = random(0,9999);
  126. processNumbers(rnd);
  127. }
  128. if (funct == 1)
  129. {
  130. int nArr1 = NumArr[0];
  131.  
  132. NumArr[0] = NumArr[1];
  133. NumArr[1] = NumArr[2];
  134. NumArr[2] = NumArr[3];
  135. NumArr[3] = nArr1;
  136. }
  137.  
  138. if (funct == 3)
  139. {
  140. if (!cycleCount)
  141. {
  142. nA0 = NumArr[0];
  143. nA1 = NumArr[1];
  144. nA2 = NumArr[2];
  145. nA3 = NumArr[3];
  146. }
  147.  
  148. switch (cycleCount)
  149. {
  150.  
  151.  
  152. case 0:
  153. NumArr[3] = 0;
  154. NumArr[2] = nA3;
  155. NumArr[1] = nA2;
  156. NumArr[0] = nA1;
  157. cycleCount++;
  158. break;
  159.  
  160. case 1:
  161. NumArr[2] = 0;
  162. NumArr[1] = nA3;
  163. NumArr[0] = nA2;
  164. cycleCount++;
  165. break;
  166.  
  167. case 2:
  168. NumArr[1] = 0;
  169. NumArr[0] = nA3;
  170. cycleCount++;
  171. break;
  172.  
  173. case 3:
  174. NumArr[0] = 0;
  175. cycleCount++;
  176. break;
  177.  
  178. case 4:
  179. NumArr[1] = 0;
  180. NumArr[0] = nA3;
  181. cycleCount++;
  182. break;
  183.  
  184. case 5:
  185. NumArr[2] = 0;
  186. NumArr[1] = nA3;
  187. NumArr[0] = nA2;
  188. cycleCount++;
  189. break;
  190.  
  191. case 6:
  192. NumArr[3] = 0;
  193. NumArr[2] = nA3;
  194. NumArr[1] = nA2;
  195. NumArr[0] = nA1;
  196. cycleCount++;
  197. break;
  198.  
  199. case 7:
  200. NumArr[3] = nA3;
  201. NumArr[2] = nA2;
  202. NumArr[1] = nA1;
  203. NumArr[0] = nA0;
  204. cycleCount = 0;
  205. break;
  206. }
  207. }
  208.  
  209. if (funct == 0)
  210. {
  211. if (numCountOp)
  212. {
  213. numCount--;
  214. }
  215. else
  216. {
  217. numCount++;
  218. }
  219.  
  220. if(numCount > numCountMax)
  221. {
  222. numCountOp = 1;
  223. }
  224.  
  225. if(numCount <= 0)
  226. {
  227. numCountOp = 0;
  228. }
  229.  
  230. processNumbers(numCount);
  231.  
  232. }
  233.  
  234.  
  235. }
  236.  
  237. int counter = 0;
  238.  
  239. void setNumber(int tubeArr[4])
  240. {
  241. for (int i = 0; i < 4; i++)
  242. {
  243. delay(1);
  244. counter++;
  245. if (counter == 1000) //if one second has passed
  246. {
  247. readSpeed();
  248. //rndFnc = random(0,3);
  249. counter = 0;
  250. }
  251. if (!(counter%100))
  252. {
  253. //cycleNumber(rndFnc);
  254. // blinkLed();
  255. }
  256.  
  257. if (on)
  258. {
  259. switch (i+1){
  260. case 1: //all the way on the left
  261.  
  262.  
  263.  
  264. digitalWrite(pb4, LOW);
  265. digitalWrite(pb5, LOW);
  266. digitalWrite(pb6, LOW);
  267. digitalWrite(pb7, HIGH);
  268. break;
  269.  
  270. case 2: //2nd from left
  271. digitalWrite(pb4, LOW);
  272. digitalWrite(pb5, LOW);
  273. digitalWrite(pb6, HIGH);
  274. digitalWrite(pb7, LOW);
  275. break;
  276.  
  277. case 3:
  278. //3rd from left
  279. digitalWrite(pb4, LOW);
  280. digitalWrite(pb5, HIGH);
  281. digitalWrite(pb6, LOW);
  282. digitalWrite(pb7, LOW);
  283. break;
  284.  
  285. case 4:
  286. // 4th from left
  287. digitalWrite(pb4, HIGH);
  288. digitalWrite(pb5, LOW);
  289. digitalWrite(pb6, LOW);
  290. digitalWrite(pb7, LOW);
  291. break;
  292. }
  293.  
  294. switch (NumArr[i])
  295. {
  296. case 0:
  297. digitalWrite(pb0, LOW);
  298. digitalWrite(pb1, HIGH);
  299. digitalWrite(pb2, LOW);
  300. digitalWrite(pb3, HIGH);
  301. break;
  302.  
  303. case 1:
  304. digitalWrite(pb0, HIGH);
  305. digitalWrite(pb1, LOW);
  306. digitalWrite(pb2, LOW);
  307. digitalWrite(pb3, LOW);
  308. break;
  309.  
  310. case 2:
  311. digitalWrite(pb0, HIGH);
  312. digitalWrite(pb1, HIGH);
  313. digitalWrite(pb2, LOW);
  314. digitalWrite(pb3, LOW);
  315. break;
  316.  
  317. case 3:
  318. digitalWrite(pb0, HIGH);
  319. digitalWrite(pb1, LOW);
  320. digitalWrite(pb2, LOW);
  321. digitalWrite(pb3, HIGH);
  322. break;
  323.  
  324. case 4:
  325. digitalWrite(pb0, LOW);
  326. digitalWrite(pb1, HIGH);
  327. digitalWrite(pb2, LOW);
  328. digitalWrite(pb3, LOW);
  329. break;
  330.  
  331. case 5:
  332. digitalWrite(pb0, LOW);
  333. digitalWrite(pb1, LOW);
  334. digitalWrite(pb2, LOW);
  335. digitalWrite(pb3, HIGH);
  336. break;
  337.  
  338. case 6:
  339. digitalWrite(pb0, LOW);
  340. digitalWrite(pb1, LOW);
  341. digitalWrite(pb2, HIGH);
  342. digitalWrite(pb3, HIGH);
  343. break;
  344.  
  345. case 7:
  346. digitalWrite(pb0, LOW);
  347. digitalWrite(pb1, LOW);
  348. digitalWrite(pb2, LOW);
  349. digitalWrite(pb3, LOW);
  350. break;
  351.  
  352. case 8:
  353. digitalWrite(pb0, LOW);
  354. digitalWrite(pb1, LOW);
  355. digitalWrite(pb2, HIGH);
  356. digitalWrite(pb3, LOW);
  357. break;
  358.  
  359. case 9:
  360. digitalWrite(pb0, HIGH);
  361. digitalWrite(pb1, HIGH);
  362. digitalWrite(pb2, LOW);
  363. digitalWrite(pb3, HIGH);
  364. break;
  365. }
  366. }
  367. else
  368. {
  369. digitalWrite(pb4, LOW);
  370. digitalWrite(pb5, LOW);
  371. digitalWrite(pb6, LOW);
  372. digitalWrite(pb7, LOW);
  373. }
  374.  
  375. }
  376. }
  377.  
  378.  
  379. void loop()
  380. {
  381. setNumber(NumArr);
  382.  
  383. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement