diff --git a/PCRemoteControl/RCForm.ps1 b/PCRemoteControl/RCForm.ps1 new file mode 100644 index 0000000..e4626e5 --- /dev/null +++ b/PCRemoteControl/RCForm.ps1 @@ -0,0 +1,589 @@ +<# + Форма для управления цветомузыкой с ПК + В скетче Arduino укажите define REMOTE_TYPE 4 +#> + +Add-Type -AssemblyName System.Windows.Forms +[System.Windows.Forms.Application]::EnableVisualStyles() + +<# + # Название нашего Arduino-устройства, которое мы ищем в ответе команды handshake + # @var string + #> +$deviceName = "ColorMusic" + +<# + # Найдено ли 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 + } + + # Если получили в ответ нужное название, то это наш Arduino + if($hello -match $deviceName){ + Write-host "Device found" + $devFound = $true + break + } + + # $arduino.close() + } + + } catch { + Write-host "Error" + $_ + } + + + if($arduino.isOpen){ + $arduino.close() + } +} + +<# + Форма с ошибкой в стиле Windows + https://poshgui.com/editor/5c4b729ac417d926b8555161 +#> +$ErrorForm = New-Object system.Windows.Forms.Form +$ErrorForm.ClientSize = '350,170' +$ErrorForm.text = "Ошибка" +$ErrorForm.BackColor = "#ffffff" +$ErrorForm.TopMost = $false +$ErrorForm.FormBorderStyle = 'Fixed3D' +$ErrorForm.MaximizeBox = $false +$ErrorForm.MinimizeBox = $false + +$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() +}) + +<# + Форма для управления цветомузыкой + https://poshgui.com/editor/5c47451d742c2245c890cd9c +#> +$Form = New-Object system.Windows.Forms.Form +$Form.ClientSize = '605,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 = 235 +$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 = 140 +$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 = 140 +$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_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/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 diff --git a/PCRemoteControl/screenshot.jpg b/PCRemoteControl/screenshot.jpg new file mode 100644 index 0000000..3525487 Binary files /dev/null and b/PCRemoteControl/screenshot.jpg differ diff --git a/colorMusic_v2.8/colorMusic_v2.8.ino b/colorMusic_v2.8/colorMusic_v2.8.ino index 86a3169..29a9335 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, читай инструкцию // ----- настройки параметров @@ -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 @@ -177,6 +187,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 +338,10 @@ void setup() { readEEPROM(); } } + + #if REMOTE_TYPE == 4 + Serial.println("ColorMusic is ready"); // Приветствие в консоль + #endif } void loop() { @@ -582,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: @@ -656,11 +717,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; @@ -693,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; @@ -723,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); @@ -756,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); @@ -788,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); @@ -822,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); @@ -831,6 +1041,9 @@ void remoteTick() { } } break; + case -1: // кейс для управление с ПК, когда нужно сохранить настройки + eeprom_flag = true; + break; default: eeprom_flag = false; // если не распознали кнопку, не обновляем настройки! break; } @@ -921,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); @@ -942,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) 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