Advertisement
Al_Ninyo

LED Cube 4x4x4 v.6

Apr 5th, 2015
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.53 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3.  
  4. LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
  5.  
  6. const int latchPin = 8;        // Пин подключен к ST_CP входу 74HC595
  7. const int clockPin = 12;       // Пин подключен к SH_CP входу 74HC595
  8. const int dataPin = 11;        // Пин подключен к DS входу 74HC595
  9. int LayerPin[] = {4,5,6,7};    // указываем пины, к которым подключены слои кубика
  10. int ButPin = 2;               // подключаем кнопку к выходу 2
  11.  
  12. int layer = 0;                 // слой
  13. int flag = 0;                  // флаг состояния
  14. volatile int rejim = 0;        // Переключалка
  15.  
  16. int DATA1[] = {37929,16770,10260,37449,16770,10260}; //вертолёт от левого нижнего угла к правому верхнему и потов сверху вниз
  17. int DATA2[] = {32,64,512,1024};
  18. //int DATA3[] = {1632,38505,1632,38505,38505,1632}; // центральный квадрат + угловые
  19.  
  20. unsigned int DATA = 0;
  21.  
  22. void setup() {
  23.   Serial.begin(9600);
  24.  
  25.   lcd.init();
  26.   lcd.backlight();
  27.   lcd.print("Hello, world!");
  28.  
  29.   pinMode(latchPin, OUTPUT);
  30.   pinMode(dataPin, OUTPUT);
  31.   pinMode(clockPin, OUTPUT);
  32.   pinMode(ButPin, INPUT);
  33.  
  34.   // гасим все слои на всякий случай
  35.   for(layer = 0; layer < 4; layer++){
  36.     pinMode(LayerPin[layer], OUTPUT);
  37.     digitalWrite(LayerPin[layer], LOW);
  38.   }
  39.  
  40.   attachInterrupt(INT0, ChangeRejim, CHANGE);
  41. }
  42.  
  43. // функция смены режима по кнопке
  44. void ChangeRejim() {
  45.   if(digitalRead(ButPin) == LOW && flag == 0)      
  46.     {                                              
  47.       rejim ++;
  48.       flag = 1;
  49.       if(rejim > 10)            // Если номер режима превышает количество эффектов,
  50.         {  rejim = 0; }        // то отсчет начинается с нуля
  51.     }
  52.     if(digitalRead(ButPin) == HIGH && flag == 1)
  53.     {
  54.       flag = 0;
  55.     }
  56. }
  57.  
  58. // функция передачи данных в сдвиговый регистр для зажигания светодиодов
  59. void doMagicWithRegisters(int whatToPush) {
  60.   digitalWrite(latchPin, LOW);
  61.  
  62.   shiftOut(dataPin, clockPin, MSBFIRST, (whatToPush>> 8));
  63.   shiftOut(dataPin, clockPin, MSBFIRST, whatToPush);
  64.  
  65.   // "защелкиваем" регистр, чтобы биты появились на выходах регистра
  66.   digitalWrite(latchPin, HIGH);
  67. }
  68.  
  69. void LayersOff() { // функция для выключения всех слоёв
  70.   for(layer = 0; layer < 4; layer++){
  71.     digitalWrite(LayerPin[layer], LOW);
  72.   }
  73. }
  74.  
  75. void LayersOn() { // функция для включения всех слоёв
  76.   for(int layer = 0; layer < 4; layer++){
  77.     digitalWrite(LayerPin[layer], HIGH);
  78.   }
  79. }
  80.  
  81. // функция для работы с вертикальными слоями
  82. // where = 1 - от нас, -1 - к нам
  83. void vLayer(int where, unsigned int start, int mask, int time) {
  84.   LayersOn();
  85.    DATA = start;
  86.    if (where > 0) {
  87.    for (int n = 0; n < 4; n++) {
  88.        DATA ^= mask<< (n*4);
  89.        DATA ^= mask<< ((n-1)*4);
  90.        doMagicWithRegisters(DATA);
  91.    delay(time);
  92.      }
  93.    } else {
  94.      for (int n = 2; n >= 0; n--) {
  95.        DATA ^= mask<< ((n+1)*4);
  96.        DATA ^= mask<< (n*4);
  97.        doMagicWithRegisters(DATA);
  98.    delay(time);
  99.        }
  100.    }
  101.   LayersOff();
  102. }
  103.  
  104. // функция для работы с горизонтальными слоями
  105. // where = 1 - снизу вверх, -1 - сверху вниз, 0 - только указанный/все слои
  106. // data - какие светодиоды горят, например: 1 - горит только первый, 15 - горят первых 4, 65535 - горят все
  107. // time - сколько мс горят светодиоды
  108. // NumLayer - какой слой горит (работает только при where = 0!), при 4 - все слои горят
  109. void hLayer(int where, int data, int time, int NumLayer) {
  110.   if (where > 0) {                          // снизу вверх
  111.     for (layer = 0; layer < 4; layer++) {
  112.       digitalWrite(LayerPin[layer], HIGH);
  113.       doMagicWithRegisters(data);
  114.       delay(time);
  115.       digitalWrite(LayerPin[layer], LOW);
  116.     }
  117.   }
  118.   else if (where < 0) {                      // сверху вниз
  119.     for (layer = 3; layer >= 0; layer--) {
  120.       digitalWrite(LayerPin[layer], HIGH);
  121.       doMagicWithRegisters(data);
  122.       delay(time);
  123.       digitalWrite(LayerPin[layer], LOW);
  124.     }
  125.   }
  126.   else {
  127.    if (NumLayer == 4) {                    // все слои горят
  128.       LayersOn();
  129.         doMagicWithRegisters(data);
  130.         delay(time);
  131.       LayersOff();
  132.         delay(time);
  133.     }
  134.   else {
  135.       digitalWrite(LayerPin[NumLayer], HIGH);
  136.       doMagicWithRegisters(data);
  137.       delay(time);
  138.       digitalWrite(LayerPin[NumLayer], LOW);
  139.    }
  140.   }
  141.   LayersOff();
  142. }
  143.  
  144. void LCDtext(char Rname[]) // функция вывода на LCD 16x2 экран
  145.   {
  146.     lcd.setCursor(0,0);
  147.     lcd.print(Rname);     // выводится название режима
  148.     lcd.setCursor(0,1);
  149.     lcd.print("Rejim: ");
  150.     if (rejim < 10) {
  151.       lcd.setCursor(8,1);
  152.       lcd.print(rejim);     // выводится номер режима
  153.       lcd.setCursor(9,1);
  154.       lcd.print("  ");
  155.     } else {
  156.       lcd.setCursor(8,1);
  157.       lcd.print(rejim);     // выводится номер режима
  158.     }
  159.   }
  160.  
  161. void loop() {
  162.  
  163.     Serial.println(digitalRead(ButPin));
  164.     if(rejim == 0)
  165.     {
  166.       LayersOff();
  167.       LCDtext("Press button!   ");
  168.   }
  169.     if(rejim == 1)
  170.     {    
  171.   //вертолёт от левого нижнего угла к правому верхнему и потов сверху вниз
  172.   LCDtext("Helicopter  *..*");
  173.       layer = 0;
  174.         for (int i = 0; i < 6; i++) {
  175.           digitalWrite(LayerPin[layer], HIGH);
  176.           doMagicWithRegisters(DATA1[i]);
  177.           delay(100);
  178.           digitalWrite(LayerPin[layer], LOW);
  179.             if (i < 3) {
  180.               layer++;
  181.             }
  182.             else {
  183.               layer--;
  184.             }
  185.         }
  186.   LayersOff();
  187.     }
  188.    
  189.     if(rejim == 2)
  190.     {
  191.       LCDtext("Random LED      ");
  192.         int randomLED = (pow(2, random(15)) + 1);
  193.           hLayer(-1, randomLED, random(10, 100), 4);
  194.           delay(100);
  195. //          hLayer(-1, randomLED, 40, 4);
  196.     }
  197.  
  198.     if(rejim == 3)
  199.     {
  200.       LCDtext("hLayers+vLayers ");
  201.           hLayer(1, 65535, 70, 4); // горизонтальные слои сверху вниз
  202.           hLayer(-1, 65535, 70, 4); // горизонтальные слои снизу вверх
  203.           vLayer(1, 15, 15, 70); // вертикальные слои от нас
  204.           vLayer(-1, 61440, 15, 70); // вертикальные слои к нам
  205.     }
  206.    
  207.     if(rejim == 4)
  208.     {
  209.       LCDtext("ALL IS UP!      ");
  210.         int TimeUP = 10;
  211.           while (TimeUP <= 150) {
  212.             hLayer(0, 65535, TimeUP, 4); // весь кубик
  213.             TimeUP = TimeUP + 10;
  214.           }
  215.     }
  216.  
  217.     if(rejim == 5)
  218.     {
  219.       LCDtext("hLayers 1       ");
  220.           hLayer(0, 36873, 200, 0);
  221.           hLayer(0, 1632, 200, 1);
  222.           hLayer(0, 1632, 200, 2);
  223.           hLayer(0, 36873, 200, 3);
  224.     }
  225.    
  226.     if(rejim == 6)
  227.     {
  228.       LCDtext("hLayers 2       ");
  229.           hLayer(1, 38505, 100, 4);
  230.           hLayer(-1, 38505, 100, 4);
  231.     }
  232.    
  233.     if(rejim == 7)
  234.     {
  235.       LCDtext("hLayers 3       ");
  236.           hLayer(1, 28662, 100, 4);
  237.           hLayer(-1, 28662, 100, 4);
  238.     }
  239.    
  240.     if(rejim == 8)
  241.     {    
  242.       LCDtext("hLayers 4       ");
  243.           hLayer(1, 63903, 150, 4); // горизонтальные слои сверху вниз
  244.           hLayer(-1, 1632, 150, 4); // горизонтальные слои снизу вверх
  245.     }
  246.    
  247.     if(rejim == 9)
  248.     {    
  249.       LCDtext("hLayers 5       ");
  250.           hLayer(1, 1632, 150, 4); // горизонтальные слои сверху вниз
  251.           hLayer(-1, 63903, 150, 4); // горизонтальные слои снизу вверх
  252.     }
  253.    
  254.     if(rejim == 10)
  255.     {
  256.       LCDtext("Fireshow        ");
  257.         for (int i = 0; i < 4; i++) {
  258.           hLayer(1, DATA2[i], 120, 4);
  259.           hLayer(-1, random(0,65535), 150, 4);
  260.           delay(300);
  261.         }
  262.     }
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement