[Programmation] programmation arduino lcd et fonction OU
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 34

programmation arduino lcd et fonction OU



  1. #1
    invite60ec2530

    programmation arduino lcd et fonction OU


    ------

    bonjour a tous

    je viens trouver de l'aide auprès de vous car je sèche vraiment et je n'arrive pas a me dépatouille de ça

    J'ai écrit un programme pour faire une télécommande nrf, ça fonctionne en émission réception etc sur ce point la c'est parfait.

    en revanche il y as deux point qui ne fonctionne pas....

    le premier mon écran LCD je n'ai rien qui s'affiche (le rétroéclairage fonctionne) mais j'ai utiliser les pin A0 à A5 je pense qu'il doit y avoir le type de sortie a déclarer

    le deuxième c'est ma divergence en OU j'aimerai que le récepteur me renvoie un accusé de réception et que sur l'émetteur ça me disent si oui ou non le message est arrivé

    de ce style la
    Code:
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
     if (digitalRead(PIN_AD2) == LOW) {
        Serial.println("Signal AD !");
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande AD2"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("envoie en cours"); // on finit d'écrire
        delay (1100);
        byte message[8] = "VPCADD2";
        Serial.println("Signal ADD2 !");
        Mirf.send(message); // On envoie le message circuit AD2
        Serial.println("envoie du message au recepteur !");
        while(Mirf.isSending()); // On attend la fin de l'envoi
    
    -------------------------------------------------------------------------------------fonction à rajouter 
    
        "si le recepteur renvoie le OK-ADD2 message on écrit sur le LCD message reçu" 
    
        "si le recepteur ne renvoie rien au bout d'un Temps donné on ecrit sur le LCD pas de message reçu et 
         on retourne au debut du programme"
    
    -------------------------------------------------------------------------------------fonction à rajouter 
    
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande AD2"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("fin d'envoie"); // on finit d'écrire
        Serial.println("fin de l'envoie");
    
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    j'ai essayé de bricoler a base de if et else dans le programme mais j'ai systématiquement du orange ou du rouge donc je désespère....

    Je met mon code en fin de topic et si quelqu'un peut m'aider je le remercie d'avance

    DD91

    code complet

    Code:
    #include <SPI.h>                   // Pour la communication via le port SPI
    #include <Mirf.h>                  // Pour la gestion de la communication
    #include <nRF24L01.h>              // Pour les définitions des registres du nRF24L01
    #include <MirfHardwareSpiDriver.h> // Pour la communication SPI
    #include <LiquidCrystal.h>         // on importe la bibliothèque LCD
     
    const byte PIN_P = 5;
    const byte PIN_AD1 = 4;
    const byte PIN_AD2 = 3;
    const byte PIN_LEDRX = A0;
    LiquidCrystal LCD(A0,A1,A2,A3,A4,A5); // on active l'ecran 
     
    void setup() {
      Serial.begin(9600);
      LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
      LCD.clear(); // on efface l'écran
      LCD.print("bonjour"); // on écrit un message
      LCD.clear(); // on efface l'écran
      LCD.print("Valise 2019,"); // on écrit un message
      LCD.setCursor(0,1); //on passe à la ligne suivante
      LCD.print("PRET"); // on finit d'écrire
      
      pinMode(PIN_P, INPUT_PULLUP);
      pinMode(PIN_AD1, INPUT_PULLUP);
      pinMode(PIN_AD2, INPUT_PULLUP);
      pinMode(PIN_LEDRX, OUTPUT);
       
      Mirf.cePin = 9; // Broche CE sur D9
      Mirf.csnPin = 10; // Broche CSN sur D10
      Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
      Mirf.init(); // Initialise la bibliothèque
    
      Mirf.channel = 1; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
      Mirf.payload = 8; // Taille d'un message (maximum 32 octets)
      Mirf.config(); // Sauvegarde la configuration dans le module radio
    
      Mirf.setTADDR((byte *) "nrf02"); // Adresse de transmission
      Mirf.setRADDR((byte *) "nrf01"); // Adresse de réception
       
      Serial.println("Testeur pret -"); 
    }
     
    void loop() {
      
      // Lit l'état des boutons
      if (digitalRead(PIN_Panto) == LOW) {
        Serial.println("Signal Panto !");
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande panto"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("envoie en cours"); // on finit d'écrire
        delay(1100);
        byte message[8] = "VPCPMNT";
        Serial.println("envoie du message au recepteur !");
        Mirf.send(message); // On envoie le message d'action 
        while(Mirf.isSending()); // On attend la fin de l'envoi
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande "); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("fin d'envoie"); // on finit d'écrire
        Serial.println("fin de l'envoie");
        delay(100);
        Serial.println("en attente de relachement bouton");
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande "); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("relacher BP"); // on finit d'écrire
        while (digitalRead(PIN_P) == LOW)
        delay(100);
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("fin d'action,"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("Valise prete"); // on finit d'écrire
        Serial.println("emeteur pret -);
        
      }
      if (digitalRead(PIN_AD1) == LOW) {
        Serial.println("Signal AD !");
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande AD1"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("envoie en cours"); // on finit d'écrire
        delay (1100);
        byte message[8] = "VPCAD1";
        Serial.println("Signal AD1 !");
        Mirf.send(message); // On envoie le message circuit AD1
        Serial.println("envoie du message au recepteur !");
        while(Mirf.isSending()); // On attend la fin de l'envoi
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande AD1"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("fin d'envoie"); // on finit d'écrire
        Serial.println("fin de l'envoie");
        delay(100);
        Serial.println("en attente de relachement bouton");
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande AD1"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("relacher BP"); // on finit d'écrire
        while (digitalRead(PIN_AD1) == LOW)
        delay(100);
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("fin d'action,"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("Valise prete"); // on finit d'écrire
        Serial.println("emeteur pret - ");
        
        }
    
      if (digitalRead(PIN_AD2) == LOW) {
        Serial.println("Signal AD !");
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande AD2"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("envoie en cours"); // on finit d'écrire
        delay (1100);
        byte message[8] = "VPCADD2";
        Serial.println("Signal ADD2 !");
        Mirf.send(message); // On envoie le message circuit AD2
        Serial.println("envoie du message au recepteur !");
        while(Mirf.isSending()); // On attend la fin de l'envoi
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande AD2"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("fin d'envoie"); // on finit d'écrire
        Serial.println("fin de l'envoie");
        delay(100);
        Serial.println("en attente de relachement bouton");
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande AD2"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("relacher BP"); // on finit d'écrire
        while (digitalRead(PIN_AD2) == LOW)
        delay(100);
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("fin d'action,"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("Valise prete"); // on finit d'écrire
        Serial.println("emeteur pret - ");
        
        } 
    }

    -----
    Dernière modification par Antoane ; 24/03/2019 à 15h42. Motif: Ajout balises code

  2. #2
    Vincent PETIT
    Animateur Électronique

    Re : programmation arduino lcd et fonction OU

    Salut,
    Tu es entrain de nous dire que tu as écrit tout ça comme code avant de t'apercevoir que l'afficheur n'affichait rien ?

    Il manque en effet un pinMode pour tes broches A0 à A5 sinon elles restent en entrées par défaut.



    C'est juste un conseil que je te donne mais si c'est ta manière de pratiquer, coder 150 lignes avant même de t'être assuré que ça fonctionnait, alors le développement de système embarqué sera un éternel casse tête, il s'apparentera à l'escalade du mont Everest, en slip, les yeux bandés, tes mains dans des gants de boxe et avec des rollers aux pieds

    En étant plus sérieux, cette pratique est le meilleur moyen pour tourner en rond pendant très longtemps. En ayant écrit autant de code sans vérifications préalables, tu peux rencontrer :
    • Un bog logiciel ou
    • Plusieurs bogs logiciels ou
    • Un bog hard ou
    • Plusieurs bogs hards ou
    • Un bog logiciel + Un bog hard ou
    • Plusieurs bogs logiciels + Plusieurs bogs hard ou
    • Les faux bogs qui en réalité sont causés par la bog d'avant
    • etc...

    Une fois que tu te retrouves dans cette situation, tu peux arrêter de chercher ce qui ne fonctionne pas et partir à la rechercher ce qui fonctionne. Lorsqu'on développe on avance en empilant des briques logiciels qu'on a bien testé. La première étape eut été d'afficher un seul caractère sur le LCD pour valider son fonctionnement et identifier le code strictement nécessaire (sans superflue). Ensuite, on affiche une ligne complète pour s'assurer qu'on maîtrise tout. Puis on ajoute les tests et conditions, les if par exemple. On avance par étape, vaidée. De cette manière si il y a un bog quelque part, on le détecte et on le règle au fil de l'eau et pas à la fin car c'est souvent impossible.

    Bon courage.
    Là où il n'y a pas de solution, il n'y a pas de problème.

  3. #3
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    salut

    une grosse partie du code avait être écrite avant,testé au fur et a mesure et surtout fonctionnel (même si ce n'est pas optimisé )

    ce qui me pose problème c'est la partie LCD et la séparation en OU au milieu d'une ligne de programme

    j'ai essayé de faire un truc cet aprem mais au final avec deux fonction if j'ai quand même les deux qui se font... je ne comprend pas....

    j'ai intégré également ça

    pinMode(A0, OUTPUT);
    pinMode(A1, OUTPUT);
    pinMode(A2, OUTPUT);
    pinMode(A3, OUTPUT);
    pinMode(A4, OUTPUT);
    pinMode(A5, OUTPUT);

    mais toujours pas de LCD

    je sèche vraiment en fait (je débute en programmation et mon niveau de maîtrise s’arrête au grafcet avec de la prog sur zelio ou TSX 17)

  4. #4
    carcan

    Re : programmation arduino lcd et fonction OU

    Hello !

    tu ne précises pas le modèle d'ardumachin utilisé ... tous ne peuvent pas utiliser les entrées analogiques (A..) en IO digitales.
    Je ne sais pas non plus si la librairie LCD supporte ça.

    Quand je regarde ton code :
    - tu utilises tout le temps lcd.begin, alors qu'il ne doit être là qu'une seule fois dans le setup
    - tu utilises la pin A0 pour 2 fonctions différentes
    - comment est câblé ton LCD (notamment la pin du contraste) ... As-tu un oscillo pour voir si ça discute sur les lignes du LCD ?
    - comme d'autres te l'on dit ... commence par un Hello World, puis un message différent quand tu presses un bouton, ... Il faut coder petit à petit.

    A+
    Laurent

  5. A voir en vidéo sur Futura
  6. #5
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    salut

    bonne nouvelle la partie LCD fonctionne.... c'est mon potard qui as un faux contact ouf (fonctionne sur un mini pro) je vais retirer les lcd begin en trop

    me reste la partie OU que je n'arrive pas a solutionner

  7. #6
    carcan

    Re : programmation arduino lcd et fonction OU

    Bonne nouvelle !

    c'est quoi ton problème de OU ??
    Si c'est au niveau de tes boutons (pour ne faire qu'une seule tâche même si l'utilisateur presse plusieurs boutons simultanément), il te suffit d'ajouter des "else" :
    Code:
    if (boutonApressé)
    {
       faistonjobA();
    }
    else if (BoutonBpressé)
    {
       faistonjobB();
    }
    else if ...
    Ou tu checke toutes les entrées simultanément
    Code:
    if (boutonApressé && !boutonBpressé && !boutonCpressé)
    {
       faistonjobA();
    }
    A+
    Laurent

  8. #7
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    Code:
    if (digitalRead(PIN_Panto) == LOW) {
        Serial.println("Signal Panto !");
        LCD.clear(); // on efface l'écran
        LCD.print("commande"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("envoie en cours"); // on finit d'écrire
        delay(1100);
        byte message[8] = "VPCPMNT";
        Serial.println("envoie du message au recepteur !");
        Mirf.send(message); // On envoie le message d'action 
        delay (100);
        if (strcmp((char*) message, "OK-MPAN")== 1 );
        {
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande "); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("reception ok"); // on finit d'écrire
        Serial.println("message recu");
        }
        else if (strcmp((char*) message, "OK-MPAN") == 0 );
        {
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("erreur reception"); // on finit d'écrire
        Serial.println("message non recu");
        }
        delay (100);
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("fin d'envoie"); // on finit d'écrire
        Serial.println("fin de l'envoie");
        delay(100);
        Serial.println("en attente de relachement bouton");
        LCD.clear(); // on efface l'écran
        LCD.print("commande "); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("relacher BP"); // on finit d'écrire
        while (digitalRead(PIN_P) == LOW)
        delay(100);
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("fin d'action,"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("Valise prete"); // on finit d'écrire
    la partie orange pose problème à la compilation, en fait normalement l’émetteur (code présenté ci dessus) envoi un message pour activer une sortie sur le récepteur jusque la tout fonctionne et à partir de la le recepteur envoie un message de ce type

    Code:
     if ((strcmp((char*) message, "VPCPMNT") == 0)&& digitalRead (relais == 0)) { 
          digitalWrite(LEDRX, HIGH);                                                      
          delay(1100);                                                                  
          digitalWrite(LEDRX, LOW);                                                     
          byte message[8] = "OK-MPAN";                                                    
          Serial.println("envoie du message au recepteur !");                            
          Mirf.send(message);                                                             
          while(Mirf.isSending());                                                                               
          Serial.println("fin de l'envoie");
    et ensuite coté émetteur ce que je cherche à avoir c'est "oui j'ai eut le message et j'affiche sur l’écran que c'est OK" ou après un laps de temps à définir dire "je n'ai rien reçu" un ping pong au final et je n'arrive pas à faire ça

    merci de ton aide en tout cas

  9. #8
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    hello

    je n'arrive toujours pas a solutionner mon problème... et en plus lorsque je souhaite rajouter un delay après le deuxième if ça déconne encore plus :/

  10. #9
    invite5637435c

    Re : programmation arduino lcd et fonction OU

    la partie orange pose problème à la compilation
    Bonjour,
    quel est le message d'erreur retourné par le compilateur?
    Faudrait commencer par là, vous ne croyez pas?

  11. #10
    invite60ec2530

    Re : programmation arduino lcd et fonction OU



    emeteur:72:5: error: expected '}' before 'else'

    else if (strcmp((char*) message, "OK-MPAN") == 0 );

    ^

    c://emeteur:72:29: error: 'message' was not declared in this scope

    else if (strcmp((char*) message, "OK-MPAN") == 0 );

    ^

    c://emeteur: At global scope:

    emeteur:105:3: error: expected unqualified-id before 'if'

    if (digitalRead(PIN_ADD1) == LOW) {

    ^

    emeteur:149:3: error: expected unqualified-id before 'if'

    if (digitalRead(PIN_ADD2) == LOW) {

    ^

    emeteur:192:1: error: expected declaration before '}' token

    }

    ^

    exit status 1
    expected '}' before 'else'


    voila le message d'erreur du compilateur

    c'est au moment ou je tente de faire ma dérivation en OU (sur le texte en orange plus haut)

    ensuite comment rajouter un indicateur en seconde a cet endroit la "else if (strcmp((char*) message, "OK-MPAN") == 0 && temp en seconde);

    je suis vraiment coincé la

  12. #11
    invite5637435c

    Re : programmation arduino lcd et fonction OU

    Et ben voilà:

    Code:
    if (strcmp((char*) message, "OK-MPAN")== 1 );
    


    retirez le ;

  13. #12
    invite5637435c

    Re : programmation arduino lcd et fonction OU

    Code:
    else if (strcmp((char*) message, "OK-MPAN") == 0 );
    
    


    idem.

  14. #13
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    re

    merci je test ca en fin de journée

    et sur la deuxième ligne comment je peux rajouter une condition temps ? car le delay ne fonctionnait pas

  15. #14
    invite5637435c

    Re : programmation arduino lcd et fonction OU

    Une tempo reste une tempo, la fonction delay est en soit une absurdité, le temps se gère de préférence à travers les interruptions, c'est bien plus propre et non bloquant.
    Je ne suis pas un grand fan des arduino et de ce pseudo langage, vous le découvrirez bien assez tôt si vous traînez un peu ici, je me suis suffisamment exprimé là dessus

    Optez pour un vrai langage et un vrai µC, vous gagnerez votre temps à l'investir dans des concepts pérennes (hard et soft) et exploitables sans avoir à en rougir.
    A moins que vous aimiez les copié-collé et le charabia de code comme 90% de ce que je vois trainer dans les discussions sur ce sujet ici, ce qui est évidemment votre droit.
    Bon courage et bonne suite.
    A+

  16. #15
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    salut

    surement qu'il y a mieux mais il faut bien commencer par quelque chose

    J'ai testé et le retrait des ; a tout arrangé

    par contre le delay non ca me met une ligne rouge

    voila ce que j'ai écrit : else if (strcmp((char*) message, "OK-MPAN") == 0 && delay(4000) )

  17. #16
    invite5637435c

    Re : programmation arduino lcd et fonction OU

    delay(4000) ne retourne pas un état en fin de tempo, il ne faut pas s'y prendre comme ça.
    Si tel avait été le cas il aurait au moins fallut écrire par exemple:
    Code:
    else if (strcmp((char*) message, "OK-MPAN") == 0 && delay(4000) == 0)
    

  18. #17
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    salut

    c'est pareil je me prend une phrase en rouge

  19. #18
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    et sans abuser de toi est il possible que tu m'aide coté récepteur ? ca fonctionnait bien avant sur mon montage précédent car ce n’était que du "reçoit un ordre je fait" mais la il fait n importe quoi avec des conditions

  20. #19
    invite5637435c

    Re : programmation arduino lcd et fonction OU

    Postez votre code modifié.

    Quand on commence la programmation on essaye de structurer simplement avant de mettre des fonctions dans des tests à tout va.
    Il faut regarder la documentation de ces fonctions et voir quelles sont les variables quelles manipulent et retournent éventuellement, puis voir dans quelle mesure on peut en faire des tests ou pas.

  21. #20
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    j'ai mis la phrase de code comme tu m'a donné plus haut

    je ne comprend pas en fait car le montage simple que j'avais codé fonctionne et la des que je rajoute des options ca merde je comprend pas pourquoi... et le récepteur fait ce qu'il veux car j'ai remplacer les boutons par les messages de l'emetteur

  22. #21
    invite5637435c

    Re : programmation arduino lcd et fonction OU

    Repostez les 2 codes en l'état actuel, après les modifications apportées.
    Remplacez des boutons par des messages n'est pas aussi trivial qu'il y parait.

  23. #22
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    Code:
      if (strcmp((char*) message, "OK-MPAN")== 1 )
        {
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande panto"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("reception ok"); // on finit d'écrire
        Serial.println("message recu");
        }
        else if (strcmp((char*) message, "OK-MPAN") == 0 && delay(4000) == 0)
        {
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande panto"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("erreur reception"); // on finit d'écrire
        Serial.println("message non recu");
    }

    voila partie émettrice, dans l'aprem je te poste un diagramme sur ce que je cherche a faire niveau récepteur et le code tel que je l'ai ecrit

    (petite précision il fonctionnait sur un programme précédent ou il n'y avait que deux possibilités et le résultat c’était je m'allume et je m’éteint)

    et je ne sait pas si j'ai un retour correct sur le LCD car j'attend le potard de 10K neuf

  24. #23
    invite5637435c

    Re : programmation arduino lcd et fonction OU

    Code:
      if (strcmp((char*) message, "OK-MPAN")== 1 )
        {
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande panto"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("reception ok"); // on finit d'écrire
        Serial.println("message recu");
        }
      else
        {
        LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
        LCD.clear(); // on efface l'écran
        LCD.print("commande panto"); // on écrit un message
        LCD.setCursor(0,1); //on passe à la ligne suivante
        LCD.print("erreur reception"); // on finit d'écrire
        Serial.println("message non recu");
        }
    Un else suffit.
    Si "OK-MPAN" n'est pas égal à 1, donc si ce message n'est pas présent, c'est qu'il est forcément égal à 0 inutile de le tester à 0, en binaire en tout cas c'est directement conséquent.
    Testez ça et si le compilateur accepte ce code sans erreur se sera déjà un bon début.
    Dernière modification par gienas ; 31/03/2019 à 14h35. Motif: Entré l'accolade fermante dans le code

  25. #24
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    je vais tester ce bout de code ce soir voir si ca fonctionne dans le compilateur, si je voulais rajouter une condition temps c'était surtout pour être sur que le message ne mette pas trop de temps a revenir en fonction de la distance entre l'émetteur et le récepteur

    Pour la partie réception je met un grafcet minimaliste de ce que je souhaite faire et ce soir je posterai le bout de code qui va avec:

    Nom : garfcet minimaliste.jpg
Affichages : 339
Taille : 65,1 Ko

  26. #25
    invite5637435c

    Re : programmation arduino lcd et fonction OU

    Citation Envoyé par dd91650 Voir le message
    si je voulais rajouter une condition temps c'était surtout pour être sur que le message ne mette pas trop de temps a revenir en fonction de la distance entre l'émetteur et le récepteur
    C'est pour cela qu'il faut travailler de préférence avec des interruptions, l'UART se "manisfeste" dès qu'un message arrive pour être traité immédiatement.
    Je regarderai votre document dès qu'il sera validé par la modération.

  27. #26
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    code du récepteur

    Code:
    #include <SPI.h>      // Pour la communication via le port SPI
    #include <Mirf.h>     // Pour la gestion de la communication
    #include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
    #include <MirfHardwareSpiDriver.h> // Pour la communication SPI
    
    const byte relaisp = 4;
    const byte relaisAD1 = 5;
    const byte relaisAD2 = 6;
    const byte LEDRX = 3;
    const byte buzzer = 2;
    
    
    void setup() {
      Serial.begin(9600);
      
      pinMode(relaisp, OUTPUT);
      pinMode(relaisAD1, OUTPUT);
      pinMode(relaisAD2, OUTPUT);
      pinMode(LEDRX, OUTPUT);
      pinMode(buzzer, OUTPUT);
    
      Mirf.cePin = 9; // Broche CE sur D9
      Mirf.csnPin = 10; // Broche CSN sur D10
      Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
      Mirf.init(); // Initialise la bibliothèque
    
      Mirf.channel = 1; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
      Mirf.payload = 8; // Taille d'un message (maximum 32 octets)
      Mirf.config(); // Sauvegarde la configuration dans le module radio
    
      Mirf.setTADDR((byte *) "nrf01"); // Adresse de transmission
      Mirf.setRADDR((byte *) "nrf02"); // Adresse de réception
    
      Serial.println("en attente de reception "); 
    }
    
    void loop() {
      byte message[8];
    
      if(Mirf.dataReady()){
        Mirf.getData(message); // Réception du paquet
    
        
          if ((strcmp((char*) message, "VPCPMNT") == 0)&& digitalRead (relaisp == 0)) { 
          delay(1100);                                                                    
          digitalWrite(LEDRX, LOW);                                                        
          byte message[8] = "OK-MPAN";                                                    
          Serial.println("envoie du message au recepteur !");                             
          Mirf.send(message);                                                             
          while(Mirf.isSending());                                                                                
          Serial.println("fin de l'envoie");                                               
          digitalWrite(buzzer, HIGH);                                                     
          Serial.println("signalisation !");                                
          delay(2100);                                                                   
          digitalWrite(buzzer, LOW);                                                      
          digitalWrite(relaisp, HIGH);                                               
          Serial.println("montée p !");                                         
          delay(1100);                                                                  
          Serial.println("pret - ");
          }
    
            if ((strcmp((char*) message, "VPCPMNT") == 0)&& digitalRead (relaisp == 1) && digitalRead (relaisAD2 == 0) && digitalRead (relaisAD1 == 0)) {   
            digitalWrite(LEDRX, HIGH);                                                                                                                          
            delay(1100);                                                                                                                                        
            digitalWrite(LEDRX, LOW);                                                                                                                           
            byte message[8] = "OK-BPAN";
            Serial.println("envoie du message au recepteur !");
            Mirf.send(message);                                                                                                                                 
            while(Mirf.isSending()); // On attend la fin de l'envoi
            Serial.println("fin de l'envoie"); 
            delay (6000); 
            digitalWrite(buzzer, HIGH);                                                                                                                         
            Serial.println("signalisation !");                                                                                                   
            delay(2100);                                                                                                                                        
            digitalWrite(buzzer, LOW);                                                                                                                          
            delay(2100);                                                                                                                                        
            if (strcmp((char*) message, "VPCPMNT") == 0);                                                                                                          
            Serial.println("validation !");                                                                                                      
            delay(1100);                                                                                                                                         
            digitalWrite(buzzer, HIGH);                                                                                                                         
            delay(3000);                                                                                                                                        
            digitalWrite(buzzer, LOW);                                                                                                                          
            digitalWrite(relaisp, LOW);                                                                                                                     
            Serial.println("descente!");                                                                                                          
            delay(1100);                                                                                                                                        
            Serial.println("pret");
         }
    
            
            if ((strcmp((char*) message, "VPCAD1") == 0) && digitalRead (relaisp == 1) && digitalRead (relaisAD2 == 0)) { 
            digitalWrite(LEDRX, HIGH);                                                                                        
            delay(1100);                                                                                                      
            digitalWrite(LEDRX, LOW);                                                                                         
            byte message[8] = "OK-AD1";
            Serial.println("envoie du message au recepteur !");
            Mirf.send(message);                                                                                               
            while(Mirf.isSending()); // On attend la fin de l'envoi
            delay (6000);
            Serial.println("fin de l'envoie");
            digitalWrite(buzzer, HIGH);                                                                                       
            Serial.println("signalisation action sur ADD !");                                                                 
            delay(1100);                                                                                                      
            digitalWrite(buzzer, LOW);                                                                                        
            delay(1100);                                                                                                      
            (strcmp((char*) message, "VPCAD1") == 0);                                                                      
            delay(1100);                                                                                                      
            digitalWrite(relaisAD1, HIGH);                                                                                   
            delay(1100);                                                                                                      
            while (strcmp((char*) message, "VPCAD1") == 1);
            delay(1100); 
           (strcmp((char*) message, "VPCAD1") == 0);                                                                        
            delay(1100);                                                                                                     
            digitalWrite(relaisAD1, LOW);                                                                                     
            delay(1100);                                                                                                      
           Serial.println("pret"); 
            }
            
            if ((strcmp((char*) message, "VPCAD2") == 0) && digitalRead (relais == 1) && digitalRead (relaisAD1 == 0)) { 
            digitalWrite(LEDRX, HIGH);                                                                                        
            delay(1100);                                                                                                    
            digitalWrite(LEDRX, LOW);                                                                                         
            byte message[8] = "OK-AD2";
            Serial.println("envoie du message au recepteur !");
            Mirf.send(message);                                                                                               
            while(Mirf.isSending()); // On attend la fin de l'envoi
            delay (6000);
            Serial.println("fin de l'envoie");
            digitalWrite(buzzer, HIGH);                                                                                       
            Serial.println("signalisation action sur ADD !");                                                                 
            delay(1100);                                                                                                      
            digitalWrite(buzzer, LOW);                                                                                        
            delay(1100);                                                                                                      
           (strcmp((char*) message, "VPCAD2") == 0);                                                                        
            delay(1100);                                                                                                   
            digitalWrite(relaisAD2, HIGH);                                                                                 
            delay(1100);                                                                                                     
           (strcmp((char*) message, "VPCAD2") == 0);                                                                         
           delay(1100);                                                                                                       
           digitalWrite(relaisAD2, LOW);                                                                                     
            delay(1100);                                                                                                      
           Serial.println("pret");  
    
           }     
    
           }
    
           }

  28. #27
    invite5637435c

    Re : programmation arduino lcd et fonction OU

    Tout ces (longs) délais ne servent à rien, en tout cas ils vont assurément provoquer des embouteillages monstres.

    Comme je le dis souvent, pour un LCD on surveille le bit "busy" et pas besoin de tempos au pif.
    Si je cumule les différentes tempo (bloquantes) de votre code j'arrive à plus de 10s.... c'est pas sérieux.

  29. #28
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    j'avoue peut être abuser des temporisations.... mais c'était une habitude sur les TSX car il leur fallait une variable quand on avait pas d'entrée

  30. #29
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    salut

    j'ai testé en retirant la totalité de la phrase derrière le else et je n'ai pas d'erreur de compilation, en revanche je n'ai pas de notion de temps d'attente si defois le message met du temps a revenir

    coté récepteur j'ai tenté de refaire le début du programme sur le style if et else if mais j'ai toujours la même boucle qui se fait donc je ne comprend pas pourquoi.... si seulement on pouvait programmer en grafcet :'(

  31. #30
    invite60ec2530

    Re : programmation arduino lcd et fonction OU

    parfois dans la boucle ca fonctionne sur le IF et ça se stop comme prévu et parfois ça va chercher le deuxième et me demande bien une validation par le BP et defois non

    Code:
    #include <SPI.h>      // Pour la communication via le port SPI
    #include <Mirf.h>     // Pour la gestion de la communication
    #include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
    #include <MirfHardwareSpiDriver.h> // Pour la communication SPI
    
    const byte relaisp= 4;
    const byte relaisAD1 = 5;
    const byte relaisAD2 = 6;
    const byte LEDRX = 3;
    const byte buzzer = 2;
    
    
    void setup() {
      Serial.begin(9600);
      
      pinMode(relaisp, OUTPUT);
      pinMode(relaisAD1, OUTPUT);
      pinMode(relaisAD2, OUTPUT);
      pinMode(LEDRX, OUTPUT);
      pinMode(buzzer, OUTPUT);
    
      Mirf.cePin = 9; // Broche CE sur D9
      Mirf.csnPin = 10; // Broche CSN sur D10
      Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
      Mirf.init(); // Initialise la bibliothèque
    
      Mirf.channel = 1; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
      Mirf.payload = 8; // Taille d'un message (maximum 32 octets)
      Mirf.config(); // Sauvegarde la configuration dans le module radio
    
      Mirf.setTADDR((byte *) "nrf01"); // Adresse de transmission
      Mirf.setRADDR((byte *) "nrf02"); // Adresse de réception
    
      Serial.println("en attente de reception "); 
    }
    
    void loop() {
      byte message[8];
    
      if(Mirf.dataReady()){
        Mirf.getData(message); // Réception du paquet
    
      if (strcmp((char*) message, "VPCPMNT") == 0) {
        digitalWrite(LEDRX, HIGH);                                                    
          delay(1100);                                                                   
          digitalWrite(LEDRX, LOW);                                                      
          byte message[8] = "OK-MPAN";                                                  
          Serial.println("envoie du message au recepteur !");                           
          Mirf.send(message);                                                            
          while(Mirf.isSending());                                                                      
          Serial.println("fin de l'envoie");                                          
          delay (1100);  
        if (digitalRead (relaisp  == HIGH ))
        {
        digitalWrite(buzzer, HIGH);                                                  
          Serial.println("signalisation !");                                
          delay(2100);                                                                   
          digitalWrite(buzzer, LOW);                                                      
          digitalWrite(relaisp, HIGH);                                              
          Serial.println("montée!");                                         
          Serial.println(" pret");
        }
        else (digitalRead (relaisp == LOW ));
        {
        digitalWrite(buzzer, HIGH);                                                                                                                         
            Serial.println("signalisation!");                                                                                                  
            delay(2100);                                                                                                                                       
            digitalWrite(buzzer, LOW);                                                                                                                         
            delay(2100);                                                                                                                                        
            (strcmp((char*) message, "VPCPMNT") == 0);                                                                                                     
            Serial.println("validation ");                                                                                                      
            delay(1100);                                                                                                                                     
            digitalWrite(buzzer, HIGH);                                                                                                                      
            delay(3000);                                                                                                                                      
            digitalWrite(buzzer, LOW);                                                                                                                          
            digitalWrite(relaisp, LOW);                                                                                                                    
            Serial.println("descente  !");                                                                                                           
            delay(1100);                                                                                                                                      
            Serial.println("pret"); }
    
            } 
    } 
    }

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. [Programmation] [ARDUINO] Programmation fin de course
    Par invite437802bf dans le forum Électronique
    Réponses: 4
    Dernier message: 11/04/2017, 15h42
  2. [Energie] Programmation Arduino
    Par invite80e40774 dans le forum Électronique
    Réponses: 23
    Dernier message: 14/04/2016, 12h54
  3. Programmation Arduino
    Par inviteed8e3936 dans le forum Électronique
    Réponses: 3
    Dernier message: 05/05/2015, 23h34
  4. Programmation arduino
    Par inviteb9f9dbb8 dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 09/04/2015, 08h25
  5. Programmation Arduino
    Par invite6b718bc5 dans le forum Électronique
    Réponses: 4
    Dernier message: 05/03/2015, 13h09
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...