sábado, 10 de junio de 2017

Tutorial #1 - Expansor de Puerto I2C PCF8574P con ESP8266 (NodeMCU)

En este tutorial explico cómo obtener más entradas y/o salidas a partir de 2 pines del NodeMCU (placa de IOT internet de las cosas basada en el ESP8266) usando el expansor de puertos I2C PCF8574P.



Código Fuente:

#include <Wire.h> // Librería de Arduino por defecto para comunicarse con I2C 

uint8_t address;

void WriteIo(uint8_t bits)
{
  Wire.beginTransmission(address);
  Wire.write(bits);
  Wire.endTransmission();
}

uint8_t ReadIo()
{  
  WriteIo(B11111111); // PCF8574 requiere que pongamos en alto “1” todas sus salidas antes de hacer una lectura
  
  Wire.beginTransmission(address);
  Wire.requestFrom((int)address, 1); // Pregunta por el primer byte del esclavo
  uint8_t bits = Wire.read(); // Lee ese primer byte
  Wire.endTransmission();
  
  return bits;
}

void setup() {
  Wire.begin(); // SDA=GPIO4,SCL=GPIO5
  address = 0x20;
  Serial.begin(115200);
}

void loop() {
  uint8_t bits = ReadIo();
  Serial.println(bits);
  delay(250);
}

6 comentarios:

  1. Hola, estoy haciendo mis primeras armas en el tema, y te quiero hacer la siguiente consulta.
    Como conecto a arduino dos componentes I2C y que además funcionan a distinta tensión. El caso es un barómetro MB180 (3v) y un LCD (5v). Vi que habría que poner unas resistencias pullup, pero te agradecería el diagrama en fritzing, si es que los sabes. Muchas Gracias.

    ResponderEliminar
  2. No uso Fritzing. Te comento el problema que tenés es muy común y se lo resuelve con un adaptador de niveles lógicos bidireccional, se venden muy baratos en mercadolibre y si querés también podés armarte uno vos con 2 transistores mos.

    ResponderEliminar
  3. Si te interesa saber cómo funciona acá está bien explicado: https://nomadaselectronicos.wordpress.com/2015/02/25/traductor-de-niveles-logicos-de-voltaje-level-translator/
    http://www.servisystem.com.ar/NEOTEO/I2C_Aislador/I2C_aislador.htm

    ResponderEliminar
  4. Hola, muy educativo tu articulo. Ahora te presento un desafio.
    Necesito usarlo en un NODEMCU Lolin v3. Para conectar 8 mudulos reles (con el modulo PCF8574P) , ademas de 2 sensores de temperatura tipo sonda compatibles con I2C, una mini pantalla oled (0,96) y un reloj compatible tambien I2C.
    El punto es que segun la temperatura, active o desactive alguno de los reles. Y a voluntad se puedan apagar o prender los otros reles. Obviamente, desde un servidor web.
    Que tal? Como seria el codigo y mas que nada las conexiones para poder controlar cada elemento de los reles en forma independiente y debe ser lectura/escritura.
    Puedes ayudarme u orientarme con este problema? LLevo mas de 10 dias tratando y no logro hacerlo funcionar.

    ResponderEliminar
    Respuestas
    1. Hola Manuel. Lamentablemente no puedo ayudarte, es demasiado lo que me estás pidiendo. En mi canal hay tutoriales para que puedas resolver casi todo lo que necesitas, lo único que falta es lo de la pantalla OLED, pero tampoco es complicado. Éxitos!

      Eliminar
    2. Hola, te cuento que finalmente lo resolvi. Encontre una libreria que no que es la Wire sino la PCF8574.h y PCF8574.cpp que me permitio lo mismo.
      Ahora una pregunta especifica al tema que tratas: si quieres poner otro PCF8574, como configuras el A0, A1 y A2 para cambiar la direccion?

      Eliminar