Manual
do
Maker
.
com
Olha o tamanho desse sensor de temperatura e umidade AHT21. Um espetáculo para agregar em circuitos eletrônicos, considerando que sua borda é castellated. Mas para protótipos também é conveniente, já que possui furação para pinos ou slot.
Sendo uma placa quadrada com 12mm de tamanho, esse sensor faz medições de temperatura e umidade através do barramento I2C.
O CI marca o nome AHT21B e sinceramente, não procurei para ver se tem o A ou uma variação inferior.
Sua tensão de alimentação vai de 2v2 à 5v5 e a comunicação se dá através de I2C. Com essa faixa de tensão, podemos usá-lo em MCUs de 3v3 e 5v, sem preocupação com circuito ou componentes extras.
A precisão de umidade varia em torno de 3%, medida de 0 à 100. A precisão de temperatura, impressionantemente tem uma variação de 0.5% (para mais ou menos também). Claro, deveremos considerar o meio em que o sensor estará, para que não sofra influência de outras fontes de calor. O intervalo de temperatura vai de impressionantes -40 à 80 Celsius.
Seu consumo máximo é de 0.8uW, ou seja, funciona até com a energia de um sorriso. A perda no circuito de uma placa de prototipagem é muito maior do que o consumo do próprio componente.
Para soldagem, a recomendação é contato por menos de 5 segundos à menos de 300 graus.
Se molhado, ele precisa ficar por 12 horas em um lugar mais seco para reidratação do polímero. Também pode ser colocado em ambiente natural para secar, mas aí vai precisar de mais de 2 dias.
Certamente a maioria usa o framework Arduino para programar, seja através da própria IDE ou usando PlatformIO em alguma outra IDE, como o VS Code. Desse modo, o código disposto para Arduino deve servir para qualquer outra MCU que disponha do barramento I2C. Se não for usar com Arduino e não sabe como fazê-lo em outra MCU - Por exemplo, ESP32 - dê uma conferida na busca rápida ou na respectiva categoria para ver a configuração do barramento. Para cada categoria (exceto web, que é nova) tem centenas de artigos sobre os mais diversos tema.
Pensei que não havia biblioteca para esse sensor e então havia começado a escrever a minha. Vou mostrar as informações e tão logo possível, adiciono no gerenciador de bibliotecas do Arduino. Normalmente minhas bibliotecas começam com Easy, se for procurar na IDE do Arduino (EasyPCF8574, EasyPCF8575, EasyColor etc). Essa levará alguns dias para estar disponível, mas se chamará EasyAHT21B.
Se deseja aprender a criar suas próprias bibliotecas também veja o tutorial de como criar uma biblioteca para Arduino.
Para criar uma biblioteca, em casos como esse é fundamental ler o datasheet do AHT21B. A brincadeira de fato começa na página 10 do datasheet.
Você não precisa compreender daqui para baixo, caso não esteja interessado em como funciona a escrita de uma biblioteca. Nesse caso, pode pular para o download da biblioteca existente e sketch de exemplo.
O início da comunicação se dá com a inicialização do barramento I2C, que é abstraído pelas bibliotecas i2C disponíveis nativamente na IDE do Arduino. Por isso, podemos pular diretamente para a comunicação de dados com o sensor.
O endereço padrão é 0x38. Leitura é 1 e escrita é 0. O comando para enviar a medição é 0xAC e a MCU deve aguardar até que a medição seja completada. O bit de leitura e escrita é o LSB; o primeiro bit da direita.
A tabela a seguir descreve os 8 bits do registrador do componente:
BITS | SIGNIFICADO | DESCRIÇÃO |
---|---|---|
bit 7 | indicador de ocupado | 1 - ocupado; 0 - hibernando |
bit 6 e 5 | retenção | retenção |
bit 4 | retenção | retenção |
bit 3 | ativação de calibração | 1 - calibrado; 0 descalibrado |
bit 2 ao 0 | retenção | retenção |
Ao ligar o circuito, deve-se esperar pelo menos 100ms antes de efetuar a primeira leitura.
Antes de fazer a leitura de temperatura e umidade, deve-se pegar o byte de status, enviando 0x71. Se a word de status e 0x18 não resultam em 0x18 (ou seja, 0 + 0x17), deve-se iniciar os registradores 0x1B, 0x1C e 0x1E.
Deve-se aguardar 10ms para enviar 0xAC para a leitura. Esse parâmetro de comando tem 2 bytes, sendo o primeiro 0x33 e o segundo 0x00.
Deve-se aguardar 80ms para que a medição seja concluída. Se a leitura de status no bit 7 da tabela acima for 0, significa que a leitura está completa, então 6 bytes podem ser lidos continuamente. De outro modo, deve-se continuar aguardando.
Recebidos os 6 bytes, deve-se checar o CRC. O CRC é uma checagem de integridade da leitura. Normalmente isso se aplica a qualquer transmissão de dados em todos os níveis, mas pouco de aplica em projetos de lazer, já que a tolerância à falha é quase que absoluta.
Se não precisar do CRC, basta enviar o fechamento da comunicação. Se for checar o CRC, seu valor inicial é 0xFF e a checagem polinominal é:
CRC [7:0] = 1+ X^4 + X^5 + X^8
Primeiramente, o passo de calibração somente precisa ser validado quando ligando o circuito. Esse é um comando para fazer ainda no setup()
. Depois disso, não é necessário no processo de aquisição das leituras.
O gatilho envia o endereço + escrita e 0xAC:
S | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | A | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | A |
---|
Nos primeiros 8 bits estão endereço + escrita . Nos subsequentes, o gatilho de medição 0xAC.
Daí temos DATA0 e DATA1:
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | A | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | A | p |
---|
Vejamos as tabelas do datasheet:
Como já citado, envia-se o pedido de leitura, se espera 80ms e confirma-se se os dados estão prontos. Se o bit 7 for 0, pode-se ler o dado; de outro modo, deve-se aguardar mais.
A umidade relativa (RH) pode ser calculada de acordo com o sinal de saída do SDA, sendo Srh. A fórmula é a seguinte:
A temperatura T pode ser calculada substituindo o sinal de saída de temperatura St na fórmula a seguir:
Com essas informações você já pode tentar fazer suas leituras sem biblioteca mesmo, criando uma função em seu programa para brincar.
"Acho" que sempre que existir um componente novo, dificilmente não teremos de imediato uma biblioteca. Ainda mais contando com a Adafruit, que escreve bibliotecas para praticamente tudo o que existe hoje. Claro que nem sempre é a mais otimizada, a mais simples ou a melhor, mas ter funcionando é melhor do que não ter.
Para usar agora mesmo seu sensor, basta instalar pelo gerenciador de bibliotecas do Arduino a biblioteca Adafruit AHTx0. No menu Arquivos > Exemplos
estará disponível tudo o que precisa para colocar no seu sketch. Por exemplo:
#include <Adafruit_AHTX0.h>
Adafruit_AHTX0 aht;
void setup() {
Serial.begin(115200);
Serial.println("Adafruit AHT10/AHT20 demo!");
if (! aht.begin()) {
Serial.println("Could not find AHT? Check wiring");
while (1) delay(10);
}
Serial.println("AHT10 or AHT20 found");
}
void loop() {
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C");
Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");
delay(500);
}
No sketch, simplesmente precisamos inicializar o barramento I2C no Arduino e com 1 linha, fazer a leitura. Toda a complexidade da compreensão e implementação de uma biblioteca para fazer a comunicação com o sensor foi abstraída!
Se quiser ver uma biblioteca pronta, dê uma olhada na que escrevi em Python para ler sensor BMP180 no Raspberry. Tão logo seja possível, escreverei um artigo mostrando a criação da biblioteca, complementado com um vídeo em nosso canal dobitaobyte no Youtube.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.