Como usar datos recibidos por bluetooth [SOLUCIONADO]

Hola de tod@s, estoy experimentando un poco con el reconocimiento de voz y unas matrices de LEDs.

El tema es el siguiente:

He realizado una aplicacion (muy simple aún) en C# con visual studio la cual reconoce palabras y las envia por bluetooth a Arduino. Uso Aruduino UNO Rev3, modulo bluetooth HC-06 una matriz LED de cuatro elementos y dos matrices LED de un elemento.

La libreria usada para el control de las matrices es:

Arduino debe reconocer la palabra y mostrará en las matrices LED una "cara", me explico, tengo dos matrices LED cada una de un elemento a modo de "ojos" y una matriz LED de cuatro elementos a modo de "boca".

Todo lo anterior funciona por separado, donde tengo el problema es a la hora de procesar la informacion llegada por el bluetooth.

El codigo de la aplicacion en C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Speech.Recognition;
using System.IO.Ports;

namespace WpfApplication1
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        SpeechRecognitionEngine _Recognition = new SpeechRecognitionEngine();
        SerialPort sp = new SerialPort();
        public MainWindow()
        {
            InitializeComponent();
            foreach (string s in SerialPort.GetPortNames())
            {
                portList.Items.Add(s);
            }
        }

        private void btSalir_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }

        private void btEscuchar_Click(object sender, RoutedEventArgs e)
        {
            _Recognition.SetInputToDefaultAudioDevice();
            _Recognition.LoadGrammar(new DictationGrammar());
            _Recognition.SpeechRecognized += _Recognition_SpeechRecognized;
            _Recognition.RecognizeAsync(RecognizeMode.Multiple);
        }

        private void _Recognition_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            foreach (RecognizedWordUnit word in e.Result.Words)
            {
                lbPalabra.Items.Add(word.Text);
                sp.Open();
                sp.Write(word.Text);
                sp.Close();
            }
        }

        private void portList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            
        }

        private void btConectar_Click(object sender, RoutedEventArgs e)
        {
            sp.PortName = portList.Text;
        }
    }
}

He escrito dos códigos para arduino que adjunto por superar el nº de caracteres permitidos.

Con el código FaceLED_v2.1.2 uso la sentencia "if" pero nunca ejecuta los "if". Me da la impresión que lo que almaceno en "buffer" es más de lo que muestra en:

Serial.println(buffer);

y estoy desconcertado porque con esta linea de código me muestra en el serial la palabra correcta, pero para mi desespero, no entra en los "if".

He enviado datos desde aplicaciones Android y ocurre lo mismo :frowning:

Usando el codigo FaceLED_v2.1.3 decidí probar a sustituir los "if " por un "switch case" pero me tira el siguiente error:

switch quantity not an integer

Si alguien tiene alguna pista estaria muy agradecido.

FaceLED_v2.1.2.ino (20.7 KB)

FaceLED_v2.1.3.ino (21 KB)

Primero: switch solo opera con tipos de dato número entero (incluido char). Y además no estamos en Python como para decir que 'sonrisa' el compilador lo va a entender como una cadena de caracteres.

Segundo: a menos que mezcles mayúsculas con minúsculas, la forma correcta de comparar arrays de char, es con strcmp:

if (!strcmp(buffer, "sonrisa"))

Hacer

if (buffer == "sonrisa")

Solo verifica igualdad en la dirección de memoria que almacenan los punteros. Por dentro, buffer es un char* y "sonrisa" es un const char* (incluso las cadenas de caracteres constantes se cargan en memoria).

Muchisimas gracias por su respuesta Lucario, funciona perfecto con su corrección :slight_smile:

Si me permite, entiendo por su comentario que si entran en juego las mayusculas, esta solución no es válida, por tanto me pregunto ¿para identificar las mayúsculas tengo que recorrer el array en busca de ellas? ¿se compara de otra forma distinta que usando strcmp?

Como en otras ocasiones, gracias por su tiempo y conocimiento :slight_smile:

_Gromek:
Si me permite, entiendo por su comentario que si entran en juego las mayusculas, esta solución no es válida, por tanto me pregunto ¿para identificar las mayúsculas tengo que recorrer el array en busca de ellas? ¿se compara de otra forma distinta que usando strcmp?

Otra alternativa sencilla, es mediante String; tiene funciones para convertir todo a mayúscula o minúscula, y para verificar igualdad:

// Después de leer desde el puerto serial

static String entrada = buffer; // O lo puedes declarar global; la idea es reutilizar el objeto una y otra vez
entrada.toLowerCase();

if (entrada.equals("sonrisa"))

// ...

Tomo nota, de nuevo muchas gracias Lucario, me parece muy interesante, voy a experimentarlo mucho, pues me llega como agua de mayo esta información, seguro en breve me veré en la tesitura de cambiar todo a mayusculas o viceversa.

Un placer aprender de usted! :slight_smile: