Tentang proyek ini
Pendahuluan
Ide untuk proyek ini sebenarnya lahir dari kebutuhan akan kesenangan dan pengetahuan. Proyek ini mudah dibuat dan memiliki banyak aplikasi. Kita dapat menggunakannya, misalnya, untuk mengontrol, menyimpan, dan menampilkan beberapa variabel perangkat keras.
Mari kita mulai
Pertama-tama, kita perlu menghubungkan LCD kita (saya menggunakan konverter I2C) :
Ketika kita melakukan ini, kita bisa pindah ke bagian selanjutnya...
Mari kita menulis beberapa kode...
Atur LCD 16x2 dengan alamat 0x3F - alamat perangkat bus I2C dapat ditemukan dari pemindaian melalui sketsa sederhana yang tersedia di Arduino Playground.
#include #include LiquidCrystal_I2C lcd(0x3F,16,2);
Sekarang kita harus mendeklarasikan String
variabel untuk menyimpan input Serial kami dan mengatur sisa barang.
String inData; void pengaturan() { lcd.init(); Serial.begin(9600); lcd.lampu latar(); }
Jika kami ingin mengirim data secara langsung dengan variabel string, ini bisa menjadi masalah, karena latensi sekitar satu detik berdasarkan ukuran string. Untuk menghindari ini gunakan char
variabel dan menambahkannya ke inData
. kami .
char diterima =Serial.read(); inData +=diterima;
Oke, semuanya baik-baik saja tetapi ketika menerima data berhenti datang? Ada solusinya:
if (diterima =='*') { ... }
Ketika char terakhir adalah * Arduino akan tahu kapan harus melanjutkan bagian selanjutnya, Sekarang kita harus menangani pesan kita. Kita harus menyingkirkan *
. ini begitulah:
inData.remove(inData.length() - 1, 1);
Dan akhirnya:
lcd.setCursor(0,0); lcd.print(dalamData); inData =""; // Hapus buffer
Tapi... Kami memiliki baris kedua yang tidak terpakai... Inilah solusinya
if (diterima =='#') { inData.remove(inData.length() - 1, 1); lcd.setCursor(0,1); lcd.print(dalamData); inData =""; } }
Ketika char terakhir akan # Arduino akan mengatur baris kedua LCD kami dan mencetak data lainnya.
Konfigurasi
Mengapa C#, bukan C atau C++ ? C# mudah dan cepat (cepat... maksud saya secara tertulis)
Pertama-tama, kita perlu mengunduh pustaka tambahan untuk memudahkan akses ke variabel perangkat keras kita.
Buka Monitor Perangkat Keras
Setelah membongkar, kami memiliki perpustakaan kami:OpenHardwareMonitorLib.dll
Buat proyek baru -> Aplikasi Windows Forms -> Klik kanan pada Referensi di Solution Explorer -> Browse -> OpenHardwareMonitorLib.dll dan jangan lupa untuk memeriksanya.
Penampilan
Siapkan formulir kami:
Sekarang kode...
Beberapa arahan...
menggunakan System.IO.Ports; menggunakan OpenHardwareMonitor.Hardware;
Dan deklarasi...
Port SerialPort =SerialPort baru();Komputer c =Komputer baru() { GPUEnabled =true, CPUEnabled =true }; nilai mengambang1, nilai2;
c
adalah objek Open Hardware Monitor. Kita harus mengaktifkan CPU dan GPU. Dalam acara Pemuatan Formulir, masukkan ini:
c.Buka();
Dalam bentuk konstruktor:
Form1 publik()
tambahkan:
Init();
lalu, di mana saja:
private void Init() { coba { notifyIcon1.Visible =false; port.Parity =Parity.None; port.StopBits =StopBits.One; port.DataBits =8; port.Jabat Tangan =Jabat Tangan.Tidak Ada; port.RtsEnable =benar; string[] port =SerialPort.GetPortNames(); foreach (port string di port) { comboBox1.Items.Add(port); } port.BaudRate =9600; } catch (Ex. Pengecualian) { MessageBox.Show(ex.Message); } }
Sederhana... Inisialisasi variabel yang dideklarasikan, pindai port yang terbuka dan tambahkan ke comboBox1
Sekarang fungsi utama untuk menyimpan dan mengirim variabel:
private void Status() { foreach (var hardwadre di c.Hardware) { if (hardwadre.HardwareType ==HardwareType.GpuNvidia) { hardwadre.Update(); foreach (sensor var di hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) { value1 =sensor.Value.GetValueOrDefault(); } } if (hardwadre.HardwareType ==HardwareType.CPU) { hardwadre.Update(); foreach (sensor var di hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) { value2 =sensor.Value.GetValueOrDefault(); } } } coba { port.Write(nilai1 + "*" + nilai2 + "#"); }catch(Pengecualian ex) { timer1.Stop(); MessageBox.Show(mis.Pesan); toolStripStatusLabel1.Text ="Arduino tidak merespons..."; }
Jangan lupa tambahkan Status()
berfungsi untuk mengatur waktu acara centang.
Sekarang tombol sambungkan:
coba { if (!port.IsOpen) { port.PortName =comboBox1.Text; port.Buka(); timer1.Interval =Convert.ToInt32(comboBox2.Text); timer1.Enabled =benar; toolStripStatusLabel1.Text ="Mengirim data..."; label2.Teks ="Tersambung"; } } catch (Pengecualian ex) { MessageBox.Show(ex.Message); }
Kami sedang memeriksa apakah port sudah terbuka, jika tidak mengatur interval timer dari comboBox2 dan menjalankan semuanya!
Tombol putuskan sambungan:
coba { port.Write("DIS*"); port.Tutup(); } catch (Ex. Pengecualian) { MessageBox.Show(ex.Message); } label2.Text ="Terputus"; timer1.Enabled =salah; toolStripStatusLabel1.Text ="Hubungkan ke Arduino..."; datanya ="";
Tulis data terakhir ke Arduino untuk mengatakan bahwa kita sudah selesai.
Anda dapat menambahkan beberapa fungsi seperti for mis. sembunyikan ke baki dll. (Kode lengkap di bawah)
Program harus dijalankan dengan hak administrator!
Kode
Kode ArduinoArduino
#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 diterima =Serial.read(); inData +=diterima; if (diterima =='*') { inData.remove(inData.length() - 1, 1); lcd.setCursor(0,0); lcd.print("Suhu GPU:" + inData + char(223)+"C "); inData =""; if(inData =="DIS") { lcd.clear(); lcd.setCursor(0,0); lcd.print("Terputus!"); } } if (diterima =='#') { inData.remove(inData.length() - 1, 1); lcd.setCursor(0,1); lcd.print("Suhu CPU:" + inData + char(223)+"C "); inData =""; } }}
Aplikasi C#C#
menggunakan Sistem;menggunakan System.Collections.Generic;menggunakan System.ComponentModel;menggunakan System.Data;menggunakan System.Drawing;menggunakan System.Linq;menggunakan System.Text;menggunakan System.Threading.Tasks;menggunakan System.Windows. Formulir;menggunakan System.IO.Ports;menggunakan OpenHardwareMonitor.Hardware;namespace Arduino_Controll{ public partial class Form1 :Form { static string data; Komputer c =Komputer baru() { GPUEnabled =true, CPUEnabled =true }; nilai mengambang1, nilai2; port SerialPort pribadi =SerialPort baru(); publik Form1() { Inisialisasi Komponen(); init(); } private void Init() { try { notifyIcon1.Visible =false; port.Parity =Parity.None; port.StopBits =StopBits.One; port.DataBits =8; port.Jabat Tangan =Jabat Tangan.Tidak Ada; port.RtsEnable =benar; string[] port =SerialPort.GetPortNames(); foreach (port string di port) { comboBox1.Items.Add(port); } port.BaudRate =9600; } catch (Ex. Pengecualian) { MessageBox.Show(ex.Message); } } private void button3_Click(pengirim objek, EventArgs e) { coba { port.Write("DIS*"); port.Tutup(); } catch (Ex. Pengecualian) { MessageBox.Show(ex.Message); } label2.Text ="Terputus"; timer1.Enabled =salah; toolStripStatusLabel1.Text ="Hubungkan ke Arduino..."; datanya =""; } private void button5_Click(pengirim objek, EventArgs e) { coba { if (!port.IsOpen) { port.PortName =comboBox1.Text; port.Buka(); timer1.Interval =Convert.ToInt32(comboBox2.Text); timer1.Enabled =benar; toolStripStatusLabel1.Text ="Mengirim data..."; label2.Teks ="Tersambung"; } } catch (Pengecualian ex) { MessageBox.Show(ex.Message); } } private void timer1_Tick(pengirim objek, EventArgs e) { Status(); } private void Form1_Load(pengirim objek, EventArgs e) { c.Open(); } private void Form1_Resize(pengirim objek, EventArgs e) { if (FormWindowState.Minimized ==this.WindowState) { notifyIcon1.Visible =true; coba { notifyIcon1.ShowBalloonTip(500, "Arduino", toolStripStatusLabel1.Text, ToolTipIcon.Info); }catch(Pengecualian ex) { } this.Hide(); } } private void notifyIcon1_DoubleClick(pengirim objek, EventArgs e) { this.Show(); this.WindowState =FormWindowState.Normal; notifyIcon1.Visible =salah; } private void Status() { foreach (var hardwadre di c.Hardware) { if (hardwadre.HardwareType ==HardwareType.GpuNvidia) { hardwadre.Update(); foreach (sensor var di hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) { value1 =sensor.Value.GetValueOrDefault(); } } if (hardwadre.HardwareType ==HardwareType.CPU) { hardwadre.Update(); foreach (sensor var di hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) { value2 =sensor.Value.GetValueOrDefault(); } } } coba { port.Write(nilai1 + "*" + nilai2 + "#"); }catch(Pengecualian ex) { timer1.Stop(); MessageBox.Show(mis.Pesan); toolStripStatusLabel1.Text ="Arduino tidak merespons..."; } } }} Skema