fbpx
1 de julho de 2022

Do bit Ao Byte

Embarcados, Linux e programação

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?