Sommario:

Telecomando Arduino Youtube per dormire (Leobot Electronics): 4 passaggi
Telecomando Arduino Youtube per dormire (Leobot Electronics): 4 passaggi

Video: Telecomando Arduino Youtube per dormire (Leobot Electronics): 4 passaggi

Video: Telecomando Arduino Youtube per dormire (Leobot Electronics): 4 passaggi
Video: rtx 433MHz e Arduino 2024, Luglio
Anonim
Telecomando Arduino Youtube per dormire (Leobot Electronics)
Telecomando Arduino Youtube per dormire (Leobot Electronics)

Telecomando Arduino Youtube

Se usi Youtube per fornirti un film o una musica da guardare mentre dormi, sicuramente saresti stato svegliato da un annuncio di carico o da diversi livelli di volume quando inizia un nuovo film. Inutile dire che questo può essere piuttosto irritante.

Quindi, la mia soluzione che ti dimostro qui per costruire da solo è un telecomando basato su Arduino per interagire con Youtube a distanza. Il telecomando è necessario per modificare il volume audio principale del mio PC, saltare gli annunci su Youtube e saltare i video su Youtube.

Inoltre, è incluso un sensore di livello audio per determinare il volume effettivo dell'altoparlante, che a sua volta può essere utilizzato per abbassare automaticamente il livello del suono al rilevamento di interruzioni rumorose come una pubblicità.

Infine, ho aggiunto un grafico sull'app per PC per visualizzare i livelli audio rilevati.

La soluzione può essere perfezionata meglio, ma per me svolge il compito.

Passaggio 1: componenti necessari

Tutti questi componenti sono forniti da Leobot Electronics (https://leobot.net)

1) Arduino UNO R3

leobot.net/viewproduct.aspx?id=530

2) TELECOMANDO 4 CANALI (315MHZ) + MODULO RICEVITORE (315MHZ)

leobot.net/viewproduct.aspx?id=521

3) MICROFONO MODULO SENSORE RILEVAMENTO VOCALE E SONORO (KY-037)

leobot.net/viewproduct.aspx?id=217

Software

1) Visual Studio

visualstudio.microsoft.com/

2) Arduino IDE

www.arduino.cc/en/main/software

Passaggio 2: configurazione hardware

1) Collegare il modulo ricevitore a 4 canali ad Arduino.

Pin ricevitore a 4 canali->Pin Arduino Uno

GND->GND

5V->5V

D0->Digitale 2

D1->Digitale 3

D2->Digitale 4

D3->Digitale 5

2) Collegare il modulo Microfono KY-037 ad Arduino

Microfono KY-037 Pin->Arduino Uno Pin

GND->GND

+->3,3V

A0->Analogico 3

Passaggio 3: codice Arduino

Panoramica

La logica che Arduino deve seguire è la seguente:

A) Controllare se il ricevitore sta segnalando eventuali pin.

B) A seconda di quale porta IO viene ricevuto il segnale è quale comando verrà inviato al PC.

C) Una volta eseguite tutte le azioni del telecomando, rilevare il livello audio con il microfono e inviarlo al PC.

D) Tutti i comandi inviati al PC hanno un formato con prima un carattere poi un valore (se è necessario un valore).

E) Ci sono cinque comandi inviati da Arduino al PC

un. "u" - Volume su

B. “d” - Volume giù

C. “s” - Salta Aggiungi

D. “v” - Salta il video

e. “a” - Livello Audio rilevato seguito dal valore

Il codice Arduino:

Scarica il codice Arduino qui:

int in1=2;

int in2=3;

int in3=4;

int in4=5;

void setup() {

Serial.begin(9600);

pinMode(A3, INGRESSO);

pinMode(in1, INGRESSO);

pinMode(in2, INGRESSO);

pinMode(in3, INGRESSO);

pinMode(in4, INGRESSO);

}

ciclo vuoto() {

if(digitalRead(in1))

{

Serial.println("u");

ritardo(100);

}

if(digitalRead(in2))

{

Serial.println("d");

ritardo(100);

}

if(digitalRead(in3))

{

Serial.println("s");

ritardo(100);

}

if(digitalRead(in4))

{

Serial.println("v");

ritardo(100);

}

int readVal= analogRead(A3);

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

ritardo(50);

}

Passaggio 4: codice dell'app per PC (C#. NET)

Codice dell'app per PC (C#. NET)
Codice dell'app per PC (C#. NET)

L'app ascolterà sulla porta COM (USB) e reagirà a seconda del comando ricevuto. Il modo più semplice per aumentare e diminuire l'audio sul PC è utilizzare i servizi Interrop per parlare direttamente con il sistema operativo Windows. Utilizziamo anche i servizi Interrop per spostare il mouse in una posizione specifica sullo schermo e fare clic. Per consentire diverse schermate e dimensioni di visualizzazione, permettiamo all'utente di specificare la posizione dei pulsanti Salta Aggiungi e Salta video.

Usiamo un grafico.net standard per visualizzare tutti i comandi audio che riceviamo.

Codice Windows:

Scarica qui il progetto completo:

leobot.net/audioadjust.zip

utilizzando il sistema;

utilizzando System. Collections. Generic;

utilizzando System. ComponentModel;

utilizzando System. Data;

utilizzando System. Drawing;

utilizzando System. Linq;

utilizzando System. Text;

utilizzando System. Windows. Forms;

utilizzando System. Runtime. InteropServices;

utilizzando System. IO. Ports;

usando System. Threading;

spazio dei nomi AudioAdjust

{

classe parziale pubblica 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);

//Azioni del mouse

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")]

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;

SerialPort statico _serialPort;

int adX = 1281;

int adY = 706;

int vidX = 250;

int vidY = 780;

bool enableAudioChange = false;

pubblico Form1()

{

InizializzaComponent();

}

private void Form1_Load (mittente oggetto, EventArgs e)

{

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

comboBoxPort. Items. AddRange(nomi);

comboBoxPort. SelectedIndex = 0;

}

int puntocorrente = 0;

private void button1_Click (mittente oggetto, EventArgs e)

{

_serialPort = new SerialPort();

_serialPort. DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);

_serialPort. PortName = comboBoxPort. SelectedItem. ToString();//Imposta il COM della tua scheda

_serialPort. BaudRate = 9600;

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

altro

{

_serialPort. Open();

}

// keybd_event((byte)Keys. VolumeDown, 0, 0, 0); // diminuisce il volume

}

void _serialPort_DataReceived(mittente oggetto, SerialDataReceivedEventArgs e)

{

Tentativo

{

stringa fullval = _serialPort. ReadLine();

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

interruttore (com)

{

caso "a":

{

{

//livello audio

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

int valInt = int. Parse(val);

AddData(valInt);

}

rottura;

}

caso "u":

{

//audio su

keybd_event((byte)Keys. VolumeUp, 0, 0, 0); // diminuisce il volume

rottura;

}

caso "d":

{

//audio giù

keybd_event((byte)Keys. VolumeDown, 0, 0, 0); // diminuisce il volume

rottura;

}

caso "s":

{

//salta annuncio

MoveCursorSkipAd();

Thread. Sleep(10);

DoMouseClick();

rottura;

}

caso "v":

{

//salta annuncio

MoveCursorSkipVideo();

Thread. Sleep(10);

DoMouseClick();

rottura;

}

}

}

catturare

{

}

//genera una nuova NotImplementedException();

}

private void MoveCursorSkipAd()

{

Cursor. Position = new Point(1140, 725);

Cursor. Position = new Point(adX, adY);

}

privato void MoveCursorSkipVideo()

{

Cursor. Position = new Point(1140, 725);

Cursor. Position = new Point(vidX, vidY);

}

public void DoMouseClick()

{

//Chiama la funzione importata con la posizione corrente del cursore

uint X = (uint)Cursore. Posizione. X;

uint Y = (uint)Cursore. Posizione. Y;

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

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

}

void AddData(int level)

{

if (abilita AudioChange)

{

if (livello >= MaxLevel)

{

keybd_event((byte)Keys. VolumeDown, 0, 0, 0); // diminuisce il volume

keybd_event((byte)Keys. VolumeDown, 0, 0, 0); // diminuisce il volume

keybd_event((byte)Keys. VolumeDown, 0, 0, 0); // diminuisce il volume

}

altro

{

if (livello < MaxLevel - 0)

{

keybd_event((byte)Keys. VolumeUp, 0, 0, 0); // diminuisce il volume

}

}

}

SetChart(livello);

puntocorrente++;

}

delegato void SetTextCallback(int val);

private void SetChart(int val)

{

// InvokeRequired required confronta l'ID del thread del

// chiama thread all'ID thread del thread di creazione.

// Se questi thread sono diversi, restituisce true.

if (this.chart1. InvokeRequired)

{

SetTextCallback d = new SetTextCallback(SetChart);

this. Invoke(d, nuovo oggetto { val });

}

altro

{

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

if (puntocorrente >= 10)

{

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

}

}

}

private void textBoxLevel_TextChanged (mittente oggetto, EventArgs e)

{

Tentativo

{

MaxLevel = int. Parse(textBoxLevel. Text);

}

catturare

{

textBoxLevel. Text = MaxLevel + "";

}

}

private void buttonTestSkip_Click(mittente oggetto, EventArgs e)

{

MoveCursorSkipAd();

Thread. Sleep(10);

DoMouseClick();

}

private void textBoxXpos_TextChanged (mittente oggetto, EventArgs e)

{

Tentativo

{

adX = int. Parse(textBoxXpos. Text);

}

catturare

{

textBoxXpos. Text = adX + "";

}

}

private void textBoxYpos_TextChanged(oggetto mittente, EventArgs e)

{

Tentativo

{

adY = int. Parse(textBoxYpos. Text);

}

catturare

{

textBoxYpos. Text = adY + "";

}

}

pulsante vuoto privatoSkipVideo_Click(mittente oggetto, EventArgs e)

{

MoveCursorSkipVideo();

Thread. Sleep(10);

DoMouseClick();

}

private void textBoxXposVid_TextChanged(oggetto mittente, EventArgs e)

{

Tentativo

{

vidX = int. Parse(textBoxXposVid. Text);

}

catturare

{

textBoxXposVid. Text = vidX + "";

}

}

private void textBoxYposVid_TextChanged(oggetto mittente, EventArgs e)

{

Tentativo

{

vidY = int. Parse(textBoxYposVid. Text);

}

catturare

{

textBoxYposVid. Text = vidY + "";

}

}

private void checkBoxEnable_CheckedChanged (mittente oggetto, EventArgs e)

{

enableAudioChange = checkBoxEnable. Checked;

}

}

[StructLayout(LayoutKind. Sequential)]

struttura pubblica POINT

{

int pubblico x;

pubblico int y;

}

}

Consigliato: