[esp] Add ESP examples.

This commit is contained in:
Shaun Reed 2025-02-01 10:30:18 -05:00
parent 5f9f508581
commit 8bf174d256
17 changed files with 278 additions and 17 deletions

View File

@ -2,15 +2,16 @@
This repository is a collection of useful code snippets and configurations. This repository is a collection of useful code snippets and configurations.
``` ```bash
github.com/shaunrd0/klips/ github.com/shaunrd0/klips/
├── ansible # Ansible roles, playbooks, and examples ├── ansible # Ansible roles, playbooks, and examples
├── blockchain # Blockchain related project templates and examples ├── blockchain # Blockchain related project templates and examples
├── cpp # C++ programs, datastructures, and other examples ├── cpp # C++ programs, datastructures, and other examples
├── dotnet # .NET projects and examples ├── dotnet # .NET projects and examples
├── esp # ESP32 projects and examples
├── figlet # Figlet fonts I like :) ├── figlet # Figlet fonts I like :)
├── javascript # Javascript projects and examples ├── javascript # Javascript projects and examples
├── python # Python scripts or tools I've made ├── python # Python scripts and tools I've made
├── README.md ├── README.md
└── scripts # Bash scripts └── scripts # Bash scripts
``` ```

View File

@ -1,4 +1,4 @@
# Ansible # ansible
A few simple roles / plays I've put together in learning how to use Ansible can be found under their corresponding directories. A few simple roles / plays I've put together in learning how to use Ansible can be found under their corresponding directories.

View File

@ -1,3 +1,4 @@
# blockchain
A template project for getting started working on the Ethereum blockchain. A template project for getting started working on the Ethereum blockchain.
This project comes with basic packages for compiling and deploying Solidity contracts with Truffle. This project comes with basic packages for compiling and deploying Solidity contracts with Truffle.

View File

@ -1,4 +1,4 @@
# Cpp # cpp
```bash ```bash
shaunrd0/klips/cpp/ shaunrd0/klips/cpp/

View File

@ -1,4 +1,4 @@
# Dotnet # dotnet
```bash ```bash
shaunrd0/klips/dotnet/ shaunrd0/klips/dotnet/

View File

@ -0,0 +1,38 @@
// set pin numbers
const int buttonPin = 4; // the number of the pushbutton pin
const int ledPin = 5; // the number of the LED pin
// variable for storing the pushbutton status
int buttonState = 0;
bool light_on = false;
bool handled = false;
void setup() {
Serial.begin(115200);
// initialize the pushbutton pin as an input
pinMode(buttonPin, INPUT);
// initialize the LED pin as an output
pinMode(ledPin, OUTPUT);
}
void loop() {
// read the state of the pushbutton value
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
if (buttonState == HIGH) {
if (!handled) {
Serial.println("Handling button pressed.");
light_on = !light_on;
handled = true;
digitalWrite(ledPin, light_on ? HIGH : LOW);
}
// turn LED on
} else {
if (handled) {
Serial.println("Reset button handled state.");
handled = false;
}
}
}

View File

@ -0,0 +1,5 @@
# 01_led-button
![schematic](./schematic.png)
Simple LED controlled by an on-board button.

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

View File

@ -0,0 +1,183 @@
#include <WiFi.h>
//
// Web server project globals
// Replace with your network credentials
const char* ssid = "network-name";
const char* password = "password";
WiFiServer server(80);
// Variable to store the HTTP request
String header;
// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0;
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;
//
// Button / light project globals
// set pin numbers
const int buttonPin = 4; // the number of the pushbutton pin
const int ledPin = 5; // the number of the LED pin
// variable for storing the pushbutton status
int buttonState = 0;
bool light_on = false;
bool handled = false;
void setup() {
Serial.begin(115200);
// initialize the pushbutton pin as an input
pinMode(buttonPin, INPUT);
// initialize the LED pin as an output
pinMode(ledPin, OUTPUT);
// wait for the Serial Monitor to be open
while (!Serial) {
delay(100);
}
// Connect to Wi-Fi network with SSID and password
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Print local IP address and start web server
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("Web Server IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}
// Handles the on-board button press.
void handleButtonPress() {
// read the state of the pushbutton value
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
if (buttonState == HIGH) {
if (!handled) {
Serial.println("Handling button pressed.");
light_on = !light_on;
handled = true;
digitalWrite(ledPin, light_on ? HIGH : LOW);
}
// turn LED on
} else {
if (handled) {
Serial.println("Reset button handled state.");
handled = false;
}
}
}
void displayPinState(WiFiClient client, int gpio_pin, bool state) {
// Display current state, and ON/OFF buttons for GPIO <gpio_pin>
client.println(String("<p>GPIO ") + String(gpio_pin) + String(" - Current State ") + String(state ? "ON" : "OFF") + String("</p>"));
// If the output state is off, it displays the ON button
if (state) {
client.println(String("<p><a href=\"/") + String(gpio_pin) + String("/off\"><button class=\"button button2\">OFF</button></a></p>"));
} else {
client.println(String("<p><a href=\"/") + String(gpio_pin) + String("/on\"><button class=\"button\">ON</button></a></p>"));
}
}
void handleStateChange(WiFiClient client, int gpio_pin) {
if (header.indexOf(String("GET /") + String(gpio_pin) + String("/on")) >= 0) {
Serial.println(String("GPIO ") + String(gpio_pin) + String(" on"));
light_on = true;
digitalWrite(gpio_pin, HIGH);
} else if (header.indexOf(String("GET /") + String(gpio_pin) + String("/off")) >= 0) {
Serial.println(String("GPIO ") + String(gpio_pin) + String(" off"));
light_on = false;
digitalWrite(gpio_pin, LOW);
}
}
void loop() {
WiFiClient client = server.available(); // Listen for incoming clients
handleButtonPress();
if (client) { // If a new client connects,
currentTime = millis();
previousTime = currentTime;
Serial.println("New Client."); // print a message out in the serial port
Serial.println("Web Server IP address: ");
Serial.println(WiFi.localIP());
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected
// Also handle the button press in this loop to not miss events.
handleButtonPress();
currentTime = millis();
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
header += c;
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// turns the GPIOs on and off
// Display the HTML web page
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
// CSS to style the on/off buttons
// Feel free to change the background-color and font-size attributes to fit your preferences
client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
client.println(".button2 {background-color: #555555;}</style></head>");
//
// Web Page Heading
client.println("<body><h1>ESP32 Web Server</h1>");
//
// Web Page Body Contents
// Button Controls
displayPinState(client, ledPin, light_on);
//
// Close Web Page Body / Heading
client.println("</body></html>");
// The HTTP response ends with another blank line
client.println();
// Break out of the while loop
break;
} else { // if you got a newline, then clear currentLine
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
}
}
// Clear the header variable
header = "";
// Close the connection
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
}
}

View File

@ -0,0 +1,11 @@
# 02_led-button-web
![schematic](./schematic.png)
This example uses the same schematic as [01_led-button](../01_led-button/).
The only difference is that you can also control the button through a web browser from any device connected to your local network.
This example was adapted from the example code in the [Arduino ESP32 API reference](https://docs.espressif.com/projects/arduino-esp32/en/latest/api/wifi.html#wi-fi-ap-example).
![screenshot](./screenshot.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

21
esp/cpp/README.md Normal file
View File

@ -0,0 +1,21 @@
# esp
```bash
shaunrd0/klips/esp/
├── 01_led-button # Simple LED circuit controlled by an on board button.
├── 02_led-button-web # LED controlled by a button or within a web browser.
├── ESP32-basic-starter-kit.pdf # PDF for tutorials in ESP32 starter kit.
├── ESP32-dev-module.png
└── README.md
```
This directory contains ESP32 projects largely adapted from the examples in [ESP32-basic-starter-kit.pdf](./ESP32-basic-starter-kit.pdf).
The APIs in the original examples paired with this PDF have changed, and I decided to do some different things with the code and/or circuits, but the original code can be [found here](https://www.dropbox.com/scl/fo/6znlij3eb23ih4jxcpv2w/AKvB1t9CCUgoVRVtGen8Yrw?rlkey=z84anl0hs940qf9fpl7l8q8q2&e=1&dl=0).
The board selected in [Arduino IDE](https://www.arduino.cc/en/software) is ESP32 Dev Module -
![ESP32 Dev Module](./ESP32-dev-module.png)
[Arduino ESP32 GitHub](https://github.com/espressif/arduino-esp32) \
[Arduino ESP32 API reference](https://docs.espressif.com/projects/arduino-esp32/en/latest/libraries.html)

View File

@ -1,9 +1,9 @@
# Javascript # javascript
This directory contains Javascript projects and examples that I've made. This directory contains Javascript projects and examples that I've made.
``` ```bash
github.com/shaunrd0/klips/javascript shaunrd0/klips/javascript
├── webgl # Examples of using WebGL within JS ├── webgl # Examples of using WebGL within JS
└── README.md └── README.md
``` ```

View File

@ -1,3 +1,4 @@
# python
This directory contains a collection of Python scripts or CLI tools that I've made. This directory contains a collection of Python scripts or CLI tools that I've made.
Each of these projects provide a `requirements.txt` that can be used to Each of these projects provide a `requirements.txt` that can be used to