Experimentos simples com o microcontrolador STM32F103 (Blue Tablet)

imagem

Parte 2 <- Parte 1

Continuamos experimentando o microcontrolador STM32F103C8T6, conectando alguns sensores / displays I2C ao tablet azul.

Suporte implementado para monitores I2C populares:

  • LCD 1602
  • SSD1306

Suporte implementado para os seguintes sensores:

  • BH1750 - Sensor de luz
  • BME280 - sensor de temperatura, pressão e umidade
  • CCS811 - Sensor de CO2, VOC (substâncias orgânicas voláteis)

Para começar a trabalhar com novos recursos, você precisa criar um novo projeto.
O link para baixar o programa MIOC é fornecido na primeira parte.

Sensores


BH1750 sensor


imagem

BH1750 Sensor de luz de 16 bits (medidor de luz) com interface I2C. O fotodiodo no BH1750 determina a intensidade da luz, que é convertida na tensão de saída usando um amplificador operacional. O ADC embutido fornece dados digitais de 16 bits. A lógica interna do BH1750 elimina a necessidade de cálculos complexos, pois gera diretamente dados digitais significativos em lux (lux).

De acordo com a documentação, o sensor BH1750 é sensível à luz visível e praticamente não é afetado pela radiação infravermelha, ou seja, reage aproximadamente à mesma faixa espectral que o olho humano.

Para trabalhar com esse sensor, na guia "Configuração", selecione BH1750.

Os resultados da medição estarão na variável global:
uint32_t BH_L;

Conectando o sensor ao barramento I2C2:

imagem

Sensor BME280


imagem

Este sensor mede os parâmetros ambientais: temperatura, pressão atmosférica e umidade.

Há também um sensor semelhante - o BMP280, que não possui a capacidade de medir a umidade. Mas custa muito menos.

Além do fato de o sensor medir todos os parâmetros acima, ele também sabe como filtrar o ruído, a calibração das leituras é incorporada a ele. Além disso, ao contrário de outros sensores, esse sensor faz todas essas medições não apenas rapidamente, mas também em faixas mais amplas. Por exemplo, muitos sensores não sabem como medir a umidade do ar em menos de 20%.

As características declaradas do sensor são as seguintes:

imagem
Os sensores estão conectados ao barramento I2C2 da seguinte maneira:

imagem

Se o BMP280 for usado, no arquivo principal / bme280.c você precisará comentar todas as linhas marcadas com o botão // Comentar para o BMP.

Os resultados da medição estarão em variáveis ​​globais:

imagem

Um exemplo de um programa que trabalha com os sensores BH1750, BME280 e um display 1602:

#include "mx_init_hw.c" int main() { char s[64]; float t=0, p=0, h=0; Init_HW(); // --------------------- // The main program loop // --------------------- while( TRUE ) { delay_ms( 300 ); t = BME_T / 10.0; p = BME_P / 100.0; h = BME_H / 10.0; sprintf( s, "t=%-7.1fC", t ); SSD1306_write_string( 1, s ); sprintf( s, "p=%-7.1fPa", p ); SSD1306_write_string( 2, s ); sprintf( s, "h=%-7.1f%% ", h ); SSD1306_write_string( 3, s ); sprintf( s, "T=%-7.1fH=%.1f", t, h ); LCD_write_string( 1, s ); sprintf( s, "P=%-7.1fL=%u", p, BH_L ); LCD_write_string( 2, s ); } } 

O resultado do programa:

imagem
O mesmo programa exibirá temperatura, pressão e umidade no visor do SSD1306
(conecte esta tela e selecione-a na configuração):

imagem

O BME280 pode medir a temperatura com maior precisão. Para fazer isso, ele deve ser calibrado. No arquivo principal / bme280.h, há uma definição de macro para isso:
#define DT 3520

Sensor CCS811


imagem

O ar ao nosso redor é uma mistura de gases e consiste principalmente de nitrogênio (cerca de 78%) e oxigênio (cerca de 21%). A porcentagem restante é explicada por várias impurezas (gases inertes, dióxido de carbono, monóxido de carbono, substâncias voláteis orgânicas (VOC), etc.). Apesar de a porcentagem de impurezas ser pequena, uma mudança na concentração pode ser muito desagradável e até perigosa para os seres humanos. A qualidade do ar em escritórios e instalações residenciais é mais frequentemente associada ao conteúdo de CO2 e VOC.

Substâncias voláteis orgânicas incluem mais de 5000 compostos. A educação da maioria deles está de alguma forma conectada com os processos da vida humana.

Assim, mesmo uma simples presença humana em uma sala fechada leva à "poluição" do ar e à necessidade de ventilação. Estimar a concentração de COV no ar é difícil. Anteriormente, sensores de CO2 eram usados ​​para estimar a concentração de COV. Ao mesmo tempo, foi levado em consideração que, em condições normais, as concentrações de VOC e CO2 são limitadas. Conhecendo a porcentagem de CO2, pode-se determinar indiretamente a concentração de COV. Se o conteúdo de dióxido de carbono no ar atingir um determinado limite, a ventilação deve ser ligada.

Na prática, a relação entre VOC e CO2 nem sempre é direta. Por exemplo, o fumo em ambientes fechados causa um aumento acentuado no conteúdo de COV, que os sensores de CO2 não registram, portanto a concentração de dióxido de carbono não muda muito. Os sensores de dióxido de carbono também não terão energia se forem utilizados produtos químicos domésticos, produtos de limpeza, tintas e vernizes ou perfumes comuns na sala. A AMS oferece sua solução para o problema de medir a concentração de COV - sensores CCS811.

Recursos dos sensores de qualidade do ar CCS811B:

imagem

O sensor possui um algoritmo de calibração automática. Os valores medidos são definidos automaticamente dentro de alguns dias. Por esse motivo, o novo sensor apresenta um erro inicial gigantesco e deve funcionar por pelo menos três a quatro dias até que resultados mais ou menos confiáveis ​​sejam obtidos:

imagem

O usuário também precisa se lembrar de que, após ligar, o sensor CCS811 deve "aquecer". O tempo desse aquecimento é superior a 30 minutos, durante os quais o erro é inaceitavelmente grande:

imagem

Esse recurso do CCS811 é extremamente importante a considerar.

Os resultados da medição do sensor estão em variáveis ​​globais:
uint32_t CCS_CO2;
uint32_t CCS_TVOC;

Conectando o sensor ao barramento I2C2:

imagem

Você pode escrever o programa para imprimir os resultados desse sensor usando os exemplos acima e a descrição de como trabalhar com o console na primeira parte.

Exemplos de outros sensores



Sensor de movimento HC-SR501


imagem

Alguns sensores, como os sensores de movimento HC-SR501, não exigem gravação de trechos adicionais.

Para esse sensor, declare uma variável, selecione Tipo = GPIO_Mode_IN_FLOATING, selecione uma porta.

Gere BSP, compile, faça o upload para o MK. Em seguida, trabalhamos com esse sensor da mesma maneira que com o botão (para receber dados).

Conexão do sensor HC-SR501:

imagem

Sensor de temperatura / umidade DHT22


imagem

Sensor de temperatura / umidade

Conexão do sensor:

imagem

O trabalho com esse sensor será um exemplo de um trecho de usuário (análogo do esboço do arduino).

O snippet pode ser obtido aqui:
dht22.c
Coloque na pasta principal
Neste arquivo, edite as linhas:

 #define PORT GPIOA #define PIN GPIO_Pin_5 

pela conexão real do sensor

O texto do programa para trabalhar com este trecho:

 #include "mx_init_hw.c" #include "dht_22.c" int main() { int16_t dht_t, dht_h; Init_HW(); dht_init(); // --------------------- // The main program loop // --------------------- while( TRUE ) { delay_ms( 5000 ); if( !get_dht_data( &dht_t, &dht_h ) ) print( "t=%.1f h=%.1f\r\n", (float)dht_t / 10.0, (float)dht_h / 10.0 ) else print( "DHT 22 - ERR\r\n" ); } } 

O resultado do trabalho:

imagem

Mais frequentemente do que a cada 4-5 segundos, o sensor não faz sentido interrogar. Razões: o cálculo da temperatura ocorre entre 800 e 900 mS; segundo: se você entrevistar com mais frequência, o sensor se aquece automaticamente.

CLI


O firmware contém um pequeno shell que funciona com o console. Você pode ver quais comandos estão no arquivo principal / mx_cli.c

Se desejar, você pode adicionar qualquer uma das suas equipes.

A CLI começa a trabalhar no modo Sem eco, ou seja, os caracteres digitados não são exibidos. Para exibir os caracteres digitados, digite: eco on.

O comando “sh on” produzirá duas vezes por segundo os valores das variáveis ​​declaradas no configurador e as variáveis ​​associadas aos sensores. O número na primeira posição corresponde ao número da linha na tabela do configurador. Este comando é feito para transferir dados para um sistema conectado ao console.

Não há sinalizadores e mutexes que analisem a ocupação do console. Portanto, ao usar o operador “imprimir” e “eco” juntos, pode ocorrer a mistura das informações de saída. Você não deve usar os dois métodos ao mesmo tempo. Para resolver esse problema, você pode usar dois canais de saída. Por exemplo, o console está no UART1 e a saída de informações do usuário no VCP. Ou vice-versa.

Use funções:

 send_uart1( char *data, int len ) send_usb( char *data, int len ) 

Para facilitar o uso dessas funções, você pode alterar a macro printf no arquivo gbl.h. Por exemplo, o seguinte:

 #define printf(fmt,argv...){char s[128];sprintf(s,fmt,##argv);send_usb(s,strlen(s));} //   VCP 

Exemplo de saída para o console (eco ativado):

imagem

Varredura de barramento I2Cx


Para digitalizar o barramento I2C1 ou I2C2, existem "firmware" * .hex prontos
scanner I2Cx
Saída de informação para UART1, velocidade - 115200.8, N, 1
Após carregar o scanner, pressione o botão “Reset”.

O firmware mostra os endereços dos dispositivos encontrados no barramento.

imagem

Todos os três sensores conectados descritos acima.

Source: https://habr.com/ru/post/pt472204/


All Articles