#include <WiFi.h>
#include <SevSeg.h> // Include SevSeg library
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiServer server(80);
SevSeg sevseg; // Create a SevSeg object
// Button pin definitions
#define BUTTON1_PIN 32 // Increment button
#define BUTTON2_PIN 35 // Decrement button
#define BUTTON3_PIN 34 // ON/OFF button
float currentLevel = 3; // Start at level 3 (display 3.0)
bool systemOn = false; // System starts off
void setup() {
Serial.begin(9600);
// Connect to WiFi
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
// Print the local IP address
Serial.println("IP Address: ");
Serial.println(WiFi.localIP());
// Start the server
server.begin();
Serial.println("Server started");
// SevSeg configuration
byte numDigits = 2;
byte digitPins[] = {17, 5}; // DIG1 and DIG2
byte segmentPins[] = {22, 23, 33, 19, 16, 18, 21, 26}; // A, B, C, D, E, F, G, DP
bool resistorsOnSegments = true;
byte hardwareConfig = COMMON_ANODE;
bool updateWithDelays = false;
bool leadingZeros = false;
bool disableDecPoint = false;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90); // Set brightness
// Initialize the buttons as input
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
pinMode(BUTTON3_PIN, INPUT_PULLUP);
// Initial display setup
displayCurrentLevel();
}
void displayCurrentLevel() {
if (systemOn) {
int displayValue = (int)(currentLevel * 10); // Multiply by 10 to show 1 decimal place
sevseg.setNumber(displayValue, 1); // Display the value with 1 decimal point
} else {
sevseg.blank(); // Clear the display when system is off
}
sevseg.refreshDisplay(); // Refresh the display
}
void updateWebPage(float level) {
WiFiClient client = server.available();
if (client) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
client.println("<!DOCTYPE html>");
client.println("<html>");
client.println("<body>");
client.println("<p>Current Level: " + String(level) + "</p>");
client.println("</body>");
client.println("</html>");
client.println();
client.stop();
}
Serial.print("Updating webpage with level: ");
Serial.println(level);
}
void loop() {
static unsigned long lastUpdate = 0;
unsigned long currentTime = millis();
if (currentTime - lastUpdate > 50) { // Refresh every 50 ms
sevseg.refreshDisplay();
lastUpdate = currentTime;
}
// Handle ON/OFF toggle with Button 3
bool button3Pressed = digitalRead(BUTTON3_PIN) == LOW;
if (button3Pressed) {
delay(200); // Debounce delay
systemOn = !systemOn; // Toggle system state
Serial.print("System is now ");
Serial.println(systemOn ? "ON" : "OFF");
displayCurrentLevel(); // Update display to reflect new state
while (digitalRead(BUTTON3_PIN) == LOW) {
// Wait for the button to be released
}
}
// If system is ON, handle button 1 (increment) and button 2 (decrement)
if (systemOn) {
bool button1Pressed = digitalRead(BUTTON1_PIN) == LOW;
bool button2Pressed = digitalRead(BUTTON2_PIN) == LOW;
// Increment with Button 1
if (button1Pressed) {
delay(200); // Debounce delay
currentLevel = min(currentLevel + 0.5, 6.0); // Increment and cap at 6.0
displayCurrentLevel();
updateWebPage(currentLevel);
while (digitalRead(BUTTON1_PIN) == LOW) {
// Wait for the button to be released
}
}
// Decrement with Button 2
if (button2Pressed) {
delay(200); // Debounce delay
currentLevel = max(currentLevel - 0.5, 0.0); // Decrement and cap at 0.0
displayCurrentLevel();
updateWebPage(currentLevel);
while (digitalRead(BUTTON2_PIN) == LOW) {
// Wait for the button to be released
}
}
}
// Web client handling
WiFiClient client = server.available();
if (client) {
String currentLine = "";
boolean levelReceived = false;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n') {
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
client.println("<!DOCTYPE html>");
client.println("<html lang=\"en\">");
client.println("<head>");
client.println("<meta charset=\"UTF-8\">");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">");
client.println("<title>Oxygen Control System</title>");
client.println("<style>");
client.println("body { font-family: Arial, sans-serif; text-align: center; }");
client.println("h1 { margin-bottom: 20px; }");
client.println(".button-container { display: flex; flex-direction: column; align-items: center; gap: 15px; }");
client.println("button { padding: 15px 30px; font-size: 24px; width: 200px; }");
client.println(".status { margin-top: 20px; font-size: 20px; color: green; }");
client.println("</style>");
client.println("</head>");
client.println("<body>");
client.println("<h1>Number Display</h1>");
client.println("<div class=\"button-container\">");
client.println("<button onclick=\"sendData(0)\">0</button>");
client.println("<button onclick=\"sendData(1)\">1</button>");
client.println("<button onclick=\"sendData(2)\">2</button>");
client.println("<button onclick=\"sendData(3)\">3</button>");
client.println("<button onclick=\"sendData(4)\">4</button>");
client.println("<button onclick=\"sendData(5)\">5</button>");
client.println("<button onclick=\"sendData(6)\">6</button>");
client.println("<button onclick=\"sendData('reset')\">Reset</button>");
client.println("<button onclick=\"sendData('inc')\">+</button>");
client.println("<button onclick=\"sendData('dec')\">-</button>");
client.println("</div>");
client.println("<p class=\"status\" id=\"status\">Current Level: " + String(currentLevel) + "</p>");
client.println("<script>");
client.println("function sendData(level) {");
client.println("let currentLevel = parseFloat(document.getElementById('status').textContent.split(' ')[2]);");
client.println("if (level === 'inc') {");
client.println(" level = (currentLevel < 6) ? currentLevel + 0.5 : currentLevel;");
client.println("} else if (level === 'dec') {");
client.println(" level = (currentLevel > 0) ? currentLevel - 0.5 : currentLevel;");
client.println("} else if (level === 'reset') {");
client.println(" level = 3;");
client.println("}");
client.println("document.getElementById('status').textContent = 'Current Level: ' + level;");
client.println("fetch('/sendData?level=' + level);");
client.println("}");
client.println("</script>");
client.println("</body>");
client.println("</html>");
client.println();
break;
} else {
if (currentLine.indexOf("GET /sendData?level=") >= 0) {
int levelStart = currentLine.indexOf("level=") + 6;
String levelStr = currentLine.substring(levelStart);
if (!levelReceived) {
float level = levelStr.toFloat();
Serial.print("Received level: ");
Serial.println(level);
currentLevel = level; // Update current level
displayCurrentLevel(); // Update the display
updateWebPage(currentLevel); // Ensure webpage is updated
levelReceived = true;
}
}
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
}
}
client.stop();
}
}