Thanksfully if you have ESP32 sketches, they'll 'just work' with variations of ESP32. You can find a wide range of examples in the File->Examples->Examples for Adafruit Metro ESP32-S2 subheading (the name of the board may vary so it could be "Examples for Adafruit Feather ESP32 V2" etc)
Let's start by scanning the local networks.
Load up the WiFiScan example under Examples->Examples for YOUR BOARDNAME->WiFi->WiFiScan
And upload this example to your board. The ESP32 should scan and find WiFi networks around you.
For ESP32, open the serial monitor, to see the scan begin.
For ESP32-S2, -S3 and -C3, don't forget you have to click Reset after uploading through the ROM bootloader. Then select the new USB Serial port created by the ESP32. It will take a few seconds for the board to complete the scan.
If you can not scan any networks, check your power supply. You need a solid power supply in order for the ESP32 to not brown out. A skinny USB cable or drained battery can cause issues.
WiFi Connection Test
Now that you can scan networks around you, its time to connect to the Internet!
Copy the example below and paste it into the Arduino IDE:
// SPDX-FileCopyrightText: 2020 Brent Rubell for Adafruit Industries // // SPDX-License-Identifier: MIT /* Web client This sketch connects to a website (wifitest.adafruit.com/testwifi/index.html) using the WiFi module. This example is written for a network using WPA encryption. For WEP or WPA, change the Wifi.begin() call accordingly. This example is written for a network using WPA encryption. For WEP or WPA, change the Wifi.begin() call accordingly. created 13 July 2010 by dlf (Metodo2 srl) modified 31 May 2012 by Tom Igoe */ #include <WiFi.h> // Enter your WiFi SSID and password char ssid[] = "YOUR_SSID"; // your network SSID (name) char pass[] = "YOUR_SSID_PASSWORD"; // your network password (use for WPA, or use as key for WEP) int keyIndex = 0; // your network key Index number (needed only for WEP) int status = WL_IDLE_STATUS; // if you don't want to use DNS (and reduce your sketch size) // use the numeric IP instead of the name for the server: //IPAddress server(74,125,232,128); // numeric IP for Google (no DNS) char server[] = "wifitest.adafruit.com"; // name address for adafruit test char path[] = "/testwifi/index.html"; // Initialize the Ethernet client library // with the IP address and port of the server // that you want to connect to (port 80 is default for HTTP): WiFiClient client; void setup() { //Initialize serial and wait for port to open: Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // attempt to connect to Wifi network: Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Connected to WiFi"); printWifiStatus(); Serial.println("\nStarting connection to server..."); // if you get a connection, report back via serial: if (client.connect(server, 80)) { Serial.println("connected to server"); // Make a HTTP request: client.print("GET "); client.print(path); client.println(" HTTP/1.1"); client.print("Host: "); client.println(server); client.println("Connection: close"); client.println(); } } void loop() { // if there are incoming bytes available // from the server, read them and print them: while (client.available()) { char c = client.read(); Serial.write(c); } // if the server's disconnected, stop the client: if (!client.connected()) { Serial.println(); Serial.println("disconnecting from server."); client.stop(); // do nothing forevermore: while (true) { delay(100); } } } void printWifiStatus() { // print the SSID of the network you're attached to: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print your board's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); }
NOTE: You must change the SECRET_SSID
and SECRET_PASS
in the example code to your WiFi SSID and password before uploading this to your board.
After you've set it correctly, upload and check the serial monitor. You should see the following. If not, go back, check wiring, power and your SSID/password
Secure Connection Example
Many servers today do not allow non-SSL connectivity. Lucky for you the ESP32 has a great TLS/SSL stack so you can have that all taken care of for you. Here's an example of a using a secure WiFi connection to connect to the Twitter API.
Copy and paste it into the Arduino IDE:
// SPDX-FileCopyrightText: 2015 Arturo Guadalupi // SPDX-FileCopyrightText: 2020 Brent Rubell for Adafruit Industries // // SPDX-License-Identifier: MIT /* This example creates a client object that connects and transfers data using always SSL. It is compatible with the methods normally related to plain connections, like client.connect(host, port). Written by Arturo Guadalupi last revision November 2015 */ #include <WiFiClientSecure.h> // Enter your WiFi SSID and password char ssid[] = "YOUR_SSID"; // your network SSID (name) char pass[] = "YOUR_SSID_PASSWORD"; // your network password (use for WPA, or use as key for WEP) int keyIndex = 0; // your network key Index number (needed only for WEP) int status = WL_IDLE_STATUS; // if you don't want to use DNS (and reduce your sketch size) // use the numeric IP instead of the name for the server: //IPAddress server(74,125,232,128); // numeric IP for Google (no DNS) #define SERVER "cdn.syndication.twimg.com" #define PATH "/widgets/followbutton/info.json?screen_names=adafruit" // Initialize the SSL client library // with the IP address and port of the server // that you want to connect to (port 443 is default for HTTPS): WiFiClientSecure client; void setup() { //Initialize serial and wait for port to open: Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // attempt to connect to Wifi network: Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Connected to WiFi"); printWifiStatus(); client.setInsecure(); // don't use a root cert Serial.println("\nStarting connection to server..."); // if you get a connection, report back via serial: if (client.connect(SERVER, 443)) { Serial.println("connected to server"); // Make a HTTP request: client.println("GET " PATH " HTTP/1.1"); client.println("Host: " SERVER); client.println("Connection: close"); client.println(); } } uint32_t bytes = 0; void loop() { // if there are incoming bytes available // from the server, read them and print them: while (client.available()) { char c = client.read(); Serial.write(c); bytes++; } // if the server's disconnected, stop the client: if (!client.connected()) { Serial.println(); Serial.println("disconnecting from server."); client.stop(); Serial.print("Read "); Serial.print(bytes); Serial.println(" bytes"); // do nothing forevermore: while (true); } } void printWifiStatus() { // print the SSID of the network you're attached to: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print your board's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); }
As before, update the ssid and password first, then upload the example to your board.
Note we use WiFiClientSecure client
instead of WiFiClient client;
to require a SSL connection! This example will connect to a twitter server to download a JSON snippet that says how many followers adafruit has
JSON Parsing Demo
This example is a little more advanced - many sites will have API's that give you JSON data. We will build on the previous SSL example to connect to twitter and get that JSON data chunk
Then we'll use ArduinoJSON to convert that to a format we can use and then display that data on the serial port (which can then be re-directed to a display of some sort)
First up, use the Library manager to install ArduinoJSON.
Then load the example JSONdemo by copying the code below and pasting it into your Arduino IDE.
// SPDX-FileCopyrightText: 2014 Benoit Blanchon // SPDX-FileCopyrightText: 2014 Arturo Guadalupi // SPDX-FileCopyrightText: 2020 Brent Rubell for Adafruit Industries // // SPDX-License-Identifier: MIT /* This example creates a client object that connects and transfers data using always SSL, then shows how to parse a JSON document in an HTTP response. It is compatible with the methods normally related to plain connections, like client.connect(host, port). Written by Arturo Guadalupi + Copyright Benoit Blanchon 2014-2019 last revision November 2015 */ #include <WiFiClientSecure.h> #include <ArduinoJson.h> #include <Wire.h> // uncomment the next line if you have a 128x32 OLED on the I2C pins //#define USE_OLED // uncomment the next line to deep sleep between requests //#define USE_DEEPSLEEP #if defined(USE_OLED) // Some boards have TWO I2C ports, how nifty. We should use the second one sometimes #if defined(ARDUINO_ADAFRUIT_QTPY_ESP32S2) || \ defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3_NOPSRAM) || \ defined(ARDUINO_ADAFRUIT_QTPY_ESP32_PICO) #define OLED_I2C_PORT &Wire1 #else #define OLED_I2C_PORT &Wire #endif #include <Adafruit_SSD1306.h> Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, OLED_I2C_PORT); #endif // Enter your WiFi SSID and password char ssid[] = "YOUR_SSID"; // your network SSID (name) char pass[] = "YOUR_SSID_PASSWORD"; // your network password (use for WPA, or use as key for WEP) int keyIndex = 0; // your network key Index number (needed only for WEP) int status = WL_IDLE_STATUS; // if you don't want to use DNS (and reduce your sketch size) // use the numeric IP instead of the name for the server: //IPAddress server(74,125,232,128); // numeric IP for Google (no DNS) #define SERVER "cdn.syndication.twimg.com" #define PATH "/widgets/followbutton/info.json?screen_names=adafruit" void setup() { //Initialize serial and wait for port to open: Serial.begin(115200); // Connect to WPA/WPA2 network WiFi.begin(ssid, pass); #if defined(USE_OLED) setupI2C(); delay(200); // wait for OLED to reset if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32 Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } display.display(); display.setTextSize(1); display.setTextColor(WHITE); display.clearDisplay(); display.setCursor(0,0); #else // Don't wait for serial if we have an OLED while (!Serial) { // wait for serial port to connect. Needed for native USB port only delay(10); } #endif // attempt to connect to Wifi network: Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); #if defined(USE_OLED) display.clearDisplay(); display.setCursor(0,0); display.print("Connecting to SSID\n"); display.println(ssid); display.display(); #endif while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Connected to WiFi"); #if defined(USE_OLED) display.print("...OK!"); display.display(); #endif printWifiStatus(); } uint32_t bytes = 0; void loop() { WiFiClientSecure client; client.setInsecure(); // don't use a root cert Serial.println("\nStarting connection to server..."); #if defined(USE_OLED) display.clearDisplay(); display.setCursor(0,0); display.print("Connecting to "); display.print(SERVER); display.display(); #endif // if you get a connection, report back via serial: if (client.connect(SERVER, 443)) { Serial.println("connected to server"); // Make a HTTP request: client.println("GET " PATH " HTTP/1.1"); client.println("Host: " SERVER); client.println("Connection: close"); client.println(); } // Check HTTP status char status[32] = {0}; client.readBytesUntil('\r', status, sizeof(status)); if (strcmp(status, "HTTP/1.1 200 OK") != 0) { Serial.print(F("Unexpected response: ")); Serial.println(status); #if defined(USE_OLED) display.print("Connection failed, code: "); display.println(status); display.display(); #endif return; } // wait until we get a double blank line client.find("\r\n\r\n", 4); // Allocate the JSON document // Use arduinojson.org/v6/assistant to compute the capacity. const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(8) + 200; DynamicJsonDocument doc(capacity); // Parse JSON object DeserializationError error = deserializeJson(doc, client); if (error) { Serial.print(F("deserializeJson() failed: ")); Serial.println(error.c_str()); return; } // Extract values JsonObject root_0 = doc[0]; Serial.println(F("Response:")); const char* root_0_screen_name = root_0["screen_name"]; long root_0_followers_count = root_0["followers_count"]; Serial.print("Twitter username: "); Serial.println(root_0_screen_name); Serial.print("Twitter followers: "); Serial.println(root_0_followers_count); #if defined(USE_OLED) display.clearDisplay(); display.setCursor(0,0); display.setTextSize(2); display.println(root_0_screen_name); display.println(root_0_followers_count); display.display(); display.setTextSize(1); #endif // Disconnect client.stop(); delay(1000); #if defined(USE_DEEPSLEEP) #if defined(USE_OLED) display.clearDisplay(); display.display(); #endif // OLED #if defined(NEOPIXEL_POWER) digitalWrite(NEOPIXEL_POWER, LOW); // off #elif defined(NEOPIXEL_I2C_POWER) digitalWrite(NEOPIXEL_I2C_POWER, LOW); // off #endif // wake up 1 second later and then go into deep sleep esp_sleep_enable_timer_wakeup(10 * 1000UL * 1000UL); // 10 sec esp_deep_sleep_start(); #else delay(10 * 1000); #endif } void setupI2C() { #if defined(ARDUINO_ADAFRUIT_QTPY_ESP32S2) || \ defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3_NOPSRAM) || \ defined(ARDUINO_ADAFRUIT_QTPY_ESP32_PICO) // ESP32 is kinda odd in that secondary ports must be manually // assigned their pins with setPins()! Wire1.setPins(SDA1, SCL1); #endif #if defined(NEOPIXEL_I2C_POWER) pinMode(NEOPIXEL_I2C_POWER, OUTPUT); digitalWrite(NEOPIXEL_I2C_POWER, HIGH); // on #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) // turn on the I2C power by setting pin to opposite of 'rest state' pinMode(PIN_I2C_POWER, INPUT); delay(1); bool polarity = digitalRead(PIN_I2C_POWER); pinMode(PIN_I2C_POWER, OUTPUT); digitalWrite(PIN_I2C_POWER, !polarity); #endif } void printWifiStatus() { // print the SSID of the network you're attached to: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print your board's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); }
By default it will connect to to the Twitter banner image API, parse the username and followers, and display them.