Tabla de contenido:

Control remoto de Arduino Youtube para dormir (Leobot Electronics): 4 pasos
Control remoto de Arduino Youtube para dormir (Leobot Electronics): 4 pasos

Video: Control remoto de Arduino Youtube para dormir (Leobot Electronics): 4 pasos

Video: Control remoto de Arduino Youtube para dormir (Leobot Electronics): 4 pasos
Video: Módulos de radio ¿Cuál usar? NRF24 | LoRa | CC1101 | HC12 | 433MHz | HC05 2024, Mes de julio
Anonim
Control remoto de Arduino Youtube para dormir (Leobot Electronics)
Control remoto de Arduino Youtube para dormir (Leobot Electronics)

Control remoto de Arduino Youtube

Si usa Youtube para proporcionarle una película o música para ver mientras duerme, seguramente se habrá despertado con un anuncio cargado o con diferentes niveles de volumen cuando comience una nueva película. No hace falta decir que esto puede resultar bastante irritante.

Entonces, mi solución que te demuestro aquí para construir por ti mismo es un control remoto basado en Arduino para interactuar con Youtube a distancia. Se requiere el control remoto para cambiar el volumen de sonido principal de mi PC, omitir anuncios en Youtube y omitir videos en Youtube.

Además, se incluye un sensor de nivel de audio para determinar qué tan alto es realmente el altavoz, que a su vez se puede usar para bajar automáticamente el nivel de sonido al detectar interrupciones fuertes como un anuncio.

Por último, agregué un gráfico en la aplicación de PC para mostrar los niveles de audio detectados.

La solución se puede refinar mejor, pero para mí cumple la tarea.

Paso 1: componentes necesarios

Todos estos componentes son suministrados por Leobot Electronics (https://leobot.net)

1) Arduino UNO R3

leobot.net/viewproduct.aspx?id=530

2) REMOTO DE 4 CANALES (315MHZ) + MÓDULO RECEPTOR (315MHZ)

leobot.net/viewproduct.aspx?id=521

3) MÓDULO DE SENSOR DE DETECCIÓN DE SONIDO Y VOZ DE MICRÓFONO (KY-037)

leobot.net/viewproduct.aspx?id=217

Software

1) Estudio Visual

visualstudio.microsoft.com/

2) IDE de Arduino

www.arduino.cc/en/main/software

Paso 2: configuración del hardware

1) Conecte el módulo receptor de 4 canales al Arduino.

Pin del receptor de 4 canales-> Pin de Arduino Uno

GND-> GND

5V-> 5V

D0-> Digital 2

D1-> Digital 3

D2-> Digital 4

D3-> Digital 5

2) Conecte el módulo de micrófono KY-037 al Arduino

Micrófono KY-037 Pin-> Pin Arduino Uno

GND-> GND

+ -> 3,3 V

A0-> Analógico 3

Paso 3: Código Arduino

Visión general

La lógica que debe seguir Arduino es la siguiente:

A) Verifique si el receptor está señalando algún pin.

B) Dependiendo del puerto IO en el que se reciba la señal, el comando se enviará a la PC.

C) Una vez realizadas todas las acciones de control remoto, detecte el nivel de audio con el micrófono y envíelo a la PC.

D) Todos los comandos enviados a la PC tienen un formato de primero tener un carácter y luego un valor (si se necesita un valor).

E) Hay cinco comandos enviados desde Arduino a la PC

una. "U" - Subir volumen

B. "D" - Bajar volumen

C. "S" - Omitir añadir

D. "V": omitir video

mi. "A": nivel de audio detectado seguido del valor

El código Arduino:

Descargue el código Arduino aquí:

int in1 = 2;

int in2 = 3;

int in3 = 4;

int in4 = 5;

configuración vacía () {

Serial.begin (9600);

pinMode (A3, ENTRADA);

pinMode (in1, ENTRADA);

pinMode (in2, ENTRADA);

pinMode (in3, ENTRADA);

pinMode (in4, ENTRADA);

}

bucle vacío () {

si (digitalRead (in1))

{

Serial.println ("u");

retraso (100);

}

si (digitalRead (in2))

{

Serial.println ("d");

retraso (100);

}

si (digitalRead (in3))

{

Serial.println ("s");

retraso (100);

}

si (digitalRead (in4))

{

Serial.println ("v");

retraso (100);

}

int readVal = analogRead (A3);

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

retraso (50);

}

Paso 4: Código de la aplicación para PC (C #. NET)

Código de aplicación para PC (C #. NET)
Código de aplicación para PC (C #. NET)

La aplicación escuchará a través del puerto COM (USB) y reaccionará según el comando que se reciba. La forma más sencilla de subir y bajar el sonido en la PC es utilizar los servicios de Interrop para hablar directamente con el sistema operativo Windows. También usamos los servicios de Interrop para mover el mouse a una posición específica en la pantalla y hacer clic. Para permitir diferentes pantallas y tamaños de vista, permitimos que el usuario especifique la posición de los botones para omitir agregar y omitir video.

Usamos un gráfico.net estándar para mostrar los comandos de audio que recibimos.

Código de Windows:

Descarga el proyecto completo aquí:

leobot.net/audioadjust.zip

usando el sistema;

utilizando System. Collections. Generic;

using System. ComponentModel;

utilizando System. Data;

usando System. Drawing;

utilizando System. Linq;

usando System. Text;

usando System. Windows. Forms;

utilizando System. Runtime. InteropServices;

usando System. IO. Ports;

usando System. Threading;

espacio de nombres AudioAdjust

{

clase parcial pública Form1: Form

{

[DllImport ("User32. Dll")]

public static extern long SetCursorPos (int x, int y);

[DllImport ("User32. Dll")]

public static extern bool ClientToScreen (IntPtr hWnd, ref POINT point);

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

public static extern void mouse_event (uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

// Acciones del mouse

privado const int MOUSEEVENTF_LEFTDOWN = 0x02;

privado const int MOUSEEVENTF_LEFTUP = 0x04;

privado const int MOUSEEVENTF_RIGHTDOWN = 0x08;

const privado int MOUSEEVENTF_RIGHTUP = 0x10;

[DllImport ("user32.dll")]

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

Random aRand = new Random ();

public int LastLevel = 0;

public int MaxLevel = 255;

static SerialPort _serialPort;

int adX = 1281;

int adY = 706;

int vidX = 250;

int vidY = 780;

bool enableAudioChange = false;

Public Form1 ()

{

InitializeComponent ();

}

Private void Form1_Load (remitente de objeto, EventArgs e)

{

cadena nombres = System. IO. Ports. SerialPort. GetPortNames ();

comboBoxPort. Items. AddRange (nombres);

comboBoxPort. SelectedIndex = 0;

}

int currentPoint = 0;

button1_Click vacío privado (remitente del objeto, EventArgs e)

{

_serialPort = new SerialPort ();

_serialPort. DataReceived + = new SerialDataReceivedEventHandler (_serialPort_DataReceived);

_serialPort. PortName = comboBoxPort. SelectedItem. ToString (); // Configure su tablero COM

_serialPort. BaudRate = 9600;

if (_serialPort. IsOpen) _serialPort. Close ();

demás

{

_serialPort. Open ();

}

// keybd_event ((byte) Keys. VolumeDown, 0, 0, 0); // disminuir volumen

}

void _serialPort_DataReceived (remitente del objeto, SerialDataReceivedEventArgs e)

{

tratar

{

string fullval = _serialPort. ReadLine ();

string com = fullval [0]. ToString ();

cambiar (com)

{

caso "a":

{

{

// nivel de audio

string val = fullval. Replace ("a", "");

int valInte = int. Parse (val);

AddData (valInt);

}

rotura;

}

caso "u":

{

// audio arriba

keybd_event ((byte) Keys. VolumeUp, 0, 0, 0); // disminuir volumen

rotura;

}

caso "d":

{

// audio abajo

keybd_event ((byte) Keys. VolumeDown, 0, 0, 0); // disminuir volumen

rotura;

}

casos :

{

//omitir aviso publicitario

MoveCursorSkipAd ();

Thread. Sleep (10);

DoMouseClick ();

rotura;

}

caso "v":

{

//omitir aviso publicitario

MoveCursorSkipVideo ();

Thread. Sleep (10);

DoMouseClick ();

rotura;

}

}

}

captura

{

}

// lanzar una nueva NotImplementedException ();

}

Private void MoveCursorSkipAd ()

{

Cursor. Position = nuevo punto (1140, 725);

Cursor. Position = nuevo punto (adX, adY);

}

Private void MoveCursorSkipVideo ()

{

Cursor. Position = nuevo punto (1140, 725);

Cursor. Position = nuevo punto (vidX, vidY);

}

public void DoMouseClick ()

{

// Llamar a la función importada con la posición actual del cursor

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 (nivel int)

{

si (enableAudioChange)

{

si (nivel> = MaxLevel)

{

keybd_event ((byte) Keys. VolumeDown, 0, 0, 0); // disminuir volumen

keybd_event ((byte) Keys. VolumeDown, 0, 0, 0); // disminuir volumen

keybd_event ((byte) Keys. VolumeDown, 0, 0, 0); // disminuir volumen

}

demás

{

si (nivel <MaxLevel - 0)

{

keybd_event ((byte) Keys. VolumeUp, 0, 0, 0); // disminuir volumen

}

}

}

SetChart (nivel);

currentPoint ++;

}

delegar void SetTextCallback (int val);

Private void SetChart (int val)

{

// InvokeRequired required compara el ID del hilo del

// subproceso de llamada al ID de subproceso del subproceso de creación.

// Si estos hilos son diferentes, devuelve verdadero.

si (this.chart1. InvokeRequired)

{

SetTextCallback d = nuevo SetTextCallback (SetChart);

this. Invoke (d, nuevo objeto {val});

}

demás

{

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

si (currentPoint> = 10)

{

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

}

}

}

private void textBoxLevel_TextChanged (remitente de objeto, EventArgs e)

{

tratar

{

MaxLevel = int. Parse (textBoxLevel. Text);

}

captura

{

textBoxLevel. Text = MaxLevel + "";

}

}

botón vacío privadoTestSkip_Click (remitente del objeto, EventArgs e)

{

MoveCursorSkipAd ();

Thread. Sleep (10);

DoMouseClick ();

}

private void textBoxXpos_TextChanged (remitente del objeto, EventArgs e)

{

tratar

{

adX = int. Parse (textBoxXpos. Text);

}

captura

{

textBoxXpos. Text = adX + "";

}

}

private void textBoxYpos_TextChanged (remitente del objeto, EventArgs e)

{

tratar

{

adY = int. Parse (textBoxYpos. Text);

}

captura

{

textBoxYpos. Text = adY + "";

}

}

botón de vacío privado SkipVideo_Click (remitente de objeto, EventArgs e)

{

MoveCursorSkipVideo ();

Thread. Sleep (10);

DoMouseClick ();

}

private void textBoxXposVid_TextChanged (remitente del objeto, EventArgs e)

{

tratar

{

vidX = int. Parse (textBoxXposVid. Text);

}

captura

{

textBoxXposVid. Text = vidX + "";

}

}

private void textBoxYposVid_TextChanged (remitente de objeto, EventArgs e)

{

tratar

{

vidY = int. Parse (textBoxYposVid. Text);

}

captura

{

textBoxYposVid. Text = vidY + "";

}

}

checkBoxEnable_CheckedChanged vacío privado (remitente del objeto, EventArgs e)

{

enableAudioChange = checkBoxEnable. Checked;

}

}

[StructLayout (LayoutKind. Sequential)]

PUNTO de estructura pública

{

public int x;

public int y;

}

}

Recomendado: