Advertisement
Guest User

Untitled

a guest
Jan 21st, 2020
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.80 KB | None | 0 0
  1. #include <LiquidCrystal.h>
  2. #include <IRremote.h>
  3. #include <FastLED.h>
  4.  
  5. /*Global vars that multiple classes need
  6. * Probably not the best way to do this
  7. */
  8. LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
  9. #define NUM_LEDS 300
  10. CRGB leds[NUM_LEDS];
  11. CRGBPalette16 currentPalette;
  12.  
  13. class LCDHandler{
  14.  
  15. const int backlight = 13;
  16. int lcdState = HIGH;
  17. int currentMode = 0;
  18.  
  19. public:
  20. LCDHandler(){
  21. pinMode(backlight, OUTPUT);
  22. startLCD();
  23. }
  24.  
  25. inline void startLCD() {
  26. digitalWrite(backlight, HIGH);
  27.  
  28. lcd.begin(16, 2);
  29. lcd.print(F("Mode: "));
  30. lcd.setCursor(0, 1);
  31. lcd.print(F("The Science Bros"));
  32. }
  33.  
  34. //takes a string and prints to the LCD with a specified delay
  35. inline void printToLCD(String word, int delayTime, int row) {
  36. //centers cursor
  37. lcd.setCursor((16 - word.length()) / 2, row);
  38.  
  39. int l = word.length() + 1;
  40. char phrase[l];
  41.  
  42. word.toCharArray(phrase, l);
  43.  
  44. for (int i; i < l - 1; i++) {
  45. lcd.print(phrase[i]);
  46. delay(delayTime);
  47. }
  48. }
  49.  
  50. inline void modeToLCD(int mode) {
  51. currentMode = mode;
  52.  
  53. switch (mode) {
  54. case 1:
  55. lcd.print(F("RAINBSMOOTH"));
  56. break;
  57. case 2:
  58. lcd.print(F("RAINBSTRIPE"));
  59. break;
  60. case 3:
  61. lcd.print(F("SOLID RED "));
  62. break;
  63. case 4:
  64. lcd.print(F("SOLID BLUE "));
  65. break;
  66. case 5:
  67. lcd.print(F("SOLID GREEN"));
  68. break;
  69. case 6:
  70. lcd.print(F("SOLIDPURPLE"));
  71. break;
  72. case 7:
  73. lcd.print(F("SOLIDYELLOW"));
  74. break;
  75. case 8:
  76. lcd.print(F("MUSICRAINBO"));
  77. break;
  78. case 9:
  79. lcd.print(F("TSBGRAPHSND"));
  80. break;
  81. case 10:
  82. lcd.print(F("TSBMSCREACT"));
  83. break;
  84. default: break;
  85. }
  86. }
  87.  
  88. inline void checkState() {
  89. digitalWrite(backlight, lcdState);
  90.  
  91. if (lcdState == LOW) {
  92. lcdState = HIGH;
  93. digitalWrite(backlight, lcdState);
  94. lcd.begin(16, 2);
  95. printToLCD(F("WELCOME"), 100, 0);
  96. printToLCD("BACK!", 100, 1);
  97. currentMode = 1;
  98. delay(1000);
  99. FastLED.show();
  100. startLCD();
  101. } else {
  102. lcd.clear();
  103. printToLCD(F("GOODBYE"), 250, 0);
  104. delay(750);
  105.  
  106. lcd.noDisplay();
  107. for (int i = 0; i < NUM_LEDS; i++) {
  108. leds[i].setRGB(0, 0, 0);
  109. }
  110.  
  111. FastLED.show();
  112. lcdState = LOW;
  113. }
  114. }
  115.  
  116. int getCurrentMode(){
  117. return currentMode;
  118. }
  119. };
  120.  
  121. const int irReceiverPin = 3;
  122. IRrecv irrecv(irReceiverPin); //Creates a variable of type IRrecv
  123.  
  124. class IRHandler{
  125.  
  126. unsigned long previousMillis;
  127. const int receiverDelay = 50;
  128. decode_results results; // define resultsas
  129.  
  130. LCDHandler lcdHandler;
  131.  
  132. public:
  133. IRHandler() {
  134. previousMillis = 0;
  135. irrecv.enableIRIn(); // enable ir receiver module
  136. }
  137.  
  138. void Update(unsigned long currentMillis){
  139. int cMode = lcdHandler.getCurrentMode();
  140.  
  141. if (irrecv.decode(&results))
  142. {
  143. if(translateIR().substring(0,5).equals("POWER")){
  144. lcdHandler.checkState();
  145. }
  146. else if(translateIR().substring(0,2).equals("UP")){
  147. if(cMode == 9)
  148. lcdHandler.modeToLCD(0);
  149. else
  150. lcdHandler.modeToLCD(cMode + 1);
  151. }
  152. else if(translateIR().substring(0,4).equals("DOWN")){
  153. if(cMode == 0)
  154. lcdHandler.modeToLCD(9);
  155. else
  156. lcdHandler.modeToLCD(cMode + 1);
  157. }
  158. else if(translateIR().toInt() >= 1 && translateIR().toInt() <= 10){
  159. lcdHandler.modeToLCD(translateIR().toInt());
  160. }
  161. }
  162.  
  163. lcd.setCursor(5,0);
  164. lcd.print(translateIR());
  165.  
  166. if(currentMillis - previousMillis >= receiverDelay){
  167. irrecv.resume();
  168. previousMillis = currentMillis;
  169. }
  170. }
  171.  
  172. // takes action based on IR code received
  173. //F() tells the compiler to keep the strings in PROGMEM rather than SRAM
  174. String translateIR() {
  175. switch (results.value)
  176. {
  177. case 0xE318261B: return F(("POWER ")); break;
  178. case 0xEE886D7F: return F(("FUNC/STOP ")); break;
  179. case 0x511DBB: return F(("VOL+ ")); break;
  180. case 0x52A3D41F: return F(("FAST BACK ")); break;
  181. case 0xD7E84B1B: return F(("PAUSE ")); break;
  182. case 0x20FE4DBB: return F(("FAST NEXT ")); break;
  183. case 0xF076C13B: return F(("DOWN ")); break;
  184. case 0xA3C8EDDB: return F(("VOL- ")); break;
  185. case 0xE5CFBD7F: return F(("UP ")); break;
  186. case 0x97483BFB: return F(("EQ ")); break;
  187. case 0xF0C41643: return F(("ST/REP ")); break;
  188. case 0xC101E57B: return F(("1 ")); break;
  189. case 0x9716BE3F: return F(("2 ")); break;
  190. case 0x3D9AE3F7: return F(("3 ")); break;
  191. case 0x6182021B: return F(("4 ")); break;
  192. case 0x8C22657B: return F(("5 ")); break;
  193. case 0x488F3CBB: return F(("6 ")); break;
  194. case 0x449E79F: return F(("7 ")); break;
  195. case 0x32C6FDF7: return F(("8 ")); break;
  196. case 0x1BC0157B: return F(("9 ")); break;
  197. case 0x3EC3FC1B: return F(("10 ")); break;
  198. case 0xFFFFFFFF: return F(("REPEAT ")); break;
  199.  
  200. default:
  201. return F(("OTHER "));
  202. }
  203. }
  204. };
  205.  
  206. class LEDHandler{
  207.  
  208. #define LED_PIN 6
  209. #define COLOR_ORDER GRB
  210. #define RAINBOW_DURATION 50
  211. #define RAINBOW_STRIPE_DURATION 1
  212. #define MUSIC_RAINBOW_DURATION 10
  213.  
  214. #define BRIGHTNESS 200
  215. #define FRAMES_PER_SECOND 60
  216. TBlendType currentBlending;
  217.  
  218. int currentMode = 0;
  219. int currentHue = 0;
  220.  
  221. unsigned long rainbowMillis, rainbowStripeMillis, musicRainbowMillis;
  222.  
  223. LCDHandler lcdHandler;
  224.  
  225. public:
  226. LEDHandler(){
  227. FastLED.addLeds<WS2811, LED_PIN, COLOR_ORDER>(leds, 300).setCorrection(TypicalLEDStrip);
  228. currentPalette = RainbowColors_p;
  229. currentBlending = LINEARBLEND;
  230. }
  231.  
  232. void Update(unsigned long currentMillis){
  233. int cMode = lcdHandler.getCurrentMode();
  234.  
  235. if(cMode == 1 && currentMillis - 0 >= RAINBOW_DURATION){
  236. rainbowMillis = currentMillis;
  237. if(currentHue <= 255){
  238. fillHSV(currentHue);
  239. ++currentHue;
  240. }
  241. else
  242. currentHue = 0;
  243. }
  244. else if(cMode == 2 && currentMillis - rainbowStripeMillis >= RAINBOW_STRIPE_DURATION){
  245. rainbowStripeMillis = currentMillis;
  246. static uint8_t startIndex = 0;
  247. startIndex = startIndex + 1; //Motion speed
  248.  
  249. FillLEDsFromPaletteColors(startIndex);
  250. FastLED.show();
  251. }
  252. else if(cMode == 3){
  253. fillHSV(HUE_RED);
  254. }
  255. else if(cMode == 3){
  256. fillHSV(HUE_BLUE);
  257. }
  258. else if(cMode == 4){
  259. fillHSV(HUE_GREEN);
  260. }
  261. else if(cMode == 5){
  262. fillHSV(HUE_PURPLE);
  263. }
  264. else if(cMode == 6){
  265. fillHSV(HUE_YELLOW);
  266. }
  267. }
  268.  
  269. void fillHSV(int hue){
  270. for(int i = 0; i < NUM_LEDS; i++){
  271. leds[i].setHSV(hue, 255, 255);
  272. }
  273. FastLED.show();
  274. }
  275.  
  276. void FillLEDsFromPaletteColors(uint8_t colorIndex)
  277. {
  278. uint8_t brightness = 255;
  279.  
  280. for (int i = 0; i < 300; i++) {
  281. leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
  282. colorIndex += 3;
  283. }
  284. }
  285.  
  286. };
  287.  
  288. IRHandler irHandler;
  289. LEDHandler ledHandler;
  290.  
  291. void setup() {
  292. Serial.begin(9600);
  293.  
  294. // OCR0A = 0xAF;
  295. // TIMSK0 |= _BV(OCIE0A);
  296. }
  297.  
  298. void loop(){
  299. unsigned long currentMillis = millis();
  300.  
  301. irHandler.Update(currentMillis);
  302. ledHandler.Update(currentMillis);
  303. }
  304.  
  305. //SIGNAL(TIMER0_COMPA_vect)
  306. //{
  307. //
  308. // Serial.println(millis());
  309. //
  310. //
  311. //}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement