Taula de continguts:

Control remot de Youtube Arduino per dormir (Leobot Electronics): 4 passos
Control remot de Youtube Arduino per dormir (Leobot Electronics): 4 passos

Vídeo: Control remot de Youtube Arduino per dormir (Leobot Electronics): 4 passos

Vídeo: Control remot de Youtube Arduino per dormir (Leobot Electronics): 4 passos
Vídeo: How to make a Bluetooth remote using a Raspberry Pi Pico W and MicroPython 2024, De novembre
Anonim
Control remot Arduino Youtube per dormir (Leobot Electronics)
Control remot Arduino Youtube per dormir (Leobot Electronics)

Remot Arduino Youtube

Si utilitzeu Youtube per proporcionar-vos una pel·lícula o una música per veure mentre dormiu, segur que us hauria despertat un anunci de càrrega o diferents nivells de volum quan comenci una nova pel·lícula. No cal dir que pot resultar força irritant.

Per tant, la meva solució que us demostro aquí per construir per vosaltres mateixos és un control remot basat en Arduino per interactuar amb Youtube a distància. El comandament a distància és necessari per canviar el volum de so principal del meu PC, ometre anuncis a Youtube i ometre vídeos a Youtube.

També s’inclou un sensor de nivell d’àudio per determinar la intensitat de l’altaveu, que al seu torn es pot utilitzar per baixar automàticament el nivell de so en detectar interrupcions fortes, com ara un anunci.

Per últim, he afegit un gràfic a l’aplicació de PC per mostrar els nivells d’àudio detectats.

La solució es pot refinar millor, però per a mi compleix la tasca.

Pas 1: components necessaris

Tots aquests components els subministra Leobot Electronics (https://leobot.net)

1) Arduino UNO R3

leobot.net/viewproduct.aspx?id=530

2) REMOT DE 4 CANALS (315 MHz) + M MODDUL DE RECEPTOR (315 MHz)

leobot.net/viewproduct.aspx?id=521

3) M MODDUL DE SENSOR DE VEU I DETECCIÓ DE SO DE MICRPHFONS (KY-037)

leobot.net/viewproduct.aspx?id=217

Programari

1) Visual Studio

visualstudio.microsoft.com/

2) IDE Arduino

www.arduino.cc/ca/main/software

Pas 2: Configuració del maquinari

1) Connecteu el mòdul receptor de 4 canals a l'Arduino.

Pin de receptor de 4 canals-> Pin d'Arduino Uno

GND-> GND

5V-> 5V

D0-> Digital 2

D1-> Digital 3

D2-> Digital 4

D3-> Digital 5

2) Connecteu el mòdul KY-037 del micròfon a l'Arduino

Micròfon KY-037 Pin-> Pin Arduino Uno

GND-> GND

+ -> 3,3V

A0-> Analògic 3

Pas 3: Codi Arduino

Visió general

La lògica que Arduino ha de seguir és la següent:

A) Comproveu si el receptor està assenyalant algun pin.

B) Segons el port IO on es rebi el senyal, és a quina ordre s’enviarà al PC.

C) Un cop fetes totes les accions de control remot, detecteu el nivell d'àudio amb el micròfon i envieu-lo al PC.

D) Totes les ordres que s’envien al PC tenen un format de primer tenir un caràcter i després un valor (si es necessita un valor).

E) Hi ha cinc ordres enviades des de l'Arduino al PC

a. "U": augment de volum

b. "D": baixar de volum

c. "S": Omet l'addició

d. "V": Omet el vídeo

e. "A": nivell d'àudio detectat seguit del valor

El codi Arduino:

Descarregueu el codi Arduino aquí:

int in1 = 2;

int in2 = 3;

int in3 = 4;

int in4 = 5;

configuració nul·la () {

Serial.begin (9600);

pinMode (A3, INPUT);

pinMode (in1, INPUT);

pinMode (in2, INPUT);

pinMode (in3, INPUT);

pinMode (in4, INPUT);

}

bucle buit () {

if (digitalRead (in1))

{

Serial.println ("u");

retard (100);

}

if (digitalRead (in2))

{

Serial.println ("d");

retard (100);

}

if (digitalRead (in3))

{

Serial.println ("s");

retard (100);

}

if (digitalRead (in4))

{

Serial.println ("v");

retard (100);

}

int readVal = analogRead (A3);

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

retard (50);

}

Pas 4: Codi d'aplicació de PC (C #. NET)

Codi d'aplicació de PC (C #. NET)
Codi d'aplicació de PC (C #. NET)

L'aplicació escoltarà el port COM (USB) i reaccionarà en funció de l'ordre que es rebi. La forma més senzilla d’augmentar i baixar el so del PC és utilitzar els serveis d’Interrop per parlar directament amb el sistema operatiu Windows. També fem servir els serveis d’Interrop per moure el ratolí a una posició específica a la pantalla i fer clic. Per tal de permetre diferents pantalles i mides de visualització, permetem a l'usuari especificar la posició dels botons d'addició i ometre vídeo.

Utilitzem un gràfic.net estàndard per mostrar qualsevol ordre d’àudio que rebem.

Codi de Windows:

Descarregueu el projecte complet aquí:

leobot.net/audioadjust.zip

utilitzant el sistema;

utilitzant System. Collections. Generic;

utilitzant System. ComponentModel;

utilitzant System. Data;

utilitzant System. Drawing;

utilitzant System. Linq;

utilitzant System. Text;

utilitzant System. Windows. Forms;

utilitzant System. Runtime. InteropServices;

utilitzant System. IO. Ports;

utilitzant System. Threading;

espai de noms AudioAdjust

{

classe parcial pública Form1: Formulari

{

[DllImport ("User32. Dll")]

públic estàtic extern llarg SetCursorPos (int x, int y);

[DllImport ("User32. Dll")]

bool extern públic estàtic ClientToScreen (IntPtr hWnd, ref POINT point);

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

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

// Accions del ratolí

private const int MOUSEEVENTF_LEFTDOWN = 0x02;

private const int MOUSEEVENTF_LEFTUP = 0x04;

private const int MOUSEEVENTF_RIGHTDOWN = 0x08;

private const int MOUSEEVENTF_RIGHTUP = 0x10;

[DllImport ("user32.dll")]

estàtic 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 = fals;

formulari públic 1 ()

{

InitializeComponent ();

}

private void Form1_Load (remitent d'objectes, EventArgs e)

{

string names = System. IO. Ports. SerialPort. GetPortNames ();

comboBoxPort. Items. AddRange (noms);

comboBoxPort. SelectedIndex = 0;

}

int CurrentPoint = 0;

private void button1_Click (remitent d'objectes, EventArgs e)

{

_serialPort = nou SerialPort ();

_serialPort. DataReceived + = new SerialDataReceivedEventHandler (_serialPort_DataReceived);

_serialPort. PortName = comboBoxPort. SelectedItem. ToString (); // Estableix el tauler COM

_serialPort. BaudRate = 9600;

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

en cas contrari

{

_serialPort. Open ();

}

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

}

void _serialPort_DataReceived (remitent de l'objecte, SerialDataReceivedEventArgs e)

{

provar

{

cadena fullval = _serialPort. ReadLine ();

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

commutador (com)

{

cas "a":

{

{

// nivell d’àudio

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

int valInt = int. Parse (val);

AddData (valInt);

}

trencar;

}

cas "u":

{

// àudio amunt

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

trencar;

}

cas "d":

{

// baixa l’àudio

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

trencar;

}

cas "s":

{

//saltar anunci

MoveCursorSkipAd ();

Fil. Dorm (10);

DoMouseClick ();

trencar;

}

cas "v":

{

//saltar anunci

MoveCursorSkipVideo ();

Fil. Dorm (10);

DoMouseClick ();

trencar;

}

}

}

atrapar

{

}

// llança una nova NotImplementedException ();

}

private void MoveCursorSkipAd ()

{

Cursor. Position = punt nou (1140, 725);

Cursor. Position = punt nou (adX, adY);

}

private void MoveCursorSkipVideo ()

{

Cursor. Position = punt nou (1140, 725);

Cursor. Position = punt nou (vidX, vidY);

}

public void DoMouseClick ()

{

// Truqueu a la funció importada amb la posició actual del cursor

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

uint Y = (uint) Cursor. Posició. Y;

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

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

}

void AddData (nivell int)

{

if (enableAudioChange)

{

if (nivell> = Nivell màxim)

{

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

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

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

}

en cas contrari

{

if (nivell <MaxLevel - 0)

{

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

}

}

}

SetChart (nivell);

currentPoint ++;

}

delegate void SetTextCallback (int val);

private void SetChart (int val)

{

// InvokeRequired required compara l'identificador de fil del fitxer

// cridant el fil a l'identificador de fil del fil creador.

// Si aquests fils són diferents, es torna cert.

if (this.chart1. InvokeRequired)

{

SetTextCallback d = nou SetTextCallback (SetChart);

this. Invoke (d, nou objecte {val});

}

en cas contrari

{

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

si (currentPoint> = 10)

{

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

}

}

}

private void textBoxLevel_TextChanged (remitent d'objectes, EventArgs e)

{

provar

{

MaxLevel = int. Parse (textBoxLevel. Text);

}

atrapar

{

textBoxLevel. Text = MaxLevel + "";

}

}

private void buttonTestSkip_Click (remitent d'objectes, EventArgs e)

{

MoveCursorSkipAd ();

Fil. Dorm (10);

DoMouseClick ();

}

private void textBoxXpos_TextChanged (remitent d'objectes, EventArgs e)

{

provar

{

adX = int. Parse (textBoxXpos. Text);

}

atrapar

{

textBoxXpos. Text = adX + "";

}

}

private void textBoxYpos_TextChanged (remitent d'objectes, EventArgs e)

{

provar

{

adY = int. Parse (textBoxYpos. Text);

}

atrapar

{

textBoxYpos. Text = adY + "";

}

}

private void buttonSkipVideo_Click (remitent d'objectes, EventArgs e)

{

MoveCursorSkipVideo ();

Fil. Dorm (10);

DoMouseClick ();

}

private void textBoxXposVid_TextChanged (remitent d'objectes, EventArgs e)

{

provar

{

vidX = int. Parse (textBoxXposVid. Text);

}

atrapar

{

textBoxXposVid. Text = vidX + "";

}

}

private void textBoxYposVid_TextChanged (remitent d'objectes, EventArgs e)

{

provar

{

vidY = int. Parse (textBoxYposVid. Text);

}

atrapar

{

textBoxYposVid. Text = vidY + "";

}

}

private void checkBoxEnable_CheckedChanged (remitent d'objectes, EventArgs e)

{

enableAudioChange = checkBoxEnable. Checked;

}

}

[StructLayout (LayoutKind. Sequential)]

public struct POINT

{

public int x;

públic i;

}

}

Recomanat: