L'API CallMeBot offre une méthode simple et efficace pour envoyer des messages sur les plateformes de messagerie populaires telles que WhatsApp et Telegram en utilisant un microcontrôleur ESP32. L'intégration de ces services de messagerie dans un projet d'automatisation, tel qu'un système de surveillance de plantes intelligentes, peut transformer une simple alerte en une notification instantanée à l'utilisateur, ce qui est essentiel pour un suivi en temps réel. Cette section explique comment configurer et utiliser l'API CallMeBot pour envoyer des messages via WhatsApp et Telegram, et comment l'intégrer avec un ESP32 pour automatiser l'envoi de notifications.

Configuration pour WhatsApp

La première étape consiste à ajouter le numéro de l'API CallMeBot à vos contacts WhatsApp. Enregistrer le numéro +34 644 51 95 23 dans vos contacts est essentiel pour activer l'API. Une fois ce numéro enregistré, envoyez un message à ce contact pour autoriser l'API à vous envoyer des messages, en spécifiant « Je permets à CallMeBot de m'envoyer des messages ». Vous recevrez alors un message contenant votre clé API unique, qui sera utilisée pour envoyer des messages via WhatsApp.

Testez la configuration en copiant l'URL fournie dans le message reçu et en la collant dans votre navigateur. Un message de test vous sera envoyé sur WhatsApp. Si vous recevez ce message, cela signifie que la configuration est correcte et que vous pouvez maintenant utiliser cette API pour automatiser l'envoi de messages depuis votre ESP32.

Configuration pour Telegram

Le processus pour configurer CallMeBot pour Telegram est similaire, mais nécessite quelques étapes supplémentaires liées à l'authentification. Commencez par coller l'URL suivante dans votre navigateur : https://api.CallMeBot.com/text.php?user=@myusername&text=This+is+a+test+from+CallMeBot, en remplaçant « myusername » par votre propre nom d'utilisateur Telegram. Si vous recevez un message d'erreur indiquant « Permission denied », vous devrez vous authentifier via Telegram. En cliquant sur le lien d'authentification, vous serez invité à vous connecter avec votre compte Telegram et à autoriser l'API à envoyer des messages. Une fois l'authentification réussie, un message de test sera envoyé dans votre application Telegram.

Code de l'ESP32 pour envoyer des messages WhatsApp et Telegram

Une fois que vous avez configuré l'API CallMeBot pour WhatsApp et Telegram, il est temps d'intégrer cette fonctionnalité dans votre code ESP32. Le microcontrôleur ESP32 peut envoyer des messages en utilisant des fonctions que nous allons définir dans le code.

Le code pour envoyer un message sur WhatsApp avec ESP32 est simple : il consiste à construire une URL d'API, à envoyer une requête HTTP et à vérifier la réponse pour confirmer que le message a été envoyé avec succès. La fonction sendWhatsAppMessage() prend le contenu du message comme paramètre, construit l'URL de l'API CallMeBot et vérifie si la réponse HTTP est réussie. Si le code de réponse HTTP est 200, le message a été envoyé correctement.

Le processus est similaire pour Telegram. La fonction sendTelegramMessage() construit également une URL d'API et envoie une requête HTTP pour publier un message sur Telegram. Après l'envoi, le code vérifie la réponse de l'API et affiche un message de confirmation ou d'erreur en conséquence.

Envoi de messages avec ESP32

Après avoir téléchargé le code sur votre ESP32, il vous suffit de connecter le microcontrôleur à votre réseau Wi-Fi et d'exécuter le code dans la fonction loop(). Chaque fois que l'événement que vous surveillez (par exemple, un changement d'état d'un capteur de plante) se produit, l'ESP32 enverra automatiquement un message sur WhatsApp et Telegram, informant l'utilisateur de l'état de la plante.

Quelques éléments à considérer lors de la mise en œuvre

Il est important de noter que pour l'envoi de messages via WhatsApp et Telegram, l'API CallMeBot impose certaines limites d'utilisation, comme la fréquence des messages envoyés et la quantité de messages par période donnée. Veillez à consulter la documentation officielle de l'API pour vous assurer que votre utilisation respecte ces limites.

De plus, lors de l'intégration de cette fonctionnalité dans un système automatisé comme le projet de surveillance des plantes, il peut être utile d'ajouter des fonctionnalités de contrôle d'erreur et de journalisation des messages envoyés, afin de pouvoir suivre et déboguer facilement toute erreur dans le processus d'envoi des messages.

Enfin, si vous prévoyez d'utiliser ces services dans des applications à plus grande échelle, il peut être judicieux d'explorer d'autres services d'API ou d'envisager des solutions personnalisées pour assurer une gestion optimale et évolutive des notifications.

Comment utiliser FreeRTOS avec ESP32 pour gérer plusieurs tâches en parallèle

L'utilisation de FreeRTOS sur un microcontrôleur, comme l'ESP32, permet de gérer des tâches en temps réel de manière efficace. Lors de la programmation d'applications embarquées, il est essentiel de pouvoir exécuter plusieurs tâches de manière concurrente. Cela est particulièrement vrai lorsqu'on travaille avec des composants tels que des LED clignotantes, des capteurs, ou d'autres dispositifs nécessitant une gestion précise du temps. Le processus de gestion des tâches avec FreeRTOS offre des avantages significatifs par rapport à l'architecture traditionnelle basée sur une boucle principale.

Prenons l'exemple d'un programme où deux LED clignotent à des intervalles différents, l'une toutes les 500 ms et l'autre toutes les 1000 ms. Au lieu d'utiliser une seule boucle dans la fonction loop(), chaque LED reçoit une tâche distincte. Ces tâches s'exécutent indépendamment les unes des autres, ce qui permet à chaque LED de clignoter à son rythme, sans affecter les autres tâches.

Création des tâches avec FreeRTOS

  1. Importation des bibliothèques nécessaires : Avant de pouvoir travailler avec FreeRTOS, il faut inclure les bibliothèques essentielles, telles que Arduino.h pour l'ESP32 et FreeRTOS.h pour la gestion des tâches en temps réel. Ces bibliothèques permettent d'interagir avec le matériel et de créer des tâches.

  2. Définition des pins des LED : Le programme commence par définir les numéros de pins pour chaque LED. Par exemple, la première LED est connectée au pin 13 et la seconde au pin 12.

  3. Création d’une tâche pour la première LED : La première tâche, led1Task, est responsable de faire clignoter la première LED. Cela se fait en alternant l'état de la LED entre haut (allumé) et bas (éteint) avec un délai de 500 ms, en utilisant la fonction vTaskDelay. Ce délai est géré en "ticks", où chaque tick correspond à un certain nombre de millisecondes, défini par portTICK_PERIOD_MS.

  4. Création d’une tâche pour la seconde LED : Une tâche similaire est créée pour la seconde LED, avec un délai de 1000 ms entre chaque changement d'état.

  5. Définition des tâches dans la fonction setup() : Après avoir créé les fonctions des tâches, celles-ci doivent être initialisées dans la fonction setup(). Cela se fait à l'aide de la fonction xTaskCreate, qui permet de spécifier la tâche, son nom, sa taille de pile, sa priorité, et d'autres paramètres. Dans cet exemple, les tâches sont définies avec une priorité de 1 et une taille de pile de 4096 octets.

  6. Boucle principale vide : Dans le cas de l’utilisation de FreeRTOS, la fonction loop() reste vide car les tâches gèrent tout en arrière-plan, ce qui est un des avantages de FreeRTOS : les tâches sont exécutées en parallèle, sans intervention du programme principal.

Un aperçu du code

Voici un extrait du code pour ces deux tâches :

cpp
void led1Task(void *parameter) { pinMode(led1Pin, OUTPUT); while (1) { digitalWrite(led1Pin, HIGH); vTaskDelay(500 / portTICK_PERIOD_MS); digitalWrite(led1Pin, LOW); vTaskDelay(500 / portTICK_PERIOD_MS); } } void led2Task(void *parameter) { pinMode(led2Pin, OUTPUT); while (1) { digitalWrite(led2Pin, HIGH); vTaskDelay(1000 / portTICK_PERIOD_MS); digitalWrite(led2Pin, LOW); vTaskDelay(1000 / portTICK_PERIOD_MS); } } void setup() {
xTaskCreate(led1Task, "LED1 Task", 4096, NULL, 1, NULL);
xTaskCreate(led2Task, "LED2 Task", 4096, NULL, 1, NULL); } void loop() { // Boucle vide car les tâches gèrent tout en arrière-plan }

Dans cet exemple, les LED clignotent à des fréquences différentes. Une LED clignote toutes les 500 ms, tandis que l'autre clignote toutes les 1000 ms, chacune fonctionnant indépendamment grâce à la gestion des tâches par FreeRTOS.

FreeRTOS et ESP-IDF : une intégration avancée

Si l'usage de FreeRTOS dans l'Arduino IDE est une bonne introduction, pour tirer pleinement parti de ses capacités, il est nécessaire de se tourner vers ESP-IDF (Espressif IoT Development Framework). ESP-IDF est un environnement de développement complet qui offre une gestion plus avancée des tâches et une plus grande flexibilité dans l'utilisation de FreeRTOS. Il permet également de mieux intégrer le FreeRTOS avec d'autres fonctionnalités de l'ESP32, telles que la gestion du Wi-Fi, du Bluetooth, et des périphériques externes.

Une meilleure gestion des tâches avec FreeRTOS

Lorsque vous utilisez FreeRTOS, il est essentiel de bien comprendre l'importance de la priorité des tâches. Dans un système embarqué, certaines tâches peuvent être plus critiques que d'autres. Par exemple, la gestion des interruptions matérielles ou des capteurs de température doit avoir une priorité plus élevée que des tâches moins urgentes, comme l'actualisation de l'affichage LED. Dans ce cas, vous pouvez attribuer une priorité plus élevée à certaines tâches pour garantir que les événements critiques sont traités rapidement et efficacement.

De plus, FreeRTOS permet de configurer des délais précis entre les exécutions des tâches. Cela est particulièrement utile dans des applications où plusieurs événements doivent se produire à des moments spécifiques, comme la lecture périodique de données de capteurs ou l'activation de périphériques à intervalles réguliers.

Il est également important de noter que FreeRTOS ne repose pas sur une boucle infinie unique, mais plutôt sur un mécanisme de planification des tâches, où chaque tâche est exécutée à tour de rôle en fonction de sa priorité et de son temps de traitement. Cette architecture permet de maximiser les performances et de minimiser l'utilisation des ressources.