Монитор ПК Arduino
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Об этом проекте
Введение
Идея этого проекта родилась из потребности в развлечениях и знаниях. Этот проект прост в исполнении и имеет множество приложений. Мы можем использовать его, например, для управления, хранения и отображения некоторых аппаратных переменных.
Приступим
Прежде всего, нам нужно подключить наш ЖК-дисплей (я использовал конвертер I2C):
Когда мы это сделали, мы можем перейти к следующей части ...
Напишем код ...
Установите ЖК-дисплей 16x2 с адресом 0x3F - адрес устройства шины I2C можно найти при сканировании с помощью простого скетча, доступного на Arduino Playground.
#include #include LiquidCrystal_I2C lcd (0x3F, 16,2);
Теперь нам нужно объявить String
переменная для хранения нашего последовательного ввода и настройки остальных вещей.
Строка inData; пустая настройка () {lcd.init (); Serial.begin (9600); lcd.backlight (); }
Если мы хотим отправлять данные напрямую с помощью строковой переменной, это может быть проблематично из-за задержки примерно в одну секунду в зависимости от размера строки. Чтобы избежать этого, используйте char
переменную и добавьте ее в наш inData
.
полученный символ =Serial.read (); inData + =получено;
Ладно, все нормально а при приеме данные перестают приходить? Решение есть:
if (получено =='*') {...}
Когда последний символ будет * Arduino будет знать, когда перейти к следующей части. Теперь мы должны обработать наше сообщение. Нам нужно избавиться от этого *
символ так:
inData.remove (inData.length () - 1, 1);
И напоследок:
lcd.setCursor (0,0); lcd.print (inData); inData =""; // Очистить буфер
Но ... У нас вторая строка не используется ... Вот решение
if (получено =='#') {inData.remove (inData.length () - 1, 1); lcd.setCursor (0,1); lcd.print (inData); inData =""; }}
Когда последний символ будет #, Arduino установит вторую строку нашего ЖК-дисплея и распечатает другие данные.
Конфигурация
Почему C #, а не C или C ++? C # - это просто и быстро (быстро ... я имею в виду письменно)
Прежде всего, нам нужно загрузить дополнительную библиотеку для легкого доступа к нашим аппаратным переменным.
Открыть аппаратный монитор
После распаковки у нас есть наша библиотека:OpenHardwareMonitorLib.dll
Создайте новый проект -> Приложение Windows Forms -> Щелкните правой кнопкой мыши ссылку в обозревателе решений -> Обзор -> OpenHardwareMonitorLib.dll и не забудьте проверить его.
Внешний вид
Подготовьте нашу форму:
Теперь код ...
Некоторые директивы ...
с использованием System.IO.Ports; с использованием OpenHardwareMonitor.Hardware;
И декларации ...
порт SerialPort =новый SerialPort (); компьютер c =новый компьютер () {GPUEnabled =true, CPUEnabled =true}; значение с плавающей запятой1, значение2;
c
- это объект Open Hardware Monitor. Мы должны включить CPU и GPU. В событии загрузки формы укажите следующее:
c.Open ();
В конструкторе форм:
общедоступная форма Form1 ()
добавить:
Init ();
а затем в любом месте:
private void Init () {try {notifyIcon1.Visible =false; port.Parity =Parity.None; port.StopBits =StopBits.One; port.DataBits =8; port.Handshake =Рукопожатие.Нет; port.RtsEnable =true; строка [] ports =SerialPort.GetPortNames (); foreach (строка порта в портах) {comboBox1.Items.Add (порт); } port.BaudRate =9600; } catch (Exception ex) {MessageBox.Show (ex.Message); }}
Просто ... Инициализируйте объявленные переменные, просканируйте открытые порты и добавьте их в comboBox1
Теперь основная функция для хранения и отправки переменных:
private void Status () {foreach (var hardwadre в c.Hardware) {if (hardwadre.HardwareType ==HardwareType.GpuNvidia) {hardwadre.Update (); foreach (датчик var в hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) {value1 =sensor.Value.GetValueOrDefault (); }} если (hardwadre.HardwareType ==HardwareType.CPU) {hardwadre.Update (); foreach (датчик var в hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) {значение2 =sensor.Value.GetValueOrDefault (); }}} попробуйте {port.Write (value1 + "*" + value2 + "#"); } catch (Exception ex) {timer1.Stop (); MessageBox.Show (например, сообщение); toolStripStatusLabel1.Text ="Ардуино не отвечает ..."; }
Не забудьте добавить Status ()
функция таймера события тика.
Теперь кнопка подключения:
попробуйте {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, и запускаем все!
Кнопка отключения:
попробуйте {port.Write ("DIS *"); port.Close (); } catch (Exception ex) {MessageBox.Show (ex.Message); } label2.Text ="Отключено"; timer1.Enabled =false; toolStripStatusLabel1.Text ="Подключиться к Arduino ..."; данные ="";
Запишите последние данные в 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 получено =Serial.read (); inData + =получено; если (получено =='*') {inData.remove (inData.length () - 1, 1); lcd.setCursor (0,0); lcd.print ("GPU Temp .:" + inData + char (223) + "C"); inData =""; если (inData =="DIS") {lcd.clear (); lcd.setCursor (0,0); lcd.print («Отключен!»); }} если (получено =='#') {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; using System.Windows. Forms; использование System.IO.Ports; использование OpenHardwareMonitor.Hardware; пространство имен Arduino_Controll {общедоступный частичный класс Form1:Form {статические строковые данные; Компьютер c =новый компьютер () {GPUEnabled =true, CPUEnabled =true}; значение с плавающей запятой1, значение2; частный порт SerialPort =новый SerialPort (); общедоступная Form1 () {InitializeComponent (); В этом(); } private void Init () {попробуйте {notifyIcon1.Visible =false; port.Parity =Parity.None; port.StopBits =StopBits.One; port.DataBits =8; port.Handshake =Рукопожатие.Нет; port.RtsEnable =true; строка [] ports =SerialPort.GetPortNames (); foreach (строка порта в портах) {comboBox1.Items.Add (порт); } port.BaudRate =9600; } catch (Exception ex) {MessageBox.Show (ex.Message); }} private void button3_Click (отправитель объекта, EventArgs e) {попробуйте {port.Write ("DIS *"); port.Close (); } catch (Exception ex) {MessageBox.Show (ex.Message); } label2.Text ="Отключено"; timer1.Enabled =false; toolStripStatusLabel1.Text ="Подключиться к Arduino ..."; данные =""; } private void button5_Click (отправитель объекта, EventArgs e) {попробуйте {если (! 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); }} приватный void timer1_Tick (отправитель объекта, EventArgs e) {Status (); } private void Form1_Load (отправитель объекта, EventArgs e) {c.Open (); } private void Form1_Resize (отправитель объекта, 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 (отправитель объекта, EventArgs e) {this.Show (); this.WindowState =FormWindowState.Normal; notifyIcon1.Visible =false; } частный статус void () {foreach (var hardwadre в c.Hardware) {if (hardwadre.HardwareType ==HardwareType.GpuNvidia) {hardwadre.Update (); foreach (датчик var в hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) {value1 =sensor.Value.GetValueOrDefault (); }} если (hardwadre.HardwareType ==HardwareType.CPU) {hardwadre.Update (); foreach (датчик var в hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) {значение2 =sensor.Value.GetValueOrDefault (); }}} попробуйте {port.Write (value1 + "*" + value2 + "#"); } catch (Exception ex) {timer1.Stop (); MessageBox.Show (например, сообщение); toolStripStatusLabel1.Text ="Arduino не отвечает ..."; }}}}
Схема
Производственный процесс
- ЖК-панель с Arduino для симулятора полета
- Создание монитора Ambilight с помощью Arduino
- ЖК-анимация и игры
- Монитор сердечного ритма с использованием Интернета вещей
- Монитор напряжения термопары водонагревателя
- Отображение изображения на ЖК-экране TFT с помощью Arduino UNO!
- Осциллограф 10 Гц-50 кГц для самостоятельного изготовления на ЖК-дисплее 128x64
- Монитор сердечного ритма MAX 30102 на ЖК-дисплее 16x2
- Домашний монитор
- Простой будильник с DS1302 RTC