Оглавление:

Пульт дистанционного управления Arduino Youtube для сна (Leobot Electronics): 4 шага
Пульт дистанционного управления Arduino Youtube для сна (Leobot Electronics): 4 шага

Видео: Пульт дистанционного управления Arduino Youtube для сна (Leobot Electronics): 4 шага

Видео: Пульт дистанционного управления Arduino Youtube для сна (Leobot Electronics): 4 шага
Видео: Управление компьютером с обычного пульта на Arduino 2024, Ноябрь
Anonim
Пульт дистанционного управления Arduino Youtube для сна (Leobot Electronics)
Пульт дистанционного управления Arduino Youtube для сна (Leobot Electronics)

Пульт Arduino Youtube

Если вы используете Youtube, чтобы предоставить вам фильм или музыку для просмотра во время сна, вы наверняка были бы разбужены либо рекламой загрузки, либо разными уровнями громкости при запуске нового фильма. Излишне говорить, что это может сильно раздражать.

Итак, мое решение, которое я доказываю вам здесь, чтобы построить для себя, - это пульт дистанционного управления на базе Arduino для взаимодействия с Youtube на расстоянии. Пульт дистанционного управления необходим для изменения основной громкости звука моего ПК, пропуска рекламы на Youtube и пропуска видео на Youtube.

Кроме того, в комплект входит датчик уровня звука для определения фактической громкости динамика, который, в свою очередь, может использоваться для автоматического понижения уровня звука при обнаружении громких прерываний, таких как реклама.

Наконец, я добавил в приложение для ПК диаграмму для отображения обнаруженных уровней звука.

Решение можно улучшить, но для меня оно решает задачу.

Шаг 1. Необходимые компоненты

Все эти компоненты поставляются Leobot Electronics (https://leobot.net).

1) Arduino UNO R3

leobot.net/viewproduct.aspx?id=530

2) 4-КАНАЛЬНЫЙ ДИСТАНЦИОННЫЙ (315 МГц) + МОДУЛЬ ПРИЕМНИКА (315 МГц)

leobot.net/viewproduct.aspx?id=521

3) МОДУЛЬ ДАТЧИКА ГОЛОСА И ЗВУКА МИКРОФОНА (KY-037)

leobot.net/viewproduct.aspx?id=217

Программное обеспечение

1) Visual Studio

visualstudio.microsoft.com/

2) Arduino IDE

www.arduino.cc/en/main/software

Шаг 2: Настройка оборудования

1) Подключите 4-канальный модуль приемника к Arduino.

Вывод 4-канального приемника-> Вывод Arduino Uno

GND-> GND

5 В-> 5 В

D0-> Цифровой 2

D1-> Цифровой 3

D2-> Цифровой 4

D3-> Цифровой 5

2) Подключите микрофонный модуль KY-037 к Arduino.

Микрофон KY-037 Pin-> Arduino Uno Pin

GND-> GND

+ -> 3,3 В

A0-> Аналог 3

Шаг 3: код Arduino

Обзор

Логика, которой должна следовать Arduino, следующая:

A) Убедитесь, что приемник сигнализирует о контактах.

Б) В зависимости от того, на каком порте ввода-вывода был получен сигнал, команда будет отправлена на ПК.

C) Выполнив все действия дистанционного управления, определите уровень звука с помощью микрофона и отправьте его на ПК.

D) Все команды, отправляемые на ПК, имеют формат: сначала символ, а затем значение (если значение необходимо).

E) От Arduino на ПК отправлено пять команд.

а. «U» - увеличение громкости

б. «D» - уменьшение громкости

c. «S» - пропустить добавление

d. «V» - пропустить видео

е. «A» - обнаруженный уровень звука, за которым следует значение

Код Arduino:

Загрузите код Arduino здесь:

int in1 = 2;

int in2 = 3;

int in3 = 4;

int in4 = 5;

void setup () {

Serial.begin (9600);

pinMode (A3, ВХОД);

pinMode (in1, INPUT);

pinMode (in2, INPUT);

pinMode (in3, ВХОД);

pinMode (in4, ВХОД);

}

void loop () {

если (digitalRead (in1))

{

Serial.println ("u");

задержка (100);

}

если (digitalRead (in2))

{

Serial.println ("d");

задержка (100);

}

если (digitalRead (in3))

{

Serial.println ("с");

задержка (100);

}

если (digitalRead (in4))

{

Serial.println ("v");

задержка (100);

}

int readVal = analogRead (A3);

Serial.println (String ("a") + String (readVal));

задержка (50);

}

Шаг 4. Код приложения для ПК (C #. NET)

Код приложения для ПК (C #. NET)
Код приложения для ПК (C #. NET)

Приложение будет прослушивать порт COM (USB) и реагировать в зависимости от полученной команды. Самый простой способ включить или выключить звук на ПК - использовать службы Interrop для прямого обращения к ОС Windows. Мы также используем сервисы Interrop, чтобы переместить указатель мыши в определенное место на экране и щелкнуть. Чтобы разрешить использование различных экранов и размеров просмотра, мы позволяем пользователю указывать положение кнопок пропуска добавления и пропуска видео.

Мы используем стандартную диаграмму.net для отображения любых получаемых звуковых команд.

Код Windows:

Скачать полный проект можно здесь:

leobot.net/audioadjust.zip

используя Систему;

using System. Collections. Generic;

using System. ComponentModel;

using System. Data;

с помощью System. Drawing;

using System. Linq;

using System. Text;

using System. Windows. Forms;

using System. Runtime. InteropServices;

используя System. IO. Ports;

using System. Threading;

пространство имен AudioAdjust

{

общедоступный частичный класс Form1: Form

{

[DllImport ("User32. Dll")]

общедоступный статический extern long SetCursorPos (int x, int y);

[DllImport ("User32. Dll")]

общедоступный статический extern bool ClientToScreen (IntPtr hWnd, ref POINT point);

[DllImport ("user32.dll", CharSet = CharSet. Auto, CallingConvention = CallingConvention. StdCall)]

общедоступный статический extern void mouse_event (uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

// Действия мыши

частная константа int MOUSEEVENTF_LEFTDOWN = 0x02;

частная константа int MOUSEEVENTF_LEFTUP = 0x04;

частная константа int MOUSEEVENTF_RIGHTDOWN = 0x08;

частный const int MOUSEEVENTF_RIGHTUP = 0x10;

[DllImport ("user32.dll")]

static extern void keybd_event (byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

Случайный aRand = новый Случайный ();

общедоступный int LastLevel = 0;

общедоступный int MaxLevel = 255;

статический SerialPort _serialPort;

int adX = 1281;

int adY = 706;

int vidX = 250;

int vidY = 780;

bool enableAudioChange = false;

общедоступная форма Form1 ()

{

InitializeComponent ();

}

private void Form1_Load (отправитель объекта, EventArgs e)

{

строка имена = System. IO. Ports. SerialPort. GetPortNames ();

comboBoxPort. Items. AddRange (имена);

comboBoxPort. SelectedIndex = 0;

}

int currentPoint = 0;

private void button1_Click (отправитель объекта, EventArgs e)

{

_serialPort = новый SerialPort ();

_serialPort. DataReceived + = новый SerialDataReceivedEventHandler (_serialPort_DataReceived);

_serialPort. PortName = comboBoxPort. SelectedItem. ToString (); // Устанавливаем COM платы

_serialPort. BaudRate = 9600;

если (_serialPort. IsOpen) _serialPort. Close ();

еще

{

_serialPort. Open ();

}

// keybd_event ((byte) Keys. VolumeDown, 0, 0, 0); // уменьшаем громкость

}

void _serialPort_DataReceived (отправитель объекта, SerialDataReceivedEventArgs e)

{

пытаться

{

строка fullval = _serialPort. ReadLine ();

строка com = fullval [0]. ToString ();

переключатель (com)

{

case "a":

{

{

// уровень звука

строка val = fullval. Replace ("а", "");

int valInt = int. Parse (значение);

AddData (valInt);

}

перерыв;

}

case "u":

{

// аудио вверх

keybd_event ((байт) Keys. VolumeUp, 0, 0, 0); // уменьшаем громкость

перерыв;

}

case "d":

{

// звук выключен

keybd_event ((байт) Keys. VolumeDown, 0, 0, 0); // уменьшаем громкость

перерыв;

}

случаи :

{

//пропустить рекламу

MoveCursorSkipAd ();

Thread. Sleep (10);

DoMouseClick ();

перерыв;

}

case "v":

{

//пропустить рекламу

MoveCursorSkipVideo ();

Thread. Sleep (10);

DoMouseClick ();

перерыв;

}

}

}

ловить

{

}

// выбросить новое NotImplementedException ();

}

private void MoveCursorSkipAd ()

{

Cursor. Position = новая точка (1140, 725);

Cursor. Position = новая точка (adX, adY);

}

private void MoveCursorSkipVideo ()

{

Cursor. Position = новая точка (1140, 725);

Cursor. Position = новая точка (vidX, vidY);

}

public void DoMouseClick ()

{

// Вызов импортируемой функции с текущей позицией курсора

uint X = (uint) Cursor. Position. X;

uint Y = (uint) Cursor. Position. Y;

mouse_event (MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);

mouse_event (MOUSEEVENTF_LEFTUP, X, Y, 0, 0);

}

void AddData (уровень int)

{

если (enableAudioChange)

{

если (уровень> = MaxLevel)

{

keybd_event ((байт) Keys. VolumeDown, 0, 0, 0); // уменьшаем громкость

keybd_event ((байт) Keys. VolumeDown, 0, 0, 0); // уменьшаем громкость

keybd_event ((байт) Keys. VolumeDown, 0, 0, 0); // уменьшаем громкость

}

еще

{

если (уровень <MaxLevel - 0)

{

keybd_event ((байт) Keys. VolumeUp, 0, 0, 0); // уменьшаем громкость

}

}

}

SetChart (уровень);

currentPoint ++;

}

делегат void SetTextCallback (int val);

частный недействительный SetChart (int val)

{

// Требуемый InvokeRequired сравнивает идентификатор потока

// вызываем поток к идентификатору создаваемого потока.

// Если эти потоки разные, возвращается истина.

если (this.chart1. InvokeRequired)

{

SetTextCallback d = новый SetTextCallback (SetChart);

this. Invoke (d, новый объект {val});

}

еще

{

chart1. Series [0]. Points. AddXY (0, val);

если (currentPoint> = 10)

{

chart1. Series [0]. Points. RemoveAt (0);

}

}

}

private void textBoxLevel_TextChanged (отправитель объекта, EventArgs e)

{

пытаться

{

MaxLevel = int. Parse (textBoxLevel. Text);

}

ловить

{

textBoxLevel. Text = MaxLevel + "";

}

}

private void buttonTestSkip_Click (отправитель объекта, EventArgs e)

{

MoveCursorSkipAd ();

Thread. Sleep (10);

DoMouseClick ();

}

private void textBoxXpos_TextChanged (отправитель объекта, EventArgs e)

{

пытаться

{

adX = int. Parse (textBoxXpos. Text);

}

ловить

{

textBoxXpos. Text = adX + "";

}

}

private void textBoxYpos_TextChanged (отправитель объекта, EventArgs e)

{

пытаться

{

adY = int. Parse (textBoxYpos. Text);

}

ловить

{

textBoxYpos. Text = adY + "";

}

}

private void buttonSkipVideo_Click (отправитель объекта, EventArgs e)

{

MoveCursorSkipVideo ();

Thread. Sleep (10);

DoMouseClick ();

}

private void textBoxXposVid_TextChanged (отправитель объекта, EventArgs e)

{

пытаться

{

vidX = int. Parse (textBoxXposVid. Text);

}

ловить

{

textBoxXposVid. Text = vidX + "";

}

}

private void textBoxYposVid_TextChanged (отправитель объекта, EventArgs e)

{

пытаться

{

vidY = int. Parse (textBoxYposVid. Text);

}

ловить

{

textBoxYposVid. Text = vidY + "";

}

}

private void checkBoxEnable_CheckedChanged (отправитель объекта, EventArgs e)

{

enableAudioChange = checkBoxEnable. Checked;

}

}

[StructLayout (LayoutKind. Sequential)]

публичная структура POINT

{

public int x;

public int y;

}

}

Рекомендуемые: