Sommario:
- Passaggio 1: componenti necessari
- Passaggio 2: configurazione hardware
- Passaggio 3: codice Arduino
- Passaggio 4: codice dell'app per PC (C#.NET)
Video: Telecomando Arduino Youtube per dormire (Leobot Electronics): 4 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:02
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)
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:
L'SWD >> un dispositivo per dormire bene: 5 passaggi
L'SWD >> un dispositivo per dormire bene: un dispositivo per riprodurre un suono piacevole, ad es. pioggia, onde, giungla per dormire meglio.Una carica giocherà (impostato a un volume moderato) fino a 8 ore!Questo è un "come" costruire un piccolo lettore MP3 ricaricabile. La scatola che ho usato è di 8,5 x 7 x 4 cm. L'idea era di costruire
Termometro IR per dormire: 5 passaggi
Termometro IR per il sonno: quindi questo Lazy Old Geek (L.O.G.) ha recentemente acquistato un modulo termico IR, MLX90614 da AliExpress.com. Guarda le immagini Questo è lo stesso tipo di sensore utilizzato nei termometri frontali e auricolari mostrati nella terza immagine. Si chiamano senza contatto perché
Timer per dormire a sufficienza: 3 passaggi
Sleep Enough Timer: non sono riuscito a trovare un buon nome per questo progetto. Potresti anche chiamarlo "abbastanza timer di spegnimento". L'idea di questo progetto è nata durante una vacanza invernale. Eravamo in una casa di vacanza dove non c'era la sveglia in camera da letto. Normalmente ho bisogno di
Maschera per gli occhi Musica per dormire: 5 passaggi
Eye Mask Sleeping Music: questo è un progetto per farti dormire meglio la notte, affidati alla versione lenta della canzone di Natale sulla maschera per gli occhi
Una guida per mettere a dormire Arduino: 5 passaggi
Una guida per mettere il tuo Arduino in sospensione: a volte ci troviamo in una situazione che richiede di mettere un Arduino in un luogo in cui collegarlo alla rete elettrica non è un'opzione. Questo accade spesso quando proviamo a registrare le informazioni in un sito remoto, o abbiamo solo bisogno di avere il tuo Arduino attivo in un