جدول المحتويات:

Arduino Youtube Remote Control for Sleep (Leobot Electronics): 4 خطوات
Arduino Youtube Remote Control for Sleep (Leobot Electronics): 4 خطوات

فيديو: Arduino Youtube Remote Control for Sleep (Leobot Electronics): 4 خطوات

فيديو: Arduino Youtube Remote Control for Sleep (Leobot Electronics): 4 خطوات
فيديو: Omni Pendulum 2024, شهر نوفمبر
Anonim
اردوينو جهاز التحكم عن بعد للنوم على يوتيوب (ليوبوت للإلكترونيات)
اردوينو جهاز التحكم عن بعد للنوم على يوتيوب (ليوبوت للإلكترونيات)

اردوينو يوتيوب عن بعد

إذا كنت تستخدم Youtube لتزويدك بفيلم أو موسيقى لمشاهدتها أثناء النوم ، فمن المؤكد أنك ستستيقظ إما من خلال إعلان تحميل أو مستويات صوت مختلفة عند بدء فيلم جديد. وغني عن القول أن هذا يمكن أن يكون مزعجًا للغاية.

لذا ، فإن الحل الذي أثبتته لكم هنا لبناءه هو جهاز تحكم عن بعد قائم على Arduino للتفاعل مع Youtube عن بعد. جهاز التحكم عن بعد مطلوب لتغيير حجم الصوت الرئيسي لجهاز الكمبيوتر الخاص بي ، وتخطي الإعلانات على Youtube وتخطي مقاطع الفيديو على 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) اردوينو IDE

www.arduino.cc/en/main/software

الخطوة 2: إعداد الجهاز

1) قم بتوصيل وحدة الاستقبال ذات 4 قنوات بـ Arduino.

دبوس استقبال 4 قنوات-> Arduino Uno Pin

GND-> GND

5V-> 5V

D0-> رقمي 2

D1-> رقمي 3

D2-> رقمي 4

D3-> رقمي 5

2) قم بتوصيل وحدة الميكروفون KY-037 بـ Arduino

ميكروفون KY-037 دبوس-> Arduino Uno Pin

GND-> GND

+ -> 3.3 فولت

A0-> تناظري 3

الخطوة 3: كود اردوينو

ملخص

المنطق الذي يحتاج Arduino إلى اتباعه هو كما يلي:

أ) تحقق مما إذا كان جهاز الاستقبال يشير إلى أي دبابيس.

ب) اعتمادًا على منفذ الإدخال / الإخراج الذي يتم استقبال الإشارة عنده ، يتم إرسال الأمر إلى جهاز الكمبيوتر.

ج) بمجرد الانتهاء من جميع إجراءات التحكم عن بعد ، اكتشف مستوى الصوت باستخدام الميكروفون وأرسله إلى جهاز الكمبيوتر.

د) تحتوي جميع الأوامر المرسلة إلى الكمبيوتر على تنسيق يحتوي أولاً على حرف ثم قيمة (إذا كانت هناك حاجة إلى قيمة).

هـ) هناك خمسة أوامر مرسلة من Arduino إلى جهاز الكمبيوتر

أ. "u" - رفع الصوت

ب. "د" - خفض مستوى الصوت

ج. "s" - تخطي إضافة

د. "v" - تخطي الفيديو

ه. "a" - تم اكتشاف مستوى الصوت متبوعًا بالقيمة

كود اردوينو:

قم بتنزيل كود Arduino هنا:

int in1 = 2 ؛

int in2 = 3 ؛

int in3 = 4 ؛

int in4 = 5 ؛

الإعداد باطل() {

Serial.begin (9600) ؛

pinMode (A3 ، الإدخال) ؛

pinMode (in1 ، الإدخال) ؛

pinMode (in2 ، الإدخال) ؛

pinMode (in3 ، الإدخال) ؛

pinMode (in4 ، الإدخال) ؛

}

حلقة فارغة() {

إذا (قراءة رقمية (in1))

{

Serial.println ("u") ؛

تأخير (100) ؛

}

إذا (قراءة رقمية (in2))

{

Serial.println ("d") ؛

تأخير (100) ؛

}

إذا (قراءة رقمية (in3))

{

Serial.println ("s") ؛

تأخير (100) ؛

}

إذا (قراءة رقمية (in4))

{

Serial.println ("v") ؛

تأخير (100) ؛

}

int readVal = analogRead (A3) ،

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

تأخير (50) ؛

}

الخطوة 4: رمز تطبيق الكمبيوتر الشخصي (C #. NET)

كود تطبيق الكمبيوتر (C #. NET)
كود تطبيق الكمبيوتر (C #. NET)

سيستمع التطبيق عبر منفذ COM (USB) ويتفاعل بناءً على الأمر الذي يتم استلامه. إن أبسط طريقة لرفع الصوت أو خفضه على جهاز الكمبيوتر هي استخدام خدمات Interrop للتحدث مباشرة إلى نظام التشغيل Windows. نستخدم أيضًا خدمات Interrop لتحريك الماوس إلى موضع معين على الشاشة والنقر. من أجل السماح للشاشات المختلفة وأحجام العرض ، نسمح للمستخدم بتحديد موضع أزرار تخطي إضافة وتخطي الفيديو.

نستخدم مخطط صافي قياسي لعرض أي أوامر صوتية نتلقاها.

كود الويندوز:

قم بتنزيل المشروع كاملاً من هنا:

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

{

فئة جزئية عامة Form1: Form

{

[DllImport ("User32. Dll")]

SetCursorPos طويلة عامة خارجية ثابتة (int x، int y) ؛

[DllImport ("User32. Dll")]

منطقية خارجية عامة ثابتة ClientToScreen (IntPtr hWnd ، المرجع POINT point) ؛

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

حدث Mouse_event خارجي ثابت عام (uint dwFlags، uint dx، uint dy، uint cButtons، uint dwExtraInfo) ؛

// إجراءات الماوس

إجراء ثابت خاص MOUSEEVENTF_LEFTDOWN = 0x02 ؛

إجراء ثابت خاص MOUSEEVENTF_LEFTUP = 0x04 ؛

إجراء ثابت خاص MOUSEEVENTF_RIGHTDOWN = 0x08 ؛

إجراء ثابت خاص MOUSEEVENTF_RIGHTUP = 0x10 ؛

[DllImport ("user32.dll")]

ثابت خارجي باطل keybd_event (بايت bVk ، بايت bScan ، uint dwFlags ، int dwExtraInfo) ؛

عشوائي aRand = عشوائي جديد () ؛

العامة int LastLevel = 0 ؛

الحد الأقصى للمستوى العمومي = 255 ؛

ثابت SerialPort _serialPort ؛

int adX = 1281 ؛

int adY = 706 ؛

int vidX = 250 ؛

int vidY = 780 ؛

bool enableAudioChange = خطأ ؛

العامة Form1 ()

{

InitializeComponent () ،

}

Form1_Load باطل خاص (مرسل الكائن ، EventArgs e)

{

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

comboBoxPort. Items. AddRange (أسماء) ،

comboBoxPort. SelectedIndex = 0 ؛

}

int CurrentPoint = 0 ؛

button1_Click الفراغ الخاص (مرسل الكائن ، EventArgs e)

{

_serialPort = جديد SerialPort () ،

_serialPort. DataReceived + = جديد SerialDataReceivedEventHandler (_serialPort_DataReceived) ؛

_serialPort. PortName = comboBoxPort. SelectedItem. ToString ()؛ // اضبط لوحة COM الخاصة بك

_serialPort. BaudRate = 9600 ،

إذا (_serialPort. IsOpen) _serialPort. Close () ؛

آخر

{

_serialPort. Open () ،

}

// keybd_event ((بايت) Keys. VolumeDown، 0، 0، 0) ؛ // تقليل الحجم

}

void_serialPort_DataReceived (مرسل الكائن ، SerialDataReceivedEventArgs e)

{

محاولة

{

سلسلة fullval = _serialPort. ReadLine () ،

سلسلة com = fullval [0]. ToString () ،

التبديل (كوم)

{

الحالة "أ":

{

{

// مستوى الصوت

سلسلة val = fullval. Replace ("a"، "")؛

int valInt = int. Parse (val) ؛

AddData (valInt) ؛

}

استراحة؛

}

الحالة "u":

{

// رفع الصوت

keybd_event ((بايت) Keys. VolumeUp، 0، 0، 0) ؛ // تقليل الحجم

استراحة؛

}

الحالة "د":

{

// صوت أسفل

keybd_event ((بايت) Keys. VolumeDown، 0، 0، 0) ؛ // تقليل الحجم

استراحة؛

}

حالات :

{

//تجاهل الاعلانات

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 ؛

mouse_event (MOUSEEVENTF_LEFTDOWN، X، Y، 0، 0) ؛

mouse_event (MOUSEEVENTF_LEFTUP، X، Y، 0، 0) ؛

}

AddData الباطل (مستوى int)

{

إذا (enableAudioChange)

{

إذا (المستوى> = MaxLevel)

{

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 ++ ؛

}

تفويض باطل SetTextCallback (int val) ؛

SetChart باطل خاص (int val)

{

// InvokeRequired يقارن معرف مؤشر الترابط الخاص بـ

// استدعاء الخيط إلى معرف مؤشر الترابط الخاص بخيط الإنشاء.

// إذا كانت هذه الخيوط مختلفة ، فإنها ترجع صحيحًا.

إذا (this.chart1. InvokeRequired)

{

SetTextCallback d = جديد SetTextCallback (SetChart) ؛

this. Invoke (d، new object {val}) ؛

}

آخر

{

chart1. Series [0]. Points. AddXY (0، val) ؛

إذا (CurrentPoint> = 10)

{

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

}

}

}

نص باطل خاص BoxLevel_TextChanged (كائن المرسل ، EventArgs e)

{

محاولة

{

MaxLevel = int. Parse (textBoxLevel. Text) ،

}

يمسك

{

textBoxLevel. Text = MaxLevel + "" ؛

}

}

زر الفراغ الخاص

{

MoveCursorSkipAd () ،

خيط النوم (10) ؛

DoMouseClick () ،

}

نص باطل خاص BoxXpos_TextChanged (كائن المرسل ، EventArgs e)

{

محاولة

{

adX = int. Parse (textBoxXpos. Text) ،

}

يمسك

{

textBoxXpos. Text = adX + "" ؛

}

}

صندوق نص باطل خاص

{

محاولة

{

adY = int. Parse (textBoxYpos. Text) ،

}

يمسك

{

textBoxYpos. Text = adY + "" ؛

}

}

زر الفراغ الخاص SkipVideo_Click (مرسل الكائن ، EventArgs e)

{

MoveCursorSkipVideo () ،

خيط النوم (10) ؛

DoMouseClick () ،

}

نص باطل خاص BoxXposVid_TextChanged (كائن مرسل ، EventArgs e)

{

محاولة

{

vidX = int. Parse (textBoxXposVid. Text) ؛

}

يمسك

{

textBoxXposVid. Text = vidX + "" ؛

}

}

TextBoxYposVid_TextChanged (كائن المرسل ، EventArgs e)

{

محاولة

{

vidY = int. Parse (textBoxYposVid. Text) ،

}

يمسك

{

textBoxYposVid. Text = vidY + "" ؛

}

}

checkBoxEnable_CheckedChanged باطل خاص (كائن المرسل ، EventArgs e)

{

enableAudioChange = checkBoxEnable. Checked ؛

}

}

[StructLayout (LayoutKind. Sequential)]

POINT الهيكل العام

{

int العامة x ؛

العامة ذ ؛

}

}

موصى به: