ArduinoPCモニター
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 |
このプロジェクトについて
はじめに
このプロジェクトのアイデアは、実際には楽しさと知識の必要性から生まれました。このプロジェクトは簡単に作成でき、多くのアプリケーションがあります。たとえば、いくつかのハードウェア変数を制御、保存、および表示するために使用できます。
始めましょう
まず、LCDを接続する必要があります(私はI2Cコンバーターを使用していました):
<図>これを行ったら、次の部分に進むことができます...
コードを書いてみましょう...
アドレス0x3Fで16x2LCDを設定します-I2Cバスデバイスのアドレスは、ArduinoPlaygroundで利用可能な簡単なスケッチを介したスキャンから見つけることができます。
#include #include LiquidCrystal_I2C lcd(0x3F、16,2);
次に、 String
を宣言する必要があります シリアル入力を保存し、残りのものをセットアップするための変数。
String inData; void setup(){lcd.init(); Serial.begin(9600); lcd.backlight(); }
文字列変数で直接データを送信する場合は、文字列サイズに基づいて約1秒の遅延が発生するため、問題が発生する可能性があります。これを回避するには、 char
を使用します 変数を inData
に追加します 。
char recieved =Serial.read(); inData + =受信済み;
さて、すべてが順調ですが、データを受信するときに来るのをやめますか?解決策があります:
if(recieved =='*'){...}
charの最後がいつになるか* Arduinoは次の部分に進むタイミングを認識します。次に、メッセージを処理する必要があります。この *
を取り除く必要があります char so:
inData.remove(inData.length()-1、1);
そして最後に:
lcd.setCursor(0,0); lcd.print(inData); inData =""; //バッファをクリアします
しかし... 2行目は未使用です...解決策は次のとおりです
if(recieved =='#'){inData.remove(inData.length()-1、1); lcd.setCursor(0,1); lcd.print(inData); inData =""; }}
文字の最後が#になると、ArduinoはLCDの2行目を設定し、他のデータを印刷します。
構成
なぜCやC ++ではなくC#なのか? C#は簡単で高速です(高速です...つまり書面で)
まず、ハードウェア変数に簡単にアクセスできるように、追加のライブラリをダウンロードする必要があります。
ハードウェアモニターを開く
解凍すると、次のライブラリが作成されます:OpenHardwareMonitorLib.dll
新しいプロジェクトを作成する-> Windowsフォームアプリケーション->ソリューションエクスプローラーで[参照]を右クリック-> [参照]-> [OpenHardwareMonitorLib.dll]を選択し、確認することを忘れないでください。
外観
フォームを準備します:
<図><図>
今すぐコーディング...
いくつかのディレクティブ...
using System.IO.Ports; OpenHardwareMonitor.Hardwareを使用します。
そして宣言...
SerialPort port =new SerialPort(); Computer c =new Computer(){GPUEnabled =true、CPUEnabled =true}; float value1、value2;
c
Open HardwareMonitorオブジェクトです。 CPUとGPUを有効にする必要があります。フォームの読み込みイベントに次のように入力します:
c.Open();
フォームコンストラクターの場合:
public Form1()
追加:
Init();
そして、どこでも:
private void Init(){try {notifyIcon1.Visible =false; port.Parity =Parity.None; port.StopBits =StopBits.One; port.DataBits =8; port.Handshake =Handshake.None; port.RtsEnable =true; string []ポート=SerialPort.GetPortNames(); foreach(ポート内の文字列ポート){comboBox1.Items.Add(port); } port.BaudRate =9600; } catch(Exception ex){MessageBox.Show(ex.Message); }}
シンプル...宣言された変数を初期化し、開いているポートをスキャンして、 comboBox1
に追加します
変数を保存および送信するための主要な関数:
private void Status(){foreach(var hardwadre in c.Hardware){if(hardwadre.HardwareType ==HardwareType.GpuNvidia){hardwadre.Update(); foreach(hardwadre.Sensorsのvarセンサー)if(sensor.SensorType ==SensorType.Temperature){value1 =Sensor.Value.GetValueOrDefault(); }} if(hardwadre.HardwareType ==HardwareType.CPU){hardwadre.Update(); foreach(hardwadre.Sensorsのvarセンサー)if(sensor.SensorType ==SensorType.Temperature){value2 =Sensor.Value.GetValueOrDefault(); }}} try {port.Write(value1 + "*" + value2 + "#"); } catch(Exception ex){timer1.Stop(); MessageBox.Show(ex.Message); toolStripStatusLabel1.Text ="Arduinoが応答していません..."; }
Status()
を追加することを忘れないでください ティックイベントをタイマーする機能。
次に接続ボタン:
try {if(!port.IsOpen){port.PortName =comboBox1.Text; port.Open(); timer1.Interval =Convert.ToInt32(comboBox2.Text); timer1.Enabled =true; toolStripStatusLabel1.Text ="データを送信しています..."; label2.Text ="接続済み"; }} catch(Exception ex){MessageBox.Show(ex.Message); }
comboBox2からタイマー間隔を設定していない場合は、ポートがすでに開いているかどうかを確認し、すべてを実行します。
切断ボタン:
try {port.Write( "DIS *"); port.Close(); } catch(Exception ex){MessageBox.Show(ex.Message); } label2.Text ="切断されました"; timer1.Enabled =false; toolStripStatusLabel1.Text ="Arduinoに接続..."; data ="";
Arduinoに最後のデータを書き込んで、完了したことを伝えます。
たとえば、のようないくつかの関数を追加できます。トレイなどに隠す(以下の完全なコード)
プログラムは管理者権限で実行する必要があります!
コード
- Arduinoコード
- C#アプリケーション
Arduinoコード Arduino
#include#include LiquidCrystal_I2C lcd(0x3F、16,2); String inData; void setup(){Serial.begin(9600); lcd.init(); lcd.backlight();} void loop(){while(Serial.available()> 0){char recieved =Serial.read(); inData + =受信済み; if(recieved =='*'){inData.remove(inData.length()-1、1); lcd.setCursor(0,0); lcd.print( "GPU Temp。:" + inData + char(223)+ "C"); inData =""; if(inData =="DIS"){lcd.clear(); lcd.setCursor(0,0); lcd.print( "切断されました!"); }} if(recieved =='#'){inData.remove(inData.length()-1、1); lcd.setCursor(0,1); lcd.print( "CPU Temp。:" + inData + char(223)+ "C"); inData =""; }}}
C#アプリケーション C#
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; usingSystem.Windows。 Forms; using System.IO.Ports; using OpenHardwareMonitor.Hardware; namespace Arduino_Controll {public partial class Form1:Form {static string data;コンピューターc =new Computer(){GPUEnabled =true、CPUEnabled =true}; float value1、value2;プライベートシリアルポートポート=新しいシリアルポート(); public Form1(){InitializeComponent();初期化(); } private void Init(){try {notifyIcon1.Visible =false; port.Parity =Parity.None; port.StopBits =StopBits.One; port.DataBits =8; port.Handshake =Handshake.None; port.RtsEnable =true; string []ポート=SerialPort.GetPortNames(); foreach(ポート内の文字列ポート){comboBox1.Items.Add(port); } port.BaudRate =9600; } catch(Exception ex){MessageBox.Show(ex.Message); }} private void button3_Click(object sender、EventArgs e){try {port.Write( "DIS *"); port.Close(); } catch(Exception ex){MessageBox.Show(ex.Message); } label2.Text ="切断されました"; timer1.Enabled =false; toolStripStatusLabel1.Text ="Arduinoに接続..."; data =""; } private void button5_Click(object sender、EventArgs e){try {if(!port.IsOpen){port.PortName =comboBox1.Text; port.Open(); timer1.Interval =Convert.ToInt32(comboBox2.Text); timer1.Enabled =true; toolStripStatusLabel1.Text ="データを送信しています..."; label2.Text ="接続済み"; }} catch(Exception ex){MessageBox.Show(ex.Message); }} private void timer1_Tick(object sender、EventArgs e){Status(); } private void Form1_Load(object sender、EventArgs e){c.Open(); } private void Form1_Resize(object sender、EventArgs e){if(FormWindowState.Minimized ==this.WindowState){notifyIcon1.Visible =true; {notifyIcon1.ShowBalloonTip(500、 "Arduino"、toolStripStatusLabel1.Text、ToolTipIcon.Info);を試してください。 } catch(Exception ex){} this.Hide(); }} private void notifyIcon1_DoubleClick(object sender、EventArgs e){this.Show(); this.WindowState =FormWindowState.Normal; notifyIcon1.Visible =false; } private void Status(){foreach(var hardwadre in c.Hardware){if(hardwadre.HardwareType ==HardwareType.GpuNvidia){hardwadre.Update(); foreach(hardwadre.Sensorsのvarセンサー)if(sensor.SensorType ==SensorType.Temperature){value1 =Sensor.Value.GetValueOrDefault(); }} if(hardwadre.HardwareType ==HardwareType.CPU){hardwadre.Update(); foreach(hardwadre.Sensorsのvarセンサー)if(sensor.SensorType ==SensorType.Temperature){value2 =Sensor.Value.GetValueOrDefault(); }}} try {port.Write(value1 + "*" + value2 + "#"); } catch(Exception ex){timer1.Stop(); MessageBox.Show(ex.Message); toolStripStatusLabel1.Text ="Arduinoが応答していません..."; }}}}
回路図
製造プロセス