elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Hacer funcionar simulador lavadora
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Hacer funcionar simulador lavadora  (Leído 717 veces)
Meta


Desconectado Desconectado

Mensajes: 3.279



Ver Perfil WWW
Hacer funcionar simulador lavadora
« en: 6 Marzo 2021, 17:39 pm »



Ver imagen.

Este proyecto ya es un reto para muchos, jajajja, aún así se puede intentar.

Aquí tengo un simulador de lavadora, puedes controlar el giro del tambor o motor, velocidad, nivel de agua. Es totalmente funcional.

Hay en este caso aunque si funciona, quiero ignorarlo para el próximo programa, Giro del motor.

La mejora o el próximo programa funciona desde el puerto serie sin usar ningún trackBar.

trackBar_Velocidad_motor funciona los valores como máximo a 100 y mínimo a 0.

trackBar_Nivel_de_agua funciona los valores como máximo a 90 y mínimo a -90.

Los sustitutos del trackBar son datos que llegan desde el puerto serie, algo así como esto, por ejemplo:

Código
  1. 50, 80

El ejemplo de arriba indica el número 50, que varía de 0 a 100, la velocidad. El 80 es el caso del 90 a -90 del nivel de agua.

Esos datos si quiero que esté. Puede recibir datos a 9600 baudios y por cada 1000 milisegundos, o lo que es lo mismo, a cada segundo.

El código completo de este programa con trackBar es este.
Código
  1. /*
  2.  Te explico la formula
  3.  
  4. float fDeltaAngulo = (((nRPM * 360) / (60 * 1000)) * timer.Interval) * ((float)trackBar_Velocidad_motor.Value / (float)trackBar_Velocidad_motor.Maximun)
  5.  
  6.    1. (nRPM * 360) -> Grados por minuto.
  7.    2. (60 * 1000) -> Milisegundos por minuto.
  8.    3. ((nRPM * 360) / (60 * 1000)) -> Grados por milisegundo.
  9.    4. (((nRPM * 360) / (60 * 1000)) * timer.Interval) -> Grados por tick del timer.
  10.    5.  ((float)trackBar_Velocidad_motor.Value / (float)trackBar_Velocidad_motor.Maximun) -> Porcentaje de la velocidad.
  11.    6. (((nRPM * 360) / (60 * 1000)) * timer.Interval) * ((float)trackBar_Velocidad_motor.Value / (float)trackBar_Velocidad_motor.Maximun) -> Calcula los grados por tick del timer aplicando un porcentaje.
  12.  
  13. Según esta formula, si el trackbar esta en 0, grados por tick * 0 = 0 (esta parado), si el trackbar esta al maximo, grados por tick * 1 = grados por tick (el angulo aumenta al máximo).
  14.  */
  15.  
  16. using System;
  17. using System.Collections.Generic;
  18. using System.ComponentModel;
  19. using System.Data;
  20. using System.Drawing;
  21. using System.Drawing.Drawing2D;
  22. using System.Linq;
  23. using System.Text;
  24. using System.Threading.Tasks;
  25. using System.Windows.Forms;
  26.  
  27. namespace Lavadora_05
  28. {
  29.    public partial class Form1 : Form
  30.    {
  31.        // Variables.
  32.        private Pen lápiz2;
  33.        private Pen lápiz3;
  34.        private Pen lápiz4;
  35.        private float angulo;
  36.        private SolidBrush agua;
  37.  
  38.        private GraphicsPath m_lavadora;
  39.        private GraphicsPath m_agua;
  40.  
  41.        public Form1()
  42.        {
  43.            InitializeComponent();
  44.        }
  45.  
  46.        private void Form1_Load(object sender, EventArgs e)
  47.        {
  48.            Text = "Simulador lavadora";
  49.            pictureBox1.Size = new Size(300, 300);
  50.            pictureBox1.BackColor = Color.LightGray;
  51.  
  52.            lápiz2 = new Pen(Color.DarkGray, 10);
  53.            lápiz2.StartCap = LineCap.ArrowAnchor;
  54.            lápiz2.EndCap = LineCap.RoundAnchor;
  55.  
  56.            lápiz3 = new Pen(Color.Black, 5);
  57.            lápiz4 = new Pen(Color.Gray, 10);
  58.  
  59.            angulo = 0;
  60.  
  61.            agua = new SolidBrush(Color.FromArgb(200, 0, 155, 219)); // Transparencia del agua 200.
  62.            trackBar_Nivel_de_agua.Value = -90; // Para que empiece sin agua.
  63.        }
  64.  
  65.        // Dibuja y colorea.
  66.        private void pictureBox1_Paint(object sender, PaintEventArgs e)
  67.        {
  68.            e.Graphics.DrawRectangle(lápiz3, 10, 10, pictureBox1.ClientSize.Width - 20, pictureBox1.ClientSize.Height - 20);
  69.            e.Graphics.DrawEllipse(lápiz4, 10, 10, pictureBox1.ClientSize.Height - 20, pictureBox1.ClientSize.Height - 20);
  70.  
  71.            e.Graphics.TranslateTransform(pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
  72.            e.Graphics.RotateTransform(angulo);
  73.            e.Graphics.TranslateTransform(-pictureBox1.ClientSize.Width / 2, -pictureBox1.ClientSize.Height / 2);
  74.            //e.Graphics.DrawLine(lápiz2, 20, pictureBox1.ClientSize.Height / 2, pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
  75.            e.Graphics.DrawPath(lápiz2, m_lavadora);
  76.            e.Graphics.ResetTransform();
  77.            e.Graphics.FillPath(agua, m_agua);
  78.        }
  79.  
  80.        // Refresca el valor actual.
  81.        private void trackBar_Giro_del_motor_ValueChanged(object sender, EventArgs e)
  82.        {
  83.            angulo = (float)trackBar_Giro_del_motor.Value;
  84.            pictureBox1.Refresh();
  85.        }
  86.  
  87.        // Cambia el tamaño del control.
  88.        private void pictureBox1_Resize(object sender, EventArgs e)
  89.        {
  90.            int ancho = pictureBox1.ClientSize.Width;
  91.            int alto = pictureBox1.ClientSize.Height;
  92.  
  93.            m_lavadora = new GraphicsPath();
  94.  
  95.            m_lavadora.AddEllipse(20, 20, ancho - 40, alto - 40);
  96.            m_lavadora.CloseFigure();
  97.            m_lavadora.AddLine(20, (alto / 2), ancho - 20, (alto / 2));
  98.            m_lavadora.CloseFigure();
  99.            m_lavadora.AddLine(ancho / 2, 20, ancho / 2, alto - 20);
  100.            m_lavadora.CloseFigure();
  101.  
  102.            m_agua = new GraphicsPath();
  103.  
  104.            m_agua.AddArc(20, 20, ancho - 40, alto - 40, trackBar_Nivel_de_agua.Value, 180 - 2 * trackBar_Nivel_de_agua.Value);
  105.            m_agua.CloseFigure();
  106.        }
  107.  
  108.        private void trackBar_Nivel_de_agua_ValueChanged(object sender, EventArgs e)
  109.        {
  110.            m_agua = new GraphicsPath();
  111.  
  112.            m_agua.AddArc(20, 20, pictureBox1.ClientSize.Width - 40, pictureBox1.ClientSize.Height - 40, -trackBar_Nivel_de_agua.Value, 180 - 2 * -trackBar_Nivel_de_agua.Value);
  113.            m_agua.CloseFigure();
  114.            pictureBox1.Refresh();
  115.        }
  116.  
  117.        private void timer1_Tick(object sender, EventArgs e)
  118.        {
  119.            //60 vueltas por minuto
  120.            float nRPM = 60;
  121.  
  122.            float fDeltaAngulo = (((nRPM * 360) / (60 * 1000)) * (float)timer1.Interval) * ((float)trackBar_Velocidad_motor.Value / (float)trackBar_Velocidad_motor.Maximum);
  123.            float track = (float)trackBar_Velocidad_motor.Value;
  124.            angulo += fDeltaAngulo;
  125.            label_angulo.Text = "angulo " + angulo.ToString();
  126.            label_fDeltaAngulo.Text = "fDeltaAngulo " + fDeltaAngulo.ToString();
  127.            pictureBox1.Refresh();
  128.  
  129.        }
  130.  
  131.        private void button_Empezar_Click(object sender, EventArgs e)
  132.        {
  133.            timer1.Start();
  134.            //timer1.Enabled = true; // También válido.
  135.        }
  136.  
  137.        private void button_parar_Click(object sender, EventArgs e)
  138.        {
  139.            timer1.Stop();
  140.            //timer1.Enabled = false; // También válido.
  141.        }
  142.    }
  143. }

El código que he intentado es este pero no funciona ni una parte y está incompleto.

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Drawing.Drawing2D;
  7. using System.IO.Ports;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12.  
  13. namespace Lavadora_07
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        // Utilizaremos un string-builder como búfer auxiliar.
  18.        // La trama llegará fragmentada.
  19.        StringBuilder sb;
  20.  
  21.        // Nuestro delegado recibe como argumento el string con la trama.
  22.        readonly Action<string> NuevaTrama;
  23.  
  24.        // Variables.
  25.        private Pen lápiz2;
  26.        private Pen lápiz3;
  27.        private Pen lápiz4;
  28.        private float angulo;
  29.        private SolidBrush agua;
  30.  
  31.        private GraphicsPath m_lavadora;
  32.        private GraphicsPath m_agua;
  33.  
  34.        // Variables sustituto del trackBar.
  35.        private int trackBar_Nivel_de_agua = 0;
  36.        private int trackBar_Velocidad_motor = 0;
  37.  
  38.        public Form1()
  39.        {
  40.            InitializeComponent();
  41.  
  42.            sb = new StringBuilder();
  43.            NuevaTrama = Actualizar;
  44.        }
  45.        private void Form1_Load(object sender, EventArgs e)
  46.        {
  47.            // Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto.
  48.            try
  49.            {
  50.                comboBox_Puerto.DataSource = SerialPort.GetPortNames();
  51.            }
  52.  
  53.            catch
  54.            {
  55.                MessageBox.Show("No encuentra ningún puerto físico ni virtual.", "Aviso:",
  56.                    MessageBoxButtons.OK, MessageBoxIcon.Warning);
  57.            }
  58.  
  59.            // Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto.
  60.            comboBox_Puerto.DataSource = SerialPort.GetPortNames();
  61.  
  62.            // // Añade puertos disponibles físicos  y virtuales.
  63.            serialPort1.PortName = comboBox_Puerto.Text.ToString();
  64.  
  65.            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
  66.  
  67.            // Dibujo tambor lavadora.
  68.            pictureBox1.Size = new Size(300, 300);
  69.            pictureBox1.BackColor = Color.LightGray;
  70.  
  71.            lápiz2 = new Pen(Color.DarkGray, 10);
  72.            lápiz2.StartCap = LineCap.ArrowAnchor;
  73.            lápiz2.EndCap = LineCap.RoundAnchor;
  74.  
  75.            lápiz3 = new Pen(Color.Black, 5);
  76.            lápiz4 = new Pen(Color.Gray, 10);
  77.  
  78.            angulo = 0;
  79.  
  80.            agua = new SolidBrush(Color.FromArgb(200, 0, 155, 219)); // Transparencia del agua 200.
  81.            trackBar_Nivel_de_agua = -90; // Para que empiece sin agua.
  82.        }
  83.  
  84.        // Detecta USB o puerto serie virtual cuando lo conecta y desconecta del cable.
  85.        protected override void WndProc(ref Message USB)
  86.        {
  87.            if (USB.Msg == 0x219)
  88.            {
  89.                comboBox_Puerto.DataSource = SerialPort.GetPortNames();
  90.            }
  91.  
  92.            base.WndProc(ref USB); // Detecta si hay cambios en el usb y si los hay los refleja.
  93.        }
  94.  
  95.        // Dibuja y colorea.
  96.        private void pictureBox1_Paint(object sender, PaintEventArgs e)
  97.        {
  98.            e.Graphics.DrawRectangle(lápiz3, 10, 10, pictureBox1.ClientSize.Width - 20, pictureBox1.ClientSize.Height - 20);
  99.            e.Graphics.DrawEllipse(lápiz4, 10, 10, pictureBox1.ClientSize.Height - 20, pictureBox1.ClientSize.Height - 20);
  100.  
  101.            e.Graphics.TranslateTransform(pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
  102.            e.Graphics.RotateTransform(angulo);
  103.            e.Graphics.TranslateTransform(-pictureBox1.ClientSize.Width / 2, -pictureBox1.ClientSize.Height / 2);
  104.            //e.Graphics.DrawLine(lápiz2, 20, pictureBox1.ClientSize.Height / 2, pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
  105.            e.Graphics.DrawPath(lápiz2, m_lavadora);
  106.            e.Graphics.ResetTransform();
  107.            e.Graphics.FillPath(agua, m_agua);
  108.        }
  109.  
  110.        // Cambia el tamaño del control.
  111.        private void pictureBox1_Resize(object sender, EventArgs e)
  112.        {
  113.            int ancho = pictureBox1.ClientSize.Width;
  114.            int alto = pictureBox1.ClientSize.Height;
  115.  
  116.            m_lavadora = new GraphicsPath();
  117.  
  118.            m_lavadora.AddEllipse(20, 20, ancho - 40, alto - 40);
  119.            m_lavadora.CloseFigure();
  120.            m_lavadora.AddLine(20, (alto / 2), ancho - 20, (alto / 2));
  121.            m_lavadora.CloseFigure();
  122.            m_lavadora.AddLine(ancho / 2, 20, ancho / 2, alto - 20);
  123.            m_lavadora.CloseFigure();
  124.  
  125.            m_agua = new GraphicsPath();
  126.  
  127.            m_agua.AddArc(20, 20, ancho - 40, alto - 40, trackBar_Nivel_de_agua, 180 - 2 * trackBar_Nivel_de_agua);
  128.            m_agua.CloseFigure();
  129.        }
  130.  
  131.        // Conectar comunicación con el puerto serie.
  132.        private void button_Conectar_Click(object sender, EventArgs e)
  133.        {
  134.            try
  135.            {
  136.                serialPort1.PortName = comboBox_Puerto.Text.ToString(); // Puerto seleccionado previamente.
  137.                serialPort1.BaudRate = Convert.ToInt32(comboBox_Baudios.Text); // Baudios.
  138.                serialPort1.Open(); // Abrir puerto.
  139.                comboBox_Puerto.Enabled = false;
  140.                comboBox_Baudios.Enabled = false;
  141.                button_Conectar.Enabled = false;
  142.                button_Desconectar.Enabled = true;
  143.            }
  144.            catch
  145.            {
  146.                MessageBox.Show("El puerto no existe.", "Aviso:",
  147.                MessageBoxButtons.OK, MessageBoxIcon.Warning);
  148.            }
  149.        }
  150.  
  151.        // Desconectar comunicación con el puerto serie.
  152.        private void button_Desconectar_Click(object sender, EventArgs e)
  153.        {
  154.            try
  155.            {
  156.                serialPort1.Close(); // Cerrar puerto.
  157.                comboBox_Puerto.Enabled = true;
  158.                comboBox_Baudios.Enabled = true;
  159.                button_Conectar.Enabled = true;
  160.                button_Desconectar.Enabled = false;
  161.            }
  162.  
  163.            catch (Exception error)
  164.            {
  165.                MessageBox.Show(error.Message, "Aviso:",
  166.                MessageBoxButtons.OK, MessageBoxIcon.Warning);
  167.            }
  168.        }
  169.  
  170.        // Al cerrar el formulario, antes cierra el puerto si está abierto.
  171.        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  172.        {
  173.            try
  174.            {
  175.                serialPort1.Close(); // Cerrar puerto.
  176.            }
  177.  
  178.            catch (Exception error)
  179.            {
  180.                MessageBox.Show(error.Message, "Aviso:",
  181.                MessageBoxButtons.OK, MessageBoxIcon.Warning);
  182.            }
  183.        }
  184.  
  185.        // Recibe datos por el puerto serie.
  186.        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
  187.        {
  188.            // Caracter/es disponible/s desde la última vez.
  189.            string recibidos = serialPort1.ReadExisting();
  190.  
  191.            // analizamos cada caracter recibido
  192.            foreach (char item in recibidos)
  193.            {
  194.                switch (item)
  195.                {
  196.                    // Ignoramos el \u000D
  197.                    case '\r':
  198.                        break;
  199.  
  200.                    // Aquí detectamos el final de la trama \u000A
  201.                    case '\n':
  202.                        // y la enviamos al control.
  203.                        Invoke(NuevaTrama, sb.ToString());
  204.  
  205.                        // Luego limpiamos el búfer.
  206.                        sb.Clear();
  207.                        break;
  208.  
  209.                    // Cualquier otro caracter recibido, lo agregamos al búfer.
  210.                    default:
  211.                        sb.Append(item);
  212.                        break;
  213.                }
  214.            }
  215.        }
  216.  
  217.        private void Actualizar(string trama)
  218.        {
  219.            // Delimitador. Ignoramos las comas.
  220.            string[] datosArray = trama.Split(',');
  221.  
  222.            // Compara si dos datos del array es igual a la cantidad total que en este
  223.            // caso son 2. Si es igual a 2, entonces ejecuta todo el código dentro del if.
  224.            if (datosArray.Length == 2)
  225.            {
  226.                // Mostrar datos.
  227.                label_Entrada_analogica_A1.Text = "Entrada Analógica A1: " + datosArray[0];
  228.                label_Entrada_analogica_A2.Text = "Entrada Analógica A2: " + datosArray[1];
  229.            }
  230.        }
  231.  
  232.        private void trackBar_Nivel_de_agua_ValueChanged(object sender, EventArgs e)
  233.        {
  234.            m_agua = new GraphicsPath();
  235.  
  236.            m_agua.AddArc(20, 20, pictureBox1.ClientSize.Width - 40, pictureBox1.ClientSize.Height - 40, -trackBar_Nivel_de_agua, 180 - 2 * -trackBar_Nivel_de_agua);
  237.            m_agua.CloseFigure();
  238.            pictureBox1.Refresh();
  239.        }
  240.    }
  241. }

¿Alguna idea de este proyectado tipo reto?

Un cordial saludos camaradas.


En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Hacer funcionar un ProgressBar en Navegador
Programación Visual Basic
JoseRa 1 3,984 Último mensaje 1 Abril 2009, 19:37 pm
por xkiz ™
hacer funcionar mi programa do while
Programación C/C++
fernandoprog1 2 972 Último mensaje 4 Junio 2015, 16:52 pm
por fernandoprog1
como hacer funcionar un gif en un picture box
.NET (C#, VB.NET, ASP)
d91 1 1,065 Último mensaje 4 Enero 2016, 14:48 pm
por DarK_FirefoX
hacer funcionar uan calculadora con un HTML que me dan
Desarrollo Web
vanel622 1 1,549 Último mensaje 14 Septiembre 2017, 02:44 am
por engel lex
como hacer funcionar type3 (v13)
Software
heostk 2 325 Último mensaje 5 Febrero 2020, 19:30 pm
por MCKSys Argentina
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines