Saludos, he estado buscando por la red, pero no encuentro mi duda. Sí que he encontrado cómo expandir las salidas digitales del NODEMCU mediante un integrado 74HC595, pero no encuentro lo que quiero hacer.
El tema es que estoy intentando controlar una serie de leds a través del wifi, para ello estoy usando el NODEMCU y el 74HC595, pero me es imposible.
Si uso el código sin conexión al wifi, me funciona perfectamente:
int pinDato = 1; // Pin conectado a DS pin 14 de 74HC595 TX
int pinClock = 15; // Pin conectado a SHCP pin 11 de 74HC595 D8
int pinRegistro = 5; // Pin conectado a STCP pin 12 de 74HC595 D1
byte datos;
void setup() {
// configura los pines de salida que se usan en el bucle principal
pinMode(pinRegistro, OUTPUT);
pinMode(pinClock, OUTPUT);
pinMode(pinDato, OUTPUT);
digitalWrite(pinRegistro, LOW);
}
void loop() {
// enviamos un dato con el bit 7 (MSB) en 1
// y el bit 0 (LSB) en 0 para comprobar si
// usamos la direccion correcta (MSBFIRST)
datos = B11110000;
shiftOut(pinDato, pinClock, MSBFIRST, datos);
// enviamos el dato y pulsamos para que pase
// al registro de salida y lo podamos ver
digitalWrite(pinRegistro,HIGH); // pulso ALTO
digitalWrite(pinRegistro,LOW); // pulso BAJO
}
Peeeero si lo que quiero es hacer esto mismo usando el wifi, no me hace caso. He probado con todo tipo de alimentación, a cambiar la protoboard, y mil cosas más. Siempre me ha funcionado el primer código con la configuración que haya sido de HW, pero el segundo código no me obedece.
Sí enciende y apaga el LED interno sin problemas, pero los led me van locos.
Os dejo el siguiente código, el que no me va:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
//Credenciales del WiFi
const char* ssid = "MiFibra-DFA4";
const char* password = "w545eM9p";
int ledPin = D0; // D0 is the LEDBUILDIN (Active LOW)
int pinDato = 1; // Pin conectado a DS pin 14 de 74HC595 TX
int pinClock = 15; // Pin conectado a SHCP pin 11 de 74HC595 D8
int pinRegistro = 5; // Pin conectado a STCP pin 12 de 74HC595 D1
byte datos;
WiFiClient client;
WiFiServer server(80);
void setup() {
pinMode(pinRegistro, OUTPUT);
pinMode(pinClock, OUTPUT);
pinMode(pinDato, OUTPUT);
//digitalWrite(pinRegistro, LOW);
Serial.begin(115200); //Inicio el puerto serie
delay(10);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// Conecto con la red WiFi en modo estación (STA)
Serial.println();
Serial.println();
Serial.print("Conectando a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado");
// Inicializo el servidor
server.begin();
Serial.println("Servidor iniciado");
// Muestro la IP local asignada. URL del servidor
Serial.print("Usa esta URL para conectar al servidor: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
// Compruebo si hay un cliente disponible (una petición)
WiFiClient client = server.available();
if (!client) {
return; // En caso de no haber un cliente, no hago nada
}
int value = LOW;
// Leo la primera linea de la petición del cliente
String request = client.readStringUntil('\r'); // Leo hasta retorno de carro
Serial.println(request); //Imprimo la petición
client.flush(); //Limpio el buffer
if (request.indexOf("/LED=ON") != -1) {
digitalWrite(ledPin, HIGH);
value = HIGH;
datos = B11111111;
digitalWrite(pinRegistro,LOW); // pulso BAJO
shiftOut(pinDato, pinClock, MSBFIRST, datos);
digitalWrite(pinRegistro,HIGH); // pulso ALTO
}
if (request.indexOf("/LED=OFF") != -1) {
digitalWrite(ledPin, LOW);
value = LOW;
datos = B00000000;
digitalWrite(pinRegistro,LOW); // pulso BAJO
shiftOut(pinDato, pinClock, MSBFIRST, datos);
digitalWrite(pinRegistro,HIGH); // pulso ALTO
}
client.flush();
// Pongo ledPin al valor que ha solicitado el cliente en la petición
// Devuelvo la respuesta al cliente -> Todo ha ido bien, el mensaje ha sido interpretado correctamente
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
// A partir de aquí creo la página en raw HTML
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("El LED esta: ");
if(value == HIGH) {
client.print("ON");
} else {
client.print("OFF");
}
client.println("
");
client.println("<a href=\"/LED=ON\"\"><button>Encender </button></a>"); // Los botones con enlace
client.println("<a href=\"/LED=OFF\"\"><button>Apagar </button></a>
");
client.println("</html>");
delay(1);
client.stop();
Serial.println("Cliente desconectado"); // Nos desconectamos del cliente
Serial.println("");
}
Supongo que será una tontería, pero me estoy volviendo loco y al final me ha tocado recurrir al comodín del público.
Muchas gracias por todo gente.