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
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
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
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.
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 initialise le texte des labels lors du chargement du Form.
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:
...
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:
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!
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:
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
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.