/* 1) все Serial.print и Serial.println в этом скетче закомментированы. 2) Везде в скетче используется 6 светодиодов на адресной светодиодной ленте WS2812, если используется другая лента или другое кол-во светодиодов, то надо это поменять. кол-во светодиодов в ленте присутствует в цикле for (int i=0; i<6; i++){ leds[i]=ledColorBlack; } где 6 - это и есть количество светодиодов на ленте. Общее описание: Подключено 3 кнопки, 2 реле и светодиодная лента, реагирующие на нажатие кнопок. Используется библиотека алекса гайвера для кнопок, чтобы не было проблем с дребезгом кнопок и в послеюущем фиксировать НЕоднократные нажатия кнопок для управления светодиодной лентой, её яркостью и цветом. Полное Управление светодиодной лентой ещё не реализовано. При одиночном нажатии на третью кнопку (пин 44) включается светодиодна лента с яркостью 30 (пин 47) и загорается светодиод красным цветом (пин 45). Если повторно нажать третью кнопку (пин 44), то выключится светодиодная лента (пин 47) и светодиод (пин 47) потухнет. При двойном нажатии на третью кнопку (пин 44), то мы переходим в режим программирования яркости светодиодной ленты, при этом загорается информационный синий светодиод (пин 39), при повторном нажатии третьей кнопки (пин 44), мы выйдем из режима программирования яркости и синий светодиод (пин 39) потухнет. Находясь в режиме программирования светодиодная лента по одиночному нажатию на третью кнопку (пин 44) увеличивает яркость от 0 до 5 от 5 до 15 от 15 до 30 от 30 до 50 от 50 до 70 от 70 до 80 от 80 до 90 от 90 до 100 от 100 до 0 Установив желаемую яркость, выходим из режима программирования яркости светодиодной ленты двойным кликом на третью кнопку (пин 44). Тройным нажатием на третью кнопку (пин 44) можно менять цвет светодиодной ленты. Четверное нажати на третью кнопку (пин 44) сбрасывает настройки до следующих параметров: 1) лента выключена, но установлена яркость 5 для последующего включения и цвет белый 2) светодиод сигнаизирующий о режиме программирования и статусе (включена/выключена) светодиодной ленты вЫключен. Светодиод используется RGB с общим анодом (с общим плюсом). | | | | | | | | красн | синий | зелен | | + 5V Через веб-интерфейс на http://10.36.1.72/ можно менять уровень яркости светодиодной ленты и её цвет, а так же контролировать эти показатели, то есть знать какой уровень яркости у включенной светодиодной ленты и каким цветом она светится. Управление ИК пультом я не удалял, хотя практика показала, что за 4 года я этим функционалом ни разу не воспользовался. */ #include "GyverButton.h" #include #include "IRremote.h" IRrecv irrecv(7); // Указываем пин, к которому подключен ИК-приемник decode_results results; // строка для ИК-приёма // для rgb ленты #include "FastLED.h" // количество светодиодов в ленте #define NUM_LEDS 144 #define COLOR_ORDER GRB #define DATA_PIN 47 // к пину 47покдлючен din светодиодной ленты CRGB leds[NUM_LEDS]; long ledColorWhite = 0xffffff; // белый (основной цвет) long ledColorBlack = 0x000000; // Чёрный (выключаем ленту) long ledColor = 0xffffff;// цвет светодиодной ленты, который будет меняться кнопками long ledColorBlue = 0x0000FF; // Синий цвет long ledColorRed = 0xFF0000; // Красный цвет long ledColorGreen = 0x008000; // Зелёный цвет byte initialBrightness = 0; // начальный уровень яркости светодиодной ленты byte brightnessLevel = 5; // Переменная значения уровня яркости лампы (0-минимум яркости, 100-максимум яркости). Можно использовать int вместо byte. int ledLight[] = {0,5,15,30,50,70,80,90,100}; // массив с уровнем яркости от 0 до 100 boolean SettingsMode = 0; // Переменная, характеризующая, зашли мы в режим настроек уровня яркости или нет boolean SettingsColorMode = 0; // Переменная, характеризующая, зашли мы в режим настроек цвета или нет // для rgb ленты конец // задаем константы const int ledPinA = 41; // номер выхода светодиода "А" GButton myButtA(40); // номер входа, подключенный к кнопке "А" const int RelayA = 46; // к 5-ому пину подключено IN1 реле "А" const int ledPinB = 43; // номер выхода светодиода "B" GButton myButtB(42); // номер входа, подключенный к кнопке "B" const int RelayB = 48; // к 5-ому пину подключено IN1 реле "B" GButton myButtC(44); // номер входа, подключенный к кнопке "С" const int ledPinC = 45; // номер выхода светодиода "C" const int ledPinCP = 39; // номер выхода светодиода "CP", показывает находимся ли мы в режиме программирования. Если горит синим, то мы в режиме программирования. // переменные boolean ledAOn = false; // Текущее состояние светодиода "A" (включен/выключен) boolean RelayAOn = false; // Текущее состояние реле boolean ledBOn = false; // Текущее состояние светодиода "B" (включен/выключен) boolean RelayBOn = false; // Текущее состояние реле boolean ledCOn = true; // Текущее состояние светодиода "C" (включен/выключен) boolean ledCPOn = true; // Текущее состояние светодиода "CP" (включен/выключен boolean ledStripLight = false; // Текущее состояние светодиодной ленты (включена/выключена) String readString = String(30); // объявляем переменную MY_IP со значением 10.36.1.72 - это IP-адрес назначаемый сетевому модулю Arduino #define MY_IP "10.36.1.72" // указываем настройки сетевого интерфейса и порт веб-сервера // mac - это mac-адрес назначаемый сетевому модулю Arduino byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x1F }; // в IPAddress ещё раз указываем IP-адрес IPAddress ip(10, 36, 1, 72); EthernetServer server(80); void setup() { delay(500); // HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (PIN --- КНОПКА --- GND) // LOW_PULL - кнопка подключена к VCC, пин подтянут к GND myButtA.setType(LOW_PULL); myButtB.setType(LOW_PULL); myButtC.setType(LOW_PULL); // указываем время для защиты от дребезга (30 мс) (!!! не должен быть больше myButt.setTimeout) myButtA.setDebounce(30); myButtB.setDebounce(30); myButtC.setDebounce(30); // NORM_OPEN - нормально-разомкнутая кнопка // NORM_CLOSE - нормально-замкнутая кнопка myButtA.setDirection(NORM_OPEN); myButtB.setDirection(NORM_OPEN); myButtC.setDirection(NORM_OPEN); // Запускаем прием с ИК irrecv.enableIRIn(); /* * без строки "digitalWrite(RelayA, LOW);" перед "pinMode" при включении * ардуины будет происходить кратковременное переключение реле, * а значит кратковременно подастся питание, что нам категорически * не надо! */ digitalWrite(RelayA, LOW); digitalWrite(RelayB, LOW); // инициализируем пин, подключенный к светодиоду "A", как выход pinMode(ledPinA, OUTPUT); // инициализируем пин, подключенный к реле "A", как выход pinMode(RelayA, OUTPUT); // инициализируем пин, подключенный к светодиоду "B", как выход pinMode(ledPinB, OUTPUT); // инициализируем пин, подключенный к реле "B", как выход pinMode(RelayB, OUTPUT); // инициализируем пин, подключенный к светодиоду "C", как выход digitalWrite(ledPinC, HIGH); pinMode(ledPinC, OUTPUT); // инициализируем пин, подключенный к светодиоду "CP", как выход digitalWrite(ledPinCP, HIGH); pinMode(ledPinCP, OUTPUT); // светодиодная лента LEDS.addLeds(leds, NUM_LEDS); // Set LED strip type // верхнюю строку можно написать и как-будто у нас светодиодная лента ws2812, оно тоже вроде как работает LEDS.setBrightness(initialBrightness); // устанавливаем яркость светодиодной ленты 0 при загрузке ардуно // включаем все светодиоды с 0 по NUM_LEDS в цвет = ledColorBlack (в чёрный цвет, то есть выключаем) for (int i=0; i 1 Click"); /////////////// если режим программирования выключен: if (SettingsMode==0){ // если светодиодная лента не включена: if (ledStripLight==false){ //Serial.println("BTN 3 -> 1 Click. NO settings mode 1"); digitalWrite(ledPinCP, HIGH); // вЫключаем светодиод, режима программирования LEDS.setBrightness(brightnessLevel); // устанавливаем яркость в значение brightnessLevel // включаем все светодиоды с 0 по NUM_LEDS в цвет = ledColor (изначально в белый цвет) for (int i=0; i 1 Click. NO settings mode 2"); digitalWrite(ledPinCP, HIGH); // выключаем светодиод, режима программирования LEDS.setBrightness(initialBrightness); // устанавливаем 0 // включаем все светодиоды с 0 по NUM_LEDS в цвет = ledColorBlack (в чёрный цвет, то есть выключаем) for (int i=0; i 1 Click on settings mode"); /////////////////////////// ЯРКОСТЬ ОТ 0 ДО 5 // если яркость (brightnessLevel) меньше 5 и не равна 5 if (brightnessLevel < 5 && brightnessLevel != 5){ // Serial.println("BTN 3 -> 1 Settings mode -> UP from 0 to 5"); // величиваем значение "brightnessLevel" с 0 до 5 постепенно на +1 значение for (brightnessLevel=0; brightnessLevel <= 4; brightnessLevel++){ for (int i=0; i 1 Settings mode -> UP from 5 to 15"); // величиваем значение "brightnessLevel" с 5 до 15 постепенно на +1 значение for (brightnessLevel=6; brightnessLevel <= 14; brightnessLevel++){ for (int i=0; i 1 Settings mode -> UP from 15 to 30"); // величиваем значение "brightnessLevel" с 15 до 30 постепенно на +1 значение for (brightnessLevel=16; brightnessLevel <= 29; brightnessLevel++){ for (int i=0; i 1 Settings mode -> UP from 30 to 50"); // величиваем значение "brightnessLevel" с 30 до 50 постепенно на +1 значение for (brightnessLevel=31; brightnessLevel <= 49; brightnessLevel++){ for (int i=0; i 1 Settings mode -> UP from 50 to 70"); // величиваем значение "brightnessLevel" с 50 до 70 постепенно на +1 значение for (brightnessLevel=51; brightnessLevel <= 69; brightnessLevel++){ for (int i=0; i 1 Settings mode -> UP from 70 to 80"); // величиваем значение "brightnessLevel" с 50 до 70 постепенно на +1 значение for (brightnessLevel=71; brightnessLevel <= 79; brightnessLevel++){ for (int i=0; i 1 Settings mode -> UP from 80 to 90"); // величиваем значение "brightnessLevel" с 80 до 90 постепенно на +1 значение for (brightnessLevel=81; brightnessLevel <= 89; brightnessLevel++){ for (int i=0; i 1 Settings mode -> UP from 90 to 100"); // величиваем значение "brightnessLevel" с 90 до 100 постепенно на +1 значение for (brightnessLevel=91; brightnessLevel <= 99; brightnessLevel++){ for (int i=0; i 1 Settings mode -> DOWN from 100 to 0"); // устанавливаем яркость светодиодной ленты LEDS.setBrightness(0); // сбрасываем яркость на 0 for (int i=0; i 2 Click -> Enter SettingsMode"); // переходим в режим программирования светодиодной лентой для настройки яркости: SettingsMode=!SettingsMode; // если режим программирования яркости светодиодной ленты включен: if (SettingsMode==1){ // вЫключаем светодиод красный digitalWrite(ledPinC, HIGH); // включаем светодиод синий digitalWrite(ledPinCP, LOW); } else { digitalWrite(ledPinCP, HIGH); // Serial.println("BTN 3 -> 2 Click -> Exit SettingsMode"); // если светодиодная лента не включена if (ledStripLight==false){ // вЫключаем светодиод обозначающий включённую светодиодную ленту digitalWrite(ledPinC, HIGH); } // если светодиодная лента включена else { // выключаем светодиод обозначающий включённую светодиодную ленту digitalWrite(ledPinC, LOW); } } // если в режиме программирования (SettingsMode==1) светодиодная лента была вЫключена, то после настройки яркости и выхода из режима программирования, надо вЫключить обратно светодиодную ленту, не смотря на установленный уровень яркости: if (SettingsMode==0 && ledStripLight==false && brightnessLevel==5) { LEDS.setBrightness(initialBrightness); for (int i=0; i 3 Click -> Change color"); // если находились в режиме программирования яркостью светодиодной ленты: if (SettingsMode==1) { // то выходим из режима программирования светодиодной лентой: // Serial.println("BTN 3 -> 3 Click -> EXIT SettingsMode"); SettingsMode=0; } // если цвет белый и режим смены цвета активен: if (ledColor == ledColorWhite && SettingsColorMode==1) { // если лента выключена или выключена (вообще можно убрать это условие): if (ledStripLight==false || ledStripLight==true){ // Serial.println("BTN 3 -> 3 Click"); digitalWrite(ledPinCP, HIGH); // вЫключаем светодиод режима программирования яркости LEDS.setBrightness(brightnessLevel); // устанавливаем яркость от 1 до 100 // включаем все светодиоды с 0 по NUM_LEDS в цвет = ledColorBlue (в синий цвет) for (int i=0; i 3 Click"); digitalWrite(ledPinCP, HIGH); // вЫключаем светодиод режима программирования яркости LEDS.setBrightness(brightnessLevel); // устанавливаем яркость от 1 до 100 // включаем все светодиоды с 0 по NUM_LEDS в цвет = ledColorBlue (в синий цвет) for (int i=0; i 3 Click"); digitalWrite(ledPinCP, HIGH); // вЫключаем светодиод режима программирования яркости LEDS.setBrightness(brightnessLevel); // устанавливаем яркость от 1 до 100 // включаем все светодиоды с 0 по NUM_LEDS в цвет = ledColorBlue (в синий цвет) for (int i=0; i 3 Click"); digitalWrite(ledPinCP, HIGH); // вЫключаем светодиод режима программирования яркости LEDS.setBrightness(brightnessLevel); // устанавливаем яркость от 1 до 100 // включаем все светодиоды с 0 по NUM_LEDS в цвет = ledColorBlue (в синий цвет) for (int i=0; i 4 Click -> Reset"); // сбрасываем настойки светодиодной ленты: ledStripLight=false; ledColor = ledColorWhite; digitalWrite(ledPinC, HIGH); digitalWrite(ledPinCP, HIGH); // устанавливаем уровень яркости светодиодной ленты после сброса по 4-ёх кратному нажатию. brightnessLevel=5; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { //Включаем реле "A" digitalWrite(RelayA, HIGH); RelayAOn = true; //Включаем светодиод "A" digitalWrite(ledPinA, HIGH); ledAOn = true; }else if(readString.indexOf("LevelA=0") >=0){ //Выключаем реле "A" digitalWrite(RelayA, LOW); RelayAOn = false; //Выключаем светодиод "A" digitalWrite(ledPinA, LOW); ledAOn = false; } /////////// реле А конец /////////// реле B начало //Проверяем включили ли реле "B" и светодиод "B"? //LevelB=1 - включен реле и светодиод "B" //LevelB=0 - выключен реле и светодиод "B" if(readString.indexOf("LevelB=1") >=0) { //Включаем реле "B" digitalWrite(RelayB, HIGH); RelayBOn = true; //Включаем светодиод "B" digitalWrite(ledPinB, HIGH); ledBOn = true; }else if(readString.indexOf("LevelB=0") >=0){ //Выключаем реле "B" digitalWrite(RelayB, LOW); RelayBOn = false; //Выключаем светодиод "B" digitalWrite(ledPinB, LOW); ledBOn = false; } /////////// реле B конец /////////////////// управление светодиодной лентой по web начало // яркость светодиодной ленты: if(readString.indexOf("ledLight=off") >=0) { digitalWrite(ledPinC, HIGH); SettingsMode=0; digitalWrite(ledPinCP, HIGH); LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, HIGH); SettingsMode=0; digitalWrite(ledPinCP, HIGH); brightnessLevel=0; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); brightnessLevel=5; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); brightnessLevel=15; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); brightnessLevel=30; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); brightnessLevel=50; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); brightnessLevel=70; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); brightnessLevel=80; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); brightnessLevel=90; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); brightnessLevel=100; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); ledColor=ledColorWhite; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); ledColor=ledColorBlue; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); ledColor=ledColorGreen; LEDS.setBrightness(brightnessLevel); for (int i=0; i=0) { digitalWrite(ledPinC, LOW); SettingsMode=0; digitalWrite(ledPinCP, HIGH); ledColor=ledColorRed; LEDS.setBrightness(brightnessLevel); for (int i=0; i"); client.println(""); client.println(" "); client.println(""); client.println(F("")); client.println(F("
")); client.println(F("Relay Control")); // добавляем красивости client.println(F("")); client.println(F("")); /////////////////////////// Relay A begin if (RelayAOn){ client.println("
"); client.println("Включить"); client.println("Выключить"); client.println(""); client.println("
"); client.println("Состояние реле: "); client.println("Вкл."); client.println("

"); }else{ client.println("
"); client.println("Включить"); client.println("Выключить"); client.println(""); client.println("
"); client.println("Состояние реле: "); client.println("Выкл"); client.println("

"); } /////////////////////////// Relay A end /////////////////////////// Relay B begin if (RelayBOn){ client.println("
"); client.println("Включить"); client.println("Выключить"); client.println(""); client.println("
"); client.println("Состояние реле: "); client.println("Вкл."); client.println("

"); }else{ client.println("
"); client.println("Включить"); client.println("Выключить"); client.println(""); client.println("
"); client.println("Состояние реле: "); client.println("Выкл"); client.println("

"); } ////////////////////////// Relay B end // управление реле кнопками на web-интерфейсе client.print(F("")); client.println(" "); client.println(F("

")); client.print(F("")); client.println(" "); client.println(F("

")); // таблица с кнопками управления яркости на web-интерфейсе client.println(""); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println("
ON10090807050301550OFF
"); client.print(F("

Текущее значение яркости: ")); client.println("

"); if (ledStripLight==false) { client.print(F("Светодиодная лента вЫключена

")); } if (brightnessLevel==0 && ledStripLight==false) { client.print(F("0

")); } if (brightnessLevel==0 && ledStripLight==true) { client.print(F("0

")); } if (brightnessLevel==5 && ledStripLight==true) { client.print(F("5

")); } if (brightnessLevel==15 && ledStripLight==true) { client.print(F("15

")); } if (brightnessLevel==30 && ledStripLight==true) { client.print(F("30

")); } if (brightnessLevel==50 && ledStripLight==true) { client.print(F("50

")); } if (brightnessLevel==70 && ledStripLight==true) { client.print(F("70

")); } if (brightnessLevel==80 && ledStripLight==true) { client.print(F("80

")); } if (brightnessLevel==90 && ledStripLight==true) { client.print(F("90

")); } if (brightnessLevel==100 && ledStripLight==true) { client.print(F("100

")); } if (ledStripLight==true) { client.print(F("Светодиодная лента включена

")); } client.print(F("

Режим программирования яркости кнопкой: ")); if (SettingsMode==true) { client.print(F("ВКЛЮЧЕН

")); } if (SettingsMode==false) { client.print(F("ВЫКЛЮЧЕН

")); } // таблица управления цветом светодиодной ленты на web-интерфейсе client.println(""); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println(" "); client.println("
белыйсинийзелёныйкрасный
"); client.print(F("

Цвет светодиодной ленты: ")); if (ledColor == ledColorWhite) { client.print(F("белый

")); } if (ledColor == ledColorBlue) { client.println("синий

"); } if (ledColor == ledColorGreen) { client.println("зелёный

"); } if (ledColor == ledColorRed) { client.println("красный

"); } ////////////////////////// LED лента end client.println(F("
")); client.println(""); readString=""; //останавливаем web-client client.stop(); } } } } // часть кода для ИК, реле и светодиода if (irrecv.decode(&results)) { int value = results.value; Serial.println(value, HEX); /* * мы знаем, что у цифры 2 значение сигнала 20DF48B7 */ if(value == 0x48B7)// Если нажата кнопка "2" { ledAOn = !ledAOn; RelayAOn = !RelayAOn; } irrecv.resume(); } }