Changes between Version 4 and Version 5 of IOC_T05
- Timestamp:
- Mar 11, 2022, 8:12:02 AM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
IOC_T05
v4 v5 31 31 et suivre la procédure correspondant à votre OS (Linux, Windows ou MacOS). 32 32 33 == Installation des librairies ESP32 33 **Installation des librairies ESP32** 34 34 35 35 Par défaut, les modules ESP32 ne sont pas disponible dans l'IDE Arduino, il faut les ajouter, voici la procédure à suivre pour ajouter les gestionnaires de cartes à base d'ESP32 : … … 48 48 - Vous pouvez tester le composant ESP32 en exécutant quelques exemples de tutoriaux (décrivez succinctement ce que vous avez fait dans le CR) 49 49 50 Les documents utiles se trouvent : 50 **Les documents utiles se trouvent** 51 51 - [https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/ Tutoriel pour l'installation des bibliothèque ESP32] 52 52 - [https://github.com/adafruit/Adafruit_SSD1306 Repository API Ecran OLED] … … 66 66 67 67 68 = Démarrage68 = Vérification de l'environnement 69 69 70 70 … … 149 149 La première fait clignoter une led dont le numéro est passé en paramètre à 5Hz. 150 150 La seconde affiche bonjour à une fois par seconde. 151 Ici, les tâches ne communiquent pas entre elles. 152 VOus pouvez nodifier le programme initial pour afficher "Salut" en plus de "bonjour" toutes les 2 secondes sans changer le comportement existant. Vous aurez donc "Salut" et "bonjour" qui s'affiche avec une périodicité propre à chaque message. 153 151 154 152 155 {{{#!c … … 178 181 //--------- définition de la tache Led 179 182 180 struct Led_st{183 typedef struct Led_s { 181 184 int timer; // numéro du timer pour cette tâche utilisé par WaitFor 182 185 unsigned long period; // periode de clignotement 183 186 int pin; // numéro de la broche sur laquelle est la LED 184 187 int etat; // etat interne de la led 185 } ;186 187 void setup_Led( struct Led_st * ctx, int timer, unsigned long period, byte pin) {188 } Led_t; 189 190 void setup_Led( Led_t * ctx, int timer, unsigned long period, byte pin) { 188 191 ctx->timer = timer; 189 192 ctx->period = period; … … 194 197 } 195 198 196 void loop_Led( struct Led_st * ctx) {199 void loop_Led(Led_t * ctx) { 197 200 if (!waitFor(ctx->timer, ctx->period)) return; // sort s'il y a moins d'une période écoulée 198 201 digitalWrite(ctx->pin,ctx->etat); // ecriture … … 202 205 //--------- definition de la tache Mess 203 206 204 struct Mess_st {207 typedef struct Mess_st { 205 208 int timer; // numéro de timer utilisé par WaitFor 206 209 unsigned long period; // periode d'affichage … … 208 211 } Mess_t ; 209 212 210 void setup_Mess( struct Mess_st * ctx, int timer, unsigned long period, const char * mess) {213 void setup_Mess(Mess_t * ctx, int timer, unsigned long period, const char * mess) { 211 214 ctx->timer = timer; 212 215 ctx->period = period; … … 215 218 } 216 219 217 void loop_Mess( struct Mess_st *ctx) {220 void loop_Mess(Mess_t *ctx) { 218 221 if (!(waitFor(ctx->timer,ctx->period))) return; // sort s'il y a moins d'une période écoulée 219 222 Serial.println(ctx->mess); // affichage du message … … 222 225 //--------- Déclaration des tâches 223 226 224 struct Led_st Led1;225 struct Mess_st Mess1;227 Led_t Led1; 228 Mess_t Mess1; 226 229 227 230 //--------- Setup et Loop … … 240 243 241 244 **Questions** 245 246 Mettez ces réponses dans votre CR (avec les questions pour que le CR soit lisible) 242 247 - Que contient le tableau `waitForTimer[]` et à quoi sert-il ? 243 248 - Si on a deux tâches indépendantes avec la même période, pourquoi ne peut-on pas utiliser le même timer dans waitFor() ? 244 249 - Dans quel cas la fonction `waitFor()` peut rendre 2 ? 245 - Modifier le programme initial pour afficher "Salut" en plus de "bonjour" toutes les 1.5 secondes sans changer le comportement existant. Vous aurez donc "Salut" et "bonjour" qui s'affiche avec une périodicité propre à chaque message. 250 246 251 247 252 = Utilisation de l'écran OLED … … 261 266 **Questions** 262 267 263 - Extraire de ce code, ce qui est nécessaire pour juste afficher un compteur qui s'incrémente toutes des 1 seconde sur l'écran OLED. Vous devez ajouter une tâche n nommée `oled` dans votre programme en conservant celles déjà dans votre sketch (programme Arduino). L'idée, c'est d'avoir plein de tâches ensemble.268 - Extraire de ce code, ce qui est nécessaire pour juste afficher un compteur qui s'incrémente toutes des 1 seconde sur l'écran OLED. Vous devez ajouter une tâche nommée `oled` dans votre programme en conservant celles déjà dans votre sketch (programme Arduino). L'idée, c'est d'avoir plein de tâches ensemble. 264 269 265 270 … … 274 279 {{{#!c 275 280 enum {EMPTY, FULL}; 276 struct mailbox { 281 282 typedef struct mailbox { 277 283 int state; 278 284 int val; 279 } mb0 = {.state = EMPTY}; 280 281 void loop_T1(... struct mailbox * mb ...) { 285 } mailbox_t; 286 287 mailbox_t mb0 = {.state = EMPTY}; 288 289 void loop_T1(... mailbox_t * mb ...) { 282 290 if (mb->state != EMPTY) return; // attend que la mailbox soit vide 283 291 mb->val = 42; … … 285 293 } 286 294 287 void loop_T2(... struct mailbox* mb ...) {295 void loop_T2(... mailbox_t * mb ...) { 288 296 if (mb->state != FULL) return; // attend que la mailbox soit pleine 289 297 // usage de mb->val … … 305 313 Avec Arduino, il est très simple d'attacher une routine d'interruption (ISR) à un signal d'interruption. 306 314 C'est la fonction `attachInterrupt(num, ISR, type)`. Pour l'ESP32 `num` est égal à `0` ou `1`, ce qui correspond aux pins `2`et `3` qui sont des entrées de signaux d'interruptions. Il existe d'autres sources d'interruption comme le changement d'état d'une pins ou la réception d'une données depuis un bus par exemple. 315 307 316 Ici, il faut créer une fonction `SerialEvent()` qui sera invoqué lors de la réception d'un caractère par le port série. 308 317 309 Dans notre contextela fonction ISR sera comme une fonction loop_Tache.318 Dans ce système, la fonction ISR sera comme une fonction loop_Tache. 310 319 311 320 **Question** … … 314 323 - Représenter le graphe de tâches final sur un dessin en utilisant le langage de [http://www.graphviz.org/ graphviz] (regarder [https://graphviz.gitlab.io/_pages/Gallery/directed/traffic_lights.html ce graphe bi-parti] dont le code est [https://graphviz.gitlab.io/_pages/Gallery/directed/traffic_lights.gv.txt là]). C'est un graphe biparti avec des ronds pour les tâches et des rectangles pour les boites à lettres. 315 324 325 326 = Tout ensemble 327 328 Le but est de faire une application avec le maximum de tâches afin de voir l'intérêt de ce système. Vous allez ajouter le buzzer et le bouton poussoir pour complexifier votre application. Le buzzer est branché sur la broche 316 329 317 330 {{{