
Parte 2 <-
Parte 1Continuamos experimentando o microcontrolador STM32F103C8T6, conectando alguns sensores / displays I2C ao tablet azul.
Suporte implementado para monitores I2C populares:
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

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:

Sensor BME280

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:

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

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:

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();
O resultado do programa:

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

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

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:

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:

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:

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:

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

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:

Sensor de temperatura / umidade DHT22

Sensor de temperatura / umidade
Conexão do sensor:

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.cColoque 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();
O resultado do trabalho:

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));}
Exemplo de saída para o console (eco ativado):

Varredura de barramento I2Cx
Para digitalizar o barramento I2C1 ou I2C2, existem "firmware" * .hex prontos
scanner I2CxSaí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.

Todos os três sensores conectados descritos acima.