#include <LiquidCrystal.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <uri/UriBraces.h>
//#include <AsyncTCP.h>
//#include <ESPAsyncWebServer.h>
#define analog 4
#define buzzerPin 2
#define ledPin 15
#define relayPin 5
int echoPin = 18; // define ultrasonic signal receiver pin ECHO to D18
int trigPin = 19; // define ultrasonic signal transmitter pin TRIG to D19
const int rs = 25;
const int en = 33;
const int d4 = 12;
const int d5 = 14;
const int d6 = 27;
const int d7 = 26;
const int lcdlight = 13; //Adjust contrast
const float GAMMA = 0.7;
const float RL10 = 50;
int a = 0, b = 0, c = 0, d = 0;
int distance = 0;
float voltage = 0;
float resistance = 0;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Defining the WiFi channel speeds up the connection:
#define WIFI_CHANNEL 6
WebServer server(80);
bool ledState = false;
bool buzzerState = false;
const char* PARAM_INPUT_1 = "output";
const char* PARAM_INPUT_2 = "state";
/*
void sendHtml() {
String response = R"(
<!DOCTYPE html><html>
<head>
<title>ESP32 Web Server Demo</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
html { font-family: sans-serif; text-align: center; }
body { display: inline-flex; flex-direction: column; }
h1 { margin-bottom: 1.2em; }
h2 { margin: 0; }
div { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: auto auto; grid-auto-flow: column; grid-gap: 1em; }
.btn { background-color: #5B5; border: none; color: #fff; padding: 0.5em 1em;
font-size: 2em; text-decoration: none }
.btn.OFF { background-color: #333; }
</style>
</head>
<body>
<h1>ESP32 Web Server</h1>
<div>
<h2>LED</h2>
<a href="/toggle/1" class="btn LED_TEXT">LED_TEXT</a>
<h2>BUZZER</h2>
<a href="/toggle/2" class="btn BUZZER_TEXT">BUZZER_TEXT</a>
</div>
</body>
</html>
)";
response.replace("LED_TEXT", ledState ? "ON" : "OFF");
response.replace("BUZZER_TEXT", buzzerState ? "ON" : "OFF");
server.send(200, "text/html", response);
}
*/
void monitor() {
a = distance;
b = analogRead(analog);
voltage = b / 1024. * 5;
resistance = 2000 * voltage / (1 - voltage / 5);
b = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
Serial.print("DIST:");
Serial.print(a);
Serial.println(" cm");
Serial.print("LM:");
Serial.print(b);
Serial.println(" lux");
if (c != a) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DIST:");
lcd.print(a);
lcd.print(" cm");
lcd.setCursor(0, 1);
lcd.print("LM:");
lcd.print(b);
lcd.print(" lux");
c = a;
}
if (d != b) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DIST:");
lcd.print(a);
lcd.print(" cm");
lcd.setCursor(0, 1);
lcd.print("LM:");
lcd.print(b);
lcd.print(" lux");
d = b;
}
delay(200);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(relayPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(analog, INPUT);
pinMode(lcdlight, OUTPUT);
analogWrite(lcdlight, 130);//Used to adjust contrast(0-255)
digitalWrite(buzzerPin, HIGH);
digitalWrite(ledPin, HIGH);
digitalWrite(relayPin, LOW);
lcd.begin(16, 2);
/*
//Connecting to WiFi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, WIFI_CHANNEL);
Serial.print("Connecting to WiFi ");
Serial.print(WIFI_SSID);
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", sendHtml);
server.on(UriBraces("/toggle/{}"), []() {
String led = server.pathArg(0);
Serial.print("Toggle #");
Serial.println(led);
switch (led.toInt()) {
case 1:
ledState = !ledState;
digitalWrite(ledPin, !ledState);
break;
case 2:
buzzerState = !buzzerState;
digitalWrite(buzzerPin, buzzerState);
break;
}
sendHtml();
*/
/*
//记得删除
//get distance and display
distance = get_distance();
monitor();
if (a <= 100) {
digitalWrite(buzzerPin, LOW);
delay(100);
digitalWrite(buzzerPin, HIGH);
}
else if (b <= 400) {
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
}
else if (a > 100 || b > 40) {
digitalWrite(buzzerPin, HIGH);
digitalWrite(ledPin, HIGH);
}
}
);
server.begin();
Serial.println("HTTP server started");
*/
}
float get_distance() {
//Determine distance
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH); // Pulse for 10μs to trigger ultrasonic detection
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
distance = pulseIn(echoPin, HIGH); // Read receiver pulse time
distance = distance / 58; // Transform pulse time to distance
//delay(100);
return distance;
}
void loop() {
// put your main code here, to run repeatedly:
//Transmitted wave frequency
//delay(100);
//server.handleClient();
//get distance and display
distance = get_distance();
monitor();
if (a <= 100) {
digitalWrite(buzzerPin, LOW);
delay(100);
digitalWrite(buzzerPin, HIGH);
}
else if (b <= 400) {
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
digitalWrite(relayPin, HIGH);
}
else if (a > 100 || b > 40) {
digitalWrite(buzzerPin, HIGH);
digitalWrite(ledPin, HIGH);
digitalWrite(relayPin, LOW);
}
}