Advertisement
Guest User

Arduino LED Controller

a guest
Aug 21st, 2016
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.07 KB | None | 0 0
  1. #include <MSGEQ7Lib.h>
  2. #include <Wire.h>
  3. #include <Adafruit_PWMServoDriver.h>
  4.  
  5. const int ADAFRUIT_BOARD_COUNT = 1;//Change to how many PCA9685 boards you have
  6. const int PWM_GEN_COUNT = 45;//change to how many MAXIMUM channels you wish to have, NOT sets, CHANNELS! 45-> 3 channels per set max = 15 sets.
  7.  
  8. int MSGEQ7_DATA = 0;//pin for analog data from eq7
  9. int MSGEQ7_RESET = 53;//reset pin
  10. int MSGEQ7_STROBE = 52;//strobe pin
  11. int MSGEQ7_FILTER[7];//filtering array
  12. int MSGEQ7_AMP[7];//amplifying array
  13. int MSGEQ7_MIN[7];//minimum value to add amplification value
  14. int maxValues[7];//for tracking the maximum value when there is no audio playing - static
  15.  
  16. uint8_t dc[256] = { // dimming table in flash memory
  17. 0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
  18. 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  19. 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
  20. 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
  21. 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11,
  22. 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15,
  23. 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20,
  24. 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26,
  25. 27, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35,
  26. 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 46, 47,
  27. 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
  28. 63, 64, 65, 66, 68, 69, 70, 71, 73, 74, 75, 76, 78, 79, 81, 82,
  29. 83, 85, 86, 88, 90, 91, 93, 94, 96, 98, 99, 101, 103, 105, 107, 109,
  30. 110, 112, 114, 116, 118, 121, 123, 125, 127, 129, 132, 134, 136, 139, 141, 144,
  31. 146, 149, 151, 154, 157, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 190,
  32. 193, 196, 200, 203, 207, 211, 214, 218, 222, 226, 230, 234, 238, 242, 248, 255,
  33. };
  34.  
  35. class Controller
  36. {
  37. private:
  38. Adafruit_PWMServoDriver boards[ADAFRUIT_BOARD_COUNT];
  39. int Sets[PWM_GEN_COUNT][3][3];
  40. int pwmCount;
  41. int MSGEQ7Values[7];
  42.  
  43. public:
  44. int Musics[PWM_GEN_COUNT][3];
  45. int musicsCount;
  46. void setPWMCount(int count)
  47. {
  48. Controller::pwmCount = count;
  49. }
  50.  
  51.  
  52. void editChannel(int set, int channel, int msgFreq, int pwmChannel = -99)//set is the INDEX of channels, channel is the INDEX of the channels[set] array.
  53. {
  54. if (pwmChannel == -99)
  55. {
  56. Controller::pwmCount++;
  57. pwmChannel = Controller::pwmCount;
  58. }
  59. Controller::Sets[set][channel][2] = 1;
  60. Controller::Sets[set][channel][0] = pwmChannel;
  61. Controller::Sets[set][channel][1] = msgFreq;
  62. Controller::setValue(set, channel);
  63. }
  64.  
  65.  
  66. void Initialize()
  67. {
  68. pinMode(MSGEQ7_DATA, INPUT);
  69. pinMode(MSGEQ7_RESET, OUTPUT);
  70. pinMode(MSGEQ7_STROBE, OUTPUT);
  71.  
  72. digitalWrite(MSGEQ7_RESET, LOW);
  73. digitalWrite(MSGEQ7_STROBE, HIGH);
  74.  
  75. //Configure filter
  76. MSGEQ7_FILTER[0] = 75;
  77. MSGEQ7_FILTER[1] = 90;
  78. MSGEQ7_FILTER[2] = 120;
  79. MSGEQ7_FILTER[3] = 190;
  80. MSGEQ7_FILTER[4] = 425;
  81. MSGEQ7_FILTER[5] = 585;
  82. MSGEQ7_FILTER[6] = 515;
  83.  
  84. //initialize maximum value array
  85. maxValues[0] = 0;
  86. maxValues[1] = 0;
  87. maxValues[2] = 0;
  88. maxValues[3] = 0;
  89. maxValues[4] = 0;
  90. maxValues[5] = 0;
  91. maxValues[6] = 0;
  92.  
  93. //Configure amplification values
  94. MSGEQ7_AMP[0] = 25;
  95. MSGEQ7_AMP[1] = 25;
  96. MSGEQ7_AMP[2] = 100;
  97. MSGEQ7_AMP[3] = 50;
  98. MSGEQ7_AMP[4] = 175;
  99. MSGEQ7_AMP[5] = 100;
  100. MSGEQ7_AMP[6] = 100;
  101.  
  102.  
  103. //Configure mimimum values after filtering applied
  104. MSGEQ7_MIN[0] = 0;
  105. MSGEQ7_MIN[1] = 0;
  106. MSGEQ7_MIN[2] = 5;
  107. MSGEQ7_MIN[3] = 5;
  108. MSGEQ7_MIN[4] = 5;
  109. MSGEQ7_MIN[5] = 5;
  110. MSGEQ7_MIN[6] = 5;
  111.  
  112. Controller::pwmCount = 0;
  113. for (int i = 0;i < PWM_GEN_COUNT + 1;i++)
  114. {
  115. for (int a = 0; a < 3;a++)
  116. {
  117. Controller::Sets[i][a][2] = 0;
  118. Controller::Sets[i][a][0] = Controller::pwmCount++;
  119. Controller::Sets[i][a][1] = 4;
  120. Controller::pwmCount++;
  121.  
  122. }
  123. }
  124. for (int i = 0; i < ADAFRUIT_BOARD_COUNT; i++)
  125. {
  126. Controller::boards[i] = Adafruit_PWMServoDriver(0x40 + i);
  127. Controller::boards[i].begin();
  128. Controller::boards[i].setPWMFreq(1000);
  129. }
  130. Controller::musicsCount = 0;
  131. }
  132.  
  133.  
  134. int getPWMChannel(int set, int channel)
  135. {
  136. if (Controller::Sets[set][channel][2] == 1) {
  137. return Controller::Sets[set][channel][0];
  138. }
  139. else
  140. {
  141. return -1;
  142. }
  143. }
  144.  
  145.  
  146. int getMsgFreq(int set, int channel)
  147. {
  148. if (Controller::Sets[set][channel][2] == 1)
  149. {
  150. return Controller::Sets[set][channel][1];
  151. }
  152. else
  153. {
  154. return -1;
  155. }
  156. }
  157.  
  158.  
  159. void setValue(int set, int channel, int value = 0)
  160. {
  161. if (Controller::Sets[set][channel][2] == 1)
  162. {
  163. int pwmChannel = Controller::Sets[set][channel][0];
  164. if (pwmChannel <= 13)
  165. {
  166. analogWrite(pwmChannel, value);
  167. }
  168. else
  169. {
  170. Controller::boards[((pwmChannel - 14) / 16)].setPWM(pwmChannel - 14, 0, map(value, 0, 255, 0, 4095));
  171. }
  172.  
  173. }
  174. }
  175.  
  176.  
  177. void disableChannel(int set, int channel)
  178. {
  179. Controller::Sets[set][channel][2] = 0;
  180. }
  181.  
  182. void stopMusic(int set, int channel)
  183. {
  184. //Controller::Musics.removeNode(set, channel);
  185. int index;
  186. for (int i = 0; i < Controller::musicsCount; i++)
  187. {
  188. if (Controller::Musics[i][0] == set && Controller::Musics[i][1] == channel)
  189. {
  190. index = i;
  191. break;
  192. }
  193. }
  194. for (int d = index; d < Controller::musicsCount; d++)
  195. {
  196. Controller::Musics[d][0] = Controller::Musics[d + 1][0];
  197. Controller::Musics[d][1] = Controller::Musics[d + 1][1];
  198. Controller::Musics[d][2] = Controller::Musics[d + 1][2];
  199. }
  200. Controller::musicsCount--;
  201. }
  202. void startMusic(int set, int channel)
  203. {
  204.  
  205. for (int i = 0; i < Controller::musicsCount; i++)
  206. {
  207. if (Controller::Musics[i][0] == set && Controller::Musics[i][1] == channel)
  208. {
  209. return;
  210. }
  211. }
  212. Controller::Musics[Controller::musicsCount][0] = set;
  213. Controller::Musics[Controller::musicsCount][1] = channel;
  214. Controller::Musics[Controller::musicsCount][2] = Controller::Sets[set][channel][1];
  215.  
  216.  
  217. Controller::musicsCount++;
  218. }
  219. void debugMusics()
  220. {
  221. Serial.println("------------------------");
  222.  
  223. for (int i = 0; i < Controller::musicsCount; i++)
  224. {
  225. Serial.print("Set: ");
  226. Serial.print(Controller::Musics[i][0]);
  227. Serial.print(" | Channel: ");
  228. Serial.print(Controller::Musics[i][1]);
  229. Serial.print(" | MSGFreq: ");
  230. Serial.println(Controller::Musics[i][2]);
  231. }
  232. Serial.println("------------------------");
  233. }
  234. void updateMusics()
  235. {
  236. //Controller::MSGEQ7IC.Read(MSGEQ7IC.spectrumValues);
  237. digitalWrite(MSGEQ7_RESET, HIGH);
  238. digitalWrite(MSGEQ7_RESET, LOW);
  239.  
  240. for (int i = 0; i < 7;i++)
  241. {
  242.  
  243. digitalWrite(MSGEQ7_STROBE, LOW);
  244. delayMicroseconds(30);
  245. Controller::MSGEQ7Values[i] = analogRead(MSGEQ7_DATA);
  246. Controller::MSGEQ7Values[i] = constrain(Controller::MSGEQ7Values[i], MSGEQ7_FILTER[i], 1023);
  247. Controller::MSGEQ7Values[i] = map(Controller::MSGEQ7Values[i], MSGEQ7_FILTER[i], 1023, 0, 255);
  248. if (Controller::MSGEQ7Values[i] > maxValues[i])
  249. maxValues[i] = MSGEQ7Values[i];
  250. if (Controller::MSGEQ7Values[i] > MSGEQ7_MIN[i])
  251. Controller::MSGEQ7Values[i] += MSGEQ7_AMP[i];
  252.  
  253. Controller::MSGEQ7Values[i] = constrain(Controller::MSGEQ7Values[i], 0, 255);
  254. Serial.print(Controller::MSGEQ7Values[i]);
  255. Serial.print(" ");
  256. digitalWrite(MSGEQ7_STROBE, HIGH);
  257. }
  258. Serial.println();
  259. for (int i = 0; i < Controller::musicsCount; i++)
  260. {
  261. Controller::setValue(Controller::Musics[i][0], Controller::Musics[i][1], dc[Controller::MSGEQ7Values[Controller::Musics[i][2]]]);
  262. }
  263.  
  264. }
  265. Controller()
  266. {
  267. pwmCount = 0;
  268. }
  269. };
  270.  
  271.  
  272. Controller LEDs;
  273.  
  274. void setup()
  275. {
  276.  
  277. /* add setup code here */
  278. Serial.begin(250000);
  279.  
  280. analogReference(DEFAULT);
  281.  
  282.  
  283. delay(100);
  284. Serial.println("Beginning initialization.");
  285. delay(100);
  286. LEDs.setPWMCount(2);
  287. LEDs.Initialize();
  288. delay(100);
  289. Serial.println("Completed initialization.");
  290. delay(100);
  291.  
  292. /*LEDs.debugMusics();
  293. LEDs.startMusic(0, 0);
  294. LEDs.debugMusics();
  295. LEDs.startMusic(1, 0);
  296. LEDs.startMusic(2, 0);
  297. LEDs.startMusic(5, 2);
  298. LEDs.startMusic(5, 2);
  299. LEDs.debugMusics();
  300. LEDs.stopMusic(0, 0);
  301. LEDs.stopMusic(2, 0);
  302. LEDs.debugMusics();*/
  303.  
  304.  
  305. /*LEDs.editChannel(0, 0, 0, 2);
  306. LEDs.editChannel(0, 1, 3, 3);
  307. LEDs.editChannel(0, 2, 5, 4);
  308.  
  309. LEDs.editChannel(1, 0, 0, 5);
  310. LEDs.editChannel(1, 1, 3, 6);
  311. LEDs.editChannel(1, 2, 5, 7);
  312.  
  313. LEDs.editChannel(2, 0, 0, 8);
  314. LEDs.editChannel(2, 1, 3, 9);
  315. LEDs.editChannel(2, 2, 5, 10);
  316.  
  317. LEDs.editChannel(3, 0, 0, 11);
  318. LEDs.editChannel(3, 1, 3, 12);
  319. LEDs.editChannel(3, 2, 5, 13);
  320.  
  321.  
  322. LEDs.startMusic(0, 2);
  323. LEDs.startMusic(0, 3);
  324. LEDs.startMusic(0, 4);
  325. LEDs.startMusic(1, 5);
  326. LEDs.startMusic(1, 6);
  327. LEDs.startMusic(1, 7);
  328. LEDs.startMusic(2, 8);
  329. LEDs.startMusic(2, 9);
  330. LEDs.startMusic(2, 10);
  331. LEDs.startMusic(3, 11);
  332. LEDs.startMusic(3, 12);
  333. LEDs.startMusic(3, 13);*/
  334.  
  335.  
  336. /*LEDs.setValue(0, 0, 255);
  337. LEDs.setValue(0, 1, 255);
  338. LEDs.setValue(0, 2, 255);
  339. LEDs.setValue(1, 0, 255);
  340. LEDs.setValue(1, 1, 255);
  341. LEDs.setValue(1, 2, 255);
  342. LEDs.setValue(2, 0, 255);
  343. LEDs.setValue(2, 1, 255);
  344. LEDs.setValue(2, 2, 255);
  345. LEDs.setValue(3, 0, 255);
  346. LEDs.setValue(3, 1, 255);
  347. LEDs.setValue(3, 2, 255);*/
  348.  
  349. LEDs.editChannel(0, 0, 2, 3);
  350. LEDs.editChannel(0, 1, 4, 2);
  351. LEDs.editChannel(0, 2, 0, 4);
  352.  
  353. LEDs.startMusic(0, 0);
  354. LEDs.startMusic(0, 1);
  355. LEDs.startMusic(0, 2);
  356. //LEDs.setValue(0, 1, 255);
  357.  
  358. LEDs.editChannel(1, 0, 2, 5);
  359. LEDs.editChannel(1, 1, 4, 6);
  360. LEDs.editChannel(1, 2, 0, 7);
  361.  
  362. LEDs.startMusic(1, 0);
  363. LEDs.startMusic(1, 1);
  364. LEDs.startMusic(1, 2);
  365. //LEDs.setValue(1, 0, 255);
  366.  
  367. //LEDs.setValue(0, 0, 0);
  368. //LEDs.setValue(0, 1, 0);
  369. //LEDs.setValue(0, 2, 0);
  370.  
  371. //LEDs.setValue(1, 0, 0);
  372. //LEDs.setValue(1, 1, 0);
  373. //LEDs.setValue(1, 2, 0);
  374.  
  375. Serial.println("Config Loaded!");
  376. Serial.println();
  377. }
  378.  
  379.  
  380. void loop()
  381. {
  382. //if command -> disable specific channel on MUSIC_LEDs
  383. //TODO: Write serial command handling
  384. //else update music
  385. boolean t = false;
  386. if (t)
  387. {
  388.  
  389. }
  390. else
  391. {
  392. LEDs.updateMusics();
  393. }
  394. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement