Biblioteca para PCF8574 – EasyPCF8574

Enfim, a biblioteca para PCF8574 que criei para exemplificar como criar uma biblioteca para Arduino foi publicada. Nesse artigo vamos ver rapidamente como adicioná-la à IDE do Arduino através do gerenciador de bibliotecas e como utilizá-la.

Abra o gerenciador de bibliotecas do Arduino

Após abrir a IDE do Arduino, vá em Ferramentas > Gerenciador de bibliotecas e digite EasyPCF8574 na caixa de pesquisa. Certamente só haverá essa biblioteca para PCF8574 com esse nome.

biblioteca para PCF8574 - gerenciador de bibliotecas

Clique em Instalar:

biblioteca para PCF8574 -instalador

Agora basta incluir e começar a usar. Já está habituado com I2C? Vamos ao básico.

Como usar o barramento I2C?

O barramento I2C é um barramento de dois fios, chamado TwoWire, mas além dos pinos de dados, temos que alimentar o circuito, certo? Sempre teremos VCC, GND, SDA e SCL. No site do Arduino temos uma referência à biblioteca Wire. Os pinos da MCU para a respectiva placa são esses:

Mas essa biblioteca para PCF8574 foi escrita para ESP8266/ESP32, sequer testei no Arduino. E nesse artigo vou mostrar sua utilização com ESP32, utilizando um circuito que duvido que alguém identifique o que seja, mas em breve também será artigo.

Pinout I2C ESP32

No caso, podemos passar os GPIOs pretendidos. Normalmente utilizo os pinos 21 e 22. Além da definição dos pinos, precisamos saber o endereço do dispositivo em questão. Algumas vezes não é explícito, pode ser necessário olhar no datasheet se não tiver impresso na própria placa do componente, mas também podemos utilizar um scanner I2C, descrito no artigo “Controle de LED RGB com PCA9685 e ESP32“.

O dispositivo que estou utilizando está no endereço 0x27. As primeiras duas linhas do sketch devem ser então:

#include "EasyPCF8574.h"

EasyPCF8574 meu_pcf(0x27, 0); //Parâmetros: endereço (0x27), valor inicial do PCF8574 (qualquer valor entre 0 e 255)

O valor inicial normalmente quereremos como 0 ou 255, dependendo da lógica aplicada. No caso do dispositivo que mostro no vídeo, a lógica é invertida, portanto 0 liga, 1 desliga. No caso, criamos um objeto chamado meu_pcf.

Iniciar o barramento I2C com a biblioteca para PCF8574

O próximo passo é iniciar o barramento I2C. Isso é feito na função setup():

void setup() {
  Serial.begin(9600);
  if (!meu_pcf.startI2C(21, 22)) {
    Serial.println("Not started. Check pin and address.");
    while (true);
  }
}

A serial já é um padrão, quase sempre a inicializamos, principalmente durante o desenvolvimento. Em seguida, uma condicional avalia a inicialização do barramento. Se retornar 0, não foi inicializado. Normalmente isso acontece por duas razões: endereço errado ou wiring errado. Se o dispositivo não foi inicializado, o programa não segue, por essa razão um loop infinito fica rodando dentro da condicional.

Como utilizar a biblioteca para PCF8574 EasyPCF8574

Apenas alguns métodos foram criados, mas devem contemplar todos os recursos. Para fazer um blink pino a pino, podemos escrever esse código no loop:

void loop() {
  meu_pcf.setInvertBit(i);
  delay(1000);
  i = i>5 ? 0 : i+1;
}

setInvertBit

O que o método setInvertBit(i) fará é inverter o estado do bit na posição i, sem a necessidade de fazer uma máscara ou, nos casos mais comuns, criar uma variável para guardar estados dos pinos. E por essa razão que essa é uma biblioteca leve e auxiliadora!

setDownBit(uint8_t bit_to_change)

Os bits vão de 0 à 7. Se quiser baixar um bit, basta chamar essa função com o número do bit.

setFullValue(uint8_t value)

Se quisermos ignorar os estados atuais nos pinos e iniciar um novo valor, basta chamar esse método, passando o valor como parâmetro. O valor pode ser qualquer um, de 0 à 255. Lembre-se que os bits são a potência de 2. Se quisermos levantar o bit 0 e 3 (cujos valores decimais seriam 1 e 8, respectivamente), podemos fazer:

meu_pcf.setFullValue((1<<0)|(1<<3));

Mas a intenção dessa biblioteca é que não precise utilizar bitwise. Porém, se não souber os valores certos das somas dos bits, é a melhor opção. Pode-se somar quantos bits quiser dessa maneira.

setUpBit(uint8_t value)

Essa função levanta o bit na posição bit_to_change. É o inverso do setDownBit.

getBitValue(uint8_t bit_position)

Essa função pega o valor do bit na posição bit_position sem alterar nada no PCF. Ela retorna uint8_t, que é unsigned char. Pra pegar o valor, podemos fazer:

uint8_t valor_do_bit_3 = meu_pcf.getBitValue(3);

getPCFValue()

Pega o valor atual dos bits no PCF e retorna um uint8_t. Quase todos os métodos têm overload do método. O método getPCFValue pode receber como parâmetro o endereço de outro PCF8574 conectado ao mesmo barramento.

Cuidado na inicialização

Os overloads dos métodos permitem acessar outro endereço, mas podemos instanciar objetos separados para cada PCF8574 conectado ao barramento. Mas seja qual for o caso, o método startI2C(21, 22) deve ser chamado apenas uma vez para iniciar o barramento, não importa quantos PCF8574 estejam conectados ao seu ESP32.

Código de exemplo completo

Para fazer o loop nos pinos trocando os estados um a um, o código é esse:

#include <Arduino.h>
#include <EasyPCF8574.h>

EasyPCF8574 meu_pcf(0x27, 0); //PCF address, initial value

uint8_t i = 0;

void setup() {
  Serial.begin(9600);
  if (!meu_pcf.startI2C(21, 22)) {
    Serial.println("Not started. Check pin and address.");
    while (true);
  }
}
void loop() {
    meu_pcf.setInvertBit(i);
    delay(600);
    i = i > 7 ? 0 : i+1;
}

Ficou fácil, hum?

Vídeo

O vídeo será disponibilizado no canal Dobitaobytebrasil para fins demonstrativos. Acredito que esse artigo seja o suficiente para o entendimento da biblioteca.

 

Revisão: Ricardo Amaral de Andrade