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 :

ESP32 et BLE


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 963
    Par défaut
    Super!! Grand Merci Jay M


    18:11:22.080 -> ets Jul 29 2019 12:21:46
    18:11:22.080 ->
    18:11:22.080 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    18:11:22.080 -> configsip: 0, SPIWP:0xee
    18:11:22.080 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    18:11:22.080 -> modeIO, clock div:1
    18:11:22.080 -> load:0x3fff0030,len:1344
    18:11:22.080 -> load:0x40078000,len:13964
    18:11:22.080 -> load:0x40080400,len:3600
    18:11:22.080 -> entry 0x400805f0
    18:11:22.358 -> E (210) psram: PSRAM ID read error: 0xffffffff
    18:11:22.546 -> 1 Adresse1 : 0xB4 0xE6 0x2D 0x78 0x83 0x54
    18:11:22.546 -> 2 Adresse2 : 0xC8 0x2B 0x96 0x1F 0x7F 0x77
    18:11:22.546 -> 3 Adresse3 : 0x50 0x02 0x91 0x77 0xEE 0xFA
    18:11:22.546 -> 4 Adresse4 : 0xEC 0xFA 0xBC 0xD8 0x28 0xD6
    18:11:22.546 -> 5 Adresse5 : 0x48 0x3F 0xDA 0x67 0xFD 0x5F
    18:11:22.546 -> 6 Adresse6 : 0xA4 0xCF 0x12 0xFC 0xF9 0x3E
    18:11:22.546 -> 7 Adresse7 : 0x40 0xF5 0x20 0x33 0xA5 0xC8
    18:11:22.546 -> 8 Adresse8 : 0xFC 0xF5 0xC4 0xAA 0x5D 0x61
    18:11:22.546 -> 9 Adresse9 : 0xD8 0xBF 0xC0 0x11 0xE6 0xFE
    18:11:22.592 -> ESPNow Init Success
    18:11:26.306 -> Btn 1 enfoncé
    18:11:26.306 -> PC1 Envoyé avec succès
    18:11:26.352 ->
    18:11:26.352 -> État de l'envoi du dernier paquet: Échec // Norma l<== le recepteur non actif
    18:11:57.455 -> Btn 1 relaché
    18:11:57.455 -> PC1 Envoyé avec succès
    18:11:57.455 ->
    18:11:57.455 -> État de l'envoi du dernier paquet: Succès
    18:12:01.402 -> Btn 1 enfoncé
    18:12:01.402 -> PC1 Envoyé avec succès
    18:12:01.402 ->
    18:12:01.402 -> État de l'envoi du dernier paquet: Succès

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 905
    Par défaut
    ESP-NOW est supporté sur les séries ESP8266, ESP32, ESP32-S et ESP32-C

    ==> https://www.espressif.com/en/solutio...utions/esp-now

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 963
    Par défaut
    Bonjour à tous

    j'ai un peu progressé dans ce projet
    pour mémoire , il s'agit de télécommander l'allumage de plusieurs point lumineux non pas par un smartphone mais à partir d'une commande indépendante munie d'une interface TFT

    EMETTEUR : uPesy ESP32 wroom DevKit
    Chaque RECEPTEUR : ESP8266 ESP01


    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
     
    // EMETTEUR uPesy ESP32 Wroom DevKit
    #include <SPI.h>
    #include <TFT_eSPI.h>
    #include <XPT2046_Touchscreen.h> // https : //github. com/PaulStoffregen/XPT2046_Touchscreen
    #include <esp_now.h>
    #include <WiFi.h>
     
    TFT_eSPI tft = TFT_eSPI();
     
    // Touchscreen pins
    #define XPT2046_IRQ 36   // T_IRQ
    #define XPT2046_MOSI 32  // T_DIN
    #define XPT2046_MISO 39  // T_OUT
    #define XPT2046_CLK 25   // T_CLK
    #define XPT2046_CS 33    // T_CS
     
    SPIClass touchscreenSPI = SPIClass(VSPI);
    XPT2046_Touchscreen touchscreen(XPT2046_CS, XPT2046_IRQ);
     
    #define SCREEN_WIDTH 320
    #define SCREEN_HEIGHT 240
    #define FONT_SIZE 2
     
    // definition des boutons
    #define BUTTON_WIDTH  80
    #define BUTTON_HEIGHT 60
    #define BUTTON_MARGIN 10
     
    // Structure pour représenter un bouton
    struct Button {
      int x, y;
      bool state;
    };
     
    Button buttons[9]; // 10 boutons
     
    // Coordonnées de l'écran tactile : (x, y) et pression (z)
    int x, y, z;
     
    // Imprimer les informations de l'écran tactile concernant X, Y et la pression (Z) sur le moniteur série
    void printTouchToSerial(int touchX, int touchY, int touchZ) {
      Serial.print("X = ");
      Serial.print(touchX);
      Serial.print(" | Y = ");
      Serial.print(touchY);
      Serial.print(" | Pressure = ");
      Serial.print(touchZ);
      Serial.println();
    }
     
    /******************************************************/
     
    //******************** Adresse Mac PC01
    uint8_t broadcastAddress1[] = {0xb4, 0xe6, 0x2d, 0x78, 0x83, 0x54};
    // ************** la structure du récepteur
    typedef struct struct_message {
      char a[32];
      bool b;
    } struct_message;
    // Create a struct_message called myData
    struct_message myData;
    esp_now_peer_info_t peerInfo;
    // *****************************rappel lorsque les données sont envoyées
    void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
      Serial.print("\r\nÉtat de l'envoi du dernier paquet:\t");
      Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Succès" : "Échec");
    }
     
    int touchX, touchY, touchZ , i;
     
    //************************************************
    // SETUP
    //************************************************
    void setup()
    {
      Serial.begin(115200);
     
      // Set device as a Wi-Fi Station
      WiFi.mode(WIFI_STA);
      // Init ESP-NOW
      if (esp_now_init() != ESP_OK) {
        Serial.println("Erreur d'initialisation de l'ESP-NOW");
        return;
      }
      // Une fois que ESPNow est Init avec succès, nous nous inscrirons pour l'envoi du CB .
      // obtenir l'état du paquet transmis.
      esp_now_register_send_cb(OnDataSent);
      // Enregistrer un pair
      memcpy(peerInfo.peer_addr, broadcastAddress1, 6);
      peerInfo.channel = 0;  
      peerInfo.encrypt = false;
      // Ajouter un pair        
      if (esp_now_add_peer(&peerInfo) != ESP_OK){
        Serial.println("Échec de l'ajout d'un pair");
        return;
      }
      // Start the SPI for the touchscreen and init the touchscreen
      touchscreenSPI.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
      touchscreen.begin(touchscreenSPI);
      // Set the Touchscreen rotation in landscape mode
      // Note: in some displays, the touchscreen might be upside down, so you might need to set the rotation to 3: touchscreen.setRotation(3);
      touchscreen.setRotation(3);
     
      // Start the tft display
      tft.init();
      // Set the TFT display rotation in landscape mode
      tft.setRotation(1);
     
      // Clear the screen before writing to it
      tft.fillScreen(TFT_BLACK);
     
      // Initialisation des positions des boutons
      int buttonX = 20;
      int buttonY = 20;
      for (int i = 0; i < 9; ++i) 
      {
        buttons[i].x = buttonX;
        buttons[i].y = buttonY;
        buttons[i].state = false;
     
        // Affichage des boutons
        drawButton(buttonX, buttonY, buttons[i].state);
     
        buttonX += BUTTON_WIDTH + BUTTON_MARGIN;
        if (buttonX + BUTTON_WIDTH > tft.width()) {
          buttonX = 20;
          buttonY += BUTTON_HEIGHT + BUTTON_MARGIN;
        }
      }
     
    }
     
    //************************************************
    // LOOP
    //************************************************
    void loop()
    {
     
      // Checks if Touchscreen was touched, and prints X, Y and Pressure (Z) info on the TFT display and Serial Monitor
      if (touchscreen.tirqTouched() && touchscreen.touched()) 
      {
        // Get Touchscreen points
        TS_Point p = touchscreen.getPoint();
        // Calibrate Touchscreen points with map function to the correct width and height
        touchX = map(p.x, 200, 3700, 1, SCREEN_WIDTH);
        touchY = map(p.y, 240, 3800, 1, SCREEN_HEIGHT);
        touchZ = p.z;
     
        //printTouchToSerial(touchX, touchY, touchZ);
     
         for (int i = 0; i < 9; ++i)
         {
            if (touchX >= buttons[i].x && touchX <= buttons[i].x + BUTTON_WIDTH &&
                touchY >= buttons[i].y && touchY <= buttons[i].y + BUTTON_HEIGHT) 
            {
              // Si un bouton est touché, inverse son état et met à jour l'affichage
              buttons[i].state = !buttons[i].state;
              drawButton(buttons[i].x, buttons[i].y, buttons[i].state);
              if ((i==0) && (buttons[0].state ==1)) 
              {
                Serial.println("Btn 1 enfoncé"); 
                // Set values to send
                strcpy(myData.a, "PC01=> ON");
                myData.b =  true;
                // Send message via ESP-NOW
                esp_err_t result = esp_now_send(broadcastAddress1, (uint8_t *) &myData, sizeof(myData));
                if (result == ESP_OK) {
                    Serial.println("PC01 Envoyé avec succès");
                }else {
                    Serial.println("Erreur d'envoi des données PC01");
                } 
              } 
              if((i==0) && (buttons[0].state ==0)) 
              {
                // Set values to send
                strcpy(myData.a, "PC01=> OFF");
                myData.b =  false;
                // Send message via ESP-NOW
                esp_err_t result = esp_now_send(broadcastAddress1, (uint8_t *) &myData, sizeof(myData));
                if (result == ESP_OK)
                {
                  Serial.println("Envoyé avec succès");
                }else{
                  Serial.println("Erreur d'envoi des données");
                }
              }
            }  
        //break;
        delay(200);
        }     
      }
    }
     
    // Dessine un bouton à une position donnée avec un état donné
    void drawButton(int x, int y, bool state) {
      uint16_t color = state ? TFT_RED : TFT_GREEN;
      tft.fillRect(x, y, BUTTON_WIDTH, BUTTON_HEIGHT, color);
      tft.drawRect(x, y, BUTTON_WIDTH, BUTTON_HEIGHT, TFT_WHITE);
     
    }
    Si le logiciel semble fonctionner (essai sur 1er élément seulement)
    il se trouve que je dois répéter dans mon croquis l'opération 8 fois ( car 8 interrupteurs possible )
    et je souhaiterai un peu d'aide pour optimiser cette tâche et surtout tous vos conseils


    merci mille fois
    pascal

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 905
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    Si le logiciel semble fonctionner (essai sur 1er élément seulement)
    il se trouve que je dois répéter dans mon croquis l'opération 8 fois ( car 8 interrupteurs possible )
    et je souhaiterai un peu d'aide pour optimiser cette tâche et surtout tous vos conseils
    Je ne comprends pas ce que vous devez répéter 8 fois ?

  5. #5
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Hello,

    Attention que dans le code, à la ligne 36, le commentaire n'est pas correct, ce qui peut prêter à confusion. Un tableau de N positions (ex. int t[N]) comportera N éléments, mais les indices pour atteindre les éléments varieront de 0 à N-1.

  6. #6
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 963
    Par défaut
    Bonjour à tous ,
    Attention que dans le code, à la ligne 36, le commentaire n'est pas correct,
    Exact , il faut lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Button buttons[9]; //  9 boutons
    Je ne comprends pas ce que vous devez répéter 8 fois ?
    pour tester je n'ai fait que le premier bouton

    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
     
    //******************** Adresse Mac PC01
    uint8_t broadcastAddress1[] = {0xb4, 0xe6, 0x2d, 0x78, 0x83, 0x54};
     
    .../....
     
     if ((i==0) && (buttons[0].state ==1)) 
              {
                Serial.println("Btn 1 enfoncé"); 
                // Set values to send
                strcpy(myData.a, "PC01=> ON");
                myData.b =  true;
                // Send message via ESP-NOW
                esp_err_t result = esp_now_send(broadcastAddress1, (uint8_t *) &myData, sizeof(myData));
                if (result == ESP_OK) {
                    Serial.println("PC01 Envoyé avec succès");
                }else {
                    Serial.println("Erreur d'envoi des données PC01");
                } 
              }
    il me reste donc les 8 autres à exécuter
    mais ma demande est surtout de savoir comment puis-je programmer cela de façon plus "académique"

    merci encore
    pascal

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 905
    Par défaut
    Cool !👍

  8. #8
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 963
    Par défaut
    Merci encore pour votre patience
    Jay M

    -maintenant prochaine étape pour l’Émetteur

    1) passer en mode sommeil
    2) et le réveil de l'ESP32 par touch-ecran TFT

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 905
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    1) passer en mode sommeil
    2) et le réveil de l'ESP32 par touch-ecran TFT
    il faudra regarder si les pins liées aux touch permettent de faire une interruption et voir comment vous pouvez couper l'alimentation de l'écran sans couper la partie touch.

    Souvenez vous aussi que lorsque l'on sort du mode sommeil sur un ESP32, c'est comme s'il rebootait donc votre setup() sera appelé puis la loop(). La seule différence c'est que les variables stockées dans la mémoire RTC auront conservé leurs valeurs.

  10. #10
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 963
    Par défaut
    il faudra regarder si les pins liées aux touch permettent de faire une interruption et voir comment vous pouvez couper l'alimentation de l'écran sans couper la partie touch.
    je me posais la question s'il n'était pas plus facile d'utiliser par ex GPIO4 comme "touch externe" ( TTP223 ) plutôt que m'embarquer à comptabiliser l'ensemble des TFT_TOUCH et surtout de surveiller l'écran en entier
    pour déclencher le réveil de l'ESP32

    Souvenez vous aussi que lorsque l'on sort du mode sommeil sur un ESP32, c'est comme s'il rebootait donc votre setup() sera appelé puis la loop(). La seule différence c'est que les variables stockées dans la mémoire RTC auront conservé leurs valeurs.
    ok c'est noté, mais le croquis charge déjà dans le setup l'ensemble des adresses des ESP01s
    vous pensez à quoi exactement à l'état des boutons par ex ( 1 ou 0 ) ?
    Images attachées Images attachées  

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 905
    Par défaut
    votre test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((i == 0) && (buttons[0].state == 0))
    est au sein d'une boucle ou i va varier de 0 à 8 inclus

    qu'est-ce qui vous empêche d'utiliser l'indice ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (buttons[i].state == 0))
    il suffit de rendre les parties codées en dur comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Serial.println("Btn 1 enfoncé");
    strcpy(myData.a, "PC01=> ON");
    plus dynamiques par exemple en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Serial.print("Btn "); Serial.print(i+1); Serial.println(" enfoncé");
    snprintf(myData.a, sizeof myData.a, "PC%02d=> ON", i+1);

  12. #12
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 963
    Par défaut
    merci Jay M

    je vais essayer mais je ne vois pas comment faire avec l'adresse MAC
    chaque PC a une adresse MAC différente ici pour la PC01 par ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //******************** Adresse Mac PC01
    uint8_t broadcastAddress1[] = {0xb4, 0xe6, 0x2d, 0x78, 0x83, 0x54};
    comment puis-je faire pour y associer la variable i par ex avec l'adresse MAC ?

  13. #13
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Faire un tableau de tableaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    uint8_t broadcastAddress[][6] = {
    	{0xb4, 0xe6, 0x2d, 0x78, 0x83, 0x54},		// adr mac1
    	{0x.., ....                        },		// adr mac2
    		....
    	{0x.., ....                        }		// adr mac8
    };
    Et l'adresse de mac4 se trouve en broadcastAdress[3]

  14. #14
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 905
    Par défaut
    Pour ce qui doit rester un mémoire il faut déclarer votre variable en RTC_DATA_ATTR comme vous avez fait. Ça marche aussi pour les tableaux

    Ensuite je ne sais pas trop à quoi correspond l’état des boutons - si je suis en train de manipuler l’écran alors le système ne devrait pas s’éteindre

  15. #15
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 963
    Par défaut
    Pour ce qui doit rester un mémoire il faut déclarer votre variable en RTC_DATA_ATTR comme vous avez fait. Ça marche aussi pour les tableaux
    du genre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RTC_DATA_ATTR uint8_t etat[] = {0,0,0,0,0,0,0,0,0};
    Ensuite je ne sais pas trop à quoi correspond l’état des boutons - si je suis en train de manipuler l’écran alors le système ne devrait pas s’éteindre
    l'etat 1 = lampe
    l'etat 0 = lampe éteinte

    j'ai mis dans le test clavier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    previousTime=currentTime;
    ce n'est pas suffisant ?


    Pour tester , j'avais mis dans le fichier config.txt et la structure "ClientPC"un champ "etat" supplémentaire , çà évitait d'utiliser l'EEPROM mais çà ne semble pas fonctionner ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    /*** Structure Fichier Config.txt ********************************/
    const size_t tailleMaxNom = 16;     // y compris le caractère nul final
    struct ClientPC {
      char nom[tailleMaxNom];            // le nom du client PC
      bool etat;                               // <=================================
      uint8_t adresse[6];               // les 6 octets de son adresse
    };

  16. #16
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 905
    Par défaut
    Oui
    Mettre les choses en tableau.
    Idéalement on mettrait tout ce qui a trait à un PC dans une structure et on ferait un tableau de structure.

  17. #17
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 963
    Par défaut
    Merci bien

    Je vais essayer de digérer tout çà et je reviens vers vous avec un nouveau croquis

    pascal

  18. #18
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 963
    Par défaut
    Bonsoir

    Voilà mon croquis modifié à partir de vos conseils:
    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
     
    // EMETTEUR uPesy ESP32 Wroom DevKit
    #include <SPI.h>
    #include <TFT_eSPI.h>
    #include <XPT2046_Touchscreen.h> // https : //github. com/PaulStoffregen/XPT2046_Touchscreen
    #include <esp_now.h>
    #include <WiFi.h>
     
    TFT_eSPI tft = TFT_eSPI();
     
    // Touchscreen pins
    #define XPT2046_IRQ 36   // T_IRQ
    #define XPT2046_MOSI 32  // T_DIN
    #define XPT2046_MISO 39  // T_OUT
    #define XPT2046_CLK 25   // T_CLK
    #define XPT2046_CS 33    // T_CS
     
    SPIClass touchscreenSPI = SPIClass(VSPI);
    XPT2046_Touchscreen touchscreen(XPT2046_CS, XPT2046_IRQ);
     
    #define SCREEN_WIDTH 320
    #define SCREEN_HEIGHT 240
    #define FONT_SIZE 2
     
    // definition des boutons
    #define BUTTON_WIDTH  80
    #define BUTTON_HEIGHT 60
    #define BUTTON_MARGIN 10
     
    // Structure pour représenter un bouton
    struct Button {
      int x, y;
      bool state;
    };
     
    Button buttons[9]; // 9 boutons
     
    // Coordonnées de l'écran tactile : (x, y) et pression (z)
    int x, y, z;
     
    // Imprimer les informations de l'écran tactile concernant X, Y et la pression (Z) sur le moniteur série
    void printTouchToSerial(int touchX, int touchY, int touchZ) {
      Serial.print("X = ");
      Serial.print(touchX);
      Serial.print(" | Y = ");
      Serial.print(touchY);
      Serial.print(" | Pressure = ");
      Serial.print(touchZ);
      Serial.println();
    }
     
    /******************************************************/
     
    //******************** Adresse Mac PC01
    //uint8_t broadcastAddress1[] = {0xb4, 0xe6, 0x2d, 0x78, 0x83, 0x54};
     
    uint8_t broadcastAddress[][6] = {
    	{0xb4, 0xe6, 0x2d, 0x78, 0x83, 0x54},		// adr mac1
    	{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},		// adr mac2
    	{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},   // adr mac3
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},   // adr mac4
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},   // adr mac5
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},   // adr mac6
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},   // adr mac7
    	{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},		// adr mac8
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},		// adr mac9
     
    };
     
    // ************** la structure du récepteur
    typedef struct struct_message {
      char a[32];
      bool b;
    } struct_message;
    // Create a struct_message called myData
    struct_message myData;
    esp_now_peer_info_t peerInfo;
    // *****************************rappel lorsque les données sont envoyées
    void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
      Serial.print("\r\nÉtat de l'envoi du dernier paquet:\t");
      Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Succès" : "Échec");
    }
     
    int touchX, touchY, touchZ , i;
     
    //************************************************
    // SETUP
    //************************************************
    void setup()
    {
      Serial.begin(115200);
     
      // Set device as a Wi-Fi Station
      WiFi.mode(WIFI_STA);
      // Init ESP-NOW
      if (esp_now_init() != ESP_OK) {
        Serial.println("Erreur d'initialisation de l'ESP-NOW");
        return;
      }
      // Une fois que ESPNow est Init avec succès, nous nous inscrirons pour l'envoi du CB .
      // obtenir l'état du paquet transmis.
      esp_now_register_send_cb(OnDataSent);
      // Enregistrer un pair
      //memcpy(peerInfo.peer_addr, broadcastAddress, 6);
      memcpy(peerInfo.peer_addr, broadcastAddress, 6);
      peerInfo.channel = 0;  
      peerInfo.encrypt = false;
      // Ajouter un pair        
      if (esp_now_add_peer(&peerInfo) != ESP_OK){
        Serial.println("Échec de l'ajout d'un pair");
        return;
      }
      // Start the SPI for the touchscreen and init the touchscreen
      touchscreenSPI.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
      touchscreen.begin(touchscreenSPI);
      // Set the Touchscreen rotation in landscape mode
      // Note: in some displays, the touchscreen might be upside down, so you might need to set the rotation to 3: touchscreen.setRotation(3);
      touchscreen.setRotation(3);
     
      // Start the tft display
      tft.init();
      // Set the TFT display rotation in landscape mode
      tft.setRotation(1);
     
      // Clear the screen before writing to it
      tft.fillScreen(TFT_BLACK);
     
      // Initialisation des positions des boutons
      int buttonX = 20;
      int buttonY = 20;
      for (int i = 0; i < 9; ++i) 
      {
        buttons[i].x = buttonX;
        buttons[i].y = buttonY;
        buttons[i].state = false;
     
        // Affichage des boutons
        drawButton(buttonX, buttonY, buttons[i].state);
     
        buttonX += BUTTON_WIDTH + BUTTON_MARGIN;
        if (buttonX + BUTTON_WIDTH > tft.width()) {
          buttonX = 20;
          buttonY += BUTTON_HEIGHT + BUTTON_MARGIN;
        }
      }
     
    }
     
    //************************************************
    // LOOP
    //************************************************
    void loop()
    {
     
      // Checks if Touchscreen was touched, and prints X, Y and Pressure (Z) info on the TFT display and Serial Monitor
      if (touchscreen.tirqTouched() && touchscreen.touched()) 
      {
        // Get Touchscreen points
        TS_Point p = touchscreen.getPoint();
        // Calibrate Touchscreen points with map function to the correct width and height
        touchX = map(p.x, 200, 3700, 1, SCREEN_WIDTH);
        touchY = map(p.y, 240, 3800, 1, SCREEN_HEIGHT);
        touchZ = p.z;
     
        //printTouchToSerial(touchX, touchY, touchZ);
     
         for (int i = 0; i < 9; ++i)
         {
            if (touchX >= buttons[i].x && touchX <= buttons[i].x + BUTTON_WIDTH &&
                touchY >= buttons[i].y && touchY <= buttons[i].y + BUTTON_HEIGHT) 
            {
              // Si un bouton est touché, inverse son état et met à jour l'affichage
              buttons[i].state = !buttons[i].state;
              drawButton(buttons[i].x, buttons[i].y, buttons[i].state);
              if (buttons[i].state == 1)
              {
                Serial.print("Btn "); Serial.print(i+1); Serial.println(" enfoncé");
                snprintf(myData.a, sizeof myData.a, "PC%02d=> ON", i+1);
                myData.b =  true;
                esp_err_t result = esp_now_send(broadcastAddress[i], (uint8_t *) &myData, sizeof(myData));
                if (result == ESP_OK) {
                    Serial.print("PC0");Serial.print(i+1); Serial.println(" Envoyé avec succès");
                }else {
                    Serial.print("Erreur d'envoi des données PC0");Serial.print(i+1);
                } 
              } 
              if (buttons[i].state == 0)
              {
                Serial.print("Btn "); Serial.print(i+1); Serial.println(" relaché");
                snprintf(myData.a, sizeof myData.a, "PC%02d=> OFF", i+1);
                myData.b =  false;
                esp_err_t result = esp_now_send(broadcastAddress[i], (uint8_t *) &myData, sizeof(myData));
                if (result == ESP_OK) {
                    Serial.print("PC0");Serial.print(i+1); Serial.println(" Envoyé avec succès");
                }else {
                    Serial.print("Erreur d'envoi des données PC0");Serial.print(i+1);
                } 
              } 
            }  
        //break;
        delay(200);
        }     
      }
    }
     
    // Dessine un bouton à une position donnée avec un état donné
    void drawButton(int x, int y, bool state) {
      uint16_t color = state ? TFT_RED : TFT_GREEN;
      tft.fillRect(x, y, BUTTON_WIDTH, BUTTON_HEIGHT, color);
      tft.drawRect(x, y, BUTTON_WIDTH, BUTTON_HEIGHT, TFT_WHITE);
     
    }
    le logiciel a l'air de "tomber en marche"
    l'appui sur le Btn2 engendre une erreur car pour l'instant je n'ai qu'1 seul ESP01s et donc 1 seule adresse en test

    votre avis ?

    pascal
    Images attachées Images attachées  

  19. #19
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Je ne m'y connais pas trop, mais les adresses pour mac2 à mac9 sont toutes {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} ??? Je doute que soit une adresse mac valide. Alors, fatalement, quand tu appuies sur le bouton pour activer mac2, esp_now_send() n'est pas content.

    Mais je ne pense pas que le programme "tombe en marche". esp_now_send() a bien fonctionné (pas comme tu l'aurais souhaité, mais ça c'est autre chose), et le programme continue à attendre un appui sur un boutton.

    Comme tu n'as qu'un seul esp branché, initialise les adresses de mac2 à mac9 avec celle de mac1. Edit: si tu testes comme cela, active et désactive une mac address avant d'en tester une autre, sinon ça pourrait être le souk.

  20. #20
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 963
    Par défaut
    merci edgarjacobs

    je voulais juste faire un essai avec la 1ere adresse , il est vrai que j'aurai pu copier les autres
    par contre,
    je souhaiterai savoir comment je peux mettre ces adresses de façon auto
    Je m'explique :
    actuellement le logiciel prévoit à terme 9 adresses possibles mais comment puis-je faire à l'aide d'un fichier "config.txt" par ex
    pour initialiser ces adresses au fur et à mesure du raccordements des PC
    en gros si je mets une nouvelle PC , comment puis-je faire pour la faire reconnaitre de façon automatique par le logiciel

    pascal

Discussions similaires

  1. Mesh Network via BLE
    Par matthieuboubou dans le forum Projets
    Réponses: 0
    Dernier message: 21/04/2015, 14h10
  2. [WD18] Bluetooth 4.0 et BLE
    Par ihih45 dans le forum WinDev
    Réponses: 4
    Dernier message: 21/04/2015, 13h40
  3. Reconnaissance des grains de blés coupés
    Par arken dans le forum Traitement d'images
    Réponses: 5
    Dernier message: 08/04/2011, 11h04
  4. Comment sauvegarder bles sources des procedures stockées?
    Par tonton67 dans le forum Développement
    Réponses: 2
    Dernier message: 24/02/2009, 08h53
  5. cas des grains de blé
    Par Maxence45 dans le forum Excel
    Réponses: 13
    Dernier message: 07/11/2007, 19h46

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