Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
- const int latchPin = 8; // Пин подключен к ST_CP входу 74HC595
- const int clockPin = 12; // Пин подключен к SH_CP входу 74HC595
- const int dataPin = 11; // Пин подключен к DS входу 74HC595
- int LayerPin[] = {4,5,6,7}; // указываем пины, к которым подключены слои кубика
- int ButPin = 2; // подключаем кнопку к выходу 2
- int layer = 0; // слой
- int flag = 0; // флаг состояния
- volatile int rejim = 0; // Переключалка
- int DATA1[] = {37929,16770,10260,37449,16770,10260}; //вертолёт от левого нижнего угла к правому верхнему и потов сверху вниз
- int DATA2[] = {32,64,512,1024};
- //int DATA3[] = {1632,38505,1632,38505,38505,1632}; // центральный квадрат + угловые
- unsigned int DATA = 0;
- void setup() {
- Serial.begin(9600);
- lcd.init();
- lcd.backlight();
- lcd.print("Hello, world!");
- pinMode(latchPin, OUTPUT);
- pinMode(dataPin, OUTPUT);
- pinMode(clockPin, OUTPUT);
- pinMode(ButPin, INPUT);
- // гасим все слои на всякий случай
- for(layer = 0; layer < 4; layer++){
- pinMode(LayerPin[layer], OUTPUT);
- digitalWrite(LayerPin[layer], LOW);
- }
- attachInterrupt(INT0, ChangeRejim, CHANGE);
- }
- // функция смены режима по кнопке
- void ChangeRejim() {
- if(digitalRead(ButPin) == LOW && flag == 0)
- {
- rejim ++;
- flag = 1;
- if(rejim > 10) // Если номер режима превышает количество эффектов,
- { rejim = 0; } // то отсчет начинается с нуля
- }
- if(digitalRead(ButPin) == HIGH && flag == 1)
- {
- flag = 0;
- }
- }
- // функция передачи данных в сдвиговый регистр для зажигания светодиодов
- void doMagicWithRegisters(int whatToPush) {
- digitalWrite(latchPin, LOW);
- shiftOut(dataPin, clockPin, MSBFIRST, (whatToPush>> 8));
- shiftOut(dataPin, clockPin, MSBFIRST, whatToPush);
- // "защелкиваем" регистр, чтобы биты появились на выходах регистра
- digitalWrite(latchPin, HIGH);
- }
- void LayersOff() { // функция для выключения всех слоёв
- for(layer = 0; layer < 4; layer++){
- digitalWrite(LayerPin[layer], LOW);
- }
- }
- void LayersOn() { // функция для включения всех слоёв
- for(int layer = 0; layer < 4; layer++){
- digitalWrite(LayerPin[layer], HIGH);
- }
- }
- // функция для работы с вертикальными слоями
- // where = 1 - от нас, -1 - к нам
- void vLayer(int where, unsigned int start, int mask, int time) {
- LayersOn();
- DATA = start;
- if (where > 0) {
- for (int n = 0; n < 4; n++) {
- DATA ^= mask<< (n*4);
- DATA ^= mask<< ((n-1)*4);
- doMagicWithRegisters(DATA);
- delay(time);
- }
- } else {
- for (int n = 2; n >= 0; n--) {
- DATA ^= mask<< ((n+1)*4);
- DATA ^= mask<< (n*4);
- doMagicWithRegisters(DATA);
- delay(time);
- }
- }
- LayersOff();
- }
- // функция для работы с горизонтальными слоями
- // where = 1 - снизу вверх, -1 - сверху вниз, 0 - только указанный/все слои
- // data - какие светодиоды горят, например: 1 - горит только первый, 15 - горят первых 4, 65535 - горят все
- // time - сколько мс горят светодиоды
- // NumLayer - какой слой горит (работает только при where = 0!), при 4 - все слои горят
- void hLayer(int where, int data, int time, int NumLayer) {
- if (where > 0) { // снизу вверх
- for (layer = 0; layer < 4; layer++) {
- digitalWrite(LayerPin[layer], HIGH);
- doMagicWithRegisters(data);
- delay(time);
- digitalWrite(LayerPin[layer], LOW);
- }
- }
- else if (where < 0) { // сверху вниз
- for (layer = 3; layer >= 0; layer--) {
- digitalWrite(LayerPin[layer], HIGH);
- doMagicWithRegisters(data);
- delay(time);
- digitalWrite(LayerPin[layer], LOW);
- }
- }
- else {
- if (NumLayer == 4) { // все слои горят
- LayersOn();
- doMagicWithRegisters(data);
- delay(time);
- LayersOff();
- delay(time);
- }
- else {
- digitalWrite(LayerPin[NumLayer], HIGH);
- doMagicWithRegisters(data);
- delay(time);
- digitalWrite(LayerPin[NumLayer], LOW);
- }
- }
- LayersOff();
- }
- void LCDtext(char Rname[]) // функция вывода на LCD 16x2 экран
- {
- lcd.setCursor(0,0);
- lcd.print(Rname); // выводится название режима
- lcd.setCursor(0,1);
- lcd.print("Rejim: ");
- if (rejim < 10) {
- lcd.setCursor(8,1);
- lcd.print(rejim); // выводится номер режима
- lcd.setCursor(9,1);
- lcd.print(" ");
- } else {
- lcd.setCursor(8,1);
- lcd.print(rejim); // выводится номер режима
- }
- }
- void loop() {
- Serial.println(digitalRead(ButPin));
- if(rejim == 0)
- {
- LayersOff();
- LCDtext("Press button! ");
- }
- if(rejim == 1)
- {
- //вертолёт от левого нижнего угла к правому верхнему и потов сверху вниз
- LCDtext("Helicopter *..*");
- layer = 0;
- for (int i = 0; i < 6; i++) {
- digitalWrite(LayerPin[layer], HIGH);
- doMagicWithRegisters(DATA1[i]);
- delay(100);
- digitalWrite(LayerPin[layer], LOW);
- if (i < 3) {
- layer++;
- }
- else {
- layer--;
- }
- }
- LayersOff();
- }
- if(rejim == 2)
- {
- LCDtext("Random LED ");
- int randomLED = (pow(2, random(15)) + 1);
- hLayer(-1, randomLED, random(10, 100), 4);
- delay(100);
- // hLayer(-1, randomLED, 40, 4);
- }
- if(rejim == 3)
- {
- LCDtext("hLayers+vLayers ");
- hLayer(1, 65535, 70, 4); // горизонтальные слои сверху вниз
- hLayer(-1, 65535, 70, 4); // горизонтальные слои снизу вверх
- vLayer(1, 15, 15, 70); // вертикальные слои от нас
- vLayer(-1, 61440, 15, 70); // вертикальные слои к нам
- }
- if(rejim == 4)
- {
- LCDtext("ALL IS UP! ");
- int TimeUP = 10;
- while (TimeUP <= 150) {
- hLayer(0, 65535, TimeUP, 4); // весь кубик
- TimeUP = TimeUP + 10;
- }
- }
- if(rejim == 5)
- {
- LCDtext("hLayers 1 ");
- hLayer(0, 36873, 200, 0);
- hLayer(0, 1632, 200, 1);
- hLayer(0, 1632, 200, 2);
- hLayer(0, 36873, 200, 3);
- }
- if(rejim == 6)
- {
- LCDtext("hLayers 2 ");
- hLayer(1, 38505, 100, 4);
- hLayer(-1, 38505, 100, 4);
- }
- if(rejim == 7)
- {
- LCDtext("hLayers 3 ");
- hLayer(1, 28662, 100, 4);
- hLayer(-1, 28662, 100, 4);
- }
- if(rejim == 8)
- {
- LCDtext("hLayers 4 ");
- hLayer(1, 63903, 150, 4); // горизонтальные слои сверху вниз
- hLayer(-1, 1632, 150, 4); // горизонтальные слои снизу вверх
- }
- if(rejim == 9)
- {
- LCDtext("hLayers 5 ");
- hLayer(1, 1632, 150, 4); // горизонтальные слои сверху вниз
- hLayer(-1, 63903, 150, 4); // горизонтальные слои снизу вверх
- }
- if(rejim == 10)
- {
- LCDtext("Fireshow ");
- for (int i = 0; i < 4; i++) {
- hLayer(1, DATA2[i], 120, 4);
- hLayer(-1, random(0,65535), 150, 4);
- delay(300);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement