Nunca há pinos GPIO suficientes em um microprocessador
Colocado sobreDe alguma forma, não importa qual microprocessador eu escolha, fico sem pinos GPIO para as necessidades do projeto ou para o que quero fazer.
Então, para um projeto recente, mudei do ESP8266 para o ESP32, que tem muito mais pinos GPIO do que seu antecessor ... mas ainda não o suficiente para o projeto em que estou trabalhando.
Para acabar com essa corrida para pinos GPIO de uma vez por todas, decidi que precisava de uma placa de expansão barata que pudesse ser configurada para switches (entrada) e LEDs ou outras coisas (saída). E enquanto eu estava nisso, pensei que alguma lógica extra seria legal.
Então, o que eu criei é uma placa I2C com oito pinos GPIO que são livremente configuráveis para entrada ou saída (eu chamo os pinos GPIO de "Slots").
A placa de expansão é ideal para uso em breadboard sem solda. O esquema pode ser posteriormente incorporado ao projeto geral de hardware.
Um slot configurado para entrada provavelmente será usado para interruptores e seria ótimo se pudéssemos distinguir entre pressionar o botão e liberá-lo (liberação rápida, liberação intermediária e liberação longa). No código do processador principal, você pode apenas dizer:
Os slots configurados para saída tornam-se um tipo de slot "atirar e esquecer". Ou seja, você pode definir o Slot como HIGH ou LOW como na função digitalWrite() no IDE Arduino . Mas você também pode dizer: vai para ALTO por 2500 ms e depois vai para BAIXO novamente. Em seu programa principal, você não precisa escrever o código para esperar 2500 ms e, em seguida, tornar o pino GPIO LOW.
Você também pode dizer ao bloqueio para piscar com um horário de ativação e desativação e, se desejar, uma duração. Por exemplo:
O bloqueio pisca a 500ms ligado, 1000ms desligado por um período de 10 segundos (10000ms) e então para de piscar.
Semelhante ao exemplo acima, mas agora o Lock piscará para sempre (ou até que você diga para fazer outra coisa);
O hardware é projetado em torno de um microcontrolador ATtiny841. A comunicação é feita através do barramento I2C (dois fios, SCL e SDA).
Você pode executar as placas em 5Volt ou 3,3Volt dependendo de suas necessidades (principalmente a voltagem que o processador principal usa), mas você não pode conectar sistemas de 5Volt e 3,3Volt juntos sem alguma lógica extra (deslocadores de nível para as linhas SDA e SCL) .
Para controlar as placas ADW0720 desenvolvi uma biblioteca com funções simples.
Todo dispositivo I2C possui um endereço na faixa de 1 a 127 (decimal). O endereço padrão das placas ADW0720 é 0x18 (24 decimais), mas você pode alterar para o que quiser com o seguinte código:
A segunda linha armazena isso novo endereço em EEPROM e a partir daí é novo endereço o endereço para este módulo.
Ao atribuir a cada placa ADW0720 um endereço exclusivo, você pode controlar várias placas ADW0720 usando apenas as duas linhas I2C!
Desenhei dois tipos de placas ADW0720 prontas para uso. A placa Tipo 1 possui 4 interruptores táteis e 4 LEDs, a placa Tipo 2 possui 8 LEDs, mas nenhum interruptor.
Em vez dos LEDs, também é possível acionar um MOSFET de canal N (como o 2N7000 ou 2N7002) como um interruptor para acionar cargas maiores, como campainhas, relés ou motores.
Você pode encontrar a biblioteca e o código do escravo ATtiny841-I2C em github. Lá você também encontrará a documentação da biblioteca.
A biblioteca vem com dois esboços de exemplo. O primeiro é mostrar o que as placas ADW0720 podem fazer (show-of) e o segundo exemplo (I2C_ADW0720_Configurator) mostra o uso mais avançado.
Com o segundo exemplo, você pode, por exemplo, definir a função (entrada ou saída) dos Slots e pode definir o endereço I2C do ADW0720 para que não precise fazer isso em seu programa principal.