Experimentos simples con el microcontrolador STM32F103 (Blue Tablet)

imagen

Parte 2 <- Parte 1

Continuemos experimentando con el microcontrolador STM32F103C8T6, conecte algunos sensores / pantallas I2C a la "tableta azul".

Soporte implementado para pantallas I2C populares:

  • LCD 1602
  • SSD1306

Soporte implementado para los siguientes sensores:

  • BH1750 - Sensor de luz
  • BME280 - sensor de temperatura, presión, humedad
  • CCS811 - Sensor de CO2, VOC (sustancias orgánicas volátiles)

Para comenzar a trabajar con nuevas características, debe crear un nuevo proyecto.
El enlace para descargar el programa MIOC se proporciona en la primera parte.

Sensores


Sensor BH1750


imagen

Sensor de luz BH1750 de 16 bits (medidor de luz) con interfaz I2C. El fotodiodo en el BH1750 determina la intensidad de la luz, que se convierte en el voltaje de salida utilizando un amplificador operacional. El ADC incorporado proporciona datos digitales de 16 bits. La lógica interna del BH1750 elimina la necesidad de realizar cálculos complejos, ya que genera directamente datos digitales significativos en lux (lux).

Según la documentación, el sensor BH1750 es sensible a la luz visible y prácticamente no se ve afectado por la radiación infrarroja, es decir. reacciona a aproximadamente el mismo rango espectral que el ojo humano.

Para trabajar con este sensor, en la pestaña "Configuración", seleccione BH1750.

Los resultados de la medición estarán en la variable global:
uint32_t BH_L;

Conexión del sensor al bus I2C2:

imagen

Sensor BME280


imagen

Este sensor mide los parámetros ambientales: temperatura, presión atmosférica y humedad.

También hay un sensor similar: BMP280, que carece de la capacidad de medir la humedad. Pero cuesta mucho menos.

Además del hecho de que el sensor mide todos los parámetros anteriores, también sabe cómo filtrar el ruido, la calibración de las lecturas está integrada. Además, a diferencia de otros sensores, este sensor realiza todas estas mediciones no solo rápidamente, sino también en rangos más amplios. Por ejemplo, muchos sensores no saben cómo medir la humedad del aire de menos del 20 por ciento.

Las características declaradas del sensor son las siguientes:

imagen
Los sensores están conectados al bus I2C2 de la siguiente manera:

imagen

Si se utilizará BMP280, en el archivo main / bme280.c debe comentar todas las líneas marcadas // Comentario para BMP.

Los resultados de la medición estarán en variables globales:

imagen

Un ejemplo de un programa que funciona con BH1750, sensores BME280 y una pantalla 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 ); } } 

El resultado del programa:

imagen
El mismo programa mostrará la temperatura, la presión y la humedad en la pantalla del SSD1306
(conecte esta pantalla y selecciónela en la configuración):

imagen

El BME280 puede medir la temperatura con mayor precisión. Para hacer esto, debe ser calibrado. En el archivo main / bme280.h, hay una definición de macro para esto:
#define DT 3520

Sensor CCS811


imagen

El aire que nos rodea es una mezcla de gases y se compone principalmente de nitrógeno (aproximadamente el 78%) y oxígeno (aproximadamente el 21%). El porcentaje restante se explica por diversas impurezas (gases inertes, dióxido de carbono, monóxido de carbono, sustancias orgánicas volátiles (VOC), etc.). A pesar de que el porcentaje de impurezas es pequeño, un cambio en su concentración puede ser muy desagradable e incluso peligroso para los humanos. La calidad del aire en oficinas y locales residenciales se asocia con mayor frecuencia con el contenido de CO2 y VOC.

Las sustancias volátiles orgánicas incluyen más de 5000 compuestos. La educación de la mayoría de ellos está de alguna manera conectada con los procesos de la vida humana.

Por lo tanto, incluso una simple presencia humana en una habitación cerrada conduce a la "contaminación" del aire y la necesidad de ventilación. Calcular la concentración de COV en el aire es difícil. Anteriormente, se usaban sensores de CO2 para estimar la concentración de COV. Al mismo tiempo, se tuvo en cuenta el hecho de que, en condiciones normales, las concentraciones de VOC y CO2 están unidas. Conociendo el porcentaje de CO2, se puede determinar indirectamente la concentración de COV. Si el contenido de dióxido de carbono en el aire ha alcanzado un cierto límite, se debe encender la ventilación.

En la práctica, la relación entre VOC y CO2 no siempre es sencilla. Por ejemplo, fumar en interiores provoca un salto brusco en el contenido de VOC, que los sensores de CO2 no registran, por lo que la concentración de dióxido de carbono no cambia mucho. Los sensores de dióxido de carbono también serán impotentes si se usan químicos domésticos, productos de limpieza, pinturas y barnices o perfumes comunes en la habitación. AMS ofrece su solución al problema de medir la concentración de VOC: sensores CCS811.

Características de los sensores de calidad del aire CCS811B:

imagen

El sensor tiene un algoritmo de calibración automática. Los valores medidos se configuran automáticamente en unos pocos días. Por esta razón, el nuevo sensor tiene un error inicial gigantesco y debe funcionar durante al menos tres o cuatro días hasta que se obtengan resultados más o menos confiables:

imagen

El usuario también debe recordar que cada vez que se enciende, el sensor CCS811 debe "calentarse". El tiempo de dicho "calentamiento" es más de 30 minutos, durante el cual el error es inaceptablemente grande:

imagen

Esta característica de CCS811 es extremadamente importante a tener en cuenta.

Los resultados de la medición del sensor están en variables globales:
uint32_t CCS_CO2;
uint32_t CCS_TVOC;

Conexión del sensor al bus I2C2:

imagen

Puede escribir el programa para imprimir los resultados de este sensor utilizando los ejemplos anteriores y la descripción de cómo trabajar con la consola en la primera parte.

Ejemplos de otros sensores.



Sensor de movimiento HC-SR501


imagen

Algunos sensores, como los sensores de movimiento HC-SR501, no requieren escribir fragmentos adicionales.

Para este sensor, declare una variable, seleccione Tipo = GPIO_Mode_IN_FLOATING, seleccione un puerto.

Generar BSP, compilar, subir a MK. A continuación, trabajamos con este sensor de la misma manera que con el botón (para recibir datos).

Conexión del sensor HC-SR501:

imagen

Sensor de temperatura / humedad DHT22


imagen

Sensor de temperatura / humedad

Conexión del sensor:

imagen

El trabajo con este sensor será como un ejemplo de un fragmento de usuario (análogo del boceto arduino).

El fragmento se puede tomar aquí:
dht22.c
Ponlo en la carpeta principal
En este archivo, edite las líneas:

 #define PORT GPIOA #define PIN GPIO_Pin_5 

por conexión real del sensor

El texto del programa para trabajar con este fragmento:

 #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" ); } } 

El resultado del trabajo:

imagen

Más a menudo que cada 4-5 segundos, el sensor no tiene sentido interrogar. Motivos: el cálculo de la temperatura se realiza dentro de 800-900 mS, segundo: si entrevista con más frecuencia, entonces el sensor se calienta automáticamente.

CLI


El firmware contiene un pequeño shell que funciona con la consola. Puede ver qué comandos hay en el archivo principal / mx_cli.c

Si lo desea, puede agregar cualquiera de sus equipos.

La CLI comienza a funcionar en modo Sin eco, es decir, los caracteres que ingresa no se muestran. Para mostrar los caracteres que ingresa, escriba: echo on.

El comando "sh on" emitirá dos veces por segundo los valores de las variables declaradas en el configurador y las variables asociadas con los sensores. El número en la primera posición corresponde al número de línea en la tabla del configurador. Este comando se realiza para transferir datos a un sistema conectado a la consola.

No hay banderas ni mutexes que analicen el ajetreo de la consola. Por lo tanto, cuando se usan juntos el operador "imprimir" y "hacer eco", se puede mezclar la información de salida. No debe usar ambos métodos al mismo tiempo. Para resolver este problema, puede usar dos canales de salida. Por ejemplo, la consola está en UART1 y la salida de información del usuario en VCP. O viceversa.

Usar funciones:

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

Para facilitar el uso de estas funciones, puede cambiar la macro printf en el archivo gbl.h. Por ejemplo, lo siguiente:

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

Ejemplo de salida a la consola (eco activado):

imagen

Escaneo de bus I2Cx


Para escanear el bus I2C1 o I2C2, hay "firmware" * .hex listo para usar.
escáner I2Cx
Salida de información a UART1, velocidad - 115200.8, N, 1
Después de cargar el escáner, presione el botón "Restablecer".

El firmware muestra las direcciones de los dispositivos encontrados en el bus.

imagen

Los tres sensores conectados descritos anteriormente.

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


All Articles