Monitor de PC Arduino
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Acerca de este proyecto
Introducción
La idea de este proyecto nació en realidad de la necesidad de diversión y conocimiento. Este proyecto es fácil de realizar y tiene muchas aplicaciones. Podemos utilizarlo, por ejemplo, para controlar, almacenar y visualizar algunas variables de hardware.
Empecemos
En primer lugar, debemos conectar nuestra pantalla LCD (estaba usando un convertidor I2C):
Cuando hicimos esto, podemos pasar a la siguiente parte ...
Escribamos un código ...
Establecer LCD 16x2 con dirección 0x3F:la dirección del dispositivo de bus I2C se puede encontrar escaneando a través de un boceto simple disponible en Arduino Playground.
#include #include LiquidCrystal_I2C lcd (0x3F, 16,2);
Ahora tenemos que declarar un String
variable para almacenar nuestra entrada serial y configurar el resto de cosas.
String inData; configuración vacía () {lcd.init (); Serial.begin (9600); LCD luz de fondo(); }
Si quisiéramos enviar datos directamente mediante una variable de cadena, podría ser problemático, debido a una latencia de aproximadamente un segundo basada en el tamaño de la cadena. Para evitar esto, use char
variable y agregarla a nuestro inData
.
char recibido =Serial.read (); inData + =recibido;
Ok, todo está bien, pero ¿cuándo dejar de recibir datos? Hay solución:
if (recibido =='*') {...}
Cuando el último de los caracteres sea * Arduino sabrá cuándo proceder con la siguiente parte, ahora tenemos que manejar nuestro mensaje. Necesitamos deshacernos de este *
char así:
inData.remove (inData.length () - 1, 1);
Y finalmente:
lcd.setCursor (0,0); lcd.print (inData); inData =""; // Limpiar búfer
Pero ... Tenemos la segunda línea sin usar ... Aquí está la solución
if (recibido =='#') {inData.remove (inData.length () - 1, 1); lcd.setCursor (0,1); lcd.print (inData); inData =""; }}
Cuando el último de los caracteres sea # Arduino establecerá la segunda línea de nuestra pantalla LCD e imprimirá otros datos.
Configuración
¿Por qué C #, no C o C ++? C # es fácil y rápido (rápido ... quiero decir por escrito)
En primer lugar, necesitamos descargar una biblioteca adicional para acceder fácilmente a nuestras variables de hardware.
Monitor de hardware abierto
Después de desempaquetar, tenemos nuestra biblioteca:OpenHardwareMonitorLib.dll
Cree un nuevo proyecto -> Aplicación Windows Forms -> Haga clic con el botón derecho en Referencias en el Explorador de soluciones -> Examinar -> OpenHardwareMonitorLib.dll y no olvide marcarlo.
Apariencia
Prepara nuestro formulario:
Ahora codifique ...
Algunas directivas ...
usando System.IO.Ports; utilizando OpenHardwareMonitor.Hardware;
Y declaraciones ...
SerialPort port =new SerialPort (); Computadora c =new Computer () {GPUEnabled =true, CPUEnabled =true}; valor flotante1, valor2;
c
es el objeto Open Hardware Monitor. Tenemos que habilitar CPU y GPU. En el evento Form Load ponga esto:
c.Open ();
En el constructor de formularios:
public Form1 ()
añadir:
Init ();
y luego, en cualquier lugar:
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 (puerto de cadena en puertos) {comboBox1.Items.Add (puerto); } port.BaudRate =9600; } catch (Exception ex) {MessageBox.Show (ex.Message); }}
Simple ... Inicialice las variables declaradas, busque puertos abiertos y agréguelo al comboBox1
Ahora función principal para almacenar y enviar variables:
estado vacío privado () {foreach (var hardwadre en c.Hardware) {if (hardwadre.HardwareType ==HardwareType.GpuNvidia) {hardwadre.Update (); foreach (var sensor en hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) {value1 =sensor.Value.GetValueOrDefault (); }} if (hardwadre.HardwareType ==HardwareType.CPU) {hardwadre.Update (); foreach (var sensor en hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) {value2 =sensor.Value.GetValueOrDefault (); }}} prueba {puerto.Escribir (valor1 + "*" + valor2 + "#"); } catch (Exception ex) {timer1.Stop (); MessageBox.Show (por ejemplo, mensaje); toolStripStatusLabel1.Text ="Arduino no responde ..."; }
No olvide agregar Status ()
función para marcar el evento del temporizador.
Ahora botón de conexión:
try {if (! port.IsOpen) {port.PortName =comboBox1.Text; puerto.Open (); timer1.Interval =Convert.ToInt32 (comboBox2.Text); timer1.Enabled =true; toolStripStatusLabel1.Text ="Enviando datos ..."; label2.Text ="Conectado"; }} catch (Exception ex) {MessageBox.Show (ex.Message); }
¡Estamos verificando si un puerto ya está abierto, si no configuramos el intervalo del temporizador desde comboBox2 y ejecutamos todo!
Botón de desconexión:
try {port.Write ("DIS *"); port.Close (); } catch (Exception ex) {MessageBox.Show (ex.Message); } label2.Text ="Desconectado"; timer1.Enabled =falso; toolStripStatusLabel1.Text ="Conectarse a Arduino ..."; datos ="";
Escribe los últimos datos en Arduino para decir que hemos terminado.
Puede agregar algunas funciones como, por ejemplo, ocultar en la bandeja, etc. (código completo a continuación)
¡El programa debe ejecutarse con privilegios de administrador!
Código
- Código Arduino
- Aplicación C #
Código Arduino Arduino
#include#include LiquidCrystal_I2C lcd (0x3F, 16,2); String inData; void setup () {Serial.begin (9600); lcd.init (); lcd.backlight ();} bucle vacío () {while (Serial.available ()> 0) {char recibido =Serial.read (); inData + =recibido; if (recibido =='*') {inData.remove (inData.length () - 1, 1); lcd.setCursor (0,0); lcd.print ("Temp. GPU:" + inData + char (223) + "C"); inData =""; if (inData =="DIS") {lcd.clear (); lcd.setCursor (0,0); lcd.print ("¡Desconectado!"); }} if (recibido =='#') {inData.remove (inData.length () - 1, 1); lcd.setCursor (0,1); lcd.print ("CPU Temp .:" + inData + char (223) + "C"); inData =""; }}}
Aplicación C # C #
usando System; usando System.Collections.Generic; usando System.ComponentModel; usando System.Data; usando System.Drawing; usando System.Linq; usando System.Text; usando System.Threading.Tasks; usando System.Windows. Formularios, uso de System.IO.Ports, uso de OpenHardwareMonitor.Hardware, espacio de nombres Arduino_Controll {clase pública parcial Form1:Form {datos de cadena estática; Computadora c =nueva Computadora () {GPUEnabled =true, CPUEnabled =true}; valor flotante1, valor2; puerto SerialPort privado =nuevo SerialPort (); Public Form1 () {InitializeComponent (); En eso(); } private void Init () {prueba {notificarIcon1.Visible =falso; port.Parity =Parity.None; port.StopBits =StopBits.One; port.DataBits =8; port.Handshake =Handshake.None; port.RtsEnable =true; string [] ports =SerialPort.GetPortNames (); foreach (puerto de cadena en puertos) {comboBox1.Items.Add (puerto); } port.BaudRate =9600; } catch (Exception ex) {MessageBox.Show (ex.Message); }} private void button3_Click (remitente del objeto, EventArgs e) {try {port.Write ("DIS *"); port.Close (); } catch (Exception ex) {MessageBox.Show (ex.Message); } label2.Text ="Desconectado"; timer1.Enabled =falso; toolStripStatusLabel1.Text ="Conectarse a Arduino ..."; datos =""; } private void button5_Click (remitente del objeto, EventArgs e) {try {if (! port.IsOpen) {port.PortName =comboBox1.Text; puerto.Open (); timer1.Interval =Convert.ToInt32 (comboBox2.Text); timer1.Enabled =true; toolStripStatusLabel1.Text ="Enviando datos ..."; label2.Text ="Conectado"; }} catch (Exception ex) {MessageBox.Show (ex.Message); }} private void timer1_Tick (remitente del objeto, EventArgs e) {Status (); } Form1_Load vacío privado (remitente del objeto, EventArgs e) {c.Open (); } Form1_Resize vacío privado (remitente del objeto, EventArgs e) {if (FormWindowState.Minimized ==this.WindowState) {notifyIcon1.Visible =true; intente {notificarIcon1.ShowBalloonTip (500, "Arduino", toolStripStatusLabel1.Text, ToolTipIcon.Info); } catch (Exception ex) {} this.Hide (); }} private void notifyIcon1_DoubleClick (remitente del objeto, EventArgs e) {this.Show (); this.WindowState =FormWindowState.Normal; notificarIcon1.Visible =falso; } Estado vacío privado () {foreach (var hardwadre en c.Hardware) {if (hardwadre.HardwareType ==HardwareType.GpuNvidia) {hardwadre.Update (); foreach (var sensor en hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) {value1 =sensor.Value.GetValueOrDefault (); }} if (hardwadre.HardwareType ==HardwareType.CPU) {hardwadre.Update (); foreach (var sensor en hardwadre.Sensors) if (sensor.SensorType ==SensorType.Temperature) {value2 =sensor.Value.GetValueOrDefault (); }}} prueba {puerto.Escribir (valor1 + "*" + valor2 + "#"); } catch (Exception ex) {timer1.Stop (); MessageBox.Show (por ejemplo, mensaje); toolStripStatusLabel1.Text ="Arduino no responde ..."; }}}}
Esquemas
Proceso de manufactura
- Panel LCD con Arduino para Flight Simulator
- Hacer Monitor Ambilight usando Arduino
- Animación LCD y juegos
- Monitor de frecuencia cardíaca con IoT
- Monitor de voltaje del termopar del calentador de agua caliente
- ¡Visualización de una imagen en una pantalla LCD TFT con Arduino UNO!
- Osciloscopio DIY de 10Hz-50kHz en pantalla LCD de 128x64
- Monitor de frecuencia cardíaca MAX 30102 en LCD 16x2
- Monitor de casa
- Estación meteorológica Arduino
- Reloj despertador simple con DS1302 RTC