esp_idf
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| esp_idf [2024/06/15 19:01] – [Plusieurs valeurs en même temps] jp | esp_idf [2024/06/26 00:01] (Version actuelle) – [ADC] jp | ||
|---|---|---|---|
| Ligne 6: | Ligne 6: | ||
| Aller dans le menu " | Aller dans le menu " | ||
| Installer l' | Installer l' | ||
| + | Vérifier que vous avez bien la dernière version d' | ||
| + | |||
| ===== Créer un 1er projet ===== | ===== Créer un 1er projet ===== | ||
| Ligne 55: | Ligne 57: | ||
| </ | </ | ||
| - | delay() est bien souvent une fonction bloquante qui va demander à votre micro de tourner en boucle et ne fera rien d' | + | delay() est bien souvent une fonction bloquante qui va demander à votre micro de tourner en boucle et ne fera rien d' |
| - | Arduino propose aussi une méthode millis() qui renvoie le nombre de millisecondes | + | Arduino propose aussi une méthode millis() qui renvoie le nombre de millisecondes |
| Il s'agit d'un compteur qui est incrémenté par un timer.\\ | Il s'agit d'un compteur qui est incrémenté par un timer.\\ | ||
| - | Il est possible de comparer " | + | Il est possible de comparer " |
| Le code n'est plus bloquant mais cela implique de créer un nombre important de variables et transformer votre code en usine à gaz si vous avez plusieurs taches à exécuter. | Le code n'est plus bloquant mais cela implique de créer un nombre important de variables et transformer votre code en usine à gaz si vous avez plusieurs taches à exécuter. | ||
| Ligne 126: | Ligne 128: | ||
| Résultat: Un entier 12 | Résultat: Un entier 12 | ||
| + | |||
| + | ==== Un nombre entier sur 3 digits ==== | ||
| + | |||
| + | <code c> | ||
| + | int8_t val = 12; | ||
| + | printf(" | ||
| + | </ | ||
| + | |||
| + | Résultat: Un entier 012 | ||
| + | |||
| ==== Un nombre entier négatif ==== | ==== Un nombre entier négatif ==== | ||
| Ligne 171: | Ligne 183: | ||
| ===== String ===== | ===== String ===== | ||
| + | |||
| + | ==== Concaténation ==== | ||
| On a souvent besoin de manipuler des chaînes de caractères. | On a souvent besoin de manipuler des chaînes de caractères. | ||
| Ligne 187: | Ligne 201: | ||
| printf(" | printf(" | ||
| } | } | ||
| - | < | + | </code> |
| Résultat : Trame: ESP32-C6, | Résultat : Trame: ESP32-C6, | ||
| Ligne 193: | Ligne 207: | ||
| Il est évidement possible d' | Il est évidement possible d' | ||
| + | ===== ESP-NOW ===== | ||
| + | |||
| + | L' | ||
| + | |||
| + | Avantages :\\ | ||
| + | * Simple à mettre en œuvre | ||
| + | * Pas de temps d' | ||
| + | * Pas de réseau (Pas de réseau ESP-NOW à créer, pas de réseau Wifi à rejoindre, pas de gateway, c'est du vrai point à point) | ||
| + | * Possibilité de crypter les trames | ||
| + | * Pas besoin de déclarer l' | ||
| + | * Portée plus importante que du Wifi classique | ||
| + | * Consommation réduite | ||
| + | |||
| + | Inconvénients : \\ | ||
| + | * Limité à 20 devices (On a néanmoins la possibilité de broadcaster une trame à tout le monde et donc d' | ||
| + | * Pas de gestion des collisions | ||
| + | |||
| + | Exemple de code pour un récepteur: | ||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | void onReceiveData(const esp_now_recv_info_t *esp_now_info, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | static void init_espnow(void) | ||
| + | { | ||
| + | if (esp_now_init() != ESP_OK) { | ||
| + | printf(" | ||
| + | return; | ||
| + | } | ||
| + | else | ||
| + | printf(" | ||
| + | |||
| + | esp_now_register_recv_cb(onReceiveData); | ||
| + | } | ||
| + | |||
| + | static void init_wifi(void) | ||
| + | { | ||
| + | const wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); | ||
| + | esp_err_t ret = nvs_flash_init(); | ||
| + | if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { | ||
| + | ESP_ERROR_CHECK( nvs_flash_erase() ); | ||
| + | ret = nvs_flash_init(); | ||
| + | } | ||
| + | ESP_ERROR_CHECK( ret ); | ||
| + | ESP_ERROR_CHECK( esp_netif_init()); | ||
| + | ESP_ERROR_CHECK( esp_event_loop_create_default() ); | ||
| + | ESP_ERROR_CHECK( esp_wifi_init(& | ||
| + | ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) ); | ||
| + | ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); | ||
| + | ESP_ERROR_CHECK( esp_wifi_start() ); | ||
| + | } | ||
| + | |||
| + | void app_main(void) | ||
| + | { | ||
| + | init_wifi(); | ||
| + | init_espnow(); | ||
| + | |||
| + | while (1) { | ||
| + | vTaskDelay(100/ | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | ** Data Received ** | ||
| + | Source: 40: | ||
| + | Destination: | ||
| + | Length: 4 byte(s) | ||
| + | Data: 65 | ||
| + | </ | ||
| + | |||
| + | |||
| + | Exemple de code pour un émetteur: | ||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | uint8_t broadcastAddress[] = {0xFF, | ||
| + | esp_now_peer_info_t peerInfo; | ||
| + | int x = 65; | ||
| + | |||
| + | void onReceiveData(const esp_now_recv_info_t *esp_now_info, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | static void init_espnow(void) | ||
| + | { | ||
| + | if (esp_now_init() != ESP_OK) { | ||
| + | printf(" | ||
| + | return; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | printf(" | ||
| + | SetColorWhite(); | ||
| + | } | ||
| + | memcpy(peerInfo.peer_addr, | ||
| + | peerInfo.channel = 0; | ||
| + | peerInfo.encrypt = false; | ||
| + | if (esp_now_add_peer(& | ||
| + | printf(" | ||
| + | return; | ||
| + | } | ||
| + | esp_now_register_recv_cb(onReceiveData); | ||
| + | } | ||
| + | |||
| + | static void init_wifi(void) | ||
| + | { | ||
| + | const wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); | ||
| + | esp_err_t ret = nvs_flash_init(); | ||
| + | if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { | ||
| + | ESP_ERROR_CHECK( nvs_flash_erase() ); | ||
| + | ret = nvs_flash_init(); | ||
| + | } | ||
| + | ESP_ERROR_CHECK( ret ); | ||
| + | ESP_ERROR_CHECK( esp_netif_init()); | ||
| + | ESP_ERROR_CHECK( esp_event_loop_create_default() ); | ||
| + | ESP_ERROR_CHECK( esp_wifi_init(& | ||
| + | ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) ); | ||
| + | ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); | ||
| + | ESP_ERROR_CHECK( esp_wifi_start() ); | ||
| + | } | ||
| + | |||
| + | void app_main(void) | ||
| + | { | ||
| + | init_wifi(); | ||
| + | init_espnow(); | ||
| + | |||
| + | while (1) { | ||
| + | |||
| + | esp_err_t result = esp_now_send(broadcastAddress, | ||
| + | if (result == ESP_OK) { | ||
| + | printf(" | ||
| + | } | ||
| + | else { | ||
| + | printf(" | ||
| + | } | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | On peut évidement combiner les codes pour faire un émetteur/ | ||
| + | |||
| + | ===== LOG ===== | ||
| + | |||
| + | Espressif a développé un système de log via la liaison série assez puissant. | ||
| + | Au lieu d' | ||
| + | |||
| + | Texte informatif en vert\\ | ||
| + | <code c> | ||
| + | ESP_LOGI(TAG," | ||
| + | </ | ||
| + | |||
| + | Texte d' | ||
| + | <code c> | ||
| + | ESP_LOGE(TAG," | ||
| + | </ | ||
| + | |||
| + | Texte d' | ||
| + | <code c> | ||
| + | ESP_LOGW(TAG," | ||
| + | </ | ||
| + | |||
| + | TAG va permettre de mettre un prefix devant la ligne afin d' | ||
| + | <code c> | ||
| + | static const char *TAG = " | ||
| + | </ | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include " | ||
| + | |||
| + | static const char *TAG = " | ||
| + | |||
| + | void app_main(void) | ||
| + | { | ||
| + | uint8_t broadcastAddress[] = {0xFF, 0xFF, | ||
| + | uint8_t len =6; | ||
| + | | ||
| + | ESP_LOGI(TAG," | ||
| + | | ||
| + | ESP_LOGE(TAG," | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | L' | ||
| + | |||
| + | <code c> | ||
| + | esp_log_level_set(" | ||
| + | </ | ||
| + | Uniquement les log d' | ||
| + | |||
| + | <code c> | ||
| + | esp_log_level_set(" | ||
| + | </ | ||
| + | Uniquement les log d' | ||
| + | |||
| + | <code c> | ||
| + | esp_log_level_set(" | ||
| + | </ | ||
| + | Aucun log n'est affiché | ||
| + | |||
| + | Ce qui permet de mettre beaucoup de log mais de n' | ||
| + | |||
| + | ===== ADC ===== | ||
| + | |||
| + | La mise en oeuvre de l'ADC de l' | ||
| + | Il faut savoir que l' | ||
| + | C'est pour cette raison, qu'il est necessaire de réaliser une calibration de cette référence lors de l' | ||
| + | |||
| + | Voici les étapes d' | ||
| + | __Etape 1:__ \\ | ||
| + | Configuration de l'ADC1 pour une lecture ponctuelle. | ||
| + | Cette méthode retourne un handle vers l'ADC1 | ||
| + | <code c> | ||
| + | adc_oneshot_unit_init_cfg_t init_config1 = { | ||
| + | .unit_id = ADC_UNIT_1, | ||
| + | }; | ||
| + | ESP_ERROR_CHECK(adc_oneshot_new_unit(& | ||
| + | </ | ||
| + | |||
| + | __Etape 2:__ \\ | ||
| + | Configuration de l'ADC pour retourner une valeur sur 12bits et d’atténuer le signal d' | ||
| + | Ce qui veut dire que l' | ||
| + | La tension appliquée sur l' | ||
| + | Donc 3.3V donnera 0.828V sur l' | ||
| + | |||
| + | On configure également l' | ||
| + | <code c> | ||
| + | adc_oneshot_chan_cfg_t config = { | ||
| + | .bitwidth = ADC_BITWIDTH_DEFAULT, | ||
| + | .atten = ADC_ATTEN_DB_12, | ||
| + | }; | ||
| + | ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, | ||
| + | </ | ||
| + | |||
| + | __Etape 3:__ | ||
| + | |||
| + | Une fois la configuration terminée, on lance la calibration de l'ADC. | ||
| + | <code c> | ||
| + | adc_cali_curve_fitting_config_t cali_config = { | ||
| + | .unit_id = ADC_UNIT_1, | ||
| + | .chan = ADC_CHANNEL_5, | ||
| + | .atten = ADC_ATTEN_DB_12, | ||
| + | .bitwidth = ADC_BITWIDTH_DEFAULT, | ||
| + | }; | ||
| + | esp_err_t ret = adc_cali_create_scheme_curve_fitting(& | ||
| + | </ | ||
| + | |||
| + | __Etape 4:__ | ||
| + | Une fois la configuration réalisée, il ne reste plus qu'à lire la valeur mesurée par l' | ||
| + | La mesure se fait en 2 étapes. La première consiste à récupérer la valeur brute de l'ADC et la 2ème consiste à convertir cette tension par rapport à l' | ||
| + | |||
| + | <code c> | ||
| + | ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, | ||
| + | ESP_LOGI(TAG, | ||
| + | | ||
| + | ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc1_cali_chan0_handle, | ||
| + | ESP_LOGI(TAG, | ||
| + | </ | ||
| + | |||
| + | Exemple complet: | ||
| + | <code c> | ||
| + | |||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | const static char *TAG = " | ||
| + | |||
| + | adc_oneshot_unit_handle_t adc1_handle; | ||
| + | | ||
| + | |||
| + | static int adc_raw; | ||
| + | static int voltage; | ||
| + | |||
| + | static void init_adc() | ||
| + | { | ||
| + | // | ||
| + | adc_oneshot_unit_init_cfg_t init_config1 = { | ||
| + | .unit_id = ADC_UNIT_1, | ||
| + | }; | ||
| + | ESP_ERROR_CHECK(adc_oneshot_new_unit(& | ||
| + | |||
| + | // | ||
| + | adc_oneshot_chan_cfg_t config = { | ||
| + | .bitwidth = ADC_BITWIDTH_DEFAULT, | ||
| + | .atten = ADC_ATTEN_DB_12, | ||
| + | }; | ||
| + | ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, | ||
| + | |||
| + | // | ||
| + | adc_cali_curve_fitting_config_t cali_config = { | ||
| + | .unit_id = ADC_UNIT_1, | ||
| + | .chan = ADC_CHANNEL_5, | ||
| + | .atten = ADC_ATTEN_DB_12, | ||
| + | .bitwidth = ADC_BITWIDTH_DEFAULT, | ||
| + | }; | ||
| + | esp_err_t ret = adc_cali_create_scheme_curve_fitting(& | ||
| + | |||
| + | if (ret == ESP_OK) { | ||
| + | ESP_LOGI(TAG, | ||
| + | } else if (ret == ESP_ERR_NOT_SUPPORTED) { | ||
| + | ESP_LOGW(TAG, | ||
| + | } else { | ||
| + | ESP_LOGE(TAG, | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void app_main(void) | ||
| + | { | ||
| + | init_adc(); | ||
| + | |||
| + | |||
| + | while (1) { | ||
| + | ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, | ||
| + | ESP_LOGI(TAG, | ||
| + | | ||
| + | ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc1_cali_chan0_handle, | ||
| + | ESP_LOGI(TAG, | ||
| + | | ||
| + | vTaskDelay(1000/ | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | {{: | ||
esp_idf.1718470895.txt.gz · Dernière modification : 2024/06/15 19:01 de jp
