Manual
do
Maker
.
com
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.
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);
}
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 :)
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.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.