[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.
```
```bash
github.com/shaunrd0/klips/
├── ansible # Ansible roles, playbooks, and examples
├── blockchain # Blockchain related project templates and examples
├── cpp # C++ programs, datastructures, and other examples
├── dotnet # .NET projects and examples
├── esp # ESP32 projects and examples
├── figlet # Figlet fonts I like :)
├── javascript # Javascript projects and examples
├── python # Python scripts or tools I've made
├── README.md
├── python # Python scripts and tools I've made
├── README.md
└── 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.

View File

@ -1,3 +1,4 @@
# 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.
@ -72,7 +73,7 @@ I explain how to configure metamask on ropsten on [Knoats - Solidity](https://kn
Give yourself test Ethereum with the [Ropsten ETH Faucet](https://faucet.ropsten.be)
To deploy to ropsten test network, and verify using `truffle-verify-plugin` -
To deploy to ropsten test network, and verify using `truffle-verify-plugin` -
```asm
npx truffle migrate --network ropsten

View File

@ -1,4 +1,4 @@
# Cpp
# cpp
```bash
shaunrd0/klips/cpp/
@ -13,11 +13,11 @@ shaunrd0/klips/cpp/
└── README.md
```
This directory contains a `CMakeLists.txt`, which can be selected to open as a
This directory contains a `CMakeLists.txt`, which can be selected to open as a
project within your preferred IDE. From there, all nested examples can be built,
debugged, and ran.
Some of the more recent projects in this repository requires the latest CMake LTS.
Some of the more recent projects in this repository requires the latest CMake LTS.
To install `cmake` LTS with `apt` we can follow [official instructions from kitware](https://apt.kitware.com/)
Alternatively, we can install the LTS with python's `pip`.
```bash
@ -34,7 +34,7 @@ cmake version 3.22.1
Once cmake is installed, dependencies for all examples can be installed with the command below.
```bash
sudo apt install libsdl2-dev freeglut3-dev
sudo apt install libsdl2-dev freeglut3-dev
```
If we build from this directory, we build all C++ projects and examples
@ -63,7 +63,7 @@ graph-test-object sdl-test visitor-test
graph-test-simple select-sort
```
We can also build from subdirectories.
We can also build from subdirectories.
To only build projects related to design patterns we build from the `patterns/` subdirectory, for example
```bash
cd /path/to/klips/cpp/patterns
@ -80,5 +80,5 @@ adapter-test factory-test prototype-test state-test
If cmake is not being used in a project, it can be built with `g++` manually using
the commands outlined in `*/.vscode/tasks.json`, or by using VSCode to open the example
and running the build task.
and running the build task.
Check the header comments in the main source file for the example for instructions.

View File

@ -1,4 +1,4 @@
# Dotnet
# dotnet
```bash
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.
```
github.com/shaunrd0/klips/javascript
```bash
shaunrd0/klips/javascript
├── webgl # Examples of using WebGL within JS
└── README.md
```

View File

@ -1,12 +1,13 @@
# python
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
install the required Python packages and dependencies.
To install Python 3.9 and `pip`
```bash
sudo apt install python3.9 python3-pip
sudo apt install python3.9 python3-pip
python3.9 -m pip install -U pip
```