תוכן עניינים:

שלט רחוק Arduino Youtube לשינה (לאובוט אלקטרוניקה): 4 שלבים
שלט רחוק Arduino Youtube לשינה (לאובוט אלקטרוניקה): 4 שלבים

וִידֵאוֹ: שלט רחוק Arduino Youtube לשינה (לאובוט אלקטרוניקה): 4 שלבים

וִידֵאוֹ: שלט רחוק Arduino Youtube לשינה (לאובוט אלקטרוניקה): 4 שלבים
וִידֵאוֹ: ELF/EMBARC Bronchiectasis conference 2023 with subtitles 2024, יולי
Anonim
שלט רחוק Arduino Youtube לשינה (לאובוט אלקטרוניקה)
שלט רחוק Arduino Youtube לשינה (לאובוט אלקטרוניקה)

מרחוק Youtube של Arduino

אם אתה משתמש ב- YouTube כדי לספק לך סרט או מוזיקה לצפייה בזמן השינה, בוודאי היה מתעורר על ידי מודעת טעינה או רמות עוצמה שונות כאשר סרט חדש מתחיל. מיותר לציין שזה יכול להיות מעצבן למדי.

לכן, הפתרון שלי שאני מוכיח לכם כאן לבנות לעצמכם הוא שלט רחוק מבוסס Arduino לאינטראקציה עם Youtube מרחוק. השלט נדרש כדי לשנות את עוצמת הקול העיקרית של המחשב האישי שלי, לדלג על פרסומות ביוטיוב ולדלג על סרטונים ביוטיוב.

כמו כן, כלול חיישן רמת שמע כדי לקבוע עד כמה הרמקול באמת חזק, אשר בתורו ניתן להשתמש בו להורדה אוטומטית של רמת הקול בעת זיהוי הפרעות חזקות כגון מודעה.

לבסוף, הוספתי תרשים באפליקציית המחשב כדי להציג את רמות השמע שזוהו.

אפשר לשכלל את הפתרון טוב יותר אבל מבחינתי הוא מבצע את המשימה.

שלב 1: דרושים רכיבים

כל הרכיבים הללו מסופקים על ידי Leobot Electronics (https://leobot.net)

1) ארדואינו UNO R3

leobot.net/viewproduct.aspx?id=530

2) 4 ערוצים מרחוק (315 מגה -הרץ) + מודול מקלט (315 מגה -הרץ)

leobot.net/viewproduct.aspx?id=521

3) מודול חיישן זיהוי קול וקול מיקרופון (KY-037)

leobot.net/viewproduct.aspx?id=217

תוֹכנָה

1) Visual Studio

visualstudio.microsoft.com/

2) Arduino IDE

www.arduino.cc/en/main/software

שלב 2: התקנת חומרה

1) חבר את מודול המקלט של 4 ערוצים ל- Arduino.

פין מקלט 4-ערוצים-> סיכת אונו Arduino

GND-> GND

5V-> 5V

D0-> דיגיטלי 2

D1-> דיגיטלי 3

D2-> דיגיטלי 4

D3-> דיגיטלי 5

2) חבר את מודול המיקרופון KY-037 ל- Arduino

מיקרופון KY-037 Pin-> Arduino Uno Pin

GND-> GND

+-> 3.3V

A0-> אנלוגי 3

שלב 3: קוד ארדואינו

סקירה כללית

ההיגיון שצריך לעקוב אחר הארדואינו הוא כדלקמן:

א) בדוק אם המקלט מסמן סיכות כלשהן.

ב) תלוי באיזו יציאת IO האות יתקבל היא איזו פקודה תישלח למחשב.

ג) לאחר שתעשה את כל פעולות השלט הרחוק, זיהה את רמת השמע עם המיקרופון ושלח אותו למחשב האישי.

ד) לכל הפקודות שנשלחות למחשב יש פורמט של תחילה בעל תו ואז ערך (אם יש צורך בערך).

ה) ישנן חמש פקודות שנשלחות מהארדואינו למחשב האישי

א. "U" - הגברת עוצמת הקול

ב. "D" - הורדת עוצמת הקול

ג. “S” - דלג על הוספה

ד. "V" - דלג על סרטון

ה. "A" - רמת האודיו זוהתה ואחריה הערך

קוד הארדואינו:

הורד את קוד Arduino כאן:

int in1 = 2;

int in2 = 3;

int in3 = 4;

int in4 = 5;

הגדרת בטל () {

Serial.begin (9600);

pinMode (A3, INPUT);

pinMode (in1, INPUT);

pinMode (in2, INPUT);

pinMode (in3, INPUT);

pinMode (in4, INPUT);

}

לולאת חלל () {

אם (digitalRead (in1))

{

Serial.println ("u");

עיכוב (100);

}

אם (digitalRead (in2))

{

Serial.println ("d");

עיכוב (100);

}

אם (digitalRead (in3))

{

Serial.println ("s");

עיכוב (100);

}

אם (digitalRead (in4))

{

Serial.println ("v");

עיכוב (100);

}

int readVal = analogRead (A3);

Serial.println (מחרוזת ("a")+ מחרוזת (readVal));

עיכוב (50);

}

שלב 4: קוד אפליקציות PC (C#. NET)

קוד יישומי מחשב (C#. NET)
קוד יישומי מחשב (C#. NET)

האפליקציה תקשיב מעל יציאת ה- COM (USB) ותגיב בהתאם לפקודה המתקבלת. הדרך הפשוטה ביותר להעלות ולרדת את הצליל במחשב היא להשתמש בשירותי Interrop כדי לדבר ישירות עם מערכת ההפעלה Windows. אנו משתמשים גם בשירותי אינטרופ כדי להזיז את העכבר למיקום ספציפי על המסך ולחץ. על מנת לאפשר מסכים וגדלי צפייה שונים, אנו מאפשרים למשתמש לציין את המיקום של לחצני הווידאו של הוספה ודילוג.

אנו משתמשים בתרשים.net רגיל להצגת כל פקודות השמע שאנו מקבלים.

קוד Windows:

הורד את הפרויקט המלא כאן:

leobot.net/audioadjust.zip

שימוש במערכת;

באמצעות System. Collections. Generic;

באמצעות System. ComponentModel;

שימוש ב- System. Data;

שימוש ב- System. Drawing;

באמצעות System. Linq;

שימוש ב- System. Text;

שימוש ב- System. Windows. Forms;

שימוש ב- System. Runtime. InteropServices;

שימוש ב- System. IO. Ports;

שימוש ב- System. Threading;

מרחב שמות AudioAdjust

{

מעמד חלקי ציבורי טופס 1: טופס

{

[DllImport ("User32. Dll")]

ציבורי סטטי חיצוני ארוך SetCursorPos (int x, int y);

[DllImport ("User32. Dll")]

ציבור סטטי חיצוני bool ClientToScreen (IntPtr hWnd, נקודת ref ref);

[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);

// פעולות עכבר

const const int MOUSEEVENTF_LEFTDOWN = 0x02;

const const int MOUSEEVENTF_LEFTUP = 0x04;

const const int MOUSEEVENTF_RIGHTDOWN = 0x08;

const 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 _serialPort;

int adX = 1281;

int adY = 706;

int vidX = 250;

int vidY = 780;

bool enableAudioChange = false;

טופס ציבורי 1 ()

{

InitializeComponent ();

}

טופס ריק_טען פרטי (שולח אובייקט, EventArgs e)

{

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

comboBoxPort. Items. AddRange (שמות);

comboBoxPort. SelectedIndex = 0;

}

int currentPoint = 0;

כפתור חלל פרטי1_קליק (שולח אובייקט, EventArgs e)

{

_serialPort = SerialPort חדש ();

_serialPort. DataReceived += new SerialDataReceivedEventHandler (_serialPort_DataReceived);

_serialPort. PortName = comboBoxPort. SelectedItem. ToString (); // הגדר את COM הלוח שלך

_serialPort. BaudRate = 9600;

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

אַחֵר

{

_serialPort. Open ();

}

// keybd_event ((בייט) Keys. VolumeDown, 0, 0, 0); // להקטין את עוצמת הקול

}

void _serialPort_DataReceived (שולח אובייקט, SerialDataReceivedEventArgs e)

{

לְנַסוֹת

{

string fullval = _serialPort. ReadLine ();

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

לעבור (com)

{

מקרה "א":

{

{

// רמת שמע

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

int valInt = int. Parse (val);

AddData (valInt);

}

לשבור;

}

מקרה "אתה":

{

// שמע למעלה

keybd_event ((בייט) Keys. VolumeUp, 0, 0, 0); // להקטין את עוצמת הקול

לשבור;

}

מקרה "d":

{

// שמע למטה

keybd_event ((בייט) Keys. VolumeDown, 0, 0, 0); // להקטין את עוצמת הקול

לשבור;

}

מקרה "s":

{

//לדלג על מודעה

MoveCursorSkipAd ();

חוט. שינה (10);

DoMouseClick ();

לשבור;

}

מקרה "v":

{

//לדלג על מודעה

MoveCursorSkipVideo ();

חוט. שינה (10);

DoMouseClick ();

לשבור;

}

}

}

לתפוס

{

}

// לזרוק NotImplementedException חדש ();

}

חלל פרטי MoveCursorSkipAd ()

{

Cursor. Position = נקודה חדשה (1140, 725);

Cursor. Position = נקודה חדשה (adX, adY);

}

חלל פרטי MoveCursorSkipVideo ()

{

Cursor. Position = נקודה חדשה (1140, 725);

Cursor. Position = נקודה חדשה (vidX, vidY);

}

ריק ציבורי של DoMouseClick ()

{

// התקשר לפונקציה המיובאת עם המיקום הנוכחי של הסמן

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

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

אירוע עכבר (MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);

אירוע עכבר (MOUSEEVENTF_LEFTUP, X, Y, 0, 0);

}

חלל AddData (רמה int)

{

if (enableAudioChange)

{

אם (רמה> = מקס רמה)

{

keybd_event ((בייט) Keys. VolumeDown, 0, 0, 0); // להקטין את עוצמת הקול

keybd_event ((בייט) Keys. VolumeDown, 0, 0, 0); // להקטין את עוצמת הקול

keybd_event ((בייט) Keys. VolumeDown, 0, 0, 0); // להקטין את עוצמת הקול

}

אַחֵר

{

אם (רמה <MaxLevel - 0)

{

keybd_event ((בייט) Keys. VolumeUp, 0, 0, 0); // להקטין את עוצמת הקול

}

}

}

SetChart (רמה);

currentPoint ++;

}

נציג void SetTextCallback (int val);

SetChart של חלל פרטי (int val)

{

// InvokeRequired required משווה את מזהה האשכול של

// קורא חוט אל מזהה האשכול של השרשור היוצר.

// אם האשכולות הללו שונים, הוא חוזר נכון.

if (this.chart1. InvokeRequired)

{

SetTextCallback d = SetTextCallback חדש (SetChart);

this. Invoke (ד, אובייקט חדש {val});

}

אַחֵר

{

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

אם (currentPoint> = 10)

{

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

}

}

}

private void textBoxLevel_TextChanged (שולח אובייקט, EventArgs e)

{

לְנַסוֹת

{

MaxLevel = int. Parse (textBoxLevel. Text);

}

לתפוס

{

textBoxLevel. Text = MaxLevel + "";

}

}

כפתור חלל פרטי TestSkip_Click (שולח אובייקט, EventArgs e)

{

MoveCursorSkipAd ();

חוט. שינה (10);

DoMouseClick ();

}

טקסט חלל פרטי BoxXpos_TextChanged (שולח אובייקט, EventArgs e)

{

לְנַסוֹת

{

adX = int. Parse (textBoxXpos. Text);

}

לתפוס

{

textBoxXpos. Text = adX + "";

}

}

private private textBoxYpos_TextChanged (שולח אובייקט, EventArgs e)

{

לְנַסוֹת

{

adY = int. Parse (textBoxYpos. Text);

}

לתפוס

{

textBoxYpos. Text = adY + "";

}

}

כפתור חלל פרטי SlipVideo_Click (שולח אובייקט, EventArgs e)

{

MoveCursorSkipVideo ();

חוט. שינה (10);

DoMouseClick ();

}

טקסט חלל פרטי BoxXposVid_TextChanged (שולח אובייקט, EventArgs e)

{

לְנַסוֹת

{

vidX = int. Parse (textBoxXposVid. Text);

}

לתפוס

{

textBoxXposVid. Text = vidX + "";

}

}

private void textBoxYposVid_TextChanged (שולח אובייקט, EventArgs e)

{

לְנַסוֹת

{

vidY = int. Parse (textBoxYposVid. Text);

}

לתפוס

{

textBoxYposVid. Text = vidY + "";

}

}

check private void checkBoxEnable_CheckedChanged (שולח אובייקט, EventArgs e)

{

enableAudioChange = checkBoxEnable. Checked;

}

}

[StructLayout (LayoutKind. Sequential)]

public struct POINT

{

public int x;

ציבורי int y;

}

}

מוּמלָץ: