IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Cherche expert arduino et écran 4D system pour projet mémoire d'ingénieur


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut Cherche expert arduino et écran 4D system pour projet mémoire d'ingénieur
    Bonjour, je suis en dernière année de mémoire d'ingénieur et je suis sur un projet où je développe un logiciel utilisant un Arduino mega2560 et un écran 4D system.
    Mon programme est terminé mais j'ai des soucis de vitesse d'exécution. Je cherche donc quelqu'un qui s'y connaisse pour examiner mon programme et me dire ce qui ne va pas.
    Je ne le met pas en ligne car il est long et que je ne souhaite pas le diffuser.
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Et sur un Due, ce ne serait pas plus rapide ? (A moins que le Mega 2560 soit imposé)

    Attention toutefois aux périphériques, le Due fonctionne avec des entrées/sorties en 3.3V et non 5V comme le Mega2560, sinon il est compatible au niveau du brochage et les programmes écrits avec les bibliothèques Arduino (*) sont compatibles d'un processeur à l'autre. (* : donc sans accès direct aux registres et aux ports)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonsoir

    Ne pas oublier que le Mega tourne sur un cœur AVR qui n'est que du 8 bits à virgule fixe et qui est optimisé pour un accès en direct aux entrées/sorties. De ce fait certaines petites facilités de programmation bouffent du temps de manière énorme.

    Dans les points classiques:
    Il ne faut pas utiliser les types flottant. Par rapport à un int utilisé en virgule fixe, le facteur de vitesse est entre 50 et 200.
    Il faut limiter les divisions. Les multiplications ne devraient être réalisées que sur du INT. (Car l'ALU de l'AVR possède une multiplication 8 bits câblée en 2 cylces)

    Il faut éviter les pinMode, digitalWrite, digitalRead, analogWrite d’Arduino. Un digitalWrite c'est 48 cycles (pour un Uno, pour le 2560 il me semblait plus mais je ne retrouve pas l'info), l'équivalent PortX |= _BV(y) ou PortX &= ~_BV(y) avec l'état et l'adresse codée en dur, c'est 2 ou 3 cycles (assembleur SBI ou CBI). Le surcoût des fonctions Arduino vient de l'aspect paramétrique de la fonction et des tests pour s'assurer que l'E/S est dans le bon mode.
    Utiliser l'accès direct aux ports nécessaire de ne pas faire n'importe quoi, car tout doit être géré par son code.
    EDIT: on peut toujours programmer de manière paramétrique mais l'adresse des entrées-sortie doit être définie par un #define (codage C) ou un const int (codage C++) et non par une variable.

    Utiliser les strings de manière parcimonieuse. C'est des données de tailles importantes nécessitant beaucoup de calcul.

    Et j'ajouterais faire gaffe aux bibliothèques que l'on utilise. Certaines sont très bien faîtes, mais d'autre sont codées avec les pieds (et notamment un abus notoire de variables à virgule flottante pour quelques unes que j'ai vu passé par ici).

    Bonne suite

    Delias

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 715
    Points : 5 394
    Points
    5 394
    Par défaut
    mais l'adresse des entrées-sortie doit être définie par un #define (codage C) ou un const int (codage C++) et non par une variable.
    si vous voulez parlez des ports il vaudrait mieux un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     constexpr volatile uint8_t *
    non ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Delias Voir le message
    Bonsoir

    Ne pas oublier que le Mega tourne sur un cœur AVR qui n'est que du 8 bits à virgule fixe et qui est optimisé pour un accès en direct aux entrées/sorties. De ce fait certaines petites facilités de programmation bouffent du temps de manière énorme.

    Dans les points classiques:
    Il ne faut pas utiliser les types flottant. Par rapport à un int utilisé en virgule fixe, le facteur de vitesse est entre 50 et 200.
    Il faut limiter les divisions. Les multiplications ne devraient être réalisées que sur du INT. (Car l'ALU de l'AVR possède une multiplication 8 bits câblée en 2 cylces)

    Il faut éviter les pinMode, digitalWrite, digitalRead, analogWrite d’Arduino. Un digitalWrite c'est 48 cycles (pour un Uno, pour le 2560 il me semblait plus mais je ne retrouve pas l'info), l'équivalent PortX |= _BV(y) ou PortX &= ~_BV(y) avec l'état et l'adresse codée en dur, c'est 2 ou 3 cycles (assembleur SBI ou CBI). Le surcoût des fonctions Arduino vient de l'aspect paramétrique de la fonction et des tests pour s'assurer que l'E/S est dans le bon mode.
    Utiliser l'accès direct aux ports nécessaire de ne pas faire n'importe quoi, car tout doit être géré par son code.
    EDIT: on peut toujours programmer de manière paramétrique mais l'adresse des entrées-sortie doit être définie par un #define (codage C) ou un const int (codage C++) et non par une variable.

    Utiliser les strings de manière parcimonieuse. C'est des données de tailles importantes nécessitant beaucoup de calcul.

    Et j'ajouterais faire gaffe aux bibliothèques que l'on utilise. Certaines sont très bien faîtes, mais d'autre sont codées avec les pieds (et notamment un abus notoire de variables à virgule flottante pour quelques unes que j'ai vu passé par ici).

    Bonne suite

    Delias
    Merci pour toutes ces infos je verrais ce que je peux utiliser la dedans, sachant que ce n'est pas une manière de programmer que je maitrise (je crois que je n'en maitrise aucune d'ailleurs!). Je peux pas me passer de calculs avec des floats, j'ai des paramètres avec plusieurs chiffres après la virgules, alors même si le résultat à la fin peut être un int, je ne peux pas me permettre de tronquer autant les paramètres sans m'apporter de grosses erreurs à la fin. Je pense que le soucis vient de la communication avec l'écran car le programme est assez fluide si je ne lui demande pas d'afficher quelque chose à l'écran.

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 715
    Points : 5 394
    Points
    5 394
    Par défaut
    si vous ne pouvez pas optimiser la partie calculs, il faut donc vous concentrer sur l'optimisation de ce qui va à l'écran 4D system
    - quel écran ? quel mode de communication ? pouvez vous choisir un débit différent plus rapide ?
    - ne pas tout effacer pour rafraîchir l'écran. modifiez juste ce qui doit l'être
    - conservez en mémoire l'ancienne valeur affichée, et n'envoyez un ordre de mise à jour que si cette valeur a changé par exemple
    ...

    pour les calculs, passer sur un autre type de cartes (ESP32 ou autres MKR) avec une vraie unité de calculs en 32 bits et tournant à plus de 16Mhz vous fera aussi sans doute gagner du temps.

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour

    L'écran communique au moyen du port série, à une vitesse relativement élevée (c'est 200k, dans l'exemple joint à la bibliothèque). Pour arriver à un problème il doit y avoir trop de communication.
    Lors de mon travail de diplôme j'avais eu le problème avec un convertisseurs DAC en i2C qui prenait trop de temps pour la mise jour dans la boucle de régulation. La solution fut de fractionner la mise à jour en n'envoyant qu'un canal à chaque tour de calcul. C'est éventuellement ce qu'il faut prévoir ici, car le serial n'est pas complètement asynchrone sur Arduino. Si c'est réellement l'écran qui ralenti trop le calcul c'est la piste d'optimisation.

    Pour changer les float en entiers, il faut décomposer le calcul et déterminer à chaque étape les valeurs min, max et la précision nécessaire (c'est du travail de réflexion papier - crayon). Une première optimisation est l'ordre du calcul, généralement c'est d’abord les multiplications puis les divisions sauf a exploser la limite de stockage du type entier que l'on utilise (8, 16 ou 32 bits).
    Pour travailler en virgule fixe sans bibliothèque, il faut multiplier par un 2n les nombres en entrée et diviser par ce même nombres en fin de calcul. Pour la sortie, si on veut arrondir au lieu de tronquer, il faut au préalable ajouter la moitié de la division. (par exemple val_réelle = (valeur_décalée + 32) / 64;). Ces calculs sont très rapide car ce ne sont que de simple décalage de bits.

    Bonne suite

    Delias

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    on m'a conseillé d'assouplir les writeObject ou les writeStr dans ma boucle loop, ce que j'ai fait et en effet le programme tourne plus vite. j'ai eu recours à des variables de mémorisation et je met à jour mon affichage que si quelque chose change plutôt qu'a chaque boucle. Cependant j'ai d'autres problèmes. Il n'y a pas de méga calculs dans mon programme donc cela ne vient vraiment pas du traitement mais vraiment l'échange avec l'écran qui ralentit l'ensemble. Ce que j'ai réglé. Maintenant ce sont des soucis de fonctionnement. En fait le plus simple est que qqun qui s'y connaisse me donne son mail en mp pour que je lui passe le programme et qu'il jette un oeil pour me dire d'où pourrais venir le problème et que je lui décrive le fonctionnement du bouzin...

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonsoir

    Petit rappel des règles.
    Ne demandez jamais dans votre message « répondez-moi par e-mail » ou « répondez-moi par MP », car le principe d'un forum, c'est de répondre sur le forum, pour que tout le monde puisse lire les réponses, profiter des réponses, confirmer, informer ou préciser des réponses déjà faites. Par contre, vous avez une option à cocher en bas à gauche pour être prévenu par e-mail que quelqu'un a répondu à votre question.

    Si vous utilisez cette option, vérifiez que votre adresse de courrier électronique est valide, que vous n'avez pas de répondeur sur votre e-mail et que votre boîte n'est pas pleine.

    Les messages visiteurs (messages postés sur les profils) sont réservés aux messages amicaux. Vos questions et vos réponses doivent être postées exclusivement sur le forum.


    Passer 2 heures pour analyser un code pour une personne, cela ne m’intéresse pas. Le faire pour tous c'est déjà plus acceptable.

    Maintenant le calcul est rapide, donc mes explications à ce sujet ne te seront pas utiles. Ce n'est pas ton problème mais au début je ne pouvais pas le savoir. Ce sera utile pour d'autres.

    Maintenant concernant l'affichage, un exemple de principe pour réduire la lenteur à ce sujet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    uint8_t affichage = 0;
    void loop()
    {
    	/************************
            Le calcul qui est rapide
            ************************/
    	affichage++;
    	switch (affichage)
    	{
    		case 1:
    			writeObject (variable_a);
    			writeObject (variable_b);
    			break;
    		case 2:
    			writeObject (variable_c);
    			writeObject (variable_d);
    			break;
    		case 3:
    			writeObject (variable_e);
    			writeObject (variable_f);
    			break;
    		case 4:
    			writeStr (string_a);
    			writeStr (string_b);
    			break;
    		case 5:
    			writeStr (string_c);
    			writeStr (string_d);
    			affichage = 0;
    			break;
    		default:
    			affichage = 0;
    	}
    }
    Bonne suite

    Delias

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Ok alors met ta ceinture!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
    790
    791
    792
    793
    794
    795
    796
    797
    798
    799
    void loop() {
    if (millis()-temps>=30000){
      //mesure pressions:
      pression1=((analogRead(PEV1)*5)/1024)*0.0125;
      pression2=((analogRead(PEV2)*5)/1024)*0.0125;
      pression3=((analogRead(PEV3)*5)/1024)*0.0125;
      pression4=((analogRead(PEV4)*5)/1024)*0.0125;
     if(pression1!=pression1Mem){
        genie.WriteStr(9,pression1);
        genie.WriteObject(GENIE_OBJ_COOL_GAUGE,0,pression1);
        P1=0.097085*pression1;
       }
     if(pression2!=pression2Mem){
      genie.WriteStr(14,pression2);
      genie.WriteObject(GENIE_OBJ_COOL_GAUGE,1,pression2);
      P2=0.097085*pression2;
       }
     if(pression3!=pression3Mem){
        genie.WriteStr(19,pression3);
        genie.WriteObject(GENIE_OBJ_COOL_GAUGE,2,pression3);
        P3=0.097085*pression3;
       }
     if(pression4!=pression4Mem){
        genie.WriteStr(24,pression4);
        genie.WriteObject(GENIE_OBJ_COOL_GAUGE,3,pression4);
        P4=0.097085*pression4;
      }
     pression1Mem=pression1;
     pression2Mem=pression2;
     pression3Mem=pression3;
     pression4Mem=pression4;
    //mesure température:
    int temp=getTemp();
    if(temp!=tempMem){
       genie.WriteObject(GENIE_OBJ_THERMOMETER,0,temp+30);//affichage t°sur thermomètre avec offset de 30
       t=196+temp+10;
    }
    tempMem=temp;
       //mesure humidité:
     Hr=getHr();
    //if(Hr!=HrMem ){
      //genie.WriteObject(GENIE_OBJ_LED_DIGITS,0,Hr);
    //}
    HrMem=Hr;
    temps=millis();
    }
     genie.DoEvents();  //TEMPO
     
     
    //demarrage de l'autotest de la BMO:
    if(AT==1){
      Autotest();//déclenchement de l'autotest de la BMO
      if(resultatAT>=34){
        genie.WriteStr(28,"OK");
      }else{
        genie.WriteStr(28,"NOK");
      }
     }
    //memorisation des talons et temps dans le paramétrage:
    if(Param!=0){
      i=Param;
      if(Val==1){
        if(neg1==1){
          talMeF[i]=-slider0_val;
        }else{
          talMeF[i]=slider0_val;
        }
        if(neg2==1){
          talStop[i]=-slider1_val;
        }else{
          talStop[i]=slider1_val;
        }
        if(neg3==1){
          talMaint[i]=-slider2_val;
        }else{
          talMaint[i]=slider2_val;
        }
        tpsMeFM[i]=slider3_val;
        tpsStopM[i]=slider4_val;
        tpsMaintM[i]=slider5_val;
      }
     
      if(talMeF[i]!=talMeFMem){
        if(talMeF[i]<0){
        genie.WriteObject(GENIE_OBJ_LED,12,1);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,7,-talMeF[i]);
        }else{
        genie.WriteObject(GENIE_OBJ_LED,12,0);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,7,talMeF[i]);
        }
       }
      if(talStop[i]!=talStopMem){
        if(talStop[i]<0){
        genie.WriteObject(GENIE_OBJ_LED,13,1);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,8,-talStop[i]);
        }else{
        genie.WriteObject(GENIE_OBJ_LED,13,0);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,8,talStop[i]);
        }
       }
      if(talMaint[i]!=talMaintMem){
        if(talMaint[i]<0){
        genie.WriteObject(GENIE_OBJ_LED,14,1);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,9,-talMaint[i]);
        }else{
        genie.WriteObject(GENIE_OBJ_LED,14,0);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,9,talMaint[i]);
        }
       }
      if(tpsMeFM[i]!=tpsMeFMMem){
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,10,tpsMeFM[i]);
      }
      if(tpsStopM[i]!=tpsStopMMem){
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,11,tpsStopM[i]);
      }
      if(tpsMaintM[i]!=tpsMaintMMem){
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,12,tpsMaintM[i]);
      }
    talMeFMem=talMeF[i];;
    talStopMem=talStop[i];
    talMaintMem=talMaint[i];
    tpsMeFMMem=tpsMeFM[i];
    tpsStopMMem=tpsStopM[i];
    tpsMaintMMem=tpsMaintM[i];
    }
    //calcul des tps de mise en froid en auto:
    for(int j=1;j<6;j++){
      tpsMeFA[j]=(-t/(-P1+12.59815))+talMeF[j];
    }
    for(int j=6;j<11;j++){
      tpsMeFA[j]=(-t/(-P2+12.59815))+talMeF[j];
    }
    for(int j=11;j<16;j++){
      tpsMeFA[j]=(-t/(-P3+12.59815))+talMeF[j];
    }
    for(int j=16;j<21;j++){
      tpsMeFA[j]=(-t/(-P4+12.59815))+talMeF[j];
    }
     
    //définition des temps de travail des EV:
    if(Mode1==1){ //si le mode auto est sélectionné pour l'EV1
      int i=Dem1; //les tps auto en mémoire sont placés dans les variables de temps
      tpsMeF1=tpsMeFA[i];
      tpsStop1=tpsStopA[i];
      tpsMaint1=tpsMaintA[i];
      }else{
      tpsMeF1=tpsMeFM[i];
      tpsStop1=tpsStopM[i];
      tpsMaint1=tpsMaintM[i];
      }
     
     
     
    if(Mode2==1){ //si le mode auto est sélectionné pour l'EV1
      int i=Dem2; //les tps auto en mémoire sont placés dans les variables de temps
      tpsMeF2=tpsMeFA[i];
      tpsStop2=tpsStopA[i];
      tpsMaint2=tpsMaintA[i];
    }else{
      tpsMeF2=tpsMeFM[i];
      tpsStop2=tpsStopM[i];
      tpsMaint2=tpsMaintM[i];
    }
     
     
    if(Mode3==1){ //si le mode auto est sélectionné pour l'EV1
      int i=Dem3; //les tps auto en mémoire sont placés dans les variables de temps
      tpsMeF3=tpsMeFA[i];
      tpsStop3=tpsStopA[i];
      tpsMaint3=tpsMaintA[i];
    }else{
      tpsMeF3=tpsMeFM[i];
      tpsStop3=tpsStopM[i];
      tpsMaint3=tpsMaintM[i];
    }
     
     
    if(Mode4==1){ //si le mode auto est sélectionné pour l'EV1
      int i=Dem4; //les tps auto en mémoire sont placés dans les variables de temps
      tpsMeF4=tpsMeFA[i];
      tpsStop4=tpsStopA[i];
      tpsMaint4=tpsMaintA[i];
    }else{
      tpsMeF4=tpsMeFM[i];
      tpsStop4=tpsStopM[i];
      tpsMaint4=tpsMaintM[i];
    }
     
    //fonctionnement EV:
    for(a=1;a<5;a++){
      if(FEV[a]==1){//si EV 1 à 4 à démarré
     
        switch(a){
          case 1:
          if(((Mode1==1)&&(pression1>=135)&&(Dem1!=0))||((Mode1==0)&&(Dem1!=0))){ //si mode auto ET pression >=135 bars ET profile sélectionné OU mode manu et profil sélectionné
            etatCev1=HIGH;
            digitalWrite(EV1,etatCev1);
            if(D1==0){     //si la mise en froid n'est pas réalisée
              tpsUP1=tpsMeF1;// on utilise le temps de mise en froid
             }else{
              tpsUP1=tpsMaint1;//sinon on utilise le temps de maintien froid
              }
            if((etatCev1==HIGH)&&(millis()-T1>=tpsUP1)){
                etatCev1=LOW;
                digitalWrite(EV1,etatCev1);
                D1=1;
                T1=millis();
               }
     
              if((etatCev1==LOW)&&(millis()-T1>=tpsStop1)){
                etatCev1=HIGH;
                digitalWrite(EV1,etatCev1);
                T1=millis();
               }
            }
            break;
            case 2:
          if(((Mode2==1)&&(pression2>=135)&&(Dem2!=0))||((Mode2==0)&&(Dem2!=0))){ //si mode auto ET pression >=135 bars ET profile sélectionné OU mode manu et profil sélectionné
            etatCev2=HIGH;
            digitalWrite(EV2,etatCev1);
            if(D2==0){     //si la mise en froid n'est pas réalisée
              tpsUP2=tpsMeF2;// on utilise le temps de mise en froid
            }else{
              tpsUP2=tpsMaint2;//sinon on utilise le temps de maintien froid
              }
            if((etatCev2==HIGH)&&((millis()-T2)>=tpsUP2)){
                etatCev2=LOW;
                digitalWrite(EV2,etatCev2);
                D2=1;
                T2=millis();
              }
              if((etatCev2==LOW)&&((millis()-T2)>=tpsStop2)){
                etatCev2=HIGH;
                digitalWrite(EV2,etatCev2);
                T2=millis();
              }
            }
            break;
            case 3:
          if(((Mode3==1)&&(pression3>=135)&&(Dem3!=0))||((Mode3==0)&&(Dem3!=0))){ //si mode auto ET pression >=135 bars ET profile sélectionné OU mode manu et profil sélectionné
            etatCev3=HIGH;
            digitalWrite(EV3,etatCev3);
            if(D3==0){     //si la mise en froid n'est pas réalisée
              tpsUP3=tpsMeF3;// on utilise le temps de mise en froid
            }else{
              tpsUP3=tpsMaint3;//sinon on utilise le temps de maintien froid
              }
            if((etatCev3==HIGH)&&((millis()-T3)>tpsUP3)){
                etatCev3=LOW;
                digitalWrite(EV3,etatCev3);
                D3=1;
                T3=millis();
              }
              if((etatCev3==LOW)&&((millis()-T3)>tpsStop3)){
                etatCev3=HIGH;
                digitalWrite(EV3,etatCev3);
                T3=millis();
              }
            }
            break;
            case 4:
          if(((Mode4==1)&&(pression4>=135)&&(Dem4!=0))||((Mode4==0)&&(Dem4!=0))){ //si mode auto ET pression >=135 bars ET profile sélectionné OU mode manu et profil sélectionné
            etatCev4=HIGH;
            digitalWrite(EV4,etatCev4);
            if(D4==0){     //si la mise en froid n'est pas réalisée
              tpsUP4=tpsMeF4;// on utilise le temps de mise en froid
            }else{
              tpsUP4=tpsMaint4;//sinon on utilise le temps de maintien froid
              }
            if((etatCev4==HIGH)&&((millis()-T4)>tpsUP4)){
                etatCev4=LOW;
                digitalWrite(EV4,etatCev4);
                D4=1;
                T4=millis();
              }
              if((etatCev4==LOW)&&((millis()-T4)>tpsStop4)){
                etatCev4=HIGH;
                digitalWrite(EV4,etatCev4);
                T4=millis();
              }
            }
            break;
        }
      }
    }
    /*
    //utilisation cde EV déportée:
    if(digitalRead(CEV1)==LOW){
      etatCev1=!etatCev1;
      digitalWrite(EV1,etatCev1);
    }
    if(digitalRead(CEV2)==LOW){
      etatCev2=!etatCev2;
      digitalWrite(EV2,etatCev2);
    }
    if(digitalRead(CEV3)==LOW){
      etatCev3=!etatCev3;
      digitalWrite(EV3,etatCev3);
    }
    if(digitalRead(CEV4)==LOW){
      etatCev4=!etatCev4;
      digitalWrite(EV4,etatCev4);
    }
    if(digitalRead(CEV5)==LOW){
      etatCev5=!etatCev5;
      digitalWrite(EV5,etatCev5);
    }
    if(digitalRead(CEV6)==LOW){
      etatCev6=!etatCev6;
      digitalWrite(EV6,etatCev6);
    }
    if(digitalRead(CEV7)==LOW){
      etatCev7=!etatCev7;
      digitalWrite(EV7,etatCev7);
    }
    if(digitalRead(CEV8)==LOW){
      etatCev8=!etatCev8;
      digitalWrite(EV8,etatCev8);
    }
    */
    }
    void myGenieEventHandler(){
      genieFrame Event;
      genie.DequeueEvent(&Event);
      if(Event.reportObject.cmd==GENIE_REPORT_EVENT){
        if(Event.reportObject.object==GENIE_OBJ_4DBUTTON){ //on capte l'état des boutons 
          if(Event.reportObject.index==8){  //on capte l'état du mode auto manu EV1
            button8_state=genie.GetEventData(&Event);
            if(button8_state==true){
              Mode1=1;
              }else{
              Mode1=0;
              }
             }
          if(Event.reportObject.index==0){  //on capte l'état du mode auto manu EV2
            button0_state=genie.GetEventData(&Event);
            if(button0_state==true){
              Mode2=1;
              }else{
              Mode2=0;
              }
           }
          if(Event.reportObject.index==1){  //on capte l'état du mode auto manu EV3
            button1_state=genie.GetEventData(&Event);
            if(button1_state==true){
              Mode3=1;
              }else{
              Mode3=0;
              }
             }
          if(Event.reportObject.index==2){  //on capte l'état du mode auto manu EV4
            button2_state=genie.GetEventData(&Event);
            if(button2_state==true){
              Mode4=1;
              }else{
              Mode4=0;
              }
          }
          if(Event.reportObject.index==4){  //on capte l'état marche EV1
            button4_state=genie.GetEventData(&Event);
            if(button4_state==true){
              FEV[1]=1;
              if(Mode1==1){
                genie.WriteStr(8,"AUTO");
              }else{
                genie.WriteStr(8,"MANU");
              }
              genie.WriteStr(4,Dem1);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,17,tpsMeF1);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,18,tpsStop1);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,19,tpsMaint1);
              }else{
              FEV[1]=0;
              }
             }
          if(Event.reportObject.index==5){  //on capte l'état marche EV2
            button5_state=genie.GetEventData(&Event);
            if(button5_state==true){
              FEV[2]=1;
              if(Mode2==1){
                genie.WriteStr(13,"AUTO");
              }else{
                genie.WriteStr(13,"MANU");
              }
              genie.WriteStr(5,Dem2);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,20,tpsMeF2);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,21,tpsStop2);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,22,tpsMaint2);
             }else{
              FEV[2]=0;
             }
            }
          if(Event.reportObject.index==6){  //on capte l'état marche EV3
            button6_state=genie.GetEventData(&Event);
            if(button6_state==true){
              FEV[3]=1;
              if(Mode3==1){
                genie.WriteStr(18,"AUTO");
              }else{
                genie.WriteStr(18,"MANU");
              }
              genie.WriteStr(6,Dem3);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,23,tpsMeF3);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,24,tpsStop3);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,25,tpsMaint3);
              }else{
              FEV[3]=0;
              }
            }
          if(Event.reportObject.index==7){  //on capte l'état marche EV4
            button7_state=genie.GetEventData(&Event);
            if(button7_state==true){
              FEV[4]=1;
              if(Mode4==1){
                genie.WriteStr(23,"AUTO");
              }else{
                genie.WriteStr(23,"MANU");
              }
              genie.WriteStr(7,Dem4);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,26,tpsMeF4);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,27,tpsStop4);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,28,tpsMaint4);
            }else{
              FEV[4]=0;
              }
            }
        }
        if(Event.reportObject.object==GENIE_OBJ_WINBUTTON){
            if(Event.reportObject.index==3){  
            button3_state=genie.GetEventData(&Event);
            if(button3_state==true){
              Param=1;
              }
            }
            if(Event.reportObject.index==4){  
            button4_state=genie.GetEventData(&Event);
            if(button4_state==true){
              Param=2;
              }
            }
            if(Event.reportObject.index==5){ 
            button5_state=genie.GetEventData(&Event);
            if(button5_state==true){
              Param=3;
              }
            }
            if(Event.reportObject.index==6){  
            button6_state=genie.GetEventData(&Event);
            if(button6_state==true){
              Param=4;
              }
            } 
            if(Event.reportObject.index==7){  
            button7_state=genie.GetEventData(&Event);
            if(button7_state==true){
              Param=5;
              }
            }
            if(Event.reportObject.index==8){  
            button8_state=genie.GetEventData(&Event);
            if(button8_state==true){
              Param=6;
              }
            }
            if(Event.reportObject.index==9){  
            button9_state=genie.GetEventData(&Event);
            if(button9_state==true){
              Param=7;
              }
            } 
            if(Event.reportObject.index==10){  
            button10_state=genie.GetEventData(&Event);
            if(button10_state==true){
              Param=8;
              }
            } 
            if(Event.reportObject.index==11){  
            button11_state=genie.GetEventData(&Event);
            if(button11_state==true){
              Param=9;
              }
            }
            if(Event.reportObject.index==12){  
            button12_state=genie.GetEventData(&Event);
            if(button12_state==true){
              Param=10;
              }
            }
            if(Event.reportObject.index==13){  
            button13_state=genie.GetEventData(&Event);
            if(button13_state==true){
              Param=11;
              }
            } 
            if(Event.reportObject.index==14){  
            button14_state=genie.GetEventData(&Event);
            if(button14_state==true){
              Param=12;
              }
            }
            if(Event.reportObject.index==15){  
            button15_state=genie.GetEventData(&Event);
            if(button15_state==true){
              Param=13;
              }
            }
            if(Event.reportObject.index==16){  
            button16_state=genie.GetEventData(&Event);
            if(button16_state==true){
              Param=14;
              }
            } 
            if(Event.reportObject.index==17){  
            button17_state=genie.GetEventData(&Event);
            if(button17_state==true){
              Param=15;
              }
            }
            if(Event.reportObject.index==18){  
            button18_state=genie.GetEventData(&Event);
            if(button18_state==true){
              Param=16;
              }
            } 
            if(Event.reportObject.index==19){  
            button19_state=genie.GetEventData(&Event);
            if(button19_state==true){
              Param=17;
              }
            }
            if(Event.reportObject.index==20){  
            button20_state=genie.GetEventData(&Event);
            if(button20_state==true){
              Param=18;
              }
            } 
            if(Event.reportObject.index==21){  
            button21_state=genie.GetEventData(&Event);
            if(button21_state==true){
              Param=19;
              }
            }
            if(Event.reportObject.index==22){  
            button22_state=genie.GetEventData(&Event);
            if(button22_state==true){
              Param=20;
              }
            } 
            if(Event.reportObject.index==33){  
            button33_state=genie.GetEventData(&Event);
            if(button33_state==true){
              Val=!Val;
              }else{
              Val=!Val;
              }
            }
    //sélection profil pour à mettre en oeuvre:
    //selection profil 1 a 5 pour l'EV1:        
            if(Event.reportObject.index==36){  
            button36_state=genie.GetEventData(&Event);
            if(button36_state==true){
              Dem1=1;
              }
            }
            if(Event.reportObject.index==37){  
            button37_state=genie.GetEventData(&Event);
            if(button37_state==true){
              Dem1=2;
              }
            }
            if(Event.reportObject.index==38){  
            button38_state=genie.GetEventData(&Event);
            if(button38_state==true){
              Dem1=3;
              }
            }
            if(Event.reportObject.index==39){  
            button39_state=genie.GetEventData(&Event);
            if(button39_state==true){
              Dem1=4;
              }
            } 
            if(Event.reportObject.index==40){  
            button40_state=genie.GetEventData(&Event);
            if(button40_state==true){
              Dem1=5;
              }
            }
    //sélection profil 6 a 10 pour l'EV2:
            if(Event.reportObject.index==41){  
            button41_state=genie.GetEventData(&Event);
            if(button41_state==true){
              Dem2=6;
              }
            } 
            if(Event.reportObject.index==42){  
            button42_state=genie.GetEventData(&Event);
            if(button42_state==true){
              Dem2=7;
              }
            } 
            if(Event.reportObject.index==43){  
            button43_state=genie.GetEventData(&Event);
            if(button43_state==true){
              Dem2=8;
              }
            }
            if(Event.reportObject.index==44){  
            button44_state=genie.GetEventData(&Event);
            if(button44_state==true){
              Dem2=9;
              }
            }
            if(Event.reportObject.index==45){  
            button45_state=genie.GetEventData(&Event);
            if(button45_state==true){
              Dem2=10;
              }
            }
    //selection du profil 11 a 15 pour l'EV3:
            if(Event.reportObject.index==46){  
              button46_state=genie.GetEventData(&Event);
              if(button46_state==true){
              Dem3=11;
              }
            } 
            if(Event.reportObject.index==47){  
              button47_state=genie.GetEventData(&Event);
              if(button47_state==true){
              Dem3=12;
              }
            } 
            if(Event.reportObject.index==48){  
              button48_state=genie.GetEventData(&Event);
              if(button48_state==true){
              Dem3=13;
              }
            }  
            if(Event.reportObject.index==49){  
              button49_state=genie.GetEventData(&Event);
              if(button49_state==true){
              Dem3=14;
              }
            }
            if(Event.reportObject.index==50){  
              button50_state=genie.GetEventData(&Event);
              if(button50_state==true){
              Dem3=15;
              }
            }
    //selection profil 16 a 20 pour l'EV4:
            if(Event.reportObject.index==51){  
              button51_state=genie.GetEventData(&Event);
              if(button51_state==true){
              Dem4=16;
              }
            }
            if(Event.reportObject.index==52){  
              button52_state=genie.GetEventData(&Event);
              if(button52_state==true){
              Dem4=17;
              }
            } 
            if(Event.reportObject.index==53){  
              button53_state=genie.GetEventData(&Event);
              if(button53_state==true){
              Dem4=18;
              }
            }  
            if(Event.reportObject.index==54){  
              button54_state=genie.GetEventData(&Event);
              if(button54_state==true){
              Dem4=19;
              }
            } 
            if(Event.reportObject.index==55){  
              button55_state=genie.GetEventData(&Event);
              if(button55_state==true){
              Dem4=20;
              }
            }
    //cde mise à l'air libre:
            if(Event.reportObject.index==58){  
              button58_state=genie.GetEventData(&Event);
              if(button58_state==true){
              etatCev5=1;
              digitalWrite(EV5,etatCev5);
              }else{
              etatCev5=0;
              digitalWrite(EV5,etatCev5);  
              }
             }
            if(Event.reportObject.index==59){  
              button59_state=genie.GetEventData(&Event);
              if(button59_state==true){
              etatCev6=1;
              digitalWrite(EV6,etatCev6);
              }else{
              etatCev6=0;
              digitalWrite(EV6,etatCev6);
            }
           }
            if(Event.reportObject.index==60){  
              button60_state=genie.GetEventData(&Event);
              if(button60_state==true){
              etatCev7=1;
              digitalWrite(EV7,etatCev7);
              }else{
              etatCev7=0;
              digitalWrite(EV7,etatCev7);
              }
            } 
            if(Event.reportObject.index==61){  
              button61_state=genie.GetEventData(&Event);
              if(button61_state==true){
              etatCev8=1;
              digitalWrite(EV8,etatCev8);
              }else{
              etatCev8=0;
              digitalWrite(EV8,etatCev8);
              }
            }
    //démarrage autotest:
            if(Event.reportObject.index==63){  
              button63_state=genie.GetEventData(&Event);
              if(button63_state==true){
              AT=1;
              }else{
              AT=0;
              }
            }
    //signe moins talons:
            if(Event.reportObject.index==68){  
              button68_state=genie.GetEventData(&Event);
              if(button68_state==true){
              neg1=1;
              genie.WriteObject(GENIE_OBJ_LED,15,1);
              }else{
              neg1=0;
              genie.WriteObject(GENIE_OBJ_LED,15,0);
              }
            }
            if(Event.reportObject.index==69){  
              button69_state=genie.GetEventData(&Event);
              if(button69_state==true){
              neg2=1;
              genie.WriteObject(GENIE_OBJ_LED,16,1);
              }else{
              neg2=0;
              genie.WriteObject(GENIE_OBJ_LED,16,0);
              }
            } 
            if(Event.reportObject.index==70){  
              button70_state=genie.GetEventData(&Event);
              if(button70_state==true){
              neg3=1;
              genie.WriteObject(GENIE_OBJ_LED,17,1);
              }else{
              neg3=0;
              genie.WriteObject(GENIE_OBJ_LED,17,0);
              }
            }
            genie.WriteStr(0,Param);
            genie.WriteStr(2,Param);
          }
        if(Event.reportObject.object==GENIE_OBJ_SLIDER){
            if(Event.reportObject.index==0){  
              slider0_val=genie.GetEventData(&Event);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,0,slider0_val);
              genie.WriteObject(GENIE_OBJ_SLIDER,0,slider0_val);
              }
            if(Event.reportObject.index==1){  
              slider1_val=genie.GetEventData(&Event);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,1,slider1_val);
              genie.WriteObject(GENIE_OBJ_SLIDER,1,slider1_val);
              }
            if(Event.reportObject.index==2){  
              slider2_val=genie.GetEventData(&Event);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,2,slider2_val);
              genie.WriteObject(GENIE_OBJ_SLIDER,2,slider2_val);
              }
            if(Event.reportObject.index==3){  
              slider3_val=genie.GetEventData(&Event);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,3,slider3_val);
              genie.WriteObject(GENIE_OBJ_SLIDER,3,slider3_val);
              }
            if(Event.reportObject.index==4){  
              slider4_val=genie.GetEventData(&Event);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,4,slider4_val);
              genie.WriteObject(GENIE_OBJ_SLIDER,4,slider4_val);
              }
            if(Event.reportObject.index==5){  
              slider5_val=genie.GetEventData(&Event);
              genie.WriteObject(GENIE_OBJ_LED_DIGITS,5,slider5_val);
              genie.WriteObject(GENIE_OBJ_SLIDER,5,slider5_val);
              }
            }   
          }
         }
    Pour expliquer un peu je dois activer 4 circuits de débit d'azote selon 4 profils différents pendant un premier cycle de mise en froid, puis une pause, puis un cycle de maintien froid. la partie paramétrage fonctionne à peu près correctement bien qu'il faille que je trouve un moyen de sauvegarder mes paramètres de profils. Les temps ne sont actuellement pas respectés.

    Dans chaque profils j'ai un mode auto où le temps est calculé automatiquement à partir de la pression dans le circuit et de la température ambiante auxquels je permet à l'utilisateur de rajouter un talon négatif ou positif par rapport à mon calcul (je sais qu'un asservissement serait plus simple mais je n'en ai pas la possibilité) et un mode manuel pour lequel je défini manuellement ces temps de fonctionnement et pause.

    Ensuite, une fois le paramétrage réalisé, je commande la mise en marche du cycle qui fera une mise en froid, une pause puis un maintien en froid puis une pause puis un maintien froid… jusqu'à ce qu'on lui dise d'arrêter.
    Tout ceci est biensur affiché à l'utilisateur qu'il sache ce que la machine réalise.
    Une fois ces soucis réglé il me faudra encore permettre à l'utilisateur de donner un nom à son profil à l'aide du clavier de l'écran 4D system et voir comment enregistrer ces profils sur la carte SD de l'écran.
    Merci du temps que tu seras disposé à m'accorder. Je sais que c'est fastidieux mais je n'ai pas beaucoup d'autres options… confinement oblige encore plus…

    PS: la partie Autotest n'est pas mise car elle fonctionne bien.

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 715
    Points : 5 394
    Points
    5 394
    Par défaut
    j'ai lu en diagonal, il y a tellement de répétition de code qu'on s'y perd...
    faudrait utiliser des tableaux et factoriser

    i faudrait aussi mettre des else entre les if quand ils sont mutuellement exclusifs (dans myGenieEventHandler)

    Je ne suis pas sûr de ce que vous faites que vous écrivez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     if (Mode1 == 1) { //si le mode auto est sélectionné pour l'EV1
        int i = Dem1; //les tps auto en mémoire sont placés dans les variables de temps
        tpsMeF1 = tpsMeFA[i];
        tpsStop1 = tpsStopA[i];
        tpsMaint1 = tpsMaintA[i];
      } else {
        tpsMeF1 = tpsMeFM[i];
        tpsStop1 = tpsStopM[i];
        tpsMaint1 = tpsMaintM[i];
      }
    dans la partie vraie du if vous avez un i en variable locale temporaire, mais qui du i qui est utilisé dans le else ?

    enchaîner des analogRead sur des pins différentes peut conduire à des mesures erronées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        pression1 = ((analogRead(PEV1) * 5) / 1024) * 0.0125;
        pression2 = ((analogRead(PEV2) * 5) / 1024) * 0.0125;
        pression3 = ((analogRead(PEV3) * 5) / 1024) * 0.0125;
        pression4 = ((analogRead(PEV4) * 5) / 1024) * 0.0125;
    la recommendation est de lire une fois "à blanc" la pin, jeter la valeur et relire. ça permet à la tension de se stabiliser correctement s'il y a de grosses différences de potentiel d'une pin à l'autre

    ensuite comme il manque plein de code difficile de dire où le temps est passé. Il faudrait instrumenter tout cela. par exemple combien de temps dure Autotest()?

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Jay M Voir le message
    j'ai lu en diagonal, il y a tellement de répétition de code qu'on s'y perd...
    faudrait utiliser des tableaux et factoriser
    Je ne suis pas sur de comprendre...
    Citation Envoyé par Jay M Voir le message
    i faudrait aussi mettre des else entre les if quand ils sont mutuellement exclusifs (dans myGenieEventHandler)
    Je ne leur demande rien d'autre, je leur demande de faire quelque chose quand on appuie sur les boutons. Sinon que devrais-je mettre en else?

    Citation Envoyé par Jay M Voir le message
    Je ne suis pas sûr de ce que vous faites que vous écrivez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     if (Mode1 == 1) { //si le mode auto est sélectionné pour l'EV1
        int i = Dem1; //les tps auto en mémoire sont placés dans les variables de temps
        tpsMeF1 = tpsMeFA[i];
        tpsStop1 = tpsStopA[i];
        tpsMaint1 = tpsMaintA[i];
      } else {
        tpsMeF1 = tpsMeFM[i];
        tpsStop1 = tpsStopM[i];
        tpsMaint1 = tpsMaintM[i];
      }
    dans la partie vraie du if vous avez un i en variable locale temporaire, mais qui du i qui est utilisé dans le else ?
    En fait je défini 1 profil par circuit. Ce numéro de profil je le stock dans les variable Dem 1 à 4. Elles me servent à ressortir les valeurs de temps en auto et en manuel. Ces temps je les mets dans les tpsMeF1, tpsStop1 et tpsMaint1, 2, 3 et 4. Si le Mode(1 a 4) est sur 1 c'est que je suis en auto et 0 en manuel donc je charge les temps auto ou manuel dans ces variables.
    Le i dans la partie vrai n'est pas utilisé dans la partie fausse?
    Cela expliquerai pourquoi mes temps s'harmonisent quand je lance le programme avec les relais en manuel car je ne peux pas utiliser le mode auto pour l'instant faute de pression...
    Citation Envoyé par Jay M Voir le message
    enchaîner des analogRead sur des pins différentes peut conduire à des mesures erronées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        pression1 = ((analogRead(PEV1) * 5) / 1024) * 0.0125;
        pression2 = ((analogRead(PEV2) * 5) / 1024) * 0.0125;
        pression3 = ((analogRead(PEV3) * 5) / 1024) * 0.0125;
        pression4 = ((analogRead(PEV4) * 5) / 1024) * 0.0125;
    la recommendation est de lire une fois "à blanc" la pin, jeter la valeur et relire. ça permet à la tension de se stabiliser correctement s'il y a de grosses différences de potentiel d'une pin à l'autre
    C'est un problème que je verrais plus tard, mais je prend note. Ce sont des capteurs PU5400 que j'utilise mais je ne les ai pas tous et je n'ai pas encore la possibilité de les tester.

    Citation Envoyé par Jay M Voir le message
    ensuite comme il manque plein de code difficile de dire où le temps est passé. Il faudrait instrumenter tout cela. par exemple combien de temps dure Autotest()?

    L'autotest se déroule qu'à la demande donc il n'entre pas en ligne de compte pour le coup. Et se déroule en une 30 aine de seconde.

    En fait mes temps de fonctionnement tpsMeF1, tpsStop1 et tpsMaint1 (et a fortiori les autres) ne sont pas respectés par le programme et bien souvent le relais reste à l'état HIGH. Je pense que cela doit venir de la gestion de millis(), mes temps sont en secondes mais je compare avec une valeur en milliseconde, mais en multipliant par 1000 ces temps la au moment du traitement (pas pendant l'élaboration sinon ca fout en l'air l'affichage des valeurs) ca ne fonctionne pas mieux…

    Je precise que j'ai appris à programmer par mes propres moyens mais que je ne suis pas un professionnel...

  13. #13
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 715
    Points : 5 394
    Points
    5 394
    Par défaut
    Le i dans la partie vrai n'est pas utilisé dans la partie fausse?
    Cela expliquerai pourquoi mes temps s'harmonisent quand je lance le programme avec les relais en manuel car je ne peux pas utiliser le mode auto pour l'instant faute de pression
    Non il est même inconnu à cet endroit... vous devez avoir un i en variable globale sans doute, c'est celui qui est pris...

    Sinon que devrais-je mettre en else?
    Si je regarde vos tests pour les événements il ressemblent à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (Event.reportObject.object == GENIE_OBJ_WINBUTTON) {
      if (Event.reportObject.index == 3) {  }
      if (Event.reportObject.index == 4) {  }
      if (Event.reportObject.index == 5) {  }
      if (Event.reportObject.index == 6) {  }
      if (Event.reportObject.index == 7) {  }
      if (Event.reportObject.index == 8) {  }
      if (Event.reportObject.index == 9) {  }
      ...
    }
    on voit bien que si vous avez trouvé que 4 était la bonne réponse ce n'est plus la peine de tester 5,6,7,....
    donc i faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (Event.reportObject.object == GENIE_OBJ_WINBUTTON) {
      if (Event.reportObject.index == 3) {  }
      else if (Event.reportObject.index == 4) {  }
      else if (Event.reportObject.index == 5) {  }
      else if  (Event.reportObject.index == 6) {  }
      else if  (Event.reportObject.index == 7) {  }
      else if  (Event.reportObject.index == 8) {  }
      else if  (Event.reportObject.index == 9) {  }
      ...
    }
    ou alors mettre un switch sur Event.reportObject.index.
    Il semble aussi que vous ayez un nombre conséquent d'éléments d'interface.... pourriez vous simplifier ?

    Pour les tableaux c'est quand je vois par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (a = 1; a < 5; a++) {
        if (FEV[a] == 1) { //si EV 1 à 4 à démarré
          switch (a) {
            case 1:... break;
            case 2:... break;
            case 3:... break;
            case 4:... break;
         } // fin du switch
      } // fin du if 
    } // fin du for
    Dans votre boucle for vous faites un truc spécial par valeur de a mais le code dans les switch se ressemble bcp, il semblerait donc qu'au lieu d'avoir des variables distinctes pour Dem1, Dem2, Dem3, Dem4 on gagnerait à les avoir dans un tableau par exemple et l'index serait directement la variable a de votre boucle.


    PS: je ne connais pas ces écrans ni cette librairie, mais je me dis que réduire le bavardage entre les 2 composants vous fera sans doute gagner bcp de temps. Simplifiez l'UI au maximum, créez des sous écrans peut être de façon à limiter ce qui est disponible à l'affichage à un instant t....

    rajoutez aussi à certains endroit de quoi mesurer le temps passé dans certaines fonctions pour comprendre ce qui coûte cher et commencez par optimiser cette partie

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Non il est même inconnu à cet endroit... vous devez avoir un i en variable globale sans doute, c'est celui qui est pris...
    effectivement… du coup j'ai rajouté aussi dans le partie fausse de if.
    Citation Envoyé par Jay M Voir le message
    Si je regarde vos tests pour les événements il ressemblent à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (Event.reportObject.object == GENIE_OBJ_WINBUTTON) {
      if (Event.reportObject.index == 3) {  }
      if (Event.reportObject.index == 4) {  }
      if (Event.reportObject.index == 5) {  }
      if (Event.reportObject.index == 6) {  }
      if (Event.reportObject.index == 7) {  }
      if (Event.reportObject.index == 8) {  }
      if (Event.reportObject.index == 9) {  }
      ...
    }
    on voit bien que si vous avez trouvé que 4 était la bonne réponse ce n'est plus la peine de tester 5,6,7,....
    donc i faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (Event.reportObject.object == GENIE_OBJ_WINBUTTON) {
      if (Event.reportObject.index == 3) {  }
      else if (Event.reportObject.index == 4) {  }
      else if (Event.reportObject.index == 5) {  }
      else if  (Event.reportObject.index == 6) {  }
      else if  (Event.reportObject.index == 7) {  }
      else if  (Event.reportObject.index == 8) {  }
      else if  (Event.reportObject.index == 9) {  }
      ...
    }
    ou alors mettre un switch sur Event.reportObject.index.
    Très bien je vais voir comment réagit le programme à cela, en fait à ce niveau, j'ai 2 écrans avec 20 boutons:
    - un écran qui me permet de paramétrer mes 20 profils, divisés en 4 groupes de 5,
    - un autre écran qui me permet d'en choisir un parmi les 5 de son groupe et de choisir le mode auto ou manuel.
    Ensuite j'ai un autre écran qui fait le rappel du profil choisi, le mode dans lequel il est, la pression de son circuit et les temps de Mise en froid, de pause et de maintien froid.
    Du coup le programme tournera probablement plus vite mais est ce qu'il detectera tous les appuis?

    Citation Envoyé par Jay M Voir le message
    Il semble aussi que vous ayez un nombre conséquent d'éléments d'interface.... pourriez vous simplifier ?
    Difficile… Peut être regrouper les écrans de paramétrage et de sélection... j'ai 8 pages d'interfaces en tout:
    -Une page de "présentation" qui redirige vers le paramétrage, le démarrage et l'autotest,
    -Une page de paramétrage qui redirige vers la page avec les sliders et les affichages et vers une autres page avec un clavier pour nommer le profil.
    -Une page démarrage et "récapitulatif des paramètres".
    -Une page autotest qui redirige vers une page compte rendu de test.
    Je ne vois pas beaucoup où je peux réduire l'interface sans compliquer les choses derrière...
    Citation Envoyé par Jay M Voir le message
    Pour les tableaux c'est quand je vois par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (a = 1; a < 5; a++) {
        if (FEV[a] == 1) { //si EV 1 à 4 à démarré
          switch (a) {
            case 1:... break;
            case 2:... break;
            case 3:... break;
            case 4:... break;
         } // fin du switch
      } // fin du if 
    } // fin du for
    Dans votre boucle for vous faites un truc spécial par valeur de a mais le code dans les switch se ressemble bcp, il semblerait donc qu'au lieu d'avoir des variables distinctes pour Dem1, Dem2, Dem3, Dem4 on gagnerait à les avoir dans un tableau par exemple et l'index serait directement la variable a de votre boucle.
    J'ai également tenté de mettre ça en tableau et ca devient compliqué on rentre dans des boucles dans des boucles et je m'y suis un peu perdu, j'ai donc réduit le nombre de boucle au profit d'un allongement du code...
    Ce qu'il faut savoir c'est que sur ma page récapitulatif des paramètres j'ai 4 boutons qui mettent en marche les 4 circuits, ils sont stockés dans les FEV1 à 4.
    Lorsque le circuit est mis en marche, je récupère le numéro de profil (Dem 1 à 4) qui me sert à extraire les paramètres de temps de mise en froid, pause et maintien froid du profil (auto ou manuel fonction de l'état de Mode 1à 4). Je commande ensuite le relais du circuit aux rythmes des différents temps.
    Je peux retenter de réduire la taille du code...
    Comment puis-je mettre en tableaux mes sorties EV 1 à 4 car c'est pour ça que j'ai programmer comme cela, je ne pense pas que je puisse les mettre en tableau... d'un point de vue déclaration également...

  15. #15
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 715
    Points : 5 394
    Points
    5 394
    Par défaut
    rajouter les else ne vous fera perdre aucun évènement puisqu'il s'agit simplement de ne pas faire des tests dont on sait que la condition sera fausse.

    J'ai également tenté de mettre ça en tableau et ca devient compliqué on rentre dans des boucles dans des boucles et je m'y suis un peu perdu, j'ai donc réduit le nombre de boucle au profit d'un allongement du code...
    pas vraiment, ça simplifierait en fait. Si Dem1 était dans un tableau Dem[0], Dem2 dans Dem[1] etc alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    or (a = 1; a < 5; a++) {
        if (FEV[a] == 1) { //si EV 1 à 4 à démarré
          switch (a) {
            case 1:... break;
            case 2:... break;
            case 3:... break;
            case 4:... break;
         } // fin du switch
      } // fin du if 
    } // fin du for
    deviendrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (a = 1; a < 5; a++) {
        if (FEV[a] == 1) { //si EV 1 à 4 à démarré
        // le code avec Dem[a]
      } // fin du if 
    } // fin du for

    Un autre exemple quand vous dites:
    effectivement… du coup j'ai rajouté aussi dans le partie fausse de if.
    Vous avez rajouté quelle valeur pour i ? si c'est Dem1 dans tous les cas, vous n'avez pas besoin de i du tout...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (Mode1 == 1) { //si le mode auto est sélectionné pour l'EV1
        tpsMeF1 = tpsMeFA[Dem1];
        tpsStop1 = tpsStopA[Dem1];
        tpsMaint1 = tpsMaintA[Dem1];
      } else {
        tpsMeF1 = tpsMeFM[Dem1];
        tpsStop1 = tpsStopM[Dem1];
        tpsMaint1 = tpsMaintM[Dem1];
      }
    mais quand je regarde le code vous faites cela pour les 4 modes Modx et les 4 Demx. Si vous aviez les modes dans un tableau ainsi que les Dem comme dit ci dessous et ainsi que les tpsMeFx, tpsStopx, tpsMaintx votre grand code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
      //définition des temps de travail des EV:
      if (Mode1 == 1) { //si le mode auto est sélectionné pour l'EV1
        int i = Dem1; //les tps auto en mémoire sont placés dans les variables de temps
        tpsMeF1 = tpsMeFA[i];
        tpsStop1 = tpsStopA[i];
        tpsMaint1 = tpsMaintA[i];
      } else {
        tpsMeF1 = tpsMeFM[i];
        tpsStop1 = tpsStopM[i];
        tpsMaint1 = tpsMaintM[i];
      }
     
      if (Mode2 == 1) { //si le mode auto est sélectionné pour l'EV1
        int i = Dem2; //les tps auto en mémoire sont placés dans les variables de temps
        tpsMeF2 = tpsMeFA[i];
        tpsStop2 = tpsStopA[i];
        tpsMaint2 = tpsMaintA[i];
      } else {
        tpsMeF2 = tpsMeFM[i];
        tpsStop2 = tpsStopM[i];
        tpsMaint2 = tpsMaintM[i];
      }
     
      if (Mode3 == 1) { //si le mode auto est sélectionné pour l'EV1
        int i = Dem3; //les tps auto en mémoire sont placés dans les variables de temps
        tpsMeF3 = tpsMeFA[i];
        tpsStop3 = tpsStopA[i];
        tpsMaint3 = tpsMaintA[i];
      } else {
        tpsMeF3 = tpsMeFM[i];
        tpsStop3 = tpsStopM[i];
        tpsMaint3 = tpsMaintM[i];
      }
     
      if (Mode4 == 1) { //si le mode auto est sélectionné pour l'EV1
        int i = Dem4; //les tps auto en mémoire sont placés dans les variables de temps
        tpsMeF4 = tpsMeFA[i];
        tpsStop4 = tpsStopA[i];
        tpsMaint4 = tpsMaintA[i];
      } else {
        tpsMeF4 = tpsMeFM[i];
        tpsStop4 = tpsStopM[i];
        tpsMaint4 = tpsMaintM[i];
      }
    deviendrait simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (int i = 0; i < 4; i++) {
      if (Mode[i] == 1) { //si le mode auto est sélectionné pour l'EV N° i
        tpsMeF[i] = tpsMeFA[Dem[i]];
        tpsStop[i] = tpsStopA[Dem[i]];
        tpsMaint[i] = tpsMaintA[Dem[i]];
      } else {
        tpsMeF[i] = tpsMeFM[Dem[i]];
        tpsStop[i] = tpsStopM[Dem[i]];
        tpsMaint[i] = tpsMaintM[Dem[i]];
      }
    }
    de même si vous éléments d'interface étaient dans des tableaux, vous pourriez factoriser le code. ça n'améliore pas forcément les performances mais ça rend le code plus léger et lisible - donc moins de bugs.

    mais prenez le temps de regarder qu'est-ce qui mange du temps.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (FEV[a] == 1) { //si EV 1 à 4 à démarré
          switch (a) {
            case 1:... break;
            case 2:... break;
            case 3:... break;
            case 4:... break;
         } // fin du switch
      } // fin du if 
    } // fin du for
    deviendrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (a = 1; a < 5; a++) {
        if (FEV[a] == 1) { //si EV 1 à 4 à démarré
        // le code avec Dem[a]
      } // fin du if 
    } // fin du for
    on se rejoint ca me rassure j'ai modifié de cette manière le code... La compilation à fonctionné je vais tester avec le matos...
    Citation Envoyé par Jay M Voir le message
    Un autre exemple quand vous dites:

    Vous avez rajouté quelle valeur pour i ? si c'est Dem1 dans tous les cas, vous n'avez pas besoin de i du tout...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (Mode1 == 1) { //si le mode auto est sélectionné pour l'EV1
        tpsMeF1 = tpsMeFA[Dem1];
        tpsStop1 = tpsStopA[Dem1];
        tpsMaint1 = tpsMaintA[Dem1];
      } else {
        tpsMeF1 = tpsMeFM[Dem1];
        tpsStop1 = tpsStopM[Dem1];
        tpsMaint1 = tpsMaintM[Dem1];
      }
    J'y pensais pas... je prend...

    Citation Envoyé par Jay M Voir le message
    mais quand je regarde le code vous faites cela pour les 4 modes Modx et les 4 Demx. Si vous aviez les modes dans un tableau ainsi que les Dem comme dit ci dessous et ainsi que les tpsMeFx, tpsStopx, tpsMaintx votre grand code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
      //définition des temps de travail des EV:
      if (Mode1 == 1) { //si le mode auto est sélectionné pour l'EV1
        int i = Dem1; //les tps auto en mémoire sont placés dans les variables de temps
        tpsMeF1 = tpsMeFA[i];
        tpsStop1 = tpsStopA[i];
        tpsMaint1 = tpsMaintA[i];
      } else {
        tpsMeF1 = tpsMeFM[i];
        tpsStop1 = tpsStopM[i];
        tpsMaint1 = tpsMaintM[i];
      }
     
      if (Mode2 == 1) { //si le mode auto est sélectionné pour l'EV1
        int i = Dem2; //les tps auto en mémoire sont placés dans les variables de temps
        tpsMeF2 = tpsMeFA[i];
        tpsStop2 = tpsStopA[i];
        tpsMaint2 = tpsMaintA[i];
      } else {
        tpsMeF2 = tpsMeFM[i];
        tpsStop2 = tpsStopM[i];
        tpsMaint2 = tpsMaintM[i];
      }
     
      if (Mode3 == 1) { //si le mode auto est sélectionné pour l'EV1
        int i = Dem3; //les tps auto en mémoire sont placés dans les variables de temps
        tpsMeF3 = tpsMeFA[i];
        tpsStop3 = tpsStopA[i];
        tpsMaint3 = tpsMaintA[i];
      } else {
        tpsMeF3 = tpsMeFM[i];
        tpsStop3 = tpsStopM[i];
        tpsMaint3 = tpsMaintM[i];
      }
     
      if (Mode4 == 1) { //si le mode auto est sélectionné pour l'EV1
        int i = Dem4; //les tps auto en mémoire sont placés dans les variables de temps
        tpsMeF4 = tpsMeFA[i];
        tpsStop4 = tpsStopA[i];
        tpsMaint4 = tpsMaintA[i];
      } else {
        tpsMeF4 = tpsMeFM[i];
        tpsStop4 = tpsStopM[i];
        tpsMaint4 = tpsMaintM[i];
      }
    deviendrait simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (int i = 0; i < 4; i++) {
      if (Mode[i] == 1) { //si le mode auto est sélectionné pour l'EV N° i
        tpsMeF[i] = tpsMeFA[Dem[i]];
        tpsStop[i] = tpsStopA[Dem[i]];
        tpsMaint[i] = tpsMaintA[Dem[i]];
      } else {
        tpsMeF[i] = tpsMeFM[Dem[i]];
        tpsStop[i] = tpsStopM[Dem[i]];
        tpsMaint[i] = tpsMaintM[Dem[i]];
      }
    }
    C'est fait!
    Citation Envoyé par Jay M Voir le message
    de même si vous éléments d'interface étaient dans des tableaux, vous pourriez factoriser le code. ça n'améliore pas forcément les performances mais ça rend le code plus léger et lisible - donc moins de bugs.
    Je vais y penser...

    Citation Envoyé par Jay M Voir le message
    mais prenez le temps de regarder qu'est-ce qui mange du temps.
    Je vais regarder avec les nouvelles modifications:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    void loop() {
    if (millis()-temps>=30000){
      //mesure pressions:
      for(i=0;i<4;i++){
      pression1[i]=((analogRead(PEV[i])*5)/1024)*0.0125;
      P[i]=0.097085*pression1[i];
      }
      if(pression1[0]!=pression1Mem[0]){
        genie.WriteStr(9,pression1[0]);
        genie.WriteObject(GENIE_OBJ_COOL_GAUGE,0,pression1[0]);
       }
      if(pression1[1]!=pression1Mem[1]){
      genie.WriteStr(14,pression1[1]);
      genie.WriteObject(GENIE_OBJ_COOL_GAUGE,1,pression1[1]);
      }
      if(pression1[2]!=pression1Mem[2]){
        genie.WriteStr(19,pression1[2]);
        genie.WriteObject(GENIE_OBJ_COOL_GAUGE,2,pression1[2]);
        }
      if(pression1[3]!=pression1Mem[3]){
        genie.WriteStr(24,pression1[3]);
        genie.WriteObject(GENIE_OBJ_COOL_GAUGE,3,pression1[3]);
       }
       for(i=0;i<4;i++){
     pression1Mem[i]=pression1[i];
       }
    //mesure température:
    int temp=getTemp();
    if(temp!=tempMem){
       genie.WriteObject(GENIE_OBJ_THERMOMETER,0,temp+30);//affichage t°sur thermomètre avec offset de 30
       t=196+temp+10;
    }
    tempMem=temp;
       //mesure humidité:
     Hr=getHr();
    //if(Hr!=HrMem ){
      //genie.WriteObject(GENIE_OBJ_LED_DIGITS,0,Hr);
    //}
    HrMem=Hr;
    temps=millis();
    }
     genie.DoEvents();  //TEMPO
     
     
    //demarrage de l'autotest de la BMO:
    if(AT==1){
      Autotest();//déclenchement de l'autotest de la BMO
      if(resultatAT>=34){
        genie.WriteStr(28,"OK");
      }else{
        genie.WriteStr(28,"NOK");
      }
     }
    //memorisation des talons et temps dans le paramétrage:
    if(Param!=0){
      i=Param;
      if(Val==1){
        if(neg1==1){
          talMeF[i]=-slider0_val;
        }else{
          talMeF[i]=slider0_val;
        }
        if(neg2==1){
          talStop[i]=-slider1_val;
        }else{
          talStop[i]=slider1_val;
        }
        if(neg3==1){
          talMaint[i]=-slider2_val;
        }else{
          talMaint[i]=slider2_val;
        }
        tpsMeFM[i]=slider3_val;
        tpsStopM[i]=slider4_val;
        tpsMaintM[i]=slider5_val;
      }
     
      if(talMeF[i]!=talMeFMem){
        if(talMeF[i]<0){
        genie.WriteObject(GENIE_OBJ_LED,12,1);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,7,-talMeF[i]);
        }else{
        genie.WriteObject(GENIE_OBJ_LED,12,0);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,7,talMeF[i]);
        }
       }
      if(talStop[i]!=talStopMem){
        if(talStop[i]<0){
        genie.WriteObject(GENIE_OBJ_LED,13,1);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,8,-talStop[i]);
        }else{
        genie.WriteObject(GENIE_OBJ_LED,13,0);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,8,talStop[i]);
        }
       }
      if(talMaint[i]!=talMaintMem){
        if(talMaint[i]<0){
        genie.WriteObject(GENIE_OBJ_LED,14,1);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,9,-talMaint[i]);
        }else{
        genie.WriteObject(GENIE_OBJ_LED,14,0);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,9,talMaint[i]);
        }
       }
      if(tpsMeFM[i]!=tpsMeFMMem){
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,10,tpsMeFM[i]);
      }
      if(tpsStopM[i]!=tpsStopMMem){
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,11,tpsStopM[i]);
      }
      if(tpsMaintM[i]!=tpsMaintMMem){
        genie.WriteObject(GENIE_OBJ_LED_DIGITS,12,tpsMaintM[i]);
      }
    talMeFMem=talMeF[i];;
    talStopMem=talStop[i];
    talMaintMem=talMaint[i];
    tpsMeFMMem=tpsMeFM[i];
    tpsStopMMem=tpsStopM[i];
    tpsMaintMMem=tpsMaintM[i];
    }
    //calcul des tps de mise en froid en auto:
    for(int j=1;j<6;j++){
      tpsMeFA[j]=(-t/(-P[0]+12.59815))+talMeF[j];
    }
    for(int j=6;j<11;j++){
      tpsMeFA[j]=(-t/(-P[1]+12.59815))+talMeF[j];
    }
    for(int j=11;j<16;j++){
      tpsMeFA[j]=(-t/(-P[2]+12.59815))+talMeF[j];
    }
    for(int j=16;j<21;j++){
      tpsMeFA[j]=(-t/(-P[3]+12.59815))+talMeF[j];
    }
     
    //définition des temps de travail des EV:
    for(i=0;i<4;i++){
    if(Mode[i]==1){ //si le mode auto est sélectionné pour les 4 EV.
      tpsMeF[i]=tpsMeFA[Dem[i]];
      tpsStop[i]=tpsStopA[Dem[i]];
      tpsMaint[i]=tpsMaintA[Dem[i]];
      }else{
      tpsMeF[i]=tpsMeFM[Dem[i]];
      tpsStop[i]=tpsStopM[Dem[i]];
      tpsMaint[i]=tpsMaintM[Dem[i]];
      }
    }
     
    //fonctionnement EV:
    for(a=0;a<4;a++){
      if(FEV[a]==1){//si EV 1 à 4 à démarré
        if(((Mode[i]==1)&&(pression1[i]>=135)&&(Dem[i]!=0))||((Mode[i]==0)&&(Dem[i]!=0))){ //si mode auto ET pression >=135 bars ET profile sélectionné OU mode manu et profil sélectionné
            etatCev[i]=HIGH;
            digitalWrite(EV[i],etatCev[i]);
            if(D[i]==0){     //si la mise en froid n'est pas réalisée
              tpsUP[i]=tpsMeF[i];// on utilise le temps de mise en froid
             }else{
              tpsUP[i]=tpsMaint[i];//sinon on utilise le temps de maintien froid
              }
            if((etatCev[i]==HIGH)&&(millis()-T[i]>=tpsUP[i])){
                etatCev[i]=LOW;
                digitalWrite(EV[i],etatCev[i]);
                D[i]=1;
                T[i]=millis();
               }
            if((etatCev[i]==LOW)&&(millis()-T[i]>=tpsStop[i])){
                etatCev[i]=HIGH;
                digitalWrite(EV[i],etatCev[i]);
                T[i]=millis();
               }
            }
           }
    }
    /*
    //utilisation cde EV déportée:
    for(i=0;i<9;i++){
      if(digitalRead(CEV[i])==LOW){
      etatCev[i]=!etatCev[i];
      digitalWrite(EV[i],etatCev[i]);
      }
    }
    */
    }
    C'est la nouvelle loop.
    Voici les déclarations et le setup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    //initialisation boutons:
    bool button0_state=0;
    bool button1_state=0;
    bool button2_state=0;
    bool button3_state=0;
    bool button4_state=0;
    bool button5_state=0;
    bool button6_state=0;
    bool button7_state=0;
    bool button8_state=0;
    bool button9_state=0;
    bool button10_state=0;
    bool button11_state=0;
    bool button12_state=0;
    bool button13_state=0;
    bool button14_state=0;
    bool button15_state=0;
    bool button16_state=0;
    bool button17_state=0;
    bool button18_state=0;
    bool button19_state=0;
    bool button20_state=0;
    bool button21_state=0;
    bool button22_state=0;
    bool button33_state=0;
    bool button36_state=0;
    bool button37_state=0;
    bool button38_state=0;
    bool button39_state=0;
    bool button40_state=0;
    bool button41_state=0;
    bool button42_state=0;
    bool button43_state=0;
    bool button44_state=0;
    bool button45_state=0;
    bool button46_state=0;
    bool button47_state=0;
    bool button48_state=0;
    bool button49_state=0;
    bool button50_state=0;
    bool button51_state=0;
    bool button52_state=0;
    bool button53_state=0;
    bool button54_state=0;
    bool button55_state=0;
    bool button58_state=0;
    bool button59_state=0;
    bool button60_state=0;
    bool button61_state=0;
    bool button63_state=0;
    bool button68_state=0;
    bool button69_state=0;
    bool button70_state=0;
     
    //initialisation sliders:
    int slider0_val=0;
    int slider1_val=0;
    int slider2_val=0;
    int slider3_val=0;
    int slider4_val=0;
    int slider5_val=0;
    bool neg1=0;
    bool neg2=0;
    bool neg3=0;
     
    //initialisation des variables temps et talons:
    char nomAD[20]={0};//nom des AD
    int talMeF[20]={0};//talon mise en froid auto
    int talStop[20]={0};//talon pause auto
    int talMaint[20]={0};//talon maintien froid auto
    unsigned int tpsMeFA[20]={0};//tps mise en froid auto (calcul+talon)
    unsigned int tpsStopA[20]={0};//tps pause auto(calcul+talon)
    unsigned int tpsMaintA[20]={0};//tps de maintien froid auto (calcul+talon)
    unsigned int tpsMeFM[20]={0};//tps de mise en froid manu
    unsigned int tpsStopM[20]={0};//tps pause manu
    unsigned int tpsMaintM[20]={0};//tps maintien manu
    unsigned long tpsUP[4]={0};//tps d'ouverture EV1 à 4
    unsigned long tpsMeF[4]={0};
    unsigned long tpsStop[4]={0};
    unsigned long tpsMaint[4]={0};
     
    //initialisation variable de travail programme:
    int Param=0;//récupération du numéro de profil.
    int Dem[4]={0};// variable de sélection profil circuit 1 à 4
    bool Mode[4]={0};//variable pour le circuit 1 à 4
    bool FEV[4]={0};//récupère la demande de mise en marche des 4 circuits
     
    //variable calcul pression:
    int pression2[4]={0};//2eme pression pour les 4 circuits
    int resultat[4]={0};//resultat du calcul pression4 - pression42 pour le circuit 4
    int resultatAT=0;//resultat de l'autotest BMO
     
    //init pin commande EV:
    const char EV[8]={5,12,6,11,7,10,8,9};//pin cde EV1
     
    //variables de mesure:
    const int temp=13;//capteur de temperature branché sur pin 13
    OneWire Capt_temp(temp);
    int pression1[4]={0};//première pression azote 4 circuits
    int Hr=A0;//pin mesure humidité 
     
    //init capteur pression:
     
    const int PEV[4]={A1,A2,A3,A4};//pin mesure pression 4 circuits
     
    //init commande déportée EV:
     
    const int CEV[8]={48,50,52,38,40,42,44,46};//pin cde déportée 8 EV
     
    //init variable état cde EV:
    bool etatCev[8]={0};
     
    //variable calcul tps mise en froid auto:
    float t=0;//variable de température
    float P[4]={0};//variable de pression 
     
    //init pin mesure tension LED 1à4:
    const int led[4]={A5,A6,A7,A8};
    int etatLed[4]={0};
     
    //init pin mesure tension des alim de la BMO:
    const float alim=A13;
     
    //init multiplexeur mesure alim:
    int A=47;
    int B=49;
    int C=51;
    int INH=53;
     
    //init variable de travail:
    int a=0;
    int b=0;
    int i=0;
    int j=0;
    int k=0;
    int l=0;
    int m=0;
    int n=0;
    long temps=0;//variable de cadencement de loop
    bool D[4]={0};//variable de fin de mise en froid
    long T[4]={0};//mémoire timing des cycles
    bool Val=0;//variable autorisant la mémorisation des valeurs entrée pour les temps de fonctionnement
    bool AT=0;//compteur servant à l'autotest.
    int tempMem=0;//mémoire température
    int talMeFMem=0;//mémoire talon mise en froid
    int talStopMem=0;//mémoire talon stop
    int talMaintMem=0;//mémoire talon maintien froid
    int tpsMeFMMem=0;//mémoire mise en froid manuelle
    int tpsStopMMem=0;//mémoire stop manuel
    int tpsMaintMMem=0;//mémoire maintien froid manuel
    int pression1Mem[4]={0};//mémoire pression1
     
    int HrMem=0;//mémoire taux d'humidité
     
    Genie genie;

  17. #17
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 715
    Points : 5 394
    Points
    5 394
    Par défaut
    quand je vois des noms de variables comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //init variable de travail:
    int a=0;
    int b=0;
    int i=0;
    int j=0;
    int k=0;
    int l=0;
    int m=0;
    int n=0;
    je me dis qu'elles n'ont pas une utilité importante, ce doit être juste pour vos indices de boucles etc... virez les (ça évitera le bug que vous avez eu avec le i non déclaré) et vous les déclarez en local quand vous en avez besoin, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 0; i < 4; i++) {...}
    dans ce code la variable i n'existe que le temps de la boucle.

    Pour avoir de bonnes pressions, faites des doubles lectures sur les pins analogiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      for (i=0; i<4; i++) {
        analogRead(PEV[I]); // lecture à blanc pour laisser la tension se stabiliser
        pression1[i]=((analogRead(PEV[i])*5)/1024)*0.0125;
        P[i]=0.097085*pression1[i];
      }
    appuyez aussi sur ctrl-T pour indenter le code, c'est pas super lisible ce code tout tassé et pas bien aligné.

    j'ai lu un peu rapidement mais je pense que ces 70 variables globales ne servent à rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    //initialisation boutons:
    bool button0_state=0;
    bool button1_state=0;
    bool button2_state=0;
    bool button3_state=0;
    bool button4_state=0;
    bool button5_state=0;
    bool button6_state=0;
    bool button7_state=0;
    bool button8_state=0;
    bool button9_state=0;
    bool button10_state=0;
    bool button11_state=0;
    bool button12_state=0;
    bool button13_state=0;
    bool button14_state=0;
    bool button15_state=0;
    bool button16_state=0;
    bool button17_state=0;
    bool button18_state=0;
    bool button19_state=0;
    bool button20_state=0;
    bool button21_state=0;
    bool button22_state=0;
    bool button33_state=0;
    bool button36_state=0;
    bool button37_state=0;
    bool button38_state=0;
    bool button39_state=0;
    bool button40_state=0;
    bool button41_state=0;
    bool button42_state=0;
    bool button43_state=0;
    bool button44_state=0;
    bool button45_state=0;
    bool button46_state=0;
    bool button47_state=0;
    bool button48_state=0;
    bool button49_state=0;
    bool button50_state=0;
    bool button51_state=0;
    bool button52_state=0;
    bool button53_state=0;
    bool button54_state=0;
    bool button55_state=0;
    bool button58_state=0;
    bool button59_state=0;
    bool button60_state=0;
    bool button61_state=0;
    bool button63_state=0;
    bool button68_state=0;
    bool button69_state=0;
    bool button70_state=0;
    En effet elles ne sont utilisées que pour la gestion des évènements où vous faites (par exemple pour button0_state):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          if(Event.reportObject.index==0){  //on capte l'état du mode auto manu EV2
            button0_state=genie.GetEventData(&Event);
            if(button0_state==true){
              Mode2=1;
              }else{
              Mode2=0;
              }
           }
    autant virer ces 70 variables et écrire simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          if(Event.reportObject.index==0){  //on capte l'état du mode auto manu EV2
            if (genie.GetEventData(&Event) != 0) {
                Mode2=1;
              }else{
                Mode2=0;
              }
           }

    Je vois bien le mais je ne vois pas le setup() et la définition de la connexion. qu'utilisez vous ?

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Jay M Voir le message
    quand je vois des noms de variables comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //init variable de travail:
    int a=0;
    int b=0;
    int i=0;
    int j=0;
    int k=0;
    int l=0;
    int m=0;
    int n=0;
    je me dis qu'elles n'ont pas une utilité importante, ce doit être juste pour vos indices de boucles etc... virez les (ça évitera le bug que vous avez eu avec le i non déclaré) et vous les déclarez en local quand vous en avez besoin, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 0; i < 4; i++) {...}
    dans ce code la variable i n'existe que le temps de la boucle.
    oui je ferais le tri a la fin...
    Citation Envoyé par Jay M Voir le message
    Pour avoir de bonnes pressions, faites des doubles lectures sur les pins analogiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      for (i=0; i<4; i++) {
        analogRead(PEV[I]); // lecture à blanc pour laisser la tension se stabiliser
        pression1[i]=((analogRead(PEV[i])*5)/1024)*0.0125;
        P[i]=0.097085*pression1[i];
      }
    ok...

    Citation Envoyé par Jay M Voir le message
    j'ai lu un peu rapidement mais je pense que ces 70 variables globales ne servent à rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    //initialisation boutons:
    bool button0_state=0;
    bool button1_state=0;
    bool button2_state=0;
    bool button3_state=0;
    bool button4_state=0;
    bool button5_state=0;
    bool button6_state=0;
    bool button7_state=0;
    bool button8_state=0;
    bool button9_state=0;
    bool button10_state=0;
    bool button11_state=0;
    bool button12_state=0;
    bool button13_state=0;
    bool button14_state=0;
    bool button15_state=0;
    bool button16_state=0;
    bool button17_state=0;
    bool button18_state=0;
    bool button19_state=0;
    bool button20_state=0;
    bool button21_state=0;
    bool button22_state=0;
    bool button33_state=0;
    bool button36_state=0;
    bool button37_state=0;
    bool button38_state=0;
    bool button39_state=0;
    bool button40_state=0;
    bool button41_state=0;
    bool button42_state=0;
    bool button43_state=0;
    bool button44_state=0;
    bool button45_state=0;
    bool button46_state=0;
    bool button47_state=0;
    bool button48_state=0;
    bool button49_state=0;
    bool button50_state=0;
    bool button51_state=0;
    bool button52_state=0;
    bool button53_state=0;
    bool button54_state=0;
    bool button55_state=0;
    bool button58_state=0;
    bool button59_state=0;
    bool button60_state=0;
    bool button61_state=0;
    bool button63_state=0;
    bool button68_state=0;
    bool button69_state=0;
    bool button70_state=0;
    En effet elles ne sont utilisées que pour la gestion des évènements où vous faites (par exemple pour button0_state):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          if(Event.reportObject.index==0){  //on capte l'état du mode auto manu EV2
            button0_state=genie.GetEventData(&Event);
            if(button0_state==true){
              Mode2=1;
              }else{
              Mode2=0;
              }
           }
    autant virer ces 70 variables et écrire simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          if(Event.reportObject.index==0){  //on capte l'état du mode auto manu EV2
            if (genie.GetEventData(&Event) != 0) {
                Mode2=1;
              }else{
                Mode2=0;
              }
           }
    Je prend note je modifierai ca plus tard.

    Je vois bien le mais je ne vois pas le setup() et la définition de la connexion. qu'utilisez vous ?[/QUOTE]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    void setup() {
      //log("Debut Setup");
      //Serial.begin(9600);
      Serial1.begin(200000);
      genie.Begin(Serial1);//écran sur le Serial 1
      genie.AttachEventHandler(myGenieEventHandler);//cde vérifiant ce qui se passe sur l'écran
      genie.WriteContrast(15);
      pinMode(EV[0],OUTPUT);
      digitalWrite(EV[0],LOW);
      pinMode(EV[1],OUTPUT);
      digitalWrite(EV[1],LOW);
      pinMode(EV[2],OUTPUT);
      digitalWrite(EV[2],LOW);
      pinMode(EV[3],OUTPUT);
      digitalWrite(EV[3],LOW);
      pinMode(EV[4],OUTPUT);
      digitalWrite(EV[4],LOW);
      pinMode(EV[5],OUTPUT);
      digitalWrite(EV[5],LOW);
      pinMode(EV[6],OUTPUT);
      digitalWrite(EV[6],LOW);
      pinMode(EV[7],OUTPUT);
      digitalWrite(EV[7],LOW);
      pinMode(temp,INPUT);
      pinMode(Hr,INPUT);
      pinMode(PEV[0],INPUT);
      pinMode(PEV[1],INPUT);
      pinMode(PEV[2],INPUT);
      pinMode(PEV[3],INPUT);
      pinMode(CEV[0],INPUT);
      pinMode(CEV[1],INPUT);
      pinMode(CEV[2],INPUT);
      pinMode(CEV[3],INPUT);
      pinMode(CEV[4],INPUT);
      pinMode(CEV[5],INPUT);
      pinMode(CEV[6],INPUT);
      pinMode(CEV[7],INPUT);
      pinMode(led[1],INPUT);
      pinMode(led[2],INPUT);
      pinMode(led[3],INPUT);
      pinMode(led[4],INPUT);
      pinMode(alim,INPUT);
      pinMode(A,OUTPUT);
      digitalWrite(A,LOW);
      pinMode(B,OUTPUT);
      digitalWrite(B,LOW);
      pinMode(C,OUTPUT);
      digitalWrite(C,LOW);
      pinMode(INH,OUTPUT);
      digitalWrite(INH,HIGH);
      //log("fin Setup");
    }
    voila je tourne en 200000K comme préconisé
    Je pense vraiment que le soucis vient de cette partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    for(i=0;i<4;i++){
    if(Mode[i]==1){ //si le mode auto est sélectionné pour les 4 EV.
      tpsMeF[i]=tpsMeFA[Dem[i]];
      tpsStop[i]=tpsStopA[Dem[i]];
      tpsMaint[i]=tpsMaintA[Dem[i]];
      }else{
      tpsMeF[i]=tpsMeFM[Dem[i]];
      tpsStop[i]=tpsStopM[Dem[i]];
      tpsMaint[i]=tpsMaintM[Dem[i]];
      }
    //fonctionnement EV:
    //log("début fonctionnement EV");
      if(FEV[i]==1){//si EV 1 à 4 à démarré
        if(((Mode[i]==1)&&(pression1[i]>=135)&&(Dem[i]!=0))||((Mode[i]==0)&&(Dem[i]!=0))){ //si mode auto ET pression >=135 bars ET profile sélectionné OU mode manu et profil sélectionné
            etatCev[i]=HIGH;
            digitalWrite(EV[i],etatCev[i]);
            if(D[i]==0){     //si la mise en froid n'est pas réalisée
              tpsUP[i]=tpsMeF[i];// on utilise le temps de mise en froid
             }else{
              tpsUP[i]=tpsMaint[i];//sinon on utilise le temps de maintien froid
             }
            if((etatCev[i]==HIGH)&&((millis()-T[i])>=tpsUP[i])){
                etatCev[i]=LOW;
                digitalWrite(EV[i],etatCev[i]);
                D[i]=1;
                T[i]=millis();
            }else if((etatCev[i]==LOW)&&((millis()-T[i])>=tpsStop[i])){
                etatCev[i]=HIGH;
                digitalWrite(EV[i],etatCev[i]);
                T[i]=millis();
               }
               //log("fin fonctionnement EV");
            }
           }
    //log("fin loop");
    }
    Je me dit que je mélange du millis() et des temps en secondes mais même en multipliant par 1000 les tps UP et Stop ca ne marche pas mieux.

    J'ai fait toutes les modifs que vous m'avez conseillé et les cycles de basculement ne fonctionnent pas alors qu'en laissant afficher les "log" le programme s'exécute très rapidement...

  19. #19
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 715
    Points : 5 394
    Points
    5 394
    Par défaut
    j'ai du mal à percevoir votre fonctionnement global et qu'est-ce que vous trouvez "lent" quand vous dites
    j'ai des soucis de vitesse d'exécution

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Jay M Voir le message
    j'ai du mal à percevoir votre fonctionnement global et qu'est-ce que vous trouvez "lent" quand vous dites
    Je n'ai plus de problème de lenteur, et je vous en remercie.
    Maintenant le problème c'est que les cycles de fonctionnement ne sont pas respectés.

    Je vais reprendre le fonctionnement de la machine. Je dois débiter de l'azote pour refroidir un matériel pendant un cycle de fonctionnement qui se décompose comme suit:
    - un temps de mise en froid
    - un temps de pause où je ne débite plus d'azote
    - un temps de maintien froid

    Je demande à mon Arduino mega de faire commuter des relais qui commandent l'ouverture ou la fermeture de mes 4 électrovannes qui assurent le débit ou non de l'azote nécessaire au refroidissement.
    Je peux paramétrer 5 profils différents par circuits ce qui me fait un total de 20 profils.
    les paramètres que je peux régler sont :
    - nom du profil,
    Pour le mode automatique:
    - un talon de mise en froid qui permet d'ajuster le temps de mise en froid automatiquement calculé par la machine d'après la pression d'azote dans le circuit et la température ambiante,
    - un talon de pause car on ne refroidit pas en permanence sous peine de givrer notre matos
    - un talon de maintien froid pour remettre un coup de froid pour pas laisser le matériel se réchauffer de trop.

    Pour le mode manuel:
    - le temps de mise en froid
    - le temps de pause
    - le temps de maintien froid

    J'ai ensuite une page "démarrage" qui permet de choisi un profils sur les 5 de chaque circuit et de sélectionner si je veux un fonctionnement automatique (temps calculés par la machine) ou manuel.

    la page suivante me permet de montrer à l'utilisateur ce qu'il a choisi et les pressions et temps pour chaque circuit afin qu'il sache ce que la machine va faire.
    Il peut alors déclencher la mise en marche avec 4 boutons (un par circuit) pour lancer un cycle commençant par un temps de mise en froid, puis des cycles de pause et de maintien froid jusqu'à ce qu'il rappuie sur ce bouton.
    En gros il doit mettre mon relais à l'état haut pendant le tps de mise en froid puis bas le temps de pause puis haut pendant le temps de maintien froid, puis bas pendant la pause, puis haut pendant le temps de maintien froid jusqu'à ce que l'opérateur lui demande d'arrêter en rappuyant sur le bouton de mise en marche.

    Maintenant le matériel répond aux commandes et ne semble plus ramer, il affiche bien les différentes données et j'arrive à paramétrer des profils différents qui ressortent bien au démarrage mais les temps rentrés ne sont pas respectés, genre je lui demande 5s d'état haut, il reste à l'état haut pendant 30s... et parfois le tous reboot quand je met en marche les 4 circuits et parfois ca ne reboot pas. Et en plus j'ai l'impression qu'ils fonctionnent tous ensemble en même temps alors qu'ils ont des paramètres différents. Le temps de pause semble plus court que normal, et le temps de maintien plus long...
    une petite image du montage
    Nom : IMG_7143 (2).JPG
Affichages : 523
Taille : 671,1 Ko

Discussions similaires

  1. Cherche un document management system pour s'inspirer
    Par randriano dans le forum Autres Solutions d'entreprise
    Réponses: 0
    Dernier message: 03/12/2014, 10h08
  2. Réponses: 0
    Dernier message: 05/11/2014, 21h11
  3. Trouver un poste pour un mémoire d'ingénieur CNAM
    Par AntoineGael dans le forum Emploi
    Réponses: 2
    Dernier message: 13/01/2014, 14h22
  4. disquette systéme pour windows xp
    Par gilleski2010 dans le forum Windows XP
    Réponses: 1
    Dernier message: 14/10/2005, 22h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo