Comment débuter en VB.Net avec des modules Yoctopuce

Comment débuter en VB.Net avec des modules Yoctopuce

Cette semaine, nous continuons notre série d'articles "pour les débutants" et on s'attaque à Visual Basic .Net. Nous allons écrire une petite application qui affiche la valeur d'un capteur Yoctopuce.






Cet article suppose que vous avez déjà quelques connaissances de Visual Basic car le but de cet article n'est pas de faire un tutoriel sur Visual Basic mais d'apprendre à utiliser nos modules dans une application écrite en VB.NET. De la même manière, si vous n'êtes pas familier avec les modules Yoctopuce, nous vous recommandons de commencer par la lecture des précédents articles de cette série, en particulier celui sur la structure logique des modules Yoctopuce.

Installation de L'API


Afin de pouvoir utiliser la librairie Yoctopuce dans votre projet, il faut tout d'abord la télécharger et l'installer quelque part sur votre disque. La librairie peut être téléchargée sur notre site depuis cette page. C'est un fichier zip qui contient la librairie, quelques exemples d'utilisation et la documentation. La partie importante est le répertoire "Sources", qui contient les fichiers sources en Visual Basic mais aussi un sous-répertoire "dll" qui contient les Dlls 32 et 64 bits dont a besoin le code VB. Copiez ce répertoire quelque part sur votre disque et l'installation est terminée. Notez qu'il est aussi possible de télécharger la librairie depuis GitHub si vous préférer utiliser Git.

Création du projet Visual Studio


Note: Pour illustrer cet article, nous avons utilisé Visual Studio 2017, mais le principe reste le même pour toutes le versions Visual Studio depuis la version 2010.

Après avoir lancé Visual Studio, créez un nouveau projet Visual Basic de type Windows Forms App.

Créez un nouveau projet Visual Basic de type Windows Forms App
Créez un nouveau projet Visual Basic de type Windows Forms App



Il faut ensuite indiquer à Visual Studio qu'il doit compiler et utiliser la librairie Yoctopuce. Pour ce projet, on va avoir besoin d'utiliser les fichiers yocto_api.vb, yocto_temperature.vb ainsi que la DLL yapi.dll qui se trouve dans le sous répertoire "dll". Faites un clic droit sur votre projet dans le panneau "Solution Explorer", et choisissez: Add > Existing Item....

Choisissez les fichiers yocto_api.vb, yocto_temperature.vb depuis l'endroit où vous avez copié les sources de la librairie et choisissez le bouton "Add as link". Utiliser "Add as link" n'est pas anodin, cela permet d'utiliser les fichiers depuis leur endroit original plutôt que de les copier dans votre projet. Ainsi, si vous mettez à jour les fichiers de la librairie Yoctopuce, l'application utilisera automatiquement la nouvelle version des fichiers lors de la prochaine compilation. Il est aussi possible de simplement ajouter les fichiers à l'aide du bouton "Add", mais si vous mettez à jour la librairie Yoctopuce, n'oubliez pas de remplacer ces fichiers par les nouveaux.

Ajoutez les fichiers de la librairie Yoctopuce
Ajoutez les fichiers de la librairie Yoctopuce



Recommencez l'opération avec le fichier yapi.dll qui se trouve dans le sous répertoire "dll". Attention vous aurez à changer le filtre des fichiers et choisir "All files (*.*)" au lieu de "VB Code files...".

Un fois la DLL ajoutée, sélectionnez-la dans le panneau Solution Explorer et changez sa propriété "Copy to Output Directory" à "Copy always". Cela aura pour effet de systématiquement copier la dll api.dll dans le répertoire de l'exécutable lors de la compilation.

Copiez automatiquement la dll lors de la compilation
Copiez automatiquement la dll lors de la compilation



Il ne reste plus qu'à écrire l'application.

Initialisation de l'API


La première chose à faire consiste initialiser l'API à l'aide de YAPI.RegisterHub, un bon endroit pour faire ça est lors du chargement du Form. Ainsi, si l'initialisation de l'API Yoctopuce se passe mal on pourra afficher un message d'erreur et arrêter l'application.


Public Class Form1
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim errmsg as String = ""
    If YAPI.RegisterHub("usb", errmsg) <> YAPI_SUCCESS Then
      MessageBox.Show("Init error:" + errmsg)
      Application.Exit()
    End If
  End Sub
End Class
 



L'interface utilisateur


On va insérer deux labels: le premier pour indiquer le nom du capteur détecté. Le second pour indiquer la température.

On ajoute deux labels
On ajoute deux labels



On initialise le texte des labels lors du chargement du Form.


Public Class Form1
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim errmsg as String = ""
    If YAPI.RegisterHub("usb", errmsg) <> YAPI_SUCCESS Then
      MessageBox.Show("Init error:" + errmsg)
      Application.Exit()
    End If
    label1.Text = "No sensor detected"
    Label2.Text = "N/A"
  End Sub
End Class
 




Mettre à jour l'interface avec la température


Contrairement à une application console, on ne peut pas se permette de créer une boucle sans fin pour lire le capteur en permanence. C'est pourquoi on va utiliser un Timer qui appelle une fonction à une fréquence de 10Hz. C'est cette fonction qui va se charger de:

  • Appeler YAPI.HandleEvents assez régulièrement. En fait ce n'est pas 100% nécessaire dans notre cas, mais c'est une bonne pratique de donner le contrôle à l'API Yoctopuce de temps en temps.
  • Appeler YAPI.UpdateDeviceList une fois toutes les deux secondes, ce qui forcera l'API à re-détecter le branchement de nouveaux modules. C'est un processus assez lourd, il faut éviter de le faire trop souvent d'où les deux secondes entre chaque appel.
  • Détecter la première fonctionnalité YTemperature disponible à l'aide de YTemperature.FirstTemperature()
  • Si cette fonctionnalité est disponible, lire la température et mettre à jour l'interface.


Ce qui nous donne le code suivant:


Public Class Form1
  ...

  Dim sensor As YTemperature = Nothing
  dim hardwaredetect As Integer = 0

  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim errmsg As String = ""

    If hardwaredetect = 0 Then
      YAPI.UpdateDeviceList(errmsg)
    End If
    hardwaredetect = (hardwaredetect + 1) Mod 20
    YAPI.HandleEvents(errmsg)
    If sensor Is Nothing Then
      sensor = YTemperature.FirstTemperature()
    End If
    label1.Text = sensor.get_friendlyName()
    label2.Text = Str(sensor.get_currentValue()) + sensor.get_unit()
    End If
  End Sub
End Class
 



Le code précédent fonctionne mais si l'utilisateur débranche le module, l'application crash. Pour éviter ce problème, il faut vérifier que le capteur de température soit toujours connecté à l'aide de la méthode isOnline().

Avec cette modification, le code complet du Form ressemble à ceci:


Public Class Form1
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim errmsg as String = ""
    If YAPI.RegisterHub("usb", errmsg) <> YAPI_SUCCESS Then
      MessageBox.Show("Init error:" + errmsg)
      Application.Exit()
    End If
    label1.Text = "No sensor detected"
    Label2.Text = "N/A"
    Timer1.Enabled = True
  End Sub

  Dim sensor As YTemperature = Nothing
  dim hardwaredetect As Integer = 0

  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim errmsg As String = ""

    If hardwaredetect = 0 Then
      YAPI.UpdateDeviceList(errmsg)
    End If
    hardwaredetect = (hardwaredetect + 1) Mod 20
    YAPI.HandleEvents(errmsg)
    If sensor Is Nothing Then
      sensor = YTemperature.FirstTemperature()
    End If
    If Not sensor Is Nothing Then
      If sensor.isOnline() Then
        label1.Text = sensor.get_friendlyName()
        label2.Text = Str(sensor.get_currentValue()) + sensor.get_unit()
      Else
        label1.Text = "Sensor is offline"
        label2.Text = "OFFLINE"
        sensor = Nothing
      End If
    End If
  End Sub
End Class
 



Et une fois qu'on compile tout ça, on obtient le résultat attendu, une fenêtre Windows qui affiche la température dès qu'un capteur de température Yoctopuce est branché:

Ça marche!
Ça marche!



Note: le code complet de l'application est disponible sur GitHub:https://github.com/yoctopuce-examples/vb_beginners

Une petite amélioration


Cet exemple ne gère que les capteurs de température, mais en changeant juste deux lignes, on peut le faire marcher avec n'importe quel senseur Yoctopuce: il suffit d'utiliser la classe YSensor à la place de la classe YTemperature:


Public Class Form1
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim errmsg as String = ""
    If YAPI.RegisterHub("usb", errmsg) <> YAPI_SUCCESS Then
      MessageBox.Show("Init error:" + errmsg)
      Application.Exit()
    End If
    label1.Text = "No sensor detected"
    Label2.Text = "N/A"
    Timer1.Enabled = True
  End Sub

  Dim sensor As YSensor = Nothing
  dim hardwaredetect As Integer = 0

  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim errmsg As String = ""

    If hardwaredetect = 0 Then
      YAPI.UpdateDeviceList(errmsg)
    End If
    hardwaredetect = (hardwaredetect + 1) Mod 20
    YAPI.HandleEvents(errmsg)
    If sensor Is Nothing Then
      sensor = YSensor.FirstSensor()
    End If
    If Not sensor Is Nothing Then
      If sensor.isOnline() Then
        label1.Text = sensor.get_friendlyName()
        label2.Text = Str(sensor.get_currentValue()) + sensor.get_unit()
      Else
        label1.Text = "Sensor is offline"
        label2.Text = "OFFLINE"
        sensor = Nothing
      End If
    End If
  End Sub
End Class
 



Maintenant, l'application marche aussi avec un capteur de lumière, un voltmètre ou n'importe quel capteur Yoctopuce.

Ça marche aussi avec les autres capteurs
Ça marche aussi avec les autres capteurs



Ce "tour de magie" fonctionne car toutes les classes Yoctopuce correspondant à des fonctionnalités de type senseur héritent de la classe YSensor. Vous pouvez donc utiliser la classe YSensor pour accéder aux fonctions de base d'un senseur comme obtenir la valeur courante ou l'unité de mesure.

Conclusion


Nous avons volontairement gardé ce code très simple, par exemple, il ne gère qu'un seul capteur branché par USB. Bien évidement, la librairie permet de gérer plusieurs capteurs, qu'ils soient connectés en USB ou connectés sur un YoctoHub distant.

Maintenant que nous avons vu les bases, il ne vous reste plus qu'a écrire vos propres applications en vous aidant de la documentation de référence. Vous pouvez aussi parcourir notre blog, qui est plein d'exemples d'utilisation de nos modules. Et si avec tout ça vous n'arrivez toujours pas à vous en sortir, vous pouvez toujours envoyer un email à support@yoctopuce.com.

Commenter aucun commentaire
Retour au blog












Yoctopuce, get your stuff connected.