コンピューターの負荷のアナログインジケーター

私はかつてClusterMの投稿に出会い、そこで彼は古い指標の形でウィジェットを作成しました。 このプロジェクトにはヴィンテージの心地よい感覚があるので、私はこのアイデアが本当に好きでした。 しかし、これは不運です-私はマイクロコントローラ自体と一緒に仕事をしたことはなく、まあまあプログラミングしているので、私は長い間アイデアを先送りにしました。 しかし最近、アレックスが友人のオープンソースの助けを借りてプログラムを変更し、Arduinoからのデータを処理するアルゴリズムを開発したビデオに出会いました。 この記事では、このタスクをどのように実装したかを示したいと思います。







ステージI.ブートモニターコードの処理方法





監視プログラムをダウンロードした後、arduinoをanalogReadサンプルライブラリのコードが縫い付けられたディスプレイに接続しました。これは、arduinoがcomポートで受信するすべてを表示するだけです。 ご覧のとおり、文字の配列を取得しました。最初は実験的に理解しようとしましたが、 吐く より専門的に行動することを決め、コードリーダーの助けを借りて提供されたソースコードを開きました。 助けを借りて、配列内のすべてのデータを送信する部分を見つけ、便宜のために紙に書き留めました。アレックスと彼のチームにコードを追加し、何も変更せず、プロセッサ、ビデオカード、およびRAM負荷値を取得しました。これらはPCdata値です[ 4]、PCdata [5]、PCdata [6]。 その後、私はArduinoでのみ作業を続けることができました。







ステージII。 データの解析と処理を扱います



正直なところ、私は初心者オタクのスタイルでそれを理解したとは言いませんが、アレックスが書いたコードを修正せずに必要であることに気付いたので、コードに追加しました。 解析は次のようになります。







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の値であり、map関数を使用して0〜100の値(ワークロードの割合)を受け入れ、constrain関数を使用して値を制限することを知って、簡単なコードを記述します。







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





ステージIII。 3つのインジケーターを1つのArduinoに接続する方法は?



始めたばかりのとき、私は1つのインジケータのみを接続し、すべてが本当にうまくいきましたが、2番目のインジケータが現れるとすぐに問題が始まります。 Arduinoは2つを一緒に「ロック」することはできません。これはArduinoのボードが原因であると思われます。 ガズル Atmega自体をClusterMとして使用する場合、エネルギー(あらゆる種類のLED、安定剤、愚か者に対する保護など)を消費します-確かに2つで十分です。 私はMOSFETトランジスタの助けを借りて問題を解決しました。ALIExpressを使用してデザイナーボードにIRF520を搭載し、1つのインジケータをMOSFET経由で接続し、2つ目を直接arduinoに接続しました。 アリのあるボードは非常に大きいので、自分でハンダ付けすることにしました。ボードをまったく上げたくないので、マーカーでテクストライトにマーカーを描きました。









コンパクトに出てきましたが、私にとってはそれが主なものです。







接続図は、Aliを搭載したボードの接続図と同じです。まあ、ほとんど、ここでは動作表示が不要なので、LEDを取り外しました。









ステージIV。 インジケーターの背景をデザインする



私はデザインを出版用に特別に保管しましたが、最終スケッチを無事に失いましたが、拡大されたプロトタイプが残りました。 後で私はこれが大きな問題ではないことに気づきました、なぜならあなたのインジケータのサイズに調整する必要があるからです、私は ペイント photoshop 2020なので、変更することもできます。









それは非常に興味深いことが判明したようです、ネジと矢印のための場所を切り取るために残っています-完了!











ステージV. RGBバックライト



その過程でLEDを押し込む場所がないことに気づいたので、結局私は拒否しましたが、最初のコードは非常に簡単でした-誰でも処理でき、3つのインジケーターのすべての色を追加するだけです。 妄想ボード上に設計-時計のように動作します:







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





まとめ

コンピュータが過負荷になっているかどうかを評価することができるため、ゲームをプレイしたり、ビデオや写真を編集したりするのに便利な興味深いウィジェットが見つかりました。







アドバイス-インジケーターを落とさないようにしてください。誤ってRAMから落ちて、矢印がゼロに戻りません。修正されていますが、ひどい松葉杖です。







Arduinoのコード全体







 //#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);//   -  } //      } */
      
      





監視プログラムはアレックスのアーカイブにあります

古いバージョンを使用しましたが、うまく機能しますので、お勧めします。







Alexと彼のチームがオープンソースコードを完成させてくれたことに感謝します。また、彼のガジェットのデモをしてくれたClusterMユーザーと、コードの解読に協力してくれた父にも感謝します。








All Articles