Go Down

Topic: NODEMCU Web Server + 74HC595 (SOLUCIONADO) (Read 40 times) previous topic - next topic

nakuadak

May 23, 2020, 05:09 pm Last Edit: May 23, 2020, 05:34 pm by nakuadak
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:

Code: [Select]
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:

Code: [Select]
#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("<br><br>");
  client.println("<a href=\"/LED=ON\"\"><button>Encender </button></a>"); // Los botones con enlace
  client.println("<a href=\"/LED=OFF\"\"><button>Apagar </button></a><br />");  
  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.

nakuadak

#1
May 23, 2020, 05:37 pm Last Edit: May 25, 2020, 05:03 am by surbyte Reason: Agregado de etiqueta para códigos/errores y enlaces
AÑADO INFO...

Esto lo estoy haciendo para controlar una caldera con 4 DHT22 y 5 relés de control. Y poder tener
además 8 salidas digitales extra con el NODEMCU.
La caldera la tengo operativa, ahora implementaré esta parte del código.

Esto es como cuando vas al taller......

Nada mas abrir el hilo en el foro he encontrado un post https://forum.arduino.cc/index.php?topic=558793.0 que me ha dado la solución. Era un problema de incompatibilidad de pines.

Los tenía así:

Code: [Select]
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


Finalmente así es cómo no me da problemas:

Code: [Select]
int pinDato = 12;  // Pin conectado a DS pin 14 de 74HC595 D6
int pinClock = 15;      // Pin conectado a SHCP pin 11 de 74HC595   D8
int pinRegistro = 13;  // Pin conectado a STCP pin 12 de 74HC595   D7




Gracias a la comunidad y un saludo.

Go Up