From c2adbcd68efd51b91a7a1f1e8861d6e7db4d604d Mon Sep 17 00:00:00 2001 From: "Ts.Saltan" Date: Thu, 24 Jan 2019 13:57:04 +0300 Subject: [PATCH 1/5] Console RC --- colorMusic_v2.8/colorMusic_v2.8.ino | 173 +++++++++++++++++++++++++++- libraries/CommandLine/CommandLine.h | 75 ++++++++++++ 2 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 libraries/CommandLine/CommandLine.h diff --git a/colorMusic_v2.8/colorMusic_v2.8.ino b/colorMusic_v2.8/colorMusic_v2.8.ino index 86a3169..51fcec9 100644 --- a/colorMusic_v2.8/colorMusic_v2.8.ino +++ b/colorMusic_v2.8/colorMusic_v2.8.ino @@ -14,7 +14,7 @@ // ***************************** НАСТРОЙКИ ***************************** // ----- настройка ИК пульта -#define REMOTE_TYPE 1 // 0 - без пульта, 1 - пульт от WAVGAT, 2 - пульт от KEYES, 3 - кастомный пульт +#define REMOTE_TYPE 4 // 0 - без пульта, 1 - пульт от WAVGAT, 2 - пульт от KEYES, 3 - кастомный пульт, 4 - управление с ПК // система может работать С ЛЮБЫМ ИК ПУЛЬТОМ (практически). Коды для своего пульта можно задать начиная со строки 160 в прошивке. Коды пультов определяются скетчем IRtest_2.0, читай инструкцию // ----- настройки параметров @@ -177,6 +177,29 @@ byte HUE_STEP = 5; #define BUTT_HASH 0x38379AD // # #endif +// ----- Управление командами с ПК ----- +// В общем-то не важно, какой код будет у кнопок +#if REMOTE_TYPE == 4 +#include +#define BUTT_UP 0xE51CA6AD +#define BUTT_DOWN 0xD22353AD +#define BUTT_LEFT 0x517068AD +#define BUTT_RIGHT 0xAC2A56AD +#define BUTT_OK 0x1B92DDAD +#define BUTT_1 0x68E456AD +#define BUTT_2 0xF08A26AD +#define BUTT_3 0x151CD6AD +#define BUTT_4 0x18319BAD +#define BUTT_5 0xF39EEBAD +#define BUTT_6 0x4AABDFAD +#define BUTT_7 0xE25410AD +#define BUTT_8 0x297C76AD +#define BUTT_9 0x14CE54AD +#define BUTT_0 0xC089F6AD +#define BUTT_STAR 0xAF3F1BAD // * +#define BUTT_HASH 0x38379AD // # +#endif + // ------------------------------ ДЛЯ РАЗРАБОТЧИКОВ -------------------------------- #define MODE_AMOUNT 9 // количество режимов @@ -305,6 +328,10 @@ void setup() { readEEPROM(); } } + + #if REMOTE_TYPE == 4 + Serial.println("ColorMusic is ready"); // Приветствие в консоль + #endif } void loop() { @@ -656,11 +683,152 @@ float smartIncrFloat(float value, float incr_step, float mininmum, float maximum #if REMOTE_TYPE != 0 void remoteTick() { + + #if REMOTE_TYPE != 4 + // Управление с пульта if (IRLremote.available()) { auto data = IRLremote.read(); IRdata = data.command; ir_flag = true; } + #else + // Управление с ПК + ir_flag = hasCommand(); + if(ir_flag){ + const char *cmdName = getCommand(); + IRdata = -1; + + // mode {mode_№} - изменение режима + if(strcmp(cmdName, "mode") == 0){ + int mode = getArgInt(); + + if(mode > 0 && mode <= MODE_AMOUNT){ + this_mode = mode-1; + } + + Serial.print("Current mode: "); + Serial.println(mode); + } + + // submode - изменение подрежима, имитируем нажатие кнопки # + else if(strcmp(cmdName, "submode") == 0){ + IRdata = BUTT_HASH; + Serial.println("Submode changed"); + } + + // calibrate - калибровка шума, имитируем нажатие на кнопку 0 + else if (0 == strcmp(cmdName, "calibrate")){ + IRdata = BUTT_0; + Serial.println("Noise calibrated"); + } + + // power - вкл/выкл ленты, имитируем нажатие на * + else if (0 == strcmp(cmdName, "power")){ + IRdata = BUTT_STAR; + if(ONstate){ + Serial.println("LEDs off"); + } else { + Serial.println("LEDs on"); + } + } + + // bright+ - увеличение яркости горящих диодов + else if (0 == strcmp(cmdName, "bright+")){ + BRIGHTNESS = smartIncr(BRIGHTNESS, 10, 0, 255); + FastLED.setBrightness(BRIGHTNESS); + cmdName = "bright"; + } + + // bright- - уменьшение яркости горящих диодов + else if (0 == strcmp(cmdName, "bright-")){ + BRIGHTNESS = smartIncr(BRIGHTNESS, -10, 0, 255); + FastLED.setBrightness(BRIGHTNESS); + cmdName = "bright"; + } + + // bright {bright_level} - изменение уровня яркости горящих диодов + // bright - без аргумента показывает текущий уровень яркости + else if (0 == strcmp(cmdName, "bright")){ + int level = getArgInt(); + if(level > 0 && level <= 255){ + BRIGHTNESS = level; + FastLED.setBrightness(BRIGHTNESS); + Serial.print("Brightness changed to: "); + Serial.println(BRIGHTNESS); + } else { + Serial.print("Current brightness: "); + Serial.println(BRIGHTNESS); + } + } + + // backlight+ - увеличение яркости негорящих светодиодов + else if (0 == strcmp(cmdName, "backlight+")){ + EMPTY_BRIGHT = smartIncr(EMPTY_BRIGHT, 5, 0, 255); + cmdName = "backlight"; + } + + // backlight- - уменьшение яркости негорящих светодиодов + else if (0 == strcmp(cmdName, "backlight-")){ + EMPTY_BRIGHT = smartIncr(EMPTY_BRIGHT, -5, 0, 255); + cmdName = "backlight"; + } + + // backlight {bright_level} - изменение яркости негорящих светодиодов + // backlight - без аргумента - текущий уровень фоновой подсветки + else if (0 == strcmp(cmdName, "backlight")){ + int level = getArgInt(); + if(level > 0 && level <= 255){ + EMPTY_BRIGHT = level; + Serial.print("Backlight brightness changed to: "); + Serial.println(EMPTY_BRIGHT); + } else { + Serial.print("Current backlight brightness: "); + Serial.println(EMPTY_BRIGHT); + } + } + + // lightmode {mode_№} - изменение подрежима у режима №7 (постоянная подсветка) + else if (0 == strcmp(cmdName, "lightmode")){ + int mode = getArgInt(); + light_mode = mode; + + Serial.print("Current light mode: "); + Serial.println(light_mode); + } + + // Команды для настройки, кнопки вверх, вниз, влево, вправо - up, down, left, right соответственно + else if (0 == strcmp(cmdName, "up")){ + settings_mode = false; + IRdata = BUTT_UP; + } + else if (0 == strcmp(cmdName, "down")){ + settings_mode = false; + IRdata = BUTT_DOWN; + } + else if (0 == strcmp(cmdName, "left")){ + settings_mode = false; + IRdata = BUTT_LEFT; + } + else if (0 == strcmp(cmdName, "right")){ + settings_mode = false; + IRdata = BUTT_RIGHT; + } + + // handshake - "рукопожатие", устройство должно вернуть своё название, чтоб программа смогла найти "своё" Arduino для управления + else if (0 == strcmp(cmdName, "handshake")){ + Serial.println(" ColorMusic"); + } + + // Обработка неподдерживаемых команд + else { + Serial.print("Invalid command '"); + Serial.print(cmdName); + Serial.println("'"); + } + + } + #endif + if (ir_flag) { // если данные пришли eeprom_timer = millis(); eeprom_flag = true; @@ -831,6 +999,9 @@ void remoteTick() { } } break; + case -1: // кейс для управление с ПК, когда нужно сохранить настройки + eeprom_flag = true; + break; default: eeprom_flag = false; // если не распознали кнопку, не обновляем настройки! break; } diff --git a/libraries/CommandLine/CommandLine.h b/libraries/CommandLine/CommandLine.h new file mode 100644 index 0000000..a5ec06e --- /dev/null +++ b/libraries/CommandLine/CommandLine.h @@ -0,0 +1,75 @@ +#define COMMAND_BUFFER_LENGTH 100 // Максикмальная длина команды. MAX: 255 + +#define CR '\r' +#define LF '\n' +#define BS '\b' +#define NULLCHAR '\0' +#define SPACE ' ' + +const char *delimiters = ", \n"; // Разделитель команд +char commandLine[COMMAND_BUFFER_LENGTH + 1]; // Буфер для команды + +/** + * hasCommand() + * Считывает данные с порта в буфер + * @return bool true - поступила новая команда, false - в буфере пусто + */ +bool hasCommand(){ + static uint8_t charsRead = 0; + + while (Serial.available()) { + char c; + + if(Serial.available()){ + c = Serial.read(); + } + + switch (c){ + case CR: // команда заканчивается символом CR и/или LS + case LF: + commandLine[charsRead] = NULLCHAR; + if (charsRead > 0) { + charsRead = 0; + Serial.println(commandLine); + return true; + } + break; + default: + c = tolower(c); + if (charsRead < COMMAND_BUFFER_LENGTH) { + commandLine[charsRead++] = c; + } + commandLine[charsRead] = NULLCHAR; //just in case + break; + } + } + + return false; +} + +/** + * getCommand() + * Получить текст команды + */ +char * getCommand() { + char * word = strtok(commandLine, delimiters); + return word; +} + +/** + * getArg() + * Получить следующий аргумент + */ +char * getArg() { + char * word = strtok(NULL, delimiters); + return word; +} + +/** + * getArgInt() + * Получить следующий числовой аргумент + */ +long getArgInt() { + char * numTextPtr = strtok(NULL, delimiters); + return atol(numTextPtr); +} \ No newline at end of file From 60bfa24592d1efc82bb7fd9553ee8dca1d5d7514 Mon Sep 17 00:00:00 2001 From: "Ts.Saltan" Date: Thu, 24 Jan 2019 13:57:24 +0300 Subject: [PATCH 2/5] Powershell RC form --- PCRemoteControl/RCForm.ps1 | 572 +++++++++++++++++++++++++++++++++ PCRemoteControl/launcher.vbs | 7 + PCRemoteControl/screenshot.jpg | Bin 0 -> 38973 bytes 3 files changed, 579 insertions(+) create mode 100644 PCRemoteControl/RCForm.ps1 create mode 100644 PCRemoteControl/launcher.vbs create mode 100644 PCRemoteControl/screenshot.jpg diff --git a/PCRemoteControl/RCForm.ps1 b/PCRemoteControl/RCForm.ps1 new file mode 100644 index 0000000..100e654 --- /dev/null +++ b/PCRemoteControl/RCForm.ps1 @@ -0,0 +1,572 @@ +<# + Форма для управления цветомузыкой с ПК + В скетче Arduino укажите define REMOTE_TYPE 4 +#> + +Add-Type -AssemblyName System.Windows.Forms +[System.Windows.Forms.Application]::EnableVisualStyles() + +<# + # Найдено ли Arduino-устройство + # @var bool + #> +$devFound = $false + +<# + # Поток к Arduino устройству + # @var Serial + #> +$arduino = $null + +# Ищем устаройства CH340 - так определяется Arduino в диспетчере задач +# Если у вашего устройства другой чип, поменяйте на следующей строке CH340 на другое значение +$query = Get-WmiObject -Query "Select Caption from Win32_PnPEntity WHERE Name like '%CH340%'" +foreach ($port in $query){ + try{ + # Ищем COM порты + if($port['Caption'] -match 'COM\d+'){ + $com = $Matches[0] + $baud = 9600 + $arduino = new-Object System.IO.Ports.SerialPort $com,$baud,None,8,one + + Write-host "Connect to " $arduino.PortName " port..." + + $arduino.ReadTimeout = 5000; + $arduino.WriteTimeout = 5000; + $arduino.open() + + # Отправляем приветствие + Write-host "handshake ..." + $arduino.WriteLine("handshake") + Write-host "Read line ..." + start-sleep -m 50 + + $hello = $arduino.ReadLine() + Write-host "Answer:" $hello + + # Если вернуло нашу команду - считываем следующую строку + if($hello -match "handshake"){ + Write-host "Read next" + start-sleep -m 50 + $hello = $arduino.ReadLine() + Write-host "Next answer:" $hello + } + + # Если нашли название ColorMusic, то это наше Arduino + if($hello -match "ColorMusic"){ + Write-host "Device found" + $devFound = $true + break + } + + # $arduino.close() + } + + } catch { + Write-host "Error" + $_ + } + + + if($arduino.isOpen){ + $arduino.close() + } +} + +<# Форма с ошибкой #> +$ErrorForm = New-Object system.Windows.Forms.Form +$ErrorForm.ClientSize = '463,120' +$ErrorForm.text = "Error" +$ErrorForm.TopMost = $false +$ErrorForm.FormBorderStyle = 'Fixed3D' +$ErrorForm.MaximizeBox = $false +$ErrorForm.MinimizeBox = $false + +$ELabel1 = New-Object system.Windows.Forms.Label +$ELabel1.text = " " +$ELabel1.BackColor = "#ff0000" +$ELabel1.AutoSize = $false +$ELabel1.width = 39 +$ELabel1.height = 41 +$ELabel1.location = New-Object System.Drawing.Point(24,33) +$ELabel1.Font = 'Microsoft Sans Serif,10,style=Bold' +$ELabel1.ForeColor = "#ffffff" + +$ELabel2 = New-Object system.Windows.Forms.Label +$ELabel2.text = "X" +$ELabel2.AutoSize = $true +$ELabel2.width = 25 +$ELabel2.height = 10 +$ELabel2.location = New-Object System.Drawing.Point(30,37) +$ELabel2.Font = 'Microsoft Sans Serif,20,style=Bold' +$ELabel2.ForeColor = "#ffffff" +$ELabel2.BackColor = "#ff0000" + +$LabelError = New-Object system.Windows.Forms.Label +$LabelError.text = "Ошибка: не найдено устройство для удалённого управления!" +$LabelError.AutoSize = $false +$LabelError.width = 360 +$LabelError.height = 42 +$LabelError.Anchor = 'top,right,left' +$LabelError.location = New-Object System.Drawing.Point(78,34) +$LabelError.Font = 'Microsoft Sans Serif,10' + +$EButton1 = New-Object system.Windows.Forms.Button +$EButton1.text = "OK" +$EButton1.width = 60 +$EButton1.height = 30 +$EButton1.location = New-Object System.Drawing.Point(393,85) +$EButton1.Font = 'Microsoft Sans Serif,10' + +$EButton1.Add_Click({ + $ErrorForm.close() +}) + +$ErrorForm.controls.AddRange(@($ELabel2, $ELabel1, $LabelError, $EButton1)) + +<# + Форма для управления цветомузыкой + https://poshgui.com/editor/5c47451d742c2245c890cd9c +#> +$Form = New-Object system.Windows.Forms.Form +$Form.ClientSize = '600,370' +$Form.text = " ColorMusic" +$Form.TopMost = $false +$Form.FormBorderStyle = 'Fixed3D' +$Form.MaximizeBox = $false + +$btn_power = New-Object system.Windows.Forms.Button +$btn_power.BackColor = "#ca2929" +$btn_power.text = "Power" +$btn_power.width = 60 +$btn_power.height = 30 +$btn_power.location = New-Object System.Drawing.Point(7,10) +$btn_power.Font = 'Microsoft Sans Serif,10' +$btn_power.ForeColor = "#ffffff" + +$btn_calibrate = New-Object system.Windows.Forms.Button +$btn_calibrate.text = "Калибровка" +$btn_calibrate.width = 100 +$btn_calibrate.height = 30 +$btn_calibrate.location = New-Object System.Drawing.Point(80,10) +$btn_calibrate.Font = 'Microsoft Sans Serif,10' + +$btn_volume_gradient = New-Object system.Windows.Forms.Button +$btn_volume_gradient.text = "Градиент" +$btn_volume_gradient.width = 100 +$btn_volume_gradient.height = 30 +$btn_volume_gradient.location = New-Object System.Drawing.Point(10,22) +$btn_volume_gradient.Font = 'Microsoft Sans Serif,10' + +$btn_volume_rainbow = New-Object system.Windows.Forms.Button +$btn_volume_rainbow.text = "Радуга" +$btn_volume_rainbow.width = 100 +$btn_volume_rainbow.height = 30 +$btn_volume_rainbow.location = New-Object System.Drawing.Point(125,22) +$btn_volume_rainbow.Font = 'Microsoft Sans Serif,10' + +$Label2 = New-Object system.Windows.Forms.Label +$Label2.text = "Яркость" +$Label2.AutoSize = $false +$Label2.width = 112 +$Label2.height = 18 +$Label2.Anchor = 'top,right,left' +$Label2.location = New-Object System.Drawing.Point(82,25) +$Label2.Font = 'Microsoft Sans Serif,10' + +$btn_bright_inc = New-Object system.Windows.Forms.Button +$btn_bright_inc.text = "+" +$btn_bright_inc.width = 25 +$btn_bright_inc.height = 25 +$btn_bright_inc.location = New-Object System.Drawing.Point(43,19) +$btn_bright_inc.Font = 'Microsoft Sans Serif,10' + +$btn_bright_dec = New-Object system.Windows.Forms.Button +$btn_bright_dec.text = "-" +$btn_bright_dec.width = 25 +$btn_bright_dec.height = 25 +$btn_bright_dec.location = New-Object System.Drawing.Point(10,19) +$btn_bright_dec.Font = 'Microsoft Sans Serif,10' + +$btn_color_5 = New-Object system.Windows.Forms.Button +$btn_color_5.text = "5 полос" +$btn_color_5.width = 100 +$btn_color_5.height = 30 +$btn_color_5.location = New-Object System.Drawing.Point(10,22) +$btn_color_5.Font = 'Microsoft Sans Serif,10' + +$btn_color_3 = New-Object system.Windows.Forms.Button +$btn_color_3.text = "3 полосы" +$btn_color_3.width = 100 +$btn_color_3.height = 30 +$btn_color_3.location = New-Object System.Drawing.Point(120,22) +$btn_color_3.Font = 'Microsoft Sans Serif,10' + +$btn_color_1 = New-Object system.Windows.Forms.Button +$btn_color_1.text = "1 полоса" +$btn_color_1.width = 100 +$btn_color_1.height = 30 +$btn_color_1.location = New-Object System.Drawing.Point(230,22) +$btn_color_1.Font = 'Microsoft Sans Serif,10' + +$btn_color_run = New-Object system.Windows.Forms.Button +$btn_color_run.text = "Бегущие частоты" +$btn_color_run.width = 150 +$btn_color_run.height = 30 +$btn_color_run.location = New-Object System.Drawing.Point(10,64) +$btn_color_run.Font = 'Microsoft Sans Serif,10' + +$btn_back_dec = New-Object system.Windows.Forms.Button +$btn_back_dec.text = "-" +$btn_back_dec.width = 25 +$btn_back_dec.height = 25 +$btn_back_dec.location = New-Object System.Drawing.Point(10,54) +$btn_back_dec.Font = 'Microsoft Sans Serif,10' + +$btn_back_inc = New-Object system.Windows.Forms.Button +$btn_back_inc.text = "+" +$btn_back_inc.width = 25 +$btn_back_inc.height = 25 +$btn_back_inc.location = New-Object System.Drawing.Point(43,54) +$btn_back_inc.Font = 'Microsoft Sans Serif,10' + +$btn_analyze = New-Object system.Windows.Forms.Button +$btn_analyze.text = "Анализатор" +$btn_analyze.width = 150 +$btn_analyze.height = 30 +$btn_analyze.location = New-Object System.Drawing.Point(180,64) +$btn_analyze.Font = 'Microsoft Sans Serif,10' + +$btn_left = New-Object system.Windows.Forms.Button +$btn_left.text = "-" +$btn_left.width = 25 +$btn_left.height = 25 +$btn_left.location = New-Object System.Drawing.Point(10,101) +$btn_left.Font = 'Microsoft Sans Serif,10' + +$btn_right = New-Object system.Windows.Forms.Button +$btn_right.text = "+" +$btn_right.width = 25 +$btn_right.height = 25 +$btn_right.location = New-Object System.Drawing.Point(43,101) +$btn_right.Font = 'Microsoft Sans Serif,10' + +$btn_down = New-Object system.Windows.Forms.Button +$btn_down.text = "-" +$btn_down.width = 25 +$btn_down.height = 25 +$btn_down.location = New-Object System.Drawing.Point(10,136) +$btn_down.Font = 'Microsoft Sans Serif,10' + +$btn_up = New-Object system.Windows.Forms.Button +$btn_up.text = "+" +$btn_up.width = 25 +$btn_up.height = 25 +$btn_up.location = New-Object System.Drawing.Point(43,136) +$btn_up.Font = 'Microsoft Sans Serif,10' + +$btn_const = New-Object system.Windows.Forms.Button +$btn_const.text = "Подсветка" +$btn_const.width = 100 +$btn_const.height = 30 +$btn_const.location = New-Object System.Drawing.Point(10,22) +$btn_const.Font = 'Microsoft Sans Serif,10' + +$Groupbox1 = New-Object system.Windows.Forms.Groupbox +$Groupbox1.height = 65 +$Groupbox1.width = 342 +$Groupbox1.text = "Шкала громкости" +$Groupbox1.location = New-Object System.Drawing.Point(10,60) + +$Groupbox2 = New-Object system.Windows.Forms.Groupbox +$Groupbox2.height = 301 +$Groupbox2.width = 203 +$Groupbox2.Anchor = 'top,right,bottom,left' +$Groupbox2.text = "Настройки" +$Groupbox2.location = New-Object System.Drawing.Point(363,60) + +$Label1 = New-Object system.Windows.Forms.Label +$Label1.text = "Яркость фона" +$Label1.AutoSize = $false +$Label1.width = 112 +$Label1.height = 18 +$Label1.Anchor = 'top,right,left' +$Label1.location = New-Object System.Drawing.Point(82,58) +$Label1.Font = 'Microsoft Sans Serif,10' + +$label_lr = New-Object system.Windows.Forms.Label +$label_lr.text = "LR" +$label_lr.AutoSize = $false +$label_lr.width = 112 +$label_lr.height = 18 +$label_lr.Anchor = 'top,right,left' +$label_lr.location = New-Object System.Drawing.Point(82,105) +$label_lr.Font = 'Microsoft Sans Serif,10' + +$Groupbox3 = New-Object system.Windows.Forms.Groupbox +$Groupbox3.height = 104 +$Groupbox3.width = 342 +$Groupbox3.text = "Цветомузыка" +$Groupbox3.location = New-Object System.Drawing.Point(10,143) + +$label_ud = New-Object system.Windows.Forms.Label +$label_ud.text = "UD" +$label_ud.AutoSize = $false +$label_ud.width = 112 +$label_ud.height = 18 +$label_ud.Anchor = 'top,right,left' +$label_ud.location = New-Object System.Drawing.Point(82,141) +$label_ud.Font = 'Microsoft Sans Serif,10' + +$Groupbox4 = New-Object system.Windows.Forms.Groupbox +$Groupbox4.height = 100 +$Groupbox4.width = 342 +$Groupbox4.text = "Постоянная подсветка" +$Groupbox4.location = New-Object System.Drawing.Point(10,261) + +$btn_const_grad = New-Object system.Windows.Forms.Button +$btn_const_grad.text = "Градиент" +$btn_const_grad.width = 100 +$btn_const_grad.height = 30 +$btn_const_grad.location = New-Object System.Drawing.Point(120,22) +$btn_const_grad.Font = 'Microsoft Sans Serif,10' + +$btn_const_rainbow = New-Object system.Windows.Forms.Button +$btn_const_rainbow.text = "Радуга" +$btn_const_rainbow.width = 100 +$btn_const_rainbow.height = 30 +$btn_const_rainbow.location = New-Object System.Drawing.Point(230,22) +$btn_const_rainbow.Font = 'Microsoft Sans Serif,10' + +$btn_const_wildfire = New-Object system.Windows.Forms.Button +$btn_const_wildfire.text = "Огонь" +$btn_const_wildfire.width = 150 +$btn_const_wildfire.height = 30 +$btn_const_wildfire.location = New-Object System.Drawing.Point(10,60) +$btn_const_wildfire.Font = 'Microsoft Sans Serif,10' + +$btn_const_strobo = New-Object system.Windows.Forms.Button +$btn_const_strobo.text = "Стробоскоп" +$btn_const_strobo.width = 150 +$btn_const_strobo.height = 30 +$btn_const_strobo.location = New-Object System.Drawing.Point(180,60) +$btn_const_strobo.Font = 'Microsoft Sans Serif,10' + +$Form.controls.AddRange(@($btn_power,$btn_calibrate,$Groupbox1,$Groupbox2,$Groupbox3,$Groupbox4)) +$Groupbox1.controls.AddRange(@($btn_volume_gradient,$btn_volume_rainbow)) +$Groupbox2.controls.AddRange(@($Label2,$btn_bright_inc,$btn_bright_dec,$btn_back_dec,$btn_back_inc,$btn_left,$btn_right,$btn_down,$btn_up,$Label1,$label_lr,$label_ud)) +$Groupbox3.controls.AddRange(@($btn_color_5,$btn_color_3,$btn_color_1,$btn_color_run,$btn_analyze)) +$Groupbox4.controls.AddRange(@($btn_const,$btn_const_grad,$btn_const_rainbow,$btn_const_strobo)) +<# +На будущее - режим с огнём +$Groupbox4.controls.AddRange(@($btn_const,$btn_const_grad,$btn_const_rainbow,$btn_const_wildfire,$btn_const_strobo)) +#> + +$label_lr.text = " " +$btn_right.Enabled = $false +$btn_left.Enabled = $false + +$label_ud.text = " " +$btn_up.Enabled = $false +$btn_down.Enabled = $false + +### Callbacks + +$btn_power.Add_Click({ + $arduino.writeLine("power") +}) + +$btn_calibrate.Add_Click({ + $arduino.writeLine("calibrate") +}) + +$btn_volume_gradient.Add_Click({ + $arduino.writeLine("mode 1") + + $label_lr.text = "Плавность анимации" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = " " + $btn_up.Enabled = $false + $btn_down.Enabled = $false +}) + +$btn_volume_rainbow.Add_Click({ + $arduino.writeLine("mode 2") + + $label_lr.text = "Плавность анимации" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Скорость радуги" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_color_1.Add_Click({ + $arduino.writeLine("mode 5") + + $label_lr.text = "Плавность анимации" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Чувствительность" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_color_3.Add_Click({ + $arduino.writeLine("mode 4") + + $label_lr.text = "Плавность анимации" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Чувствительность" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_color_5.Add_Click({ + $arduino.writeLine("mode 3") + + $label_lr.text = "Плавность анимации" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Чувствительность" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_const_strobo.Add_Click({ + $arduino.writeLine("mode 6") + + $label_lr.text = "Плавность вспышек" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Частота вспышек" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_const.Add_Click({ + $arduino.writeLine("mode 7") + $arduino.writeLine("lightmode 0") + + $label_lr.text = "Цвет" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Насыщенность" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_const_grad.Add_Click({ + $arduino.writeLine("mode 7") + $arduino.writeLine("lightmode 1") + + $label_lr.text = "Скорость" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Насыщенность" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_const_rainbow.Add_Click({ + $arduino.writeLine("mode 7") + $arduino.writeLine("lightmode 2") + + $label_lr.text = "Скорость" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Шаг радуги" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_const_wildfire.Add_Click({ + $arduino.writeLine("mode 7") + $arduino.writeLine("lightmode 3") + + $label_lr.text = "Искры" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Высота огня" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_color_run.Add_Click({ + $arduino.writeLine("mode 8") + + $label_lr.text = "Скорость" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Чувствительность" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_analyze.Add_Click({ + $arduino.writeLine("mode 9") + + $label_lr.text = "Шаг цвета" + $btn_right.Enabled = $true + $btn_left.Enabled = $true + + $label_ud.text = "Цвет" + $btn_up.Enabled = $true + $btn_down.Enabled = $true +}) + +$btn_bright_dec.Add_Click({ + $arduino.writeLine("bright-") +}) + +$btn_bright_inc.Add_Click({ + $arduino.writeLine("bright+") +}) + +$btn_back_inc.Add_Click({ + $arduino.writeLine("backlight+") +}) + +$btn_back_dec.Add_Click({ + $arduino.writeLine("backlight-") +}) + +$btn_up.Add_Click({ + $arduino.writeLine("up") +}) + +$btn_down.Add_Click({ + $arduino.writeLine("down") +}) + +$btn_right.Add_Click({ + $arduino.writeLine("right") +}) + +$btn_left.Add_Click({ + $arduino.writeLine("left") +}) + +### GUI End ### + +if ($devFound) { + $Form.text = $Form.text + ' (' + $arduino.PortName + ')' + $Form.showDialog() +} else { + $ErrorForm.showDialog() +} + +$arduino.close() \ No newline at end of file diff --git a/PCRemoteControl/launcher.vbs b/PCRemoteControl/launcher.vbs new file mode 100644 index 0000000..83e8c61 --- /dev/null +++ b/PCRemoteControl/launcher.vbs @@ -0,0 +1,7 @@ +Set objShell = CreateObject("Wscript.Shell") +strPath = Wscript.ScriptFullName +Set objFSO = CreateObject("Scripting.FileSystemObject") +Set objFile = objFSO.GetFile(strPath) +strFolder = objFSO.GetParentFolderName(objFile) +strPath = "powershell.exe -ExecutionPolicy UnRestricted -windowstyle hidden -File " & strFolder & "\\RCForm.ps1" +objShell.Run strPath, 4, true \ No newline at end of file diff --git a/PCRemoteControl/screenshot.jpg b/PCRemoteControl/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3525487cf8286869de5906d386f219a3c5abb9a0 GIT binary patch literal 38973 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 Date: Thu, 24 Jan 2019 14:11:59 +0300 Subject: [PATCH 3/5] RemoteControl readme --- PCRemoteControl/RCForm.ps1 | 8 ++++---- PCRemoteControl/readme.md | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 PCRemoteControl/readme.md diff --git a/PCRemoteControl/RCForm.ps1 b/PCRemoteControl/RCForm.ps1 index 100e654..fb74253 100644 --- a/PCRemoteControl/RCForm.ps1 +++ b/PCRemoteControl/RCForm.ps1 @@ -129,7 +129,7 @@ $ErrorForm.controls.AddRange(@($ELabel2, $ELabel1, $LabelError, $EButton1)) https://poshgui.com/editor/5c47451d742c2245c890cd9c #> $Form = New-Object system.Windows.Forms.Form -$Form.ClientSize = '600,370' +$Form.ClientSize = '605,370' $Form.text = " ColorMusic" $Form.TopMost = $false $Form.FormBorderStyle = 'Fixed3D' @@ -280,7 +280,7 @@ $Groupbox1.location = New-Object System.Drawing.Point(10,60) $Groupbox2 = New-Object system.Windows.Forms.Groupbox $Groupbox2.height = 301 -$Groupbox2.width = 203 +$Groupbox2.width = 235 $Groupbox2.Anchor = 'top,right,bottom,left' $Groupbox2.text = "Настройки" $Groupbox2.location = New-Object System.Drawing.Point(363,60) @@ -297,7 +297,7 @@ $Label1.Font = 'Microsoft Sans Serif,10' $label_lr = New-Object system.Windows.Forms.Label $label_lr.text = "LR" $label_lr.AutoSize = $false -$label_lr.width = 112 +$label_lr.width = 140 $label_lr.height = 18 $label_lr.Anchor = 'top,right,left' $label_lr.location = New-Object System.Drawing.Point(82,105) @@ -312,7 +312,7 @@ $Groupbox3.location = New-Object System.Drawing.Point(10,143) $label_ud = New-Object system.Windows.Forms.Label $label_ud.text = "UD" $label_ud.AutoSize = $false -$label_ud.width = 112 +$label_ud.width = 140 $label_ud.height = 18 $label_ud.Anchor = 'top,right,left' $label_ud.location = New-Object System.Drawing.Point(82,141) diff --git a/PCRemoteControl/readme.md b/PCRemoteControl/readme.md new file mode 100644 index 0000000..2c85855 --- /dev/null +++ b/PCRemoteControl/readme.md @@ -0,0 +1,29 @@ +# Управление светомузыкой c консоли +## Установка +В скетче изменить значение константы REMOTE_TYPE на 4 +```c +#define REMOTE_TYPE 4 +``` + +## Команды для управления с консоли +* **mode {mode_№}** - изменение режима (от 1 до 9, как на пульте) +* **submode** - изменение подрежима +* **calibrate** - калибровка шума +* **power** - вкл/выкл ленты +* **bright+** - увеличение яркости горящих диодов +* **bright-** - уменьшение яркости горящих диодов +* **bright {bright_level}** - изменение уровня яркости горящих диодов +* **backlight+** - увеличение яркости негорящих светодиодов +* **backlight-** - уменьшение яркости негорящих светодиодов +* **backlight {bright_level}** - изменение яркости негорящих светодиодов +* **lightmode {mode_№}** - изменение подрежима у режима №7 (постоянная подсветка) +* **up** - настройка режима, кнопка вверх +* **down** - настройка режима, кнопка вниз +* **left** - настройка режима, кнопка влево +* **right** - настройка режима, кнопка вправо +* **handshake** - "рукопожатие", устройство должно вернуть своё название, чтоб программа с ПК смогла найти "своё" Arduino для управления + +## Программа для управления с ПК +![Powershell RC Form](https://github.com/TsSaltan/ColorMusic/blob/master/PCRemoteControl/screenshot.jpg) +1. Если в диспетчере устройство Arduino определяется как **CH340**, то ничего менять не надо, запускаем файл **launcher.vbs** +2. Если же название у микросхемы другое, в файле **RCForm.ps1** меняем **CH340** на своё значение. \ No newline at end of file From d114444bb9422b9b1842497b40718f2c331e0ad1 Mon Sep 17 00:00:00 2001 From: "Ts.Saltan" Date: Thu, 24 Jan 2019 14:41:05 +0300 Subject: [PATCH 4/5] Added fire animation (light_mode) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Новый подрежим "анимация огня" для режима постоянно подсветки (№7). Настройка Вверх/вниз - изменение высоты огня Влево/вправо - изменение частоты повяления "вспышек" --- PCRemoteControl/RCForm.ps1 | 4 --- colorMusic_v2.8/colorMusic_v2.8.ino | 50 +++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/PCRemoteControl/RCForm.ps1 b/PCRemoteControl/RCForm.ps1 index fb74253..1772cac 100644 --- a/PCRemoteControl/RCForm.ps1 +++ b/PCRemoteControl/RCForm.ps1 @@ -356,11 +356,7 @@ $Form.controls.AddRange(@($btn_power,$btn_calibrate,$Groupbox1,$Groupbox2,$Group $Groupbox1.controls.AddRange(@($btn_volume_gradient,$btn_volume_rainbow)) $Groupbox2.controls.AddRange(@($Label2,$btn_bright_inc,$btn_bright_dec,$btn_back_dec,$btn_back_inc,$btn_left,$btn_right,$btn_down,$btn_up,$Label1,$label_lr,$label_ud)) $Groupbox3.controls.AddRange(@($btn_color_5,$btn_color_3,$btn_color_1,$btn_color_run,$btn_analyze)) -$Groupbox4.controls.AddRange(@($btn_const,$btn_const_grad,$btn_const_rainbow,$btn_const_strobo)) -<# -На будущее - режим с огнём $Groupbox4.controls.AddRange(@($btn_const,$btn_const_grad,$btn_const_rainbow,$btn_const_wildfire,$btn_const_strobo)) -#> $label_lr.text = " " $btn_right.Enabled = $false diff --git a/colorMusic_v2.8/colorMusic_v2.8.ino b/colorMusic_v2.8/colorMusic_v2.8.ino index 51fcec9..034a6db 100644 --- a/colorMusic_v2.8/colorMusic_v2.8.ino +++ b/colorMusic_v2.8/colorMusic_v2.8.ino @@ -114,6 +114,16 @@ byte HUE_STEP = 5; HUE_PINK */ +// ---- Режим огня ---- +// COOLING/Охлажнение: Насколько воздух охлаждается +// Меньше охлаждение - выше пламя и наоборот +// Default 50, suggested range 20-100 +byte FIRE_COOLING = 50; + +// SPARKING: Какова вероятность появления искры +// Default 120, suggested range 50-200. +byte FIRE_SPARKING = 120; + // ----- КНОПКИ ПУЛЬТА WAVGAT ----- #if REMOTE_TYPE == 1 #define BUTT_UP 0xF39EEBAD @@ -609,6 +619,30 @@ void animation() { if (rainbow_steps < 0) rainbow_steps = 255; } break; + + case 3: + static byte heat[NUM_LEDS]; + // Step 1. Cool down every cell a little + for( int i = 0; i < NUM_LEDS; i++) { + heat[i] = qsub8( heat[i], random8(0, ((FIRE_COOLING * 10) / NUM_LEDS) + 2)); + } + // Step 2. Heat from each cell drifts 'up' and diffuses a little + for( int k= NUM_LEDS - 1; k >= 2; k--) { + heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3; + } + // Step 3. Randomly ignite new 'sparks' of heat near the bottom + if( random8() < FIRE_SPARKING ) { + int y = random8(7); + heat[y] = qadd8( heat[y], random8(160,255) ); + } + // Step 4. Map from heat cells to LED colors + for( int j = 0; j < NUM_LEDS/*/2*/; j++) { + CRGB color = HeatColor( heat[j]); + int pixelnumber; + pixelnumber = j; + leds[pixelnumber] = color; + } + break; } break; case 7: @@ -861,7 +895,7 @@ void remoteTick() { case 4: case 7: if (++freq_strobe_mode > 3) freq_strobe_mode = 0; break; - case 6: if (++light_mode > 2) light_mode = 0; + case 6: if (++light_mode > 3) light_mode = 0; break; } break; @@ -891,6 +925,8 @@ void remoteTick() { break; case 2: RAINBOW_STEP_2 = smartIncrFloat(RAINBOW_STEP_2, 0.5, 0.5, 10); break; + case 3: FIRE_COOLING = smartIncr(FIRE_COOLING, 10, 20, 100); + break; } break; case 7: MAX_COEF_FREQ = smartIncrFloat(MAX_COEF_FREQ, 0.1, 0.0, 10); @@ -924,6 +960,8 @@ void remoteTick() { break; case 2: RAINBOW_STEP_2 = smartIncrFloat(RAINBOW_STEP_2, -0.5, 0.5, 10); break; + case 3: FIRE_COOLING = smartIncr(FIRE_COOLING, -10, 20, 100); + break; } break; case 7: MAX_COEF_FREQ = smartIncrFloat(MAX_COEF_FREQ, -0.1, 0.0, 10); @@ -956,7 +994,9 @@ void remoteTick() { case 1: COLOR_SPEED = smartIncr(COLOR_SPEED, -10, 0, 255); break; case 2: RAINBOW_PERIOD = smartIncr(RAINBOW_PERIOD, -1, -20, 20); - break; + break; + case 3: FIRE_SPARKING = smartIncr(FIRE_SPARKING, -10, 50, 200); + break; } break; case 7: RUNNING_SPEED = smartIncr(RUNNING_SPEED, -10, 1, 255); @@ -990,6 +1030,8 @@ void remoteTick() { break; case 2: RAINBOW_PERIOD = smartIncr(RAINBOW_PERIOD, 1, -20, 20); break; + case 3: FIRE_SPARKING = smartIncr(FIRE_SPARKING, 10, 50, 200); + break; } break; case 7: RUNNING_SPEED = smartIncr(RUNNING_SPEED, 10, 1, 255); @@ -1092,6 +1134,8 @@ void updateEEPROM() { EEPROM.updateInt(56, HUE_STEP); EEPROM.updateInt(60, EMPTY_BRIGHT); if (KEEP_STATE) EEPROM.updateByte(64, ONstate); + EEPROM.updateInt(68, FIRE_SPARKING); + EEPROM.updateInt(72, FIRE_COOLING); } void readEEPROM() { this_mode = EEPROM.readByte(1); @@ -1113,6 +1157,8 @@ void readEEPROM() { HUE_STEP = EEPROM.readInt(56); EMPTY_BRIGHT = EEPROM.readInt(60); if (KEEP_STATE) ONstate = EEPROM.readByte(64); + FIRE_SPARKING = EEPROM.readInt(68); + FIRE_COOLING = EEPROM.readInt(72); } void eepromTick() { if (eeprom_flag) From ae9cdcc114f2642d2be8b7f191953b4341f8e280 Mon Sep 17 00:00:00 2001 From: "Ts.Saltan" Date: Fri, 25 Jan 2019 23:52:12 +0300 Subject: [PATCH 5/5] Powershell new error form --- PCRemoteControl/RCForm.ps1 | 111 +++++++++++++++++----------- colorMusic_v2.8/colorMusic_v2.8.ino | 2 +- 2 files changed, 67 insertions(+), 46 deletions(-) diff --git a/PCRemoteControl/RCForm.ps1 b/PCRemoteControl/RCForm.ps1 index 1772cac..e4626e5 100644 --- a/PCRemoteControl/RCForm.ps1 +++ b/PCRemoteControl/RCForm.ps1 @@ -6,6 +6,12 @@ Add-Type -AssemblyName System.Windows.Forms [System.Windows.Forms.Application]::EnableVisualStyles() +<# + # Название нашего Arduino-устройства, которое мы ищем в ответе команды handshake + # @var string + #> +$deviceName = "ColorMusic" + <# # Найдено ли Arduino-устройство # @var bool @@ -52,8 +58,8 @@ foreach ($port in $query){ Write-host "Next answer:" $hello } - # Если нашли название ColorMusic, то это наше Arduino - if($hello -match "ColorMusic"){ + # Если получили в ответ нужное название, то это наш Arduino + if($hello -match $deviceName){ Write-host "Device found" $devFound = $true break @@ -71,59 +77,74 @@ foreach ($port in $query){ if($arduino.isOpen){ $arduino.close() } -} +} -<# Форма с ошибкой #> +<# + Форма с ошибкой в стиле Windows + https://poshgui.com/editor/5c4b729ac417d926b8555161 +#> $ErrorForm = New-Object system.Windows.Forms.Form -$ErrorForm.ClientSize = '463,120' -$ErrorForm.text = "Error" +$ErrorForm.ClientSize = '350,170' +$ErrorForm.text = "Ошибка" +$ErrorForm.BackColor = "#ffffff" $ErrorForm.TopMost = $false $ErrorForm.FormBorderStyle = 'Fixed3D' $ErrorForm.MaximizeBox = $false $ErrorForm.MinimizeBox = $false -$ELabel1 = New-Object system.Windows.Forms.Label -$ELabel1.text = " " -$ELabel1.BackColor = "#ff0000" -$ELabel1.AutoSize = $false -$ELabel1.width = 39 -$ELabel1.height = 41 -$ELabel1.location = New-Object System.Drawing.Point(24,33) -$ELabel1.Font = 'Microsoft Sans Serif,10,style=Bold' -$ELabel1.ForeColor = "#ffffff" - -$ELabel2 = New-Object system.Windows.Forms.Label -$ELabel2.text = "X" -$ELabel2.AutoSize = $true -$ELabel2.width = 25 -$ELabel2.height = 10 -$ELabel2.location = New-Object System.Drawing.Point(30,37) -$ELabel2.Font = 'Microsoft Sans Serif,20,style=Bold' -$ELabel2.ForeColor = "#ffffff" -$ELabel2.BackColor = "#ff0000" - -$LabelError = New-Object system.Windows.Forms.Label -$LabelError.text = "Ошибка: не найдено устройство для удалённого управления!" -$LabelError.AutoSize = $false -$LabelError.width = 360 -$LabelError.height = 42 -$LabelError.Anchor = 'top,right,left' -$LabelError.location = New-Object System.Drawing.Point(78,34) -$LabelError.Font = 'Microsoft Sans Serif,10' - -$EButton1 = New-Object system.Windows.Forms.Button -$EButton1.text = "OK" -$EButton1.width = 60 -$EButton1.height = 30 -$EButton1.location = New-Object System.Drawing.Point(393,85) -$EButton1.Font = 'Microsoft Sans Serif,10' - -$EButton1.Add_Click({ +$ErrorIcon = New-Object system.Windows.Forms.PictureBox +$ErrorIcon.width = 32 +$ErrorIcon.height = 32 +$ErrorIcon.location = New-Object System.Drawing.Point(15,15) +$ErrorIcon.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom +# Закодированная в Base64 иконка +$base64ImageString = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjEuNWRHWFIAAAEYSURBVEhLtZNNCsIwEEZzlNzccwhuegCXxaUIHqNVJxNakmZ+voEa3sJu+r4XavqGzvtSiJygYMqFyIkIaPstFSIREcGUP/dEhCJgAc9fnoVQBCzg+curEIrABPt8FoQiMEEzv4JHAILD/AocAQiG+RUwwhOI8ytYhCdQ5leQCFMwzK9nf0QiTMEw/ygAInSBdPujwI3QBdLtCwIvQhFI8wlRYEcoAuXjkQVmhCRQ5hOawIiQBPq3rwr0iEGgzycMgRYxCMy/riVQInqBOZ+wBWJELzDnE45AimgE3nyIIaIRePNBDhGbAJvvXlGhj9gE2HxI0Eew4JTbb2kiWHDS7bfsEey5pnVO6+NU5kSvpZezh379iSn/AEa8ZdiowHAjAAAAAElFTkSuQmCC" +$imageBytes = [Convert]::FromBase64String($base64ImageString) +$ms = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length) +$ms.Write($imageBytes, 0, $imageBytes.Length); +$ErrorIcon.Image = [System.Drawing.Image]::FromStream($ms, $true) + +$ErrorBottomPanel = New-Object system.Windows.Forms.Panel +$ErrorBottomPanel.height = 40 +$ErrorBottomPanel.width = 350 +$ErrorBottomPanel.BackColor = "#f0f0f0" +$ErrorBottomPanel.Anchor = 'right,bottom,left' +$ErrorBottomPanel.location = New-Object System.Drawing.Point(0,130) + +$ErrorButtonOK = New-Object system.Windows.Forms.Button +$ErrorButtonOK.text = "OK" +$ErrorButtonOK.width = 60 +$ErrorButtonOK.height = 23 +$ErrorButtonOK.Anchor = 'right,bottom' +$ErrorButtonOK.location = New-Object System.Drawing.Point(278,9) +$ErrorButtonOK.Font = 'Microsoft Sans Serif,10' + +$ErrorTitleLabel = New-Object system.Windows.Forms.Label +$ErrorTitleLabel.text = "Не найдено устройство" +$ErrorTitleLabel.AutoSize = $true +$ErrorTitleLabel.width = 271 +$ErrorTitleLabel.height = 22 +$ErrorTitleLabel.Anchor = 'top,right,left' +$ErrorTitleLabel.location = New-Object System.Drawing.Point(65,10) +$ErrorTitleLabel.Font = 'Calibri,16' +$ErrorTitleLabel.ForeColor = "#003399" + +$ErrorLabelDescription = New-Object system.Windows.Forms.Label +$ErrorLabelDescription.text = "Проверьте, подключено ли Arduino '$deviceName' и не занят ли COM порт другой программой" +$ErrorLabelDescription.AutoSize = $false +$ErrorLabelDescription.width = 270 +$ErrorLabelDescription.height = 70 +$ErrorLabelDescription.Anchor = 'top,right,bottom,left' +$ErrorLabelDescription.location = New-Object System.Drawing.Point(65,50) +$ErrorLabelDescription.Font = 'Microsoft Sans Serif,10' + +$ErrorForm.controls.AddRange(@($ErrorIcon,$ErrorBottomPanel,$ErrorTitleLabel,$ErrorLabelDescription)) +$ErrorBottomPanel.controls.AddRange(@($ErrorButtonOK)) + +$ErrorButtonOK.Add_Click({ $ErrorForm.close() }) -$ErrorForm.controls.AddRange(@($ELabel2, $ELabel1, $LabelError, $EButton1)) - <# Форма для управления цветомузыкой https://poshgui.com/editor/5c47451d742c2245c890cd9c diff --git a/colorMusic_v2.8/colorMusic_v2.8.ino b/colorMusic_v2.8/colorMusic_v2.8.ino index 034a6db..29a9335 100644 --- a/colorMusic_v2.8/colorMusic_v2.8.ino +++ b/colorMusic_v2.8/colorMusic_v2.8.ino @@ -115,7 +115,7 @@ byte HUE_STEP = 5; */ // ---- Режим огня ---- -// COOLING/Охлажнение: Насколько воздух охлаждается +// COOLING/Охлаждение: Насколько воздух охлаждается // Меньше охлаждение - выше пламя и наоборот // Default 50, suggested range 20-100 byte FIRE_COOLING = 50;