Manual

do

Maker

.

com

Biblioteca para PCF8575

Biblioteca para PCF8575

Enfim, a primeira versão da biblioteca para PCF8575, a EasyPCF8575. Tentei contemplar o máximo possível de operações, mas sempre há espaço para novas implementações~~. Deve levar em torno de 15 dias para estar disponível no gerenciador de bibliotecas do Arduino, ainda tenho que montar a estrutura para atender aos critérios de aceitação~~, mas já dá pra usar baixando diretamente do repositório. Em menos de 12 horas a biblioteca já ficou disponível através do gerenciador de bibliotecas, então opte por baixar de lá, para simplificar.

Nota importante sobre criação de biblioteca para Arduino

Atualizei o artigo de como criar biblioteca para Arduino, porque o procedimento mudou. Agora está mais simples e rápido, confira o artigo relacionado.

Como utilizar a biblioteca para PCF8575

Procurei fazer o mais simples possível. Após incluir a biblioteca, criamos um objeto com o nome desejado. Em setup(), passamos os pinos da MCU e o endereço do dispositivo. Se estiver utilizando em Arduino, basta passar o endereço. Se não sabe o endereço e tem "apenas um" PCF8575 conectado à MCU, passe a macro SEARCH, para que seja feita a descoberta automática do endereço.

Para garantir, tem também um método que verifica se o PCF8574 está funcional. Passando disso, é só usar os demais métodos da classe. Até o setup() o código mais adequado é esse:

#include <Arduino.h>
#include <Wire.h>
#include <EasyPCF8575.h>

EasyPCF8575 pcf; //criamos o objeto pcf. Dê o nome que desejar

void setup(){
    Serial.begin(9600);

    pcf.startI2C(21,22,SEARCH); //sda, scl e endereço. SEARCH faz descoberta

    //Verifica se o dispositivo está disponível
    if (!pcf.check(SEARCH)){
        Serial.println("Device not found. Try to specify the address");

        //não precisa, mas se quiser saber o endereço:
        Serial.println(pcf.whichAddr()); //se falhar, será 0
        while (true);
    }

Métodos da classe EasyPCF8575

Alguns métodos tem sobrecarga, como por exemplo, startI2C, que pode receber apenas o endereço ou também os pinos. Na biblioteca deixo as referências em inglês. Os métodos públicos da classe são:

bool check(uint8_t addr);                    
//! Just returns true if pcf found

        uint8_t findPCFaddr();                       
//!find and return PCF address

        uint8_t getLeftByteValue();                  
//! Returns value of left byte
        uint8_t getRightByteValue();                 
//! Returns value of right byte

        uint8_t *getBytesValueAsBytes();             
//! Returns an array of two bytes
        uint16_t getBytesValueAsInt();               
//! Returns bytes value as int

        uint8_t getLeftBitValue(uint8_t bit0upTo7);  
//! check if bit is HIGH or LOW
        uint8_t getRightBitValue(uint8_t bit0upTo7); 
//! check if bit is HIGH or LOW
        uint8_t getBitValue(uint8_t bit0UpTo15);     
//! check if a bit is HIGH or LOW

        void setNewLeftByteValue(uint8_t value);     
//! Set a new value, ignoring last value in left byte
        void setNewRightByteValue(uint8_t value);    
//! Set a new value, ignoring last value in right byte

        void setNewBytesValue(uint8_t *value);       
//! Set a new value, ignoring last two byte values. Here we need pass an array of 2 bytes like [16,5], representing left and right, respectively.

        void setNewBytesValue(uint16_t value);       
//! Set a new value, ignoring last two byte values. Here we can pass a int like 512+128, but not 1+1, because this is equal 2, resulting in 1 byte: 00000010

        void setBitDown(uint8_t bit0upTo15);         
//! Here you can down any bit using numerical position, from 0 to 15
        void setBitUp(uint8_t bit0upTo15);           
//! Here you can up any bit using numerical position, from 0 to 15
        
        void setLeftBitDown(uint8_t bit0upTo7);      
//! Here you can pass the position of any bit of left byte, from 0 to 7. Think as port B
        void setRightBitDown(uint8_t bit0upTo7);     
//! Here you can pass the position of any bit of right byte, from 0 to 7. Think as port A

        void setLeftBitUp(uint8_t bit0upTo7);        
//! Here you can pass the position of any bit of left byte, from 0 to 7. Think as port B
        void setRightBitUp(uint8_t bit0upTo7);       
//! Here you can pass the position of any bit of right byte, from 0 to 7. Think as port A

        void setAllBitsDown();                       
//! Put all bits in LOW
        void setAllBitsUp();                         
//! Put all bits in HIGH

        void setInvertBit(uint8_t bit0upTo15);       
//! Invert bit value

        void startI2C(uint8_t sda_pin, uint8_t scl_pin, uint8_t pcf_addr);
 //!Call it in setup() function. Instead pcf_addr, you can pass SEARCH as parameter to auto discovering
        void startI2C(uint8_t pcf_addr); 
//! Using default pins in Arduino, but other platforms may be needed to use sda, scl and addr.

        uint8_t whichAddr(); 
//Not really necessary, but shows pcf address, if you are a curious :)

Vídeo

No vídeo mostrarei a captura com o analisador lógico e de protocolos, feito com Raspberry Pi Pico. Nesse caso, utilizei apenas para checar o estado de um dos bytes. Também mostro a saída serial de algumas manipulações e explico a criação e uso da biblioteca. Devo levar uns dois dias pra terminar a edição (ou não? - a ver), mas já adianto meu pedido de "inscreva-se no canal DobitaobyteBrasil no Youtube" e mostre-se altruísta, valorizando meu esforço em compartilhar conteúdo, valeu?

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.