Back to TILs

Esp32 with FreeRTOS - Wifi AP

C FreeRTOS Arduino xTaskCreatePinnedToCore wifi SPIFFS

Table of contents

File FreeRTOS_Esp32_wifi_AP.ino

void setup() {
  Serial.begin(115200);

  delay(1000);

  // Initialize SPIFFS
  // if (!SPIFFS.begin(true)) {
  if (!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)) {
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  } else {
    Serial.println("SPIFFS mounted");
  }

  Serial.println("SPIFFS listing:");

  File root = SPIFFS.open("/");
  if (!root) {
    Serial.println("- failed to open directory");
    return;
  }
  if (!root.isDirectory()) {
    Serial.println(" - not a directory");
    return;
  }

  File file = root.openNextFile();
  while (file) {
    if (file.isDirectory()) {
      Serial.print("  DIR : ");
      Serial.println(file.name());
      // if (levels) {
      //   listDir(fs, file.path(), levels - 1);
      // }
    } else {
      Serial.print("  FILE: ");
      Serial.print(file.name());
      Serial.print("\tSIZE: ");
      Serial.println(file.size());
    }
    file = root.openNextFile();
  }

  WiFi.mode(WIFI_AP);

  if (WiFi.softAP(ssid, password)) {
    Serial.println("softAP Ready");
  } else {
    Serial.println("softAP Failed");
  }

  delay(1000);

  // while (WiFi.status() != WL_CONNECTED) {
  //   delay(1000);
  //   Serial.println("Connecting to WiFi..");
  //   Serial.println(WiFi.status());
  // }

  if (WiFi.softAPConfig(local_IP, gateway, subnet)) {
    Serial.println("softAPConfig Ready");
  } else {
    Serial.println("softAPConfig Failed");
  }

  IPAddress myIP = WiFi.softAPIP();

  Serial.print("SSID: ");
  Serial.println(ssid);
  Serial.print("Passworkd: ");
  Serial.println(password);
  Serial.print("AP IP address: ");
  Serial.println(myIP);

  // AsyncCallbackWebHandler& on(
  //   const char* uri,
  //   WebRequestMethodComposite method,
  //   ArRequestHandlerFunction onRequest,
  //   ArUploadHandlerFunction onUpload,
  //   ArBodyHandlerFunction onBody);

  // WebRequestMethodComposite
  //

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
    // Send file
    Serial.println("/");
    Serial.println(request->url());
    // request->send(SPIFFS, "/index.html", String(), false, processor);
    request->send(SPIFFS, "/index.html");
    Serial.println("/ END");
  });
  server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request) {
    // Send file
    Serial.println("/style.css");
    request->send(SPIFFS, "/style.css", "text/css");
  });
  server.on("/on", HTTP_GET, [](AsyncWebServerRequest *request) {
    Serial.println("/on");
    digitalWrite(ledPin, HIGH);
    request->send(SPIFFS, "/index.html", String(), false, processor);
  });
  server.on("/off", HTTP_GET, [](AsyncWebServerRequest *request) {
    Serial.println("/off");
    digitalWrite(ledPin, LOW);
    request->send(SPIFFS, "/index.html", String(), false, processor);
  });

  server.begin();
}
void loop() {}

Compiling the project

# ESP32-WROOM-DA Module                              esp32:esp32:esp32da
# ESP32S3 Dev Module Octal (WROOM2)                  esp32:esp32:esp32s3-octal
# Fri3d Badge 2024 (ESP32-S3-WROOM-1)                esp32:esp32:fri3d_2024_esp32s3
# uPesy ESP32 Wroom DevKit                           esp32:esp32:uPesy_wroom

# LilyGo T-Display                                   esp32:esp32:lilygo_t_display
# LilyGo T-Display-S3                                esp32:esp32:lilygo_t_display_s3
# LilyGo T-ETH-Lite                                  esp32:esp32:lilygo_t_eth_lite
# LilyGo T-Watch-S3                                  esp32:esp32:twatchs3
# LilyGo T-Watch-Ultra                               esp32:esp32:twatch_ultra
# LilyGo T3-S3                                       esp32:esp32:lilygo_t3s3
# LilyGo-T-LoRa-Pager                                esp32:esp32:tlora_pager

BOARD?= esp32:esp32:esp32da
PORT?= /dev/ttyUSB0
BAUD?= 115200
PROJECT_NAME?= FreeRTOS_Esp32_blink
FILE_SYSTEM?=spiffs
# littlefs or spiffs

UPLOAD_SPEED?=921600
FLASH_SIZE?=4M
CPU_FREQ?=240
#PARTITION_SCHEME?= app3M_fat9M_16MB
PARTITION_SCHEME?= default
# VERBOSE?= --verbose
CLEAN?= --clean

BOARD_OPTIONS=FlashMode=qio,PartitionScheme=$(PARTITION_SCHEME),FlashSize=$(FLASH_SIZE),CPUFreq=$(CPU_FREQ)

# --board-options FlashMode=qio,FlashSize=16M,LoopCore=1,EventsCore=1,USBMode=hwcdc,CDCOnBoot=default,MSCOnBoot=default,DFUOnBoot=default,UploadMode=default,PartitionScheme=default_8MB,CPUFreq=240,UploadSpeed=921600,DebugLevel=none,EraseFlash=none

# board            := "esp32:esp32:esp32s3"
# monitor_speed    := "115200"
# flash_size       := "16M"
# cpu_freq         := "240"
# partition_scheme := "app3M_fat9M_16MB"

# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/min_spiffs.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/app3M_fat9M_16MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/app3M_fat9M_fact512k_16MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/app3M_spiffs9M_fact512k_16MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/bare_minimum_2MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/boot_app0.bin
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/default_16MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/default_32MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/default_8MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/default.bin
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/default.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/default_ffat_8MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/default_ffat.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/esp_sr_16.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/ffat.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/huge_app.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/large_fat_32MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/large_ffat_8MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/large_littlefs_32MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/large_spiffs_16MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/large_spiffs_8MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/m5stack_partitions_16MB_factory_4_apps.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/m5stack_partitions_16MB_factory_6_apps.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/max_app_4MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/max_app_8MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/minimal.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/min_spiffs.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/no_fs.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/noota_3g.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/noota_3gffat.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/no_ota.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/noota_ffat.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/ota_nofs_4MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/rainmaker_4MB_no_ota.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/rainmaker_8MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/rainmaker.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/tinyuf2-partitions-16MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/tinyuf2-partitions-16MB-noota.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/tinyuf2-partitions-4MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/tinyuf2-partitions-4MB-noota.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/tinyuf2-partitions-8MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/tinyuf2-partitions-8MB-noota.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/zigbee_2MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/zigbee_8MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/zigbee.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/zigbee_zczr_2MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/zigbee_zczr_8MB.csv
# /home/geraldo/.arduino15/packages/esp32/hardware/esp32/3.2.0/tools/partitions/zigbee_zczr.csv

#partitioncmd := --build-property build.partitions=${PARTITIONTYPE} --build-property upload.maximum_size=${PARTITIONMAX}


all:
	$(Q)echo "Compiling $(PROJECT_NAME)..."
	$(Q)mkdir -p out
	$(Q)arduino-cli compile \
		$(VERBOSE) \
		$(CLEAN) \
		--fqbn $(BOARD) \
		--board-options "$(BOARD_OPTIONS)" \
		--output-dir out \
		$(PROJECT_NAME).ino
	$(MAKE) til
	$(MAKE) til_copy


clean:
	$(RM) -r out
	$(RM) -r til

Update config, toolchain, libraries

.PHONY: update
update:
	$(Q)echo create config at /home/geraldo/.arduino15/arduino-cli.yaml
	$(Q)arduino-cli config init || echo Config file already exists
	$(Q)arduino-cli config set network.connection_timeout 600s
	$(Q)cat /home/geraldo/.arduino15/arduino-cli.yaml
	$(Q)arduino-cli core update-index
	$(Q)arduino-cli core install arduino:avr
	$(Q)arduino-cli core install esp32:esp32
	$(Q)arduino-cli lib uninstall AsyncTCP             # 1.1.4
	$(Q)arduino-cli lib uninstall ESPAsyncTCP          # 
	$(Q)arduino-cli lib uninstall ESPAsyncWebServer    # ESPAsyncWebServer@3.1.0
	$(Q)arduino-cli lib install "ESP Async TCP"        # 2.0.0
	$(Q)arduino-cli lib install "Async TCP"            # 3.4.4
	$(Q)arduino-cli lib install "ESP Async WebServer"  # ESP Async WebServer@3.7.8
	$(Q)arduino-cli upgrade

Upload binary to the board

.PHONY: upload
upload:
	$(Q)arduino-cli upload \
		$(VERBOSE) \
		$(shell pwd) \
		--input-dir out/ \
		--port $(PORT) \
		--fqbn $(BOARD) \
		--board-options "$(BOARD_OPTIONS)" \
		--verify

Upload binary to the board

.PHONY: upload_with_data
upload_with_data:
	$(Q)arduino-cli upload \
		$(VERBOSE) \
		"$(shell pwd)","$(FILE_SYSTEM)" \
		--input-dir out/ \
		--port $(PORT) \
		--fqbn $(BOARD) \
		--board-options "$(BOARD_OPTIONS)" \
		--verify

Open serial monitor in another terminal

.PHONY: serial
serial10:
	$(Q)xfce4-terminal -x picocom $(PORT) \
		--baud $(BAUD) \
		--echo \
		--exit-after 10000

serial:
	$(Q)xfce4-terminal -x picocom $(PORT) \
		--baud $(BAUD) \
		--echo \