مؤشر تناظري لتحميل الكمبيوتر

التقيت ذات مرة بمنشور من ClusterM حيث قام بعمل أداة على شكل مؤشرات قديمة. لقد أحببت هذه الفكرة حقًا لأن هناك شعورًا لطيفًا بالخمر في هذا المشروع. لكن هذا حظ سيئ - لم أعمل أبدًا مع وحدة التحكم الدقيقة نفسها وأنا أبرمج ذلك ، لذا أنا أبطلت الفكرة لفترة طويلة. لكنني صادفت مؤخرًا مقطع فيديو حيث قام أليكس بتعديل البرنامج بمساعدة أصدقاء المصدر المفتوح وطور خوارزمية لمعالجة البيانات من Arduino. في هذه المقالة أريد أن أبين كيف قمت بتنفيذ هذه المهمة.


المرحلة الأولى. كيف تعاملت مع رمز مراقبة التمهيد



بعد تنزيل برنامج المراقبة ، قمت بتوصيل اردوينو مع شاشة عرض تم من خلالها خياطة الرمز من مكتبة الأمثلة analogRead ، فإنه ببساطة يعرض كل شيء يتلقىه اردوينو على منفذ com. كما ترون ، لقد حصلت على مجموعة من الشخصيات ، في البداية حاولت أن أفهم تجريبيًا ، ولكن بعد ذلك بصق قررت العمل بشكل أكثر احترافية وفتحت باستخدام شفرة المصدر التي قدمتها التعليمات البرمجية المصدر. وبمساعدة المساعدة ، وجدت الجزء الذي يرسل جميع البيانات في مصفوفة ، لراحيتي كتبتها على قطعة من الورق ، منذ أن أضفت الرمز إلى أليكس وفريقه لم أغير أي شيء ، لقد أخذت للتو المعالج وبطاقة الفيديو وقيم تحميل ذاكرة الوصول العشوائي ، وهذه قيم PCdata [ 4] ، PCdata [5] ، PCdata [6]. بعد ذلك ، تمكنت من مواصلة العمل فقط مع Arduino.


المرحلة الثانية. نتعامل مع تحليل البيانات ومعالجتها


بصراحة ، لن أقول أنني اكتشفت ذلك ، بأسلوب المهوس المبتدئ ، أدركت للتو أنني بحاجة إلى الرمز الذي كتبه أليكس دون أي تعديلات ، لذلك أضفته إلى الكود الخاص بي. يبدو التحليل كما يلي:


while (Serial.available() > 0) { char aChar = Serial.read(); if (aChar != 'E') { inData[index] = aChar; index++; inData[index] = '\0'; } else { char *p = inData; char *str; index = 0; String value = ""; while ((str = strtok_r(p, ";", &p)) != NULL) { string_convert = str; PCdata[index] = string_convert.toInt(); index++; } index = 0; isDataExist = true; } } } 

للتأكد ، من خلال الأمر lcd.Write ، أقوم بإخراج قيم PCdata [4] بالتناوب للتأكد من أنني أقبل البيانات التي أحتاجها.


بعد ذلك ، بدأت في ترجمة البيانات المئوية إلى إشارة PWM. مع العلم أن الإشارة التي نرسلها هي القيم من 0 إلى 255 ، ونحن نقبل القيم من 0 إلى 100 (هذه هي النسبة المئوية للحمل) باستخدام وظيفة الخريطة وتقييد القيم باستخدام وظيفة تقييد ، أكتب رمزًا بسيطًا:


  cpu = map(cpu, 0, 100, 0, 255); cpu = constrain(cpu, 0, 255); analogWrite(9, cpu); gpu= PCdata[5]; gpu = map(gpu, 0, 100, 0, 255); gpu = constrain(gpu, 0, 255); analogWrite(3, gpu); mem= PCdata[6]; mem = map(mem, 0, 100, 0, 255); mem = constrain(mem, 0, 255); analogWrite(5, mem); 

المرحلة الثالثة. كيفية ربط 3 مؤشرات لاردوينو واحد؟


عندما بدأت للتو ، قمت بتوصيل مؤشر واحد فقط وكل شيء على ما يرام ، ولكن بمجرد ظهور المؤشر الثاني ، تبدأ المشاكل. لا يمكن لـ Arduino "التأرجح" معًا ، أعتقد أن هذا يرجع إلى لوحة Arduino ، فهناك الكثير من الأشياء التي شراب تستهلك الطاقة (جميع أنواع المصابيح ، والمثبتات ، والحماية من الحمقى ، وما إلى ذلك) إذا كنت تستخدم Atmega نفسها كـ ClusterM - يجب أن يكون كافيًا ، لاثنين بالتأكيد. لقد قمت بحل المشكلة بمساعدة الترانزستورات mosfet ، كان لدي IRF520 على لوحة المصمم مع Ali Express ، وربط مؤشر واحد من خلال mosfet والثاني مباشرة في اردوينو وعملت. نظرًا لأن اللوحة مع Ali ضخمة للغاية ، فقد قررت لحامها بنفسي ، ولم أرغب في رفع اللوحة على الإطلاق ، لذلك قمت برسمها بعلامة على القماش.



خرجت بشكل مضغوط ، ولكن بالنسبة لي هذا هو الشيء الرئيسي.


مخطط الاتصال هو نفس مخطط اللوحة مع علي ، حسنًا ، أزلت LED تقريبًا لأن إشارة العملية ليست مطلوبة هنا.



المرحلة الرابعة. تصميم الخلفيات للمؤشر


حافظت بشكل خاص على تصميمي للنشر ، لكنني فقدت الرسم النهائي بنجاح ، ولكن بقي نموذج أولي موسع. أدركت لاحقًا أن هذه ليست مشكلة كبيرة ، حيث سيكون من الضروري التكيف مع حجم مؤشراتك ، لقد فعلت ذلك في الطلاء فوتوشوب 2020 ، لذلك أنا متأكد من أنه يمكنك تعديله أيضًا.



يبدو لي أنه اتضح أنه مثير للاهتمام للغاية ، يبقى قطع مكان البراغي والسهام - تم!




المرحلة الخامسة RGB الخلفية


منذ ذلك الحين ، أدركت أنه ليس لدي أي مكان لأشغل LED - في النهاية رفضت ، لكنني فعلت الرمز الأولي ، إنه بسيط للغاية - يمكن للجميع التعامل معه ، فقط أضف جميع الألوان للمؤشرات الثلاثة. مصممة على لوحة الوهم - تعمل مثل الساعة:


  void led() { if (PCdata[4] < 20 ) { digitalWrite (6, HIGH);//,       rgb } else{ digitalWrite (6, LOW); } if (PCdata[4] > 20 && PCdata[4] < 60 );// ,     //     { digitalWrite(5, HIGH);//   -  } //      } 

الملخص
اتضح عنصر واجهة مستخدم مثير للاهتمام ، وهو مفيد عند لعب الألعاب ، وتحرير مقاطع الفيديو والصور ، لأنه من الممكن تقييم ما إذا كان الكمبيوتر محملاً بشكل زائد.


نصيحة - حاول ألا تسقط مؤشراتك ، لقد سقطت عن طريق الخطأ من ذاكرة الوصول العشوائي والسهم لا يعود إلى الصفر ، تم إصلاحه ولكنه عكازات رهيبة.


الكود الكامل لاردوينو


 //#include <Wire.h> //    //#include <LiquidCrystal.h> //    ,     //LiquidCrystal lcd(8, 9, 4, 5, 6, 7); char inData[82]; //    () int PCdata[20]; //       byte index = 0; String string_convert; bool isDataExist = false; int cpu; int mem; int gpu; void setup() { Serial.begin(9600); } void loop() { parsing(); //led();       cpu = PCdata[4]; cpu = map(cpu, 0, 100, 0, 255); cpu = constrain(cpu, 0, 255); analogWrite(9, cpu); gpu= PCdata[5]; gpu = map(gpu, 0, 100, 0, 255); gpu = constrain(gpu, 0, 255); analogWrite(3, gpu); mem= PCdata[6]; mem = map(mem, 0, 100, 0, 255); mem = constrain(mem, 0, 255); analogWrite(5, mem); } void parsing() { while (Serial.available() > 0) { char aChar = Serial.read(); if (aChar != 'E') { inData[index] = aChar; index++; inData[index] = '\0'; } else { char *p = inData; char *str; index = 0; String value = ""; while ((str = strtok_r(p, ";", &p)) != NULL) { string_convert = str; PCdata[index] = string_convert.toInt(); index++; } index = 0; isDataExist = true; } } } /*void led() { if (PCdata[4] < 20 ) { digitalWrite (6, HIGH);//       rgb } else{ digitalWrite (6, LOW); } if (PCdata[4] > 20 && PCdata[4] < 60 );// ,     ,     { digitalWrite(5, HIGH);//   -  } //      } */ 

برنامج المراقبة موجود في أرشيف أليكس
لقد استخدمت الإصدار القديم ، وهو يعمل بشكل رائع ، لذا أنصحك.


أود أن أشكر أليكس وفريقه على وضع اللمسات الأخيرة على رمز المصدر المفتوح ، وكذلك مستخدم ClusterM لإثبات أداتهم وأبي لمساعدتي في فك تشفير الشفرة.

Source: https://habr.com/ru/post/ar429582/


All Articles