none
recibir datos de dos sensores en arduino y C# RRS feed

  • Pregunta

  • buenos dias amigos estoy realizando un proyecto pequeño en el cual estoy usando arduino 1 mas un sensor de ultrasonido y uno de peso, con el cual estoy calcucaldo peso y altura el codigo de arduino quedo asi

    // Hx711.DOUT - pin #A2
    // Hx711.SCK - pin #A3

    #include <hx711.h>
    Hx711 scale(A2, A3);
    const int EchoPin = 4;
    const int TriggerPin = 5;
    const int LedPin = 13;

    void setup() {
    Serial.begin(9600);
    pinMode(LedPin, OUTPUT);
    pinMode(TriggerPin, OUTPUT);
    pinMode(EchoPin, INPUT);
    }

    void loop() {
    Serial.println(scale.getGram()*0.0098, 3);
    delay(1000);
       int cm = ping(TriggerPin, EchoPin);
       Serial.println(cm);
       delay(1000);
    }
     
    int ping(int TriggerPin, int EchoPin) {
       long duration, distanceCm;
       
       digitalWrite(TriggerPin, LOW);  //para generar un pulso limpio ponemos a LOW 4us
       delayMicroseconds(4);
       digitalWrite(TriggerPin, HIGH);  //generamos Trigger (disparo) de 10us
       delayMicroseconds(10);
       digitalWrite(TriggerPin, LOW);
       
       duration = pulseIn(EchoPin, HIGH);  //medimos el tiempo entre pulsos, en microsegundos
       
       distanceCm = duration * 10 / 292/ 2;   //convertimos a distancia, en cm
       return distanceCm;
    }

    ahora quiero enviar el peso y la altura por separado cada uno a su label respectivo; actualmente estoy usando el siguiente codigo pero no he podido serapar los datos me gustaria que me ayudaran

    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;
    using System.IO.Ports;

    namespace CapaPresentacion
    {
        public partial class Control : Form
        {
            private SerialPort serialPort1;

            public Control()
            {
                InitializeComponent();
                serialPort1 = new SerialPort();
                serialPort1.PortName = "COM3";
                serialPort1.BaudRate = 9600;
                serialPort1.DtrEnable = true;
                serialPort1.Open();

                serialPort1.DataReceived += serialport1_DataReceived;

            }

            private void Control_Load(object sender, EventArgs e)
            {

            }

            private void serialport1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                string line = serialPort1.ReadLine();
                this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
            }
            private delegate void LineReceivedEvent(string line);
            private void LineReceived(string Line)
            {
                label7.Text = Line;
                label8.Text = Line;
            }
        }

    martes, 24 de abril de 2018 18:12

Todas las respuestas

  • Hola LuisTyrant:

    Mirando código de Arduino. Sobre todo en las variables.

    const int EchoPin = 4;
    const int TriggerPin = 5;
    const int LedPin = 13;

    Son valores constantes, nunca cambia. Para tener buenas prácticas de programación, aunque sea en Arduino, hay que aprovecharlas para sacar máximo partido, sobre todo cuando trabajes con microcontroladores, así ahorras memoria y rendimiento. Se escriben en mayúsculas. A parte de eso, de tipo de datos que has puesto int, no vas a usar tanta memoria, así que, use byte. Ejemplo abajo.

    ¿Varía los el valor de los pines o lo vas a cambiar en medio del programa?

    El tipo de datos byte se usa de 0 a 255, asi que usar int es desaprevechar memoria que es muy importante para los uC. Quedaría así. Poner en mayúsculas, desde que lo vean, se sabe que es una constante.

    const byte ECHOPIN = 4;
    const byte TRIGGERPIN = 5;
    const byte LEDPIN = 13;

    Explica esta parte.

     distanceCm = duration * 10 / 292/ 2;   //convertimos a distancia, en cm

    Que yo sepa se multiplica primero, por eso lo pongo entre paréntesis. Se que lo hace automáticamente, per para novatos mejor tener las cosas claras.

     distanceCm = (duration * 10) / 292/ 2;   //convertimos a distancia, en cm

    Ahora. ¿Qué cálculo tiene que hacer después?

    En cuanto a C#, recoge los datos al mismo tiempo, lo pones en una variable y lo separas tal como dijo el amigo bisagra.

    Para recibir datos y partirlo para diferenciarlo, usa delimitadores. Un ejemplo.

            // Procesar los datos recibidos en el bufer y extraer tramas completas.
            private void Actualizar(object sender, EventArgs e)
            {
    
                char[] Delimitador = {' ', '\r', '\n', };
    
                // string[] Palabras = Recibidos.Split(Delimitador);
                string[] Palabras = Recibidos.Split(Delimitador, StringSplitOptions.RemoveEmptyEntries);
    
                foreach (string Comandos in Palabras)
                {
                    // label1.Text = Recibidos.ToString(); // Mostrar resultado en un label y convertirlo a string.
                    label1.Text = Recibidos; // Mostrar resultado en un label y convertirlo a string.
                    Recibidos = ""; // Limpiar.
                }
            }

    Si quieres enviar una trama de bytes como este de abajo desde C# a Arduino.

    String cmd = "500000FF03FF000018000A04010000D*0095000001";

    Para que se entienda que significa cada parte de la trama, puedes hacerlo de esta otra manera.

        String cmd = "";
        String OutAddress = "0001";
        cmd = "";
        cmd = cmd + "5000" ;// sub HEAD (NOT).
        cmd = cmd + "00"  ;//   Número de red de trabajo (NOT.)
        cmd = cmd + "FF"  ;// NÚMERO PLC.
        cmd = cmd + "03FF"   ;// DEMANDA OBJETO MÓDULO I/0. 
        cmd = cmd + "00"  ;//  DEMANDA OBJETO NÚMERO DE DISPOSITIVO
        cmd = cmd + "001C"  ;//  LONGITUD DEMANDA DE DATOS.
        cmd = cmd + "000A";//  DATOS DE LA CPU.
        cmd = cmd + "0401";//  LEER COMANDO.
        cmd = cmd + "0000" ;//  Sub commanO.
        cmd = cmd +"D*"  ;//  CÓDIGO DE DISPOSITIVO.
        cmd = cmd + "009500"; // AD BASE.
        cmd = cmd + OutAddress;  //BASE DE DIRECCIONES.

    Como puedes ver, en realidad estás enviando una trama de carácteres pero concatenado, lo bueno, que para el lector que lo lee, puede ver de forma fácil cada comando y documentarlo.

    Más documentación de envíos y recibos de datos con Arduino y ejemplos incluidos.

    [TUTORIAL] Lecturas de entradas digitales con Arduino y Visual Studio .net.

    [TUTORIAL] Encender y apagar un Led con Arduino y Visual Studio.

    Saludos.

    • Editado Metaconta martes, 24 de abril de 2018 19:44
    martes, 24 de abril de 2018 19:26
  • hola

    una duda, porque envias los datos por puerto serie en lugar de usar ethernet, o sea que sea por red ? a lo que apunto es que es mejor usar socket

    ademas envia el dato en una sola llamada, no en dos separadas, salvo que en cada una indiques si envias el peso o medida para poder saber en que label mostrar cada uno

    void loop() {
    
    	int cm = ping(TriggerPin, EchoPin);
    	decimal peso = scale.getGram() * 0.0098;
    	string cadena = cm + "|" + peso;
    	
    	Serial.println(cadena, 3);
    
    	delay(1000);
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 24 de abril de 2018 19:40
  • Hola:

    Por cierto. Este tema va en la sección del foro.

    Comunicación con dispositivos externos.

    Para que lo sepan a la próxima. Los moderadores a moverlo. Es mejor tener un orden.

    Saludos.


    http://electronica-pic.blogspot.com

    martes, 24 de abril de 2018 20:03
  • pues por el momento los estoy enviando por serial, ya que el ethernet no lo tengo disponible y mandarlo a comprar se tarda en llegar y este  proyecto es algo espontaneo
    jueves, 26 de abril de 2018 20:30
  • Cuando tengas algo, haz lo saber.

    http://electronica-pic.blogspot.com

    viernes, 27 de abril de 2018 7:21