#include #include #include #define DMX_SLAVE_CHANNELS 512 #define LCD_W 16 //количество выводимых на дисплей каналов (по идее соответствует символьной ширине дисплея) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS ); unsigned long lastFrameReceivedTime = 0; //Время последнего получения пакета unsigned long lastFrameTranceivedTime = 0; // Время последнего отображенного пакета byte qa[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111 }; byte ws[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111 }; byte ed[8] = { B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111 }; byte rf[8] = { B00000, B00000, B00000, B00000, B11111, B11111, B11111, B11111 }; byte tg[8] = { B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111 }; byte yh[8] = { B00000, B00000, B11111, B11111, B11111, B11111, B11111, B11111 }; byte uj[8] = { B00000, B11111, B11111, B11111, B11111, B11111, B11111, B11111 }; byte ik[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 }; byte outAr [LCD_W]; // Значения каналов, выводимые на дисплей unsigned short chRx; // количество принятых каналов #define KEY_BUTTON_1_PIN A2 //пин к которому подключена клавиатура unsigned int KeyButton1Value=0; //значение с клавиатуры unsigned long KeyButton1TimePress=0; //последнее время когда не было нажатых кнопок unsigned long KeyButton1Latency=100; //задержка перед считыванием состояния панели управления после нажатия unsigned int KeyButton1WasChecked=0; //метка означающая что нажатие кнопки было обработано unsigned long KeyButton1RepeatLatency=1500; //время после которого удерживание кнопки начинает засчитываться как многократные быстрые нажатия unsigned long KeyButton1RepeatTimePress=0; //вспомогательная переменная для обработки повторных нажатий unsigned long KeyButton1TimeFromPress=0; //переменная для хранения времени между временем когда не было зажатых кнопок и временем проверки unsigned long KeyBoardTime1=0; // unsigned long KeyBoardTime2=0; // Переменные для обработки времени для обработки событий клавиатуры unsigned long KeyBoardTimeInterval=25; // byte start = 0; // +1 номер канала, который выводится на экран первым void setup() { lcd.begin(LCD_W, 2); dmx_slave.enable (); dmx_slave.setStartAddress (1); dmx_slave.onReceiveComplete ( OnFrameReceiveComplete ); lcd.createChar(0,qa); lcd.createChar(1,ws); lcd.createChar(2,ed); lcd.createChar(3,rf); lcd.createChar(4,tg); lcd.createChar(5,yh); lcd.createChar(6,uj); lcd.createChar(7,ik); pinMode (KEY_BUTTON_1_PIN, INPUT); pinMode (10, OUTPUT); pinMode (9, OUTPUT); digitalWrite(9, LOW); } void loop() { //проверка таймера для обработки нажатий клавиатуры KeyBoardTime2=millis(); if ((KeyBoardTime2-KeyBoardTime1)>KeyBoardTimeInterval) { KeyBoardTime1=KeyBoardTime2; KeyBoardCalculate(); } if (lastFrameReceivedTime > lastFrameTranceivedTime){ //если получен новый пакет printLevel (outAr); // Вывод значений на дисплей lastFrameTranceivedTime = millis(); } else if ((lastFrameReceivedTime==0 && lastFrameTranceivedTime ==0)||(KeyBoardTime2-lastFrameReceivedTime>2000)) { lcd.clear(); delay (500); lcd.setCursor(0, 0); lcd.print("NO SIGNAL"); delay (500); } } void OnFrameReceiveComplete (unsigned short channelsReceived) // функция, вызываемая после получения очередного пакета { chRx = channelsReceived; // количество калалов, на которые пришли данные в пакете for (byte i=0; i9) { // lcd.print((start+1)); // lcd.print(" "); // } else lcd.print((start+1)); // lcd.setCursor(5, 1); lcd.print("V:"); // if (lv[0]<10) { // lcd.print("00"); // lcd.print(lv[0]); // Отображение уровня первого отображаемого канала в абсолютных единицах } else if (lv[0]<100 && lv[0]>9) { // lcd.print("0"); // lcd.print(lv[0]); // } else lcd.print(lv[0]); // lcd.setCursor(11, 1); lcd.print("T:"); // Отображение общего количества полученных каналов lcd.print(chRx); // } void ButtonPress() // Распознаем, какая кнопка нажата { if ((KeyButton1Value>200) and (KeyButton1Value<500)) { if((start) < (chRx-LCD_W) && chRx>LCD_W) start++; // обработка нажатия первой кнопки } if ((KeyButton1Value>500) and (KeyButton1Value<1000)) { if(start > 0) start--; // Обработка нажатия второй кнопки } } void KeyBoardCalculate() { //Часть отработки нажатия клавиши KeyButton1Value=analogRead(KEY_BUTTON_1_PIN); //если сигнал с кнопки нулевой то обнуляем метку обработки нажатия if ((KeyButton1Value<=50) or (KeyButton1Value>=1000)) { //Сохраняем время последнего сигнала без нажатой кнопки KeyButton1TimePress=millis(); KeyButton1WasChecked=0; KeyButton1RepeatTimePress=0; } KeyButton1TimeFromPress=millis()-KeyButton1TimePress; //исключаем шумы if ((KeyButton1Value>50) and (KeyButton1Value<1000)) { //отработка первого нажатия if ( ((KeyButton1TimeFromPress)>KeyButton1Latency) and (KeyButton1WasChecked==0)) { KeyButton1Value=analogRead(KEY_BUTTON_1_PIN); ButtonPress(); KeyButton1WasChecked=1; KeyButton1RepeatTimePress=0; } //отработка повторных нажатий if ( ((KeyButton1TimeFromPress)>(KeyButton1RepeatLatency+KeyButton1RepeatTimePress)) and (KeyButton1WasChecked==1)) { KeyButton1Value=analogRead(KEY_BUTTON_1_PIN); ButtonPress(); KeyButton1RepeatTimePress=KeyButton1RepeatTimePress+100; } } }