/* This sketch shows the WiFi event usage - Example from WiFi > WiFiClientEvents
Complete details at https://RandomNerdTutorials.com/esp32-useful-wi-fi-functions-arduino/ */
/*
* WiFi Events
0 ARDUINO_EVENT_WIFI_READY < ESP32 WiFi ready
1 ARDUINO_EVENT_WIFI_SCAN_DONE < ESP32 finish scanning AP
2 ARDUINO_EVENT_WIFI_STA_START < ESP32 station start
3 ARDUINO_EVENT_WIFI_STA_STOP < ESP32 station stop
4 ARDUINO_EVENT_WIFI_STA_CONNECTED < ESP32 station connected to AP
5 ARDUINO_EVENT_WIFI_STA_DISCONNECTED < ESP32 station disconnected from AP
6 ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE < the auth mode of AP connected by ESP32 station changed
7 ARDUINO_EVENT_WIFI_STA_GOT_IP < ESP32 station got IP from connected AP
8 ARDUINO_EVENT_WIFI_STA_LOST_IP < ESP32 station lost IP and the IP is reset to 0
9 ARDUINO_EVENT_WPS_ER_SUCCESS < ESP32 station wps succeeds in enrollee mode
10 ARDUINO_EVENT_WPS_ER_FAILED < ESP32 station wps fails in enrollee mode
11 ARDUINO_EVENT_WPS_ER_TIMEOUT < ESP32 station wps timeout in enrollee mode
12 ARDUINO_EVENT_WPS_ER_PIN < ESP32 station wps pin code in enrollee mode
13 ARDUINO_EVENT_WIFI_AP_START < ESP32 soft-AP start
14 ARDUINO_EVENT_WIFI_AP_STOP < ESP32 soft-AP stop
15 ARDUINO_EVENT_WIFI_AP_STACONNECTED < a station connected to ESP32 soft-AP
16 ARDUINO_EVENT_WIFI_AP_STADISCONNECTED < a station disconnected from ESP32 soft-AP
17 ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED < ESP32 soft-AP assign an IP to a connected station
18 ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED < Receive probe request packet in soft-AP interface
19 ARDUINO_EVENT_WIFI_AP_GOT_IP6 < ESP32 ap interface v6IP addr is preferred
19 ARDUINO_EVENT_WIFI_STA_GOT_IP6 < ESP32 station interface v6IP addr is preferred
20 ARDUINO_EVENT_ETH_START < ESP32 ethernet start
21 ARDUINO_EVENT_ETH_STOP < ESP32 ethernet stop
22 ARDUINO_EVENT_ETH_CONNECTED < ESP32 ethernet phy link up
23 ARDUINO_EVENT_ETH_DISCONNECTED < ESP32 ethernet phy link down
24 ARDUINO_EVENT_ETH_GOT_IP < ESP32 ethernet got IP from connected AP
19 ARDUINO_EVENT_ETH_GOT_IP6 < ESP32 ethernet interface v6IP addr is preferred
25 ARDUINO_EVENT_MAX
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#include <WiFi.h> // Load Wi-Fi library
WiFiServer server(80); // Set web server port number to 80
const char* ssid = "Wokwi-GUEST";
const char* password = "";
String header; // Variable to store the HTTP request
String output26State = "off";// Auxiliar variables to store the current output state
String output27State = "off";// Auxiliar variables to store the current output state
float nastavljenaTemperatura = 25.0;
float prejsnjaRazlika1 = 0;
float prejsnjaRazlika2 = 0;
float prejsnjaTemperatura = 0;
int rele1 = LOW;
int rele2 = LOW;
const int pinTipkaPlus = 17;
const int pinTipkaMinus = 16;
const int pinSenzorjaTemperature = 5;
const int pinReleja1 = 26;
const int pinReleja2 = 27;
const int intervalBranjaTipke = 200;
unsigned long msecLst1 = 0;
unsigned long msecLst2 = 0;
unsigned long prejsnjiCasTipke = 0;
// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0;
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;
void WiFiEvent(WiFiEvent_t event){
Serial.printf("[WiFi-event] event: %d\n", event);
switch (event) {
case ARDUINO_EVENT_WIFI_READY:
Serial.println("WiFi interface ready");
break;
case ARDUINO_EVENT_WIFI_SCAN_DONE:
Serial.println("Completed scan for access points");
break;
case ARDUINO_EVENT_WIFI_STA_START:
Serial.println("WiFi client started");
break;
case ARDUINO_EVENT_WIFI_STA_STOP:
Serial.println("WiFi clients stopped");
break;
case ARDUINO_EVENT_WIFI_STA_CONNECTED:
Serial.println("Connected to access point");
break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
Serial.println("Disconnected from WiFi access point");
break;
case ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE:
Serial.println("Authentication mode of access point has changed");
break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Serial.print("Obtained IP address: ");
Serial.println(WiFi.localIP());
break;
case ARDUINO_EVENT_WIFI_STA_LOST_IP:
Serial.println("Lost IP address and IP address is reset to 0");
break;
case ARDUINO_EVENT_WPS_ER_SUCCESS:
Serial.println("WiFi Protected Setup (WPS): succeeded in enrollee mode");
break;
case ARDUINO_EVENT_WPS_ER_FAILED:
Serial.println("WiFi Protected Setup (WPS): failed in enrollee mode");
break;
case ARDUINO_EVENT_WPS_ER_TIMEOUT:
Serial.println("WiFi Protected Setup (WPS): timeout in enrollee mode");
break;
case ARDUINO_EVENT_WPS_ER_PIN:
Serial.println("WiFi Protected Setup (WPS): pin code in enrollee mode");
break;
case ARDUINO_EVENT_WIFI_AP_START:
Serial.println("WiFi access point started");
break;
case ARDUINO_EVENT_WIFI_AP_STOP:
Serial.println("WiFi access point stopped");
break;
case ARDUINO_EVENT_WIFI_AP_STACONNECTED:
Serial.println("Client connected");
break;
case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED:
Serial.println("Client disconnected");
break;
case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED:
Serial.println("Assigned IP address to client");
break;
case ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED:
Serial.println("Received probe request");
break;
case ARDUINO_EVENT_WIFI_AP_GOT_IP6:
Serial.println("AP IPv6 is preferred");
break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
Serial.println("STA IPv6 is preferred");
break;
case ARDUINO_EVENT_ETH_GOT_IP6:
Serial.println("Ethernet IPv6 is preferred");
break;
case ARDUINO_EVENT_ETH_START:
Serial.println("Ethernet started");
break;
case ARDUINO_EVENT_ETH_STOP:
Serial.println("Ethernet stopped");
break;
case ARDUINO_EVENT_ETH_CONNECTED:
Serial.println("Ethernet connected");
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println("Ethernet disconnected");
break;
case ARDUINO_EVENT_ETH_GOT_IP:
Serial.println("Obtained IP address");
break;
default: break;
}}
void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(IPAddress(info.got_ip.ip_info.ip.addr));
}
OneWire oneWire(pinSenzorjaTemperature);
DallasTemperature senzorTemperature(&oneWire);
void setup(){
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
//display.display();
display.print("Temperatura: ");
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.display();
Serial.begin(115200);
// Initialize the output variables as outputs
pinMode(pinReleja1, OUTPUT);
pinMode(pinReleja2, OUTPUT);
pinMode(pinTipkaMinus, INPUT);
pinMode(pinTipkaPlus, INPUT);
// Set outputs to LOW
digitalWrite(pinReleja1, LOW);
digitalWrite(pinReleja2, LOW);
// 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("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}
void loop(){
senzorTemperature.requestTemperatures();
//float temperatura = senzorTemperature.getTempCByIndex(0);
float temperatura = 25; // Change to "senzorTemperature.getTempCByIndex(0);" due to simulation error
// Branje tipk za nastavitev temperature
unsigned long trenutniCas = millis(); // Preberi trenutni čas v milisekundah
if (trenutniCas - prejsnjiCasTipke >= intervalBranjaTipke) {
prejsnjiCasTipke = trenutniCas; // Posodobi čas zadnjega branja tipke
}
if (digitalRead(pinTipkaPlus) == HIGH) {
nastavljenaTemperatura += 0.2; // Povečaj nastavljeno temperaturo za 0,2 stopinje Celzija
}
if (digitalRead(pinTipkaMinus) == HIGH) {
nastavljenaTemperatura -= 0.2; // Zmanjšaj nastavljeno temperaturo za 0,2 stopinje Celzija
}
// Prikaz temperature na zaslonu
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,5);
display.setTextSize(2);
display.print("Stanovanje");
display.setTextSize(3);
display.setCursor(2,25);
display.print(temperatura);
display.println(" C");
display.setTextSize(2);
display.setCursor(96,22);
display.println("o");
display.setCursor(12,50);
display.print("Set:");
display.print(nastavljenaTemperatura);
display.print("C");
display.display();
WiFiClient client = server.available(); // Listen for incoming clients
if (client) { // If a new client connects,
currentTime = millis();
previousTime = currentTime;
Serial.println("New Client."); // print a message out in the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected
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
if (header.indexOf("GET /26/on") >= 0) {
Serial.println("GPIO 26 on");
output26State = "on";
digitalWrite(pinReleja1, HIGH);
} else if (header.indexOf("GET /26/off") >= 0) {
Serial.println("GPIO 26 off");
output26State = "off";
digitalWrite(pinReleja1, LOW);
} else if (header.indexOf("GET /27/on") >= 0) {
Serial.println("GPIO 27 on");
output27State = "on";
digitalWrite(pinReleja2, HIGH);
} else if (header.indexOf("GET /27/off") >= 0) {
Serial.println("GPIO 27 off");
output27State = "off";
digitalWrite(pinReleja2, LOW);
}
// 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>");
// Display current state, and ON/OFF buttons for GPIO 26
client.println("<p>GPIO 26 - State " + output26State + "</p>");
// If the output26State is off, it displays the ON button
if (output26State=="off") {
client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");
}
// Display current state, and ON/OFF buttons for GPIO 27
client.println("<p>GPIO 27 - State " + output27State + "</p>");
// If the output27State is off, it displays the ON button
if (output27State=="off") {
client.println("<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>");
}
client.println("</body></html>");
// The HTTP response ends with another blank line
client.println();
client.println("<p>Temperatura: </p>");
client.println(temperatura);
client.println("<p>stopinj Celzija</p>");
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("");
}
if (rele1 == LOW) {
// Preverjanje temperature in nadzor relejev
if (temperatura > (nastavljenaTemperatura + 0.2 )) {
unsigned long msec1 = millis();
float razlika1 = abs(1 / (temperatura - nastavljenaTemperatura)) * 4000;
if ((razlika1 != prejsnjaRazlika1) || (temperatura != prejsnjaTemperatura)){
Serial.print("Zakasnitev 1: ");
Serial.println(razlika1); // Izpis vrednosti razlika v konzoli samo ob spremembi
Serial.print("Temperatura: ");
Serial.print(" °C");
Serial.println(temperatura);
prejsnjaRazlika1 = razlika1; // Posodobitev prejšnje vrednosti razlike
prejsnjaTemperatura = temperatura;
}
rele2 = LOW; // Izklop releja 2
digitalWrite(pinReleja2, LOW); // Izklop releja 2
//float msecDelay = 1.0 / (razlika + 1.0);
// unsigned long casDoIzklopa = map(razlika, 0, 10, 1000, 5000);
if (msec1 - msecLst1 >= razlika1){
msecLst1 = msec1;
rele1 = HIGH; // Vklop releja 1
digitalWrite(pinReleja1, HIGH); // Vklop releja 1
}
}
}else{
if (rele1 == HIGH) {
// Preverjanje temperature in nadzor relejev
if (temperatura > (nastavljenaTemperatura + 0.2 )) {
unsigned long msec1 = millis();
float razlika2 = abs(temperatura - nastavljenaTemperatura) * 1000;
if (razlika2 != prejsnjaRazlika2) {
Serial.print("Čas vklopa 1: ");
Serial.println(razlika2); // Izpis vrednosti razlika v konzoli samo ob spremembi
prejsnjaRazlika2 = razlika2; // Posodobitev prejšnje vrednosti razlike
}
if (msec1 - msecLst1 >= razlika2){
msecLst1 = msec1;
rele1 = LOW; // Izklop releja 1
digitalWrite(pinReleja1, LOW); // Izklop releja 1
}
}
}
}
if (rele2 == LOW) {
// Preverjanje temperature in nadzor relejev
if (temperatura < (nastavljenaTemperatura + 0.2 )) {
unsigned long msec2 = millis();
float razlika1 = abs(1 / (temperatura - nastavljenaTemperatura)) * 4000;
if (razlika1 != prejsnjaRazlika1) {
Serial.print("Zakasnitev 2: ");
Serial.println(razlika1); // Izpis vrednosti razlika v konzoli samo ob spremembi
Serial.print("Temperatura: ");
Serial.print(" °C");
Serial.println(temperatura);
prejsnjaRazlika1 = razlika1; // Posodobitev prejšnje vrednosti razlike
}
rele1 = LOW; // Izklop releja 1
digitalWrite(pinReleja1, LOW); // Izklop releja 1
//float msecDelay = 1.0 / (razlika + 1.0);
// unsigned long casDoIzklopa = map(razlika, 0, 10, 1000, 5000);
if (msec2 - msecLst2 >= razlika1){
msecLst2 = msec2;
rele2 = HIGH; // Vklop releja 1
digitalWrite(pinReleja2, HIGH); // Vklop releja 1
}
}
}else{
if (rele2 == HIGH) {
// Preverjanje temperature in nadzor relejev
if (temperatura < (nastavljenaTemperatura + 0.2 )) {
unsigned long msec2 = millis();
float razlika2 = abs(temperatura - nastavljenaTemperatura) * 1000;
if (razlika2 != prejsnjaRazlika2) {
Serial.print("Čas vklopa 2: ");
Serial.println(razlika2); // Izpis vrednosti razlika v konzoli samo ob spremembi
prejsnjaRazlika2 = razlika2; // Posodobitev prejšnje vrednosti razlike
}
if (msec2 - msecLst2 >= razlika2){
msecLst2 = msec2;
rele2 = LOW; // Izklop releja 2
digitalWrite(pinReleja2, LOW); // Izklop releja 2
}
}
}
}
}