#include <LiquidCrystal_PCF8574.h> #include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> #include <ESP8266WiFi.h> #include <ArduinoJson.h> LiquidCrystal_PCF8574 lcd(0x27); // set the LCD address to 0x27 for a 16 chars and 2 line display // DS18B20 data wire #define ONE_WIRE_BUS 0 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); //Esta aplicación crea un nuevo punto de acceso WiFi. //Modificar las variables ssid y password y conectarse desde un móvil o PC utilizando estos parámetros. const char* ssid = "NodeMCU"; const char* password = "123456789"; String request; unsigned long currentTime = millis(); unsigned long previousTime = 0; const long timeoutTime = 2000; float sensor; float tempC; WiFiServer server(80); #define I0 16 #define I1 14 #define I2 12 #define Q0 2 #define Q1 15 #define Q2 13 #define estado_I0 digitalRead(I0) #define estado_I1 digitalRead(I1) #define estado_I2 digitalRead(I2) boolean estado_Q0 = LOW; boolean estado_Q1 = LOW; boolean estado_Q2 = LOW; byte alto[] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B00000, }; byte bajo[] = { B11111, B10001, B10001, B10001, B10001, B10001, B11111, B00000, }; void estados() { lcd.setCursor(0,0); lcd.print("IP: "); lcd.print(WiFi.softAPIP()); lcd.setCursor(0,1); lcd.print("I: "); lcd.write(digitalRead(I0)); lcd.print(" "); lcd.write(digitalRead(I1)); lcd.print(" "); lcd.write(digitalRead(I2)); lcd.setCursor(0,2); lcd.print(" 0 1 2"); lcd.setCursor(0,3); lcd.print("Q: "); lcd.write(digitalRead(Q0)); lcd.print(" "); lcd.write(digitalRead(Q1)); lcd.print(" "); lcd.write(digitalRead(Q2)); } void setup() { // put your setup code here, to run once: pinMode(I0, INPUT); pinMode(I1, INPUT); pinMode(I2, INPUT); pinMode(Q0, OUTPUT); pinMode(Q1, OUTPUT); pinMode(Q2, OUTPUT); sensors.begin(); lcd.begin(20, 4); lcd.createChar(0, bajo); lcd.createChar(1, alto); delay(200); lcd.setBacklight(255); WiFi.softAP(ssid, password); server.begin(); } void loop() { // put your main code here, to run repeatedly: WiFiClient client = server.available(); // Listen for incoming clients sensor = analogRead(A0); sensors.requestTemperatures(); // Send the command to get temperatures tempC = sensors.getTempCByIndex(0); estados(); if (client) // If a new client connects, { currentTime = millis(); previousTime = currentTime; 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 request += 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) { if (request.indexOf("/Q0_on") != -1) estado_Q0 = HIGH; if (request.indexOf("/Q0_off") != -1) estado_Q0 = LOW; if (request.indexOf("/Q1_on") != -1) estado_Q1 = HIGH; if (request.indexOf("/Q1_off") != -1) estado_Q1 = LOW; if (request.indexOf("/Q2_on") != -1) estado_Q2 = HIGH; if (request.indexOf("/Q2_off") != -1) estado_Q2 = LOW; digitalWrite(Q0, estado_Q0); digitalWrite(Q1, estado_Q1); digitalWrite(Q2, estado_Q2); if (request.indexOf("/json") != -1) { // HTTP Response in the form of HTML Web Page client.println("HTTP/1.1 206 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); StaticJsonDocument<128> doc; doc["sensor"] = sensor; doc["temperatura"] = tempC; doc["I0"] = estado_I0; doc["I1"] = estado_I1; doc["I2"] = estado_I2; doc["Q0"] = digitalRead(Q0); doc["Q1"] = digitalRead(Q1); doc["Q2"] = digitalRead(Q2); serializeJson(doc, client); break; } else { // HTTP Response in the form of HTML Web Page client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); // Display the HTML web page client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head>"); client.println("<META charset=\"utf-8\">"); client.println("<meta http-equiv=\"refresh\" content=\"0.5\">"); client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">"); client.println("<link rel=\"icon\" href=\"data:,\">"); // CSS Styling for Buttons and Web Page client.println("<style>"); client.println("html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}"); client.println("body {margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}"); client.println(".button {display: inline-table;width: 50px;background-color: #1abc9c;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 20px;margin: 0px auto 35px;cursor: pointer;border-radius: 20px;}"); client.println(".button-on {background-color: #1abc9c;}"); client.println(".button-on:active {background-color: #16a085;}"); client.println(".button-off {background-color: #34495e;}"); client.println(".button-off:active {background-color: #2c3e50;}"); client.println("</style>"); client.println("</head>"); // The main body of the Web Page client.println("<body>"); client.println("<h1>ESP8266 Web Server</h1>\n"); client.println("<h3>Using Access Point (AP) Mode</h3>\n"); client.println("<h3>Sensor: "); client.println(sensor,1); client.println("</h3>\n"); client.println("<h3>Temperatura: "); client.println(tempC,1); client.println("°C"); client.println("</h3>\n"); if (estado_I0) client.println("<a class=\"button button-on\">I0: ON</a>"); else client.println("<a class=\"button button-off\">I0: OFF</a>"); if (estado_I1) client.println("<a class=\"button button-on\">I1: ON</a>"); else client.println("<a class=\"button button-off\">I1: OFF</a>"); if (estado_I2) client.println("<a class=\"button button-on\">I2: ON</a>"); else client.println("<a class=\"button button-off\">I2: OFF</a>"); client.println("<br>"); if (estado_Q0) client.println("<a class=\"button button-on\" href=\"/Q0_off\">Q0: ON</a>"); else client.println("<a class=\"button button-off\" href=\"/Q0_on\">Q0: OFF</a>"); if (estado_Q1) client.println("<a class=\"button button-on\" href=\"/Q1_off\">Q1: ON</a>"); else client.println("<a class=\"button button-off\" href=\"/Q1_on\">Q1: OFF</a>"); if (estado_Q2) client.println("<a class=\"button button-on\" href=\"/Q2_off\">Q2: ON</a>"); else client.println("<a class=\"button button-off\" href=\"/Q2_on\">Q2: OFF</a>"); client.println("</body>"); client.println("</html>"); client.println(""); 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 } } request = ""; client.stop(); } }