OK now that we have the onboard elements, WiFi and deep sleep all worked out, we can now create a full demo!
This example connects to the online Adafruit Quotes service, and displays an inspiring quote once a minute with deep sleep in between.
Don't forget to update the SSID and password!
If you are looking for the ThinkInk library to use with this example, click the link below to get a zip including the ThinkInk library.
To get the full set of libraries that go with the Adafruit EPD library, click this link and download the latest zip file.
// SPDX-FileCopyrightText: 2017 Evandro Copercini
//
// SPDX-License-Identifier: Apache-2.0
/*
Wifi secure connection example for ESP32
Running on TLS 1.2 using mbedTLS
2017 - Evandro Copercini - Apache 2.0 License.
*/
#include <WiFiClientSecure.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#include "Adafruit_ThinkInk.h"
#include "Adafruit_NeoPixel.h"
#include <Fonts/FreeSans9pt7b.h>
const char* ssid = "adafruit"; // your network SSID (name of wifi network)
const char* password = "ffffffff"; // your network password
const char* server = "www.adafruit.com";
const char* path = "/api/quotes.php";
WiFiClientSecure client;
// older pre-2025 magtag
//ThinkInk_290_Grayscale4_T5 display(EPD_DC, EPD_RESET, EPD_CS, -1, -1);
// magtag with SSD1680Z chipset
ThinkInk_290_Grayscale4_EAAMFGN display(EPD_DC, EPD_RESET, EPD_CS, -1, -1);
Adafruit_NeoPixel intneo = Adafruit_NeoPixel(4, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);
void deepSleep() {
pinMode(NEOPIXEL_POWER, OUTPUT);
pinMode(SPEAKER_SHUTDOWN, OUTPUT);
digitalWrite(SPEAKER_SHUTDOWN, LOW); // off
digitalWrite(NEOPIXEL_POWER, HIGH); // off
digitalWrite(EPD_RESET, LOW); // off (yes required to save a few mA)
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
esp_sleep_enable_timer_wakeup(60 * 1000000); // 60 seconds
esp_deep_sleep_start();
}
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(115200);
//while (!Serial) delay(10);
pinMode(BUTTON_A, INPUT_PULLUP);
pinMode(BUTTON_B, INPUT_PULLUP);
pinMode(BUTTON_C, INPUT_PULLUP);
pinMode(BUTTON_D, INPUT_PULLUP);
pinMode(EPD_BUSY, INPUT);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
display.begin(THINKINK_GRAYSCALE4);
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
display.clearBuffer();
display.setFont(&FreeSans9pt7b);
display.setTextSize(1);
display.setTextColor(EPD_BLACK);
display.setCursor(10, 30);
display.print("Connecting to SSID ");
display.println(ssid);
display.display();
WiFi.begin(ssid, password);
// attempt to connect to Wifi network:
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(100);
}
Serial.print("Connected to ");
Serial.println(ssid);
//client.setCACert(test_root_ca);
//client.setCertificate(test_client_key); // for client verification
//client.setPrivateKey(test_client_cert); // for client verification
// Neopixel power
pinMode(NEOPIXEL_POWER, OUTPUT);
digitalWrite(NEOPIXEL_POWER, LOW); // on
intneo.fill(25, 0, 0);
intneo.show();
Serial.println("\nStarting connection to server...");
client.setInsecure();
if (!client.connect(server, 443)) {
Serial.println("Connection failed!");
deepSleep();
}
intneo.fill(25, 25, 0);
intneo.show();
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();
// 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);
deepSleep();
}
intneo.fill(0, 25, 0);
intneo.show();
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
Serial.println("headers received");
break;
}
}
intneo.fill(0, 25, 25);
intneo.show();
while (client.peek() != '[') {
client.read();
}
intneo.fill(0, 0, 25);
intneo.show();
// 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());
deepSleep();
}
intneo.fill(0, 25, 25);
intneo.show();
// Extract values
JsonObject root_0 = doc[0];
Serial.println(F("Response:"));
const char* root_0_text = root_0["text"];
const char* root_0_author = root_0["author"];
Serial.print("Quote: "); Serial.println(root_0_text);
Serial.print("Author: "); Serial.println(root_0_author);
display.clearBuffer();
display.setFont(&FreeSans9pt7b);
display.setTextSize(1);
display.setTextWrap(true);
display.setTextColor(EPD_BLACK);
display.setCursor(10, 30);
display.println(root_0_text);
display.setTextColor(EPD_DARK);
display.setCursor(40, 120);
display.println(root_0_author);
display.display();
while (!digitalRead(EPD_BUSY)) {
delay(10);
}
while (client.available() > 0)
{
//read back one line from the server
String line = client.readStringUntil('\r');
Serial.println(line);
}
// disconnect
client.stop();
deepSleep();
}
void loop() {
}
Page last edited January 22, 2025
Text editor powered by tinymce.