这个项目的想法实际上是出于对乐趣和知识的需要。这个项目很容易制作并且有很多应用。例如,我们可以使用它来控制、存储和显示一些硬件变量。
首先,我们需要连接我们的 LCD(我使用的是 I2C 转换器):
当我们这样做时,我们可以进入下一部分......
使用地址 0x3F 设置 16x2 LCD - I2C 总线设备的地址可以通过 Arduino Playground 上可用的简单草图扫描找到。
#include
#include
LiquidCrystal_I2C lcd(0x3F,16,2);
现在我们必须声明一个String
变量来存储我们的串行输入并设置其余的东西。
String inData;
void setup()
{
lcd.init();
Serial.begin(9600);
lcd.backlight();
}
如果我们想通过字符串变量直接发送数据,这可能会出现问题,因为基于字符串大小的延迟大约为一秒。为了避免这个使用char
变量并将其添加到我们的inData
.
char recieved = Serial.read();
inData += recieved;
好的,一切都很好,但是当接收数据停止时?有解决办法:
if (recieved == '*')
{ ... }
char 的最后一个何时为 * Arduino 将知道何时继续下一部分,现在我们必须处理我们的消息。我们需要摆脱这个*
字符,所以:
inData.remove(inData.length() - 1, 1);
最后:
lcd.setCursor(0,0);
lcd.print(inData);
inData = ""; // Clear buffer
但是......我们有第二行未使用......这是解决方案
if (recieved == '#')
{
inData.remove(inData.length() - 1, 1);
lcd.setCursor(0,1);
lcd.print(inData);
inData = "";
}
}
当最后一个字符为 # 时,Arduino 将设置我们 LCD 的第二行并打印其他数据。
为什么是 C#,而不是 C 或 C++?C# 简单快速(快速......我的意思是写作)
首先,我们需要下载额外的库以便于访问我们的硬件变量。
解压后,我们有我们的库:OpenHardwareMonitorLib.dll
创建新项目 -> Windows 窗体应用程序 -> 右键单击解决方案资源管理器中的引用 -> 浏览 -> OpenHardwareMonitorLib.dll 并且不要忘记检查它。
准备我们的表格:
一些指令...
using System.IO.Ports;
using OpenHardwareMonitor.Hardware;
和声明...
SerialPort port = new SerialPort();
Computer c = new Computer()
{
GPUEnabled = true,
CPUEnabled = true
};
float value1, value2;
c
是打开硬件监视器对象。我们必须启用 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[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
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 (var sensor in hardwadre.Sensors)
if (sensor.SensorType == SensorType.Temperature)
{
value1 = sensor.Value.GetValueOrDefault();
}
}
if (hardwadre.HardwareType == HardwareType.CPU)
{
hardwadre.Update();
foreach (var sensor in hardwadre.Sensors)
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's not responding...";
}
不要忘记为Status()
计时器滴答事件添加功能。
现在连接按钮:
try
{
if (!port.IsOpen)
{
port.PortName = comboBox1.Text;
port.Open();
timer1.Interval = Convert.ToInt32(comboBox2.Text);
timer1.Enabled = true;
toolStripStatusLabel1.Text = "Sending data...";
label2.Text = "Connected";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
我们正在检查端口是否已经打开,如果没有从 comboBox2 设置计时器间隔并运行所有内容!
断开按钮:
try
{
port.Write("DIS*");
port.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
label2.Text = "Disconnected";
timer1.Enabled = false;
toolStripStatusLabel1.Text = "Connect to Arduino...";
data = "";
将最后一个数据写入 Arduino,表示我们完成了。
您可以添加一些功能,例如隐藏到托盘等。(下面的完整代码)
程序必须以管理员权限运行!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !