Control de 8 reles ssd mediante PCF8574 y nodemcu [SOLUCIONADO]

Hola, quisiera un poco de su sabiduria, ya que llevo 10 dias quebrandome la cabezo y no logro ver la luz.

Necesito lo siguiente (en mis palabras, puede que le falta tecnica) "Mi idea es usar un NodeMCU esp 8266 Lolin v3 para controlar 8 reles de estado solido. Como no me alcanzan los pines, estoy tratando de hacerlo mediante el compronente PCF8574, ya que permite mediante I2C conectarlo y ganar 8 pines extras. El problema esta en que debo control indivialmente cada pin extra, para prender o apagar el rele asociado."

He revisado un monton de videos, blogs y referencias, pero por mi tontera no logro dar con la respuesta a como conectarlo correctamente y como poder leer y escribir en esos pines, a fin de prender o apagar los reles.

Dejo imagenes de los componentes con los que cuento. Si me pueden ayudar, seria genial. Gracias de antemano.

|500x357 |500x357

Hi, Adjunto un link que esplica como alambrarlo y un sketch de como hacerlo. Pruebalo a ver si te sirve. Espero que te sirva.

http://arduinolearning.com/code/arduino-and-a-pcf8574.php

tauro0221: Hi, Adjunto un link que esplica como alambrarlo y un sketch de como hacerlo. Pruebalo a ver si te sirve. Espero que te sirva.

http://arduinolearning.com/code/arduino-and-a-pcf8574.php

Muchas gracias Tauro0221. Es muy parecido a otro que habia visto, probado y descartado.

Sin embargo, despues de tanto, vino la solucion, un poco mas facil de lo que yo creia. Y se puede controlar cada uno de los 8 pines extras que se ganan.

Les dejo el codigo que use para las pruebas, con un modulo rele de 4 unidades, fuente externa de 5v y los gnd unidos al gnd de la placa

#include "Arduino.h"
#include "PCF8574.h"



// Setear la direccion Hexadecimal del extensor
PCF8574 pcf8574(0x20);  // A0,A1,A2 todos en GND en los junpers

int pausa = 2000;

void setup(){

  Serial.begin(9600);
  // Todos los pines en OUTPUT
  pcf8574.pinMode(P0, OUTPUT);
  pcf8574.pinMode(P1, OUTPUT);
  pcf8574.pinMode(P2, OUTPUT);
  pcf8574.pinMode(P3, OUTPUT);
  //pcf8574.pinMode(P4, OUTPUT);
  //pcf8574.pinMode(P5, OUTPUT);
  //pcf8574.pinMode(P6, OUTPUT);
  //pcf8574.pinMode(P7, OUTPUT);
  pcf8574.begin();

}



void loop(){

  pcf8574.digitalWrite(P0, LOW);  // P0 en ON
  delay(pausa);
  pcf8574.digitalWrite(P0, HIGH); // P0 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P1, LOW);  // P1 en ON
  delay(pausa);
  pcf8574.digitalWrite(P1, HIGH); // P1 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P2, LOW);  // P2 en ON
  delay(pausa);
  pcf8574.digitalWrite(P2, HIGH); // P2 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P3, LOW);  // P3 en ON
  delay(pausa);
  pcf8574.digitalWrite(P3, HIGH); // P3 en OFF
  delay(pausa);
  
  //pcf8574.digitalWrite(P4, HIGH); // NC High on P4
  //pcf8574.digitalWrite(P5, LOW);  // NO High on P5
  //pcf8574.digitalWrite(P6, HIGH); // NC High on P6
  //pcf8574.digitalWrite(P7, LOW);  // NO High on P7

  delay(pausa);

}

Mañana tratare de subir un Fritzing de las conexiones, estoy aprendiendo recien a usarlo, asi que solo lo dibujo en mi cuaderno, a la antigua....

Saludos. Espero que a otros les sirva.

Por favor, las conexiones en electronica sea con el programa que sea deben ser ortogonales. O sea.. cuando cambias de direccion en ángulo recto. Eso de tirar diagonales desde el sensor al pin del arduino es algo que se ha generalizado y resulta solo entendible por el autor.

Aprende en los programas a no usar delay() en cada paso que das en tu código

pcf8574.digitalWrite(P0, LOW);  // P0 en ON
  delay(pausa);
  pcf8574.digitalWrite(P0, HIGH); // P0 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P1, LOW);  // P1 en ON
  delay(pausa);
  pcf8574.digitalWrite(P1, HIGH); // P1 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P2, LOW);  // P2 en ON
  delay(pausa);
  pcf8574.digitalWrite(P2, HIGH); // P2 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P3, LOW);  // P3 en ON
  delay(pausa);
  pcf8574.digitalWrite(P3, HIGH); // P3 en OFF
  delay(pausa);

tienes un STOP y el resto?

Si aprendes a usar millis() puedes comandar todo sin que se detenga el programa. Que pasa si luego tienes muchos sensores? pulsadores, sensores pantalla que actualizar Cada pausa es de 2000 mseg o sea 2seg Cada vez que cambias una de las 8 salidas demoras 2 seg o sea 16 segundos en recorrer todo. Para la prueba esta bien pero para mas adelante no.

Desterra el uso de delay() antes que te vuelvas adicto y sea tarde.

Ve a Documentación => Indice de temas tutoriales => millis()

Actualizo el codigo con los 8 reles, en 2 placas de 4 cada una.

#include "Arduino.h"
#include "PCF8574.h"



// Setear la direccion Hexadecimal del extensor
PCF8574 pcf8574(0x20);  // A0,A1,A2 todos en GND en los junpers

int pausa = 2000;

void setup(){

  Serial.begin(9600);
  // Todos los pines en OUTPUT
  pcf8574.pinMode(P0, OUTPUT);
  pcf8574.pinMode(P1, OUTPUT);
  pcf8574.pinMode(P2, OUTPUT);
  pcf8574.pinMode(P3, OUTPUT);
  pcf8574.pinMode(P4, OUTPUT);
  pcf8574.pinMode(P5, OUTPUT);
  pcf8574.pinMode(P6, OUTPUT);
  pcf8574.pinMode(P7, OUTPUT);
  pcf8574.begin();
  apagarReles();
}



void loop(){

  pcf8574.digitalWrite(P0, LOW);  // P0 en ON
  delay(pausa);
  pcf8574.digitalWrite(P0, HIGH); // P0 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P1, LOW);  // P1 en ON
  delay(pausa);
  pcf8574.digitalWrite(P1, HIGH); // P1 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P2, LOW);  // P2 en ON
  delay(pausa);
  pcf8574.digitalWrite(P2, HIGH); // P2 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P3, LOW);  // P3 en ON
  delay(pausa);
  pcf8574.digitalWrite(P3, HIGH); // P3 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P4, LOW);  // P4 en ON
  delay(pausa);
  pcf8574.digitalWrite(P4, HIGH); // P4 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P5, LOW);  // P5 en ON
  delay(pausa);
  pcf8574.digitalWrite(P5, HIGH); // P5 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P6, LOW);  // P6 en ON
  delay(pausa);
  pcf8574.digitalWrite(P6, HIGH); // P6 en OFF
  delay(pausa);
  
  pcf8574.digitalWrite(P7, LOW);  // P7 en ON
  delay(pausa);
  pcf8574.digitalWrite(P7, HIGH); // P7 en OFF
  delay(pausa);

}

// Funciones
void apagarReles(){
  pcf8574.digitalWrite(P0, HIGH); // P0 en OFF
  pcf8574.digitalWrite(P1, HIGH); // P1 en OFF
  pcf8574.digitalWrite(P2, HIGH); // P2 en OFF
  pcf8574.digitalWrite(P3, HIGH); // P3 en OFF
  pcf8574.digitalWrite(P4, HIGH); // P4 en OFF
  pcf8574.digitalWrite(P5, HIGH); // P5 en OFF
  pcf8574.digitalWrite(P6, HIGH); // P6 en OFF
  pcf8574.digitalWrite(P7, HIGH); // P7 en OFF
}

Ahora a comenzar la pelea para agregar una mini pantalla oled 0,96 y las sondas de medicion de temperatura. Saludos a todos.

Hi, No dices que fue lo que encontraste para resolver el problema para que sirva de experiencia para otros mienbros del forum.

tauro0221: Hi, No dices que fue lo que encontraste para resolver el problema para que sirva de experiencia para otros mienbros del forum.

Estimado, lo que encontre fue la libreria que me permite controlarlos individualmente. Si eso no te sirve a ti o nadie mas, sorry. A mi me sirvio.

Paz!!!!

Hi, Muchas gracias por tu respuesta.

Surbyte, no entendi el primer parrafo..... no se a que te refieres.

Lo segundo, respecto a los millis(), si toda la razon. Ahora estoy estudiandolo y claro, con el delay() todo se detiene y se pierde el control. El codigo que subi, si eran solo pruebas para ver el funcionamiento, para ver que pudiera controlar los reles en forma individual.

Estoy tratando de seguir algunos de tus comentarios que he visto por ahi y voy separando en tareas. No importa que demora mas, pero al menos asi voy teniendo claro lo que puedo o no puedo lograr.

Saludos y peace!!!

No sabes que son conexiones ortogonales? Es que forman ángulo recto.

Este dibujo tiene conexiones ortogonales, es decir cada conexión sigue linea recta y si cambia de dirección lo hace a 90 grados.

Y esto es el mamarracho que no debes dibujar.

|500x342

Y para colmo, es un tutorial del mismo Fritzing

Otro ejemplo bien hecho

|500x250

mal hecho

|500x301

Surbyte, si lo de las conexiones ortogonales lo tenía claro, mi duda es que yo no he subido ningún esquema en fritzing, entonces no sé a qué viene dentro del post.

Gracias de todos modos por el apunte respecto de la forma de dibujar circuitos.

Peace!!!

Aprovecho para hacer pedagogía, tu no eres el único que lee.

Eso se agradece mucho.

Paz.