Spisu treści:

Pilot Arduino Youtube do spania (Leobot Electronics): 4 kroki
Pilot Arduino Youtube do spania (Leobot Electronics): 4 kroki

Wideo: Pilot Arduino Youtube do spania (Leobot Electronics): 4 kroki

Wideo: Pilot Arduino Youtube do spania (Leobot Electronics): 4 kroki
Wideo: Gilticus в такси)) 2024, Lipiec
Anonim
Pilot Arduino Youtube do spania (Leobot Electronics)
Pilot Arduino Youtube do spania (Leobot Electronics)

Pilot Arduino Youtube

Jeśli korzystasz z YouTube, aby zapewnić Ci film lub muzykę do oglądania podczas snu, z pewnością obudziła Cię reklama wczytywania lub inny poziom głośności, gdy zaczyna się nowy film. Nie trzeba dodawać, że może to być dość irytujące.

Tak więc moim rozwiązaniem, które tutaj udowadniam, aby zbudować dla siebie, jest oparty na Arduino pilot zdalnego sterowania do interakcji z Youtube na odległość. Pilot jest wymagany do zmiany głównej głośności dźwięku mojego komputera, pomijania reklam na Youtube i pomijania filmów na Youtube.

W zestawie znajduje się również czujnik poziomu dźwięku, który określa, jak głośno jest głośnik, co z kolei może zostać wykorzystane do automatycznego obniżenia poziomu dźwięku po wykryciu głośnych zakłóceń, takich jak reklama.

Na koniec dodałem wykres w aplikacji na PC, aby wyświetlić wykryte poziomy dźwięku.

Rozwiązanie może być lepiej dopracowane, ale dla mnie spełnia zadanie.

Krok 1: Potrzebne komponenty

Wszystkie te komponenty są dostarczane przez Leobot Electronics (https://leobot.net)

1) Arduino UNO R3

leobot.net/viewproduct.aspx?id=530

2) PILOT 4 KANAŁOWY (315MHZ) + MODUŁ ODBIORNIKA (315MHZ)

leobot.net/viewproduct.aspx?id=521

3) MIKROFON MODUŁ CZUJNIKA GŁOSU I DŹWIĘKU (KY-037)

leobot.net/viewproduct.aspx?id=217

Oprogramowanie

1) Studio wizualne

visualstudio.microsoft.com/

2) IDE Arduino

www.arduino.cc/en/main/software

Krok 2: Konfiguracja sprzętu

1) Podłącz 4-kanałowy moduł odbiornika do Arduino.

4-kanałowy pin odbiornika-> pin Arduino Uno

GND->GND

5V->5V

D0->cyfrowe 2

D1->cyfrowe 3

D2->cyfrowy 4

D3->cyfrowy 5

2) Podłącz moduł mikrofonu KY-037 do Arduino

Mikrofon KY-037 Pin->Arduino Uno Pin

GND->GND

+->3,3V

A0->Analog 3

Krok 3: Kod Arduino

Przegląd

Logika, którą Arduino musi przestrzegać, jest następująca:

A) Sprawdź, czy odbiornik sygnalizuje jakiekolwiek piny.

B) W zależności od tego, na którym porcie IO sygnał jest odbierany, polecenie zostanie wysłane do komputera.

C) Po wykonaniu wszystkich czynności związanych ze zdalnym sterowaniem, wykryj poziom dźwięku za pomocą mikrofonu i wyślij go do komputera.

D) Wszystkie polecenia wysyłane do komputera mają format: najpierw znak, a następnie wartość (jeśli wartość jest potrzebna).

E) Istnieje pięć poleceń wysyłanych z Arduino do komputera!

a. „u” - zwiększanie głośności

b. „d” - Zmniejszenie głośności

C. „s” - Pomiń Dodaj

D. „v” – Pomiń wideo

mi. „a” – wykryty poziom dźwięku, po którym następuje wartość

Kod Arduino:

Pobierz kod Arduino tutaj:

int in1=2;

int in2=3;

int in3=4;

int in4=5;

pusta konfiguracja () {

Serial.początek(9600);

pinMode(A3, WEJŚCIE);

pinMode(we1, WEJŚCIE);

pinMode(we2, INPUT);

pinMode(we3, INPUT);

pinMode(we4, WEJŚCIE);

}

pusta pętla () {

if(odczyt cyfrowy(in1))

{

Serial.println("u");

opóźnienie (100);

}

if(odczyt cyfrowy(in2))

{

Serial.println("d");

opóźnienie (100);

}

if (odczyt cyfrowy (in3))

{

Serial.println("s");

opóźnienie (100);

}

if(odczyt cyfrowy(in4))

{

Serial.println("v");

opóźnienie (100);

}

int odczytWart=odczyt analogowy(A3);

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

opóźnienie(50);

}

Krok 4: Kod aplikacji PC (C#. NET)

Kod aplikacji na komputer (C#. NET)
Kod aplikacji na komputer (C#. NET)

Aplikacja będzie nasłuchiwać przez port COM (USB) i reagować w zależności od otrzymanego polecenia. Najprostszym sposobem zwiększania i zmniejszania dźwięku na komputerze jest skorzystanie z usług Interrop w celu bezpośredniego komunikowania się z systemem operacyjnym Windows. Korzystamy również z usług Interrop, aby przesunąć mysz w określone miejsce na ekranie i kliknąć. Aby umożliwić różne ekrany i rozmiary widoków, umożliwiamy użytkownikowi określenie pozycji przycisków pomijania dodawania i pomijania wideo.

Używamy standardowego wykresu.net do wyświetlania dowolnych poleceń audio, które otrzymujemy.

Kod systemu Windows:

Pobierz cały projekt tutaj:

leobot.net/audioadjust.zip

korzystanie z Systemu;

za pomocą System. Collections. Generic;

przy użyciu System. ComponentModel;

za pomocą System. Data;

za pomocą System. Drawing;

za pomocą System. Linq;

za pomocą System. Text;

za pomocą System. Windows. Forms;

za pomocą System. Runtime. InteropServices;

za pomocą System. IO. Ports;

za pomocą System. Threading;

przestrzeń nazw AudioAdjust

{

public częściowa klasa 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);

//Akcje myszy

stała prywatna int MOUSEEVENTF_LEFTDOWN = 0x02;

stała prywatna int MOUSEEVENTF_LEFTUP = 0x04;

stała prywatna int MOUSEEVENTF_RIGHTDOWN = 0x08;

stała prywatna int MOUSEEVENTF_RIGHTUP = 0x10;

[DllImport("user32.dll")]

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

Random aRand = nowy Random();

public int Ostatni Poziom = 0;

public int MaxLevel = 255;

statyczny SerialPort _serialPort;

int adX = 1281;

int adY = 706;

int vidX = 250;

int vidY = 780;

bool enableAudioChange = false;

publiczny formularz1()

{

InitializeComponent();

}

private void Form1_Load (nadawca obiektu, EventArgs e)

{

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

comboBoxPort. Items. AddRange(nazwy);

comboBoxPort. SelectedIndex = 0;

}

int bieżącyPunkt = 0;

private void button1_Click (nadawca obiektu, argumenty zdarzenia e)

{

_SerialPort = nowy SerialPort();

_serialPort. DataReceived += nowy SerialDataReceivedEventHandler(_serialPort_DataReceived);

_serialPort. PortName = comboBoxPort. SelectedItem. ToString();//Ustaw tablicę COM

_serialPort. BaudRate = 9600;

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

w przeciwnym razie

{

_serialPort. Open();

}

// keybd_event((bajt)Klucze. VolumeDown, 0, 0, 0); // zmniejsz głośność

}

void _serialPort_DataReceived (nadawca obiektu, SerialDataReceivedEventArgs e)

{

próbować

{

string fullval = _serialPort. ReadLine();

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

przełącznik (com)

{

przypadek „a”:

{

{

//poziom dźwięku

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

int valInt = int. Parse(val);

DodajDane(valInt);

}

przerwa;

}

przypadek „u”:

{

//dźwięk w górę

keybd_event((bajt)Klucze. Zwiększenie głośności, 0, 0, 0); // zmniejsz głośność

przerwa;

}

przypadek „d”:

{

//wyłączony dźwięk

keybd_event((bajt)Klucze. GłośnośćDown, 0, 0, 0); // zmniejsz głośność

przerwa;

}

sprawy :

{

//Pomiń reklamę

PrzesuńKursorPomińAd();

Wątek. Uśpienie(10);

DoMouseClick();

przerwa;

}

przypadek „v”:

{

//Pomiń reklamę

PrzesuńKursorPomińWideo();

Wątek. Uśpienie(10);

DoMouseClick();

przerwa;

}

}

}

łapać

{

}

//wyrzuć nowy NotImplementedException();

}

private void MoveCursorSkipAd()

{

Cursor. Position = nowy punkt (1140, 725);

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

}

private void MoveCursorSkipVideo()

{

Cursor. Position = nowy punkt (1140, 725);

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

}

public void DoMouseClick()

{

//Wywołaj zaimportowaną funkcję z aktualną pozycją kursora

uint X = (uint)Kursor. Pozycja. X;

uint Y = (uint) Kursor. Pozycja. Y;

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

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

}

void AddData (poziom wewnętrzny)

{

jeśli (włączAudioChange)

{

jeśli (poziom >= MaxLevel)

{

keybd_event((bajt)Klucze. GłośnośćDown, 0, 0, 0); // zmniejsz głośność

keybd_event((bajt)Klucze. GłośnośćDown, 0, 0, 0); // zmniejsz głośność

keybd_event((bajt)Klucze. GłośnośćDown, 0, 0, 0); // zmniejsz głośność

}

w przeciwnym razie

{

jeśli (poziom < MaxLevel - 0)

{

keybd_event((bajt)Klucze. Zwiększenie głośności, 0, 0, 0); // zmniejsz głośność

}

}

}

SetChart(poziom);

aktualnyPunkt++;

}

deleguj void SetTextCallback(int val);

private void SetChart(int val)

{

// InvokeRequired wymagane porównuje identyfikator wątku

// wywołanie wątku na identyfikator wątku tworzącego wątku.

// Jeśli te wątki są różne, zwraca true.

if (this.chart1. InvokeRequired)

{

SetTextCallback d = nowy SetTextCallback(SetChart);

this. Invoke(d, nowy obiekt { val });

}

w przeciwnym razie

{

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

jeśli (bieżącyPunkt >= 10)

{

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

}

}

}

private void textBoxLevel_TextChanged(nadawca obiektu, EventArgs e)

{

próbować

{

PoziomMaksymalny = int. Parse(PoziomPolaTekstowego. Tekst);

}

łapać

{

textBoxLevel. Text = MaxLevel + "";

}

}

private void buttonTestSkip_Click(object sender, EventArgs e)

{

PrzesuńKursorPomińAd();

Wątek. Uśpienie(10);

DoMouseClick();

}

private void textBoxXpos_TextChanged (nadawca obiektu, EventArgs e)

{

próbować

{

adX = int. Parse(pole tekstoweXpoz. Tekst);

}

łapać

{

textBoxXpos. Text = adX + "";

}

}

private void textBoxYpos_TextChanged (nadawca obiektu, EventArgs e)

{

próbować

{

adY = int. Parse(pole tekstoweYpoz. Tekst);

}

łapać

{

textBoxYpos. Text = adY + "";

}

}

private void buttonSkipVideo_Click(object sender, EventArgs e)

{

PrzesuńKursorPomińWideo();

Wątek. Uśpienie(10);

DoMouseClick();

}

private void textBoxXposVid_TextChanged (nadawca obiektu, EventArgs e)

{

próbować

{

vidX = int. Parse(textBoxXposVid. Text);

}

łapać

{

textBoxXposVid. Text = vidX + "";

}

}

private void textBoxYposVid_TextChanged (nadawca obiektu, EventArgs e)

{

próbować

{

vidY = int. Parse(textBoxYposVid. Text);

}

łapać

{

textBoxYposVid. Text = vidY + "";

}

}

private void checkBoxEnable_CheckedChanged (nadawca obiektu, EventArgs e)

{

enableAudioChange = checkBoxEnable. Checked;

}

}

[StructLayout(Layout Kind. Sequential)]

struktura publiczna POINT

{

publiczne int x;

int publicznej;

}

}

Zalecana: