Last active
July 18, 2023 18:10
-
-
Save LaboratorioGluon/d2b026c1e6edcd547adcf52521153dfb to your computer and use it in GitHub Desktop.
Simplest ESP32 OTA using ESP-IDF
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************* | |
* | |
* Code created by Laboratorio Gluon | |
* www.laboratoriogluon.com | |
* | |
********************************************/ | |
#include "freertos/FreeRTOS.h" | |
#include "freertos/task.h" | |
#include "esp_system.h" | |
#include "esp_event.h" | |
#include "esp_log.h" | |
#include "esp_ota_ops.h" | |
#include "esp_http_client.h" | |
#include "esp_https_ota.h" | |
#include "esp_wifi.h" | |
#include "esp_event.h" | |
#include "string.h" | |
#include "nvs.h" | |
#include "nvs_flash.h" | |
#include <sys/socket.h> | |
/********** HAY QUE CAMBIAR SOLO ESTO ************/ | |
#define BIN_URL "http://192.168.1.133:8000/firmware.bin" | |
/*************************************************/ | |
extern void wifi_init_sta(); | |
static const char *TAG = "simple_ota_example"; | |
#define OTA_URL_SIZE 256 | |
esp_err_t _http_event_handler(esp_http_client_event_t *evt) | |
{ | |
switch (evt->event_id) { | |
case HTTP_EVENT_ERROR: | |
ESP_LOGD(TAG, "HTTP_EVENT_ERROR"); | |
break; | |
case HTTP_EVENT_ON_CONNECTED: | |
ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED"); | |
break; | |
case HTTP_EVENT_HEADER_SENT: | |
ESP_LOGD(TAG, "HTTP_EVENT_HEADER_SENT"); | |
break; | |
case HTTP_EVENT_ON_HEADER: | |
ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value); | |
break; | |
case HTTP_EVENT_ON_DATA: | |
ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len); | |
break; | |
case HTTP_EVENT_ON_FINISH: | |
ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH"); | |
break; | |
case HTTP_EVENT_DISCONNECTED: | |
ESP_LOGD(TAG, "HTTP_EVENT_DISCONNECTED"); | |
break; | |
case HTTP_EVENT_REDIRECT: | |
ESP_LOGD(TAG, "HTTP_EVENT_REDIRECT"); | |
break; | |
} | |
return ESP_OK; | |
} | |
void simple_ota_example_task(void *pvParameter) | |
{ | |
ESP_LOGI(TAG, "Starting OTA example task"); | |
esp_http_client_config_t config = { | |
.url = BIN_URL, | |
.event_handler = _http_event_handler, | |
.keep_alive_enable = true, | |
}; | |
esp_https_ota_config_t ota_config = { | |
.http_config = &config, | |
}; | |
ESP_LOGI(TAG, "Attempting to download update from %s", config.url); | |
esp_err_t ret = esp_https_ota(&ota_config); | |
if (ret == ESP_OK) { | |
ESP_LOGI(TAG, "OTA Succeed, Rebooting..."); | |
esp_restart(); | |
} else { | |
ESP_LOGE(TAG, "Firmware upgrade failed"); | |
} | |
while (1) { | |
vTaskDelay(1000 / portTICK_PERIOD_MS); | |
} | |
} | |
void app_main(void) | |
{ | |
ESP_LOGI(TAG, "OTA example app_main start"); | |
// Initialize NVS. | |
esp_err_t err = nvs_flash_init(); | |
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { | |
// 1.OTA app partition table has a smaller NVS partition size than the non-OTA | |
// partition table. This size mismatch may cause NVS initialization to fail. | |
// 2.NVS partition contains data in new format and cannot be recognized by this version of code. | |
// If this happens, we erase NVS partition and initialize NVS again. | |
ESP_ERROR_CHECK(nvs_flash_erase()); | |
err = nvs_flash_init(); | |
} | |
ESP_ERROR_CHECK(err); | |
// Initialize and connect to Wifi | |
wifi_init_sta(); | |
xTaskCreate(&simple_ota_example_task, "ota_example_task", 8192, NULL, 5, NULL); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[env:esp32doit-devkit-v1] | |
platform = espressif32 | |
board = esp32doit-devkit-v1 | |
framework = espidf | |
monitor_speed = 115200 | |
board_build.partitions=partitions_two_ota_coredump.csv |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "freertos/FreeRTOS.h" | |
#include "freertos/event_groups.h" | |
#include "esp_wifi.h" | |
#include "esp_log.h" | |
#define WIFI_SSID <TU_SSID_AQUI> | |
#define WIFI_PWD <CONTRASENYA_WIFI> | |
static EventGroupHandle_t s_wifi_event_group; | |
static int s_retry_num = 0; | |
#define WIFI_CONNECTED_BIT BIT0 | |
#define WIFI_FAIL_BIT BIT1 | |
static const char *TAG = "WIFI"; | |
static void event_handler(void* arg, esp_event_base_t event_base, | |
int32_t event_id, void* event_data) | |
{ | |
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { | |
esp_wifi_connect(); | |
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { | |
if (s_retry_num < 5) { | |
esp_wifi_connect(); | |
s_retry_num++; | |
ESP_LOGI(TAG, "retry to connect to the AP"); | |
} else { | |
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); | |
} | |
ESP_LOGI(TAG,"connect to the AP fail"); | |
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { | |
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; | |
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); | |
s_retry_num = 0; | |
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); | |
} | |
} | |
void wifi_init_sta(void) | |
{ | |
s_wifi_event_group = xEventGroupCreate(); | |
ESP_ERROR_CHECK(esp_netif_init()); | |
ESP_ERROR_CHECK(esp_event_loop_create_default()); | |
esp_netif_create_default_wifi_sta(); | |
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); | |
ESP_ERROR_CHECK(esp_wifi_init(&cfg)); | |
esp_event_handler_instance_t instance_any_id; | |
esp_event_handler_instance_t instance_got_ip; | |
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, | |
ESP_EVENT_ANY_ID, | |
&event_handler, | |
NULL, | |
&instance_any_id)); | |
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, | |
IP_EVENT_STA_GOT_IP, | |
&event_handler, | |
NULL, | |
&instance_got_ip)); | |
wifi_config_t wifi_config = { | |
.sta = { | |
.ssid = WIFI_SSID, | |
.password = WIFI_PWD, | |
.threshold.authmode = WIFI_AUTH_WPA2_PSK, | |
}, | |
}; | |
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); | |
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) ); | |
ESP_ERROR_CHECK(esp_wifi_start() ); | |
ESP_LOGI(TAG, "wifi_init_sta finished."); | |
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, | |
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, | |
pdFALSE, | |
pdFALSE, | |
portMAX_DELAY); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment