Saya pernah bertemu posting dari ClusterM di mana dia membuat widget dalam bentuk indikator lama. Saya sangat menyukai ide ini karena ada perasaan vintage yang menyenangkan dalam proyek ini. Tapi ini nasib buruk - saya tidak pernah bekerja dengan mikrokontroler itu sendiri dan saya memprogram begitu-begitu, jadi saya menunda ide untuk waktu yang lama. Tetapi baru-baru ini, saya menemukan sebuah video di mana Alex memodifikasi program dengan bantuan teman-teman Open source dan mengembangkan algoritma untuk memproses data dari Arduino. Dalam artikel ini saya ingin menunjukkan bagaimana saya mengimplementasikan tugas ini.
Tahap I. Bagaimana saya menangani kode monitor boot

Setelah mengunduh program pemantauan, saya menghubungkan arduino dengan tampilan di mana kode dari perpustakaan contoh analogRead dijahit, itu hanya menampilkan semua yang diterima arduino di port com. Seperti yang dapat Anda lihat, saya mendapatkan berbagai karakter, pada awalnya saya mencoba memahami secara eksperimental, tetapi kemudian meludah Saya memutuskan untuk bertindak lebih profesional dan membuka menggunakan pembaca kode yang disediakan oleh kode sumber. Dengan bantuan, saya menemukan bagian yang mengirimkan semua data dalam sebuah array, menuliskannya di selembar kertas untuk kenyamanan saya, karena Alex tidak mengubah kode dengan timnya, saya hanya mengambil nilai prosesor, kartu video, dan nilai beban RAM, ini adalah nilai data PC [ 4], PCdata [5], PCdata [6]. Setelah itu, saya bisa terus bekerja hanya dengan Arduino.
Tahap II. Kami menangani parsing dan pemrosesan data
Sejujurnya, saya tidak akan mengatakan bahwa saya menemukan jawabannya, dengan gaya geek pemula, saya baru menyadari bahwa saya membutuhkan kode yang ditulis oleh Alex tanpa modifikasi, jadi saya menambahkannya ke kode saya. Parsing terlihat seperti ini:
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; } } }
Yang pasti, melalui perintah lcd.Write, saya secara bergantian menampilkan nilai-nilai PCdata [4] untuk memastikan bahwa saya menerima data yang saya butuhkan.
Selanjutnya, saya mulai menerjemahkan data persentase ke dalam sinyal PWM. Mengetahui bahwa sinyal yang kami kirim adalah nilai dari 0 hingga 255, dan kami menerima nilai dari 0 hingga 100 (ini adalah persentase muatan) menggunakan fungsi peta dan membatasi nilai menggunakan fungsi kendala, saya menulis kode sederhana:
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);
Tahap III. Bagaimana menghubungkan 3 indikator ke satu Arduino?
Ketika saya baru mulai, saya menghubungkan hanya satu indikator dan semuanya benar-benar baik-baik saja, tetapi segera setelah yang kedua muncul, masalah mulai. Arduino tidak bisa "mengayunkan" keduanya bersama-sama, saya curiga ini karena papan Arduino, ada banyak hal yang membuang waktu mengkonsumsi energi (semua jenis LED, stabilisator, perlindungan terhadap orang bodoh, dll.) jika Anda menggunakan Atmega sebagai ClusterM - itu sudah cukup, untuk dua orang tentunya. Saya memecahkan masalah dengan bantuan transistor MOSFET, saya memiliki IRF520 pada papan desainer dengan Aliexpress, menghubungkan satu indikator melalui MOSFET dan yang kedua langsung ke Arduino dan itu berhasil. Karena papan dengan Ali sangat besar, saya memutuskan untuk menyoldernya sendiri, saya tidak ingin mengangkat papan sama sekali, jadi saya menggambar spidol pada textolite dengan spidol.

Itu keluar dengan kompak, tetapi bagi saya itu adalah hal utama.
Diagram koneksi sama dengan papan dengan Ali, well, hampir, saya melepas LED karena indikasi operasi tidak diperlukan di sini.

Tahap IV. Desain latar belakang untuk indikator
Saya secara khusus menyimpan desain saya untuk publikasi, tetapi saya berhasil kehilangan sketsa terakhir, tetapi prototipe yang diperbesar tetap ada. Kemudian saya menyadari bahwa ini bukan masalah besar, karena akan perlu menyesuaikan dengan ukuran indikator Anda, saya melakukannya cat photoshop 2020, jadi saya yakin Anda bisa memodifikasinya juga.

Sepertinya saya itu ternyata sangat menarik, masih harus memotong tempat untuk sekrup dan panah - selesai!

Tahap V. Lampu latar RGB
Karena dalam proses saya menyadari bahwa saya tidak punya tempat untuk mendorong LED - pada akhirnya saya menolak, tapi saya melakukan kode awal, itu sangat sederhana - semua orang bisa menanganinya, cukup tambahkan semua warna untuk tiga indikator. Dirancang pada papan khayalan - berfungsi seperti jam:
void led() { if (PCdata[4] < 20 ) { digitalWrite (6, HIGH);//, rgb } else{ digitalWrite (6, LOW); } if (PCdata[4] > 20 && PCdata[4] < 60 );// , // { digitalWrite(5, HIGH);// - } // }
Ringkasan
Ternyata widget yang menarik, yang berguna saat bermain game, mengedit video dan foto, karena dimungkinkan untuk mengevaluasi apakah komputer kelebihan beban.
Saran - cobalah untuk tidak menjatuhkan indikator Anda, saya tidak sengaja jatuh dari RAM dan panah tidak kembali ke nol, sudah diperbaiki tapi itu kruk yang mengerikan.
Seluruh kode untuk 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; } } }
Program pemantauan ada di arsip Alex
Saya menggunakan versi lama, ini berfungsi dengan baik, jadi saya menyarankan Anda.
Saya ingin mengucapkan terima kasih kepada Alex dan timnya untuk menyelesaikan kode Open Source, serta pengguna ClusterM karena menunjukkan gadget mereka dan ayah saya karena membantu saya mendekripsi kode.