Bote de basura inteligente diseñado en base a STM32+Huawei Cloud IOT

1. Introducción del proyecto

En lugares concurridos, como calles comerciales, calles de bocadillos y lugares pintorescos, la limpieza oportuna de los botes de basura es crucial para brindar una buena experiencia a los visitantes. Sin embargo, el método tradicional de limpieza de los botes de basura generalmente se lleva a cabo de forma programada o periódica y no puede responder a tiempo de acuerdo con la situación real, lo que provoca que los botes de basura se desborden, afecte el saneamiento ambiental y cause molestias e insatisfacción a los turistas.

Para resolver este problema, este proyecto diseñó un sistema de gestión de contenedores de basura inteligente basado en el chip de control principal STM32F103ZET6 y la plataforma Huawei Cloud IoT. El sistema está conectado a la plataforma Huawei Cloud IoT a través del módulo NBIOT-BC26, lo que permite la recopilación y carga de datos de botes de basura en tiempo real.

A nivel local, los botes de basura recopilan datos a través de una variedad de sensores. Utilice el módulo DHT11 para monitorear la temperatura y humedad ambiente en tiempo real para comprender el estado del ambiente donde se encuentra el bote de basura. El módulo GPS producido por Zhongke Microelectronics se utiliza para generar datos GPS a través del puerto serie para realizar la función de posicionamiento del bote de basura. La boca del bote de basura también está equipada con un sensor de infrarrojos para detectar si el bote de basura está lleno.

A través del módulo NBIOT-BC26, los datos recopilados se cargan en la plataforma Huawei Cloud IoT en tiempo real. En el centro de gestión del personal de limpieza se desarrolló una gran pantalla de datos utilizando Qt y ejecutando bajo sistema Windows. La gran pantalla de datos muestra información detallada sobre los botes de basura en el área, incluida la temperatura ambiente, la humedad, el posicionamiento GPS y el estado de desbordamiento de los botes de basura.

Cuando el bote de basura esté lleno, el anfitrión enviará un mensaje de texto en tiempo real para notificar al personal de limpieza que lo limpie y proporcionará la información de ubicación del bote de basura para que el personal de limpieza pueda responder rápidamente y realizar operaciones de limpieza.

A través de este sistema inteligente de gestión de botes de basura, la limpieza de los botes de basura se puede programar a tiempo de acuerdo con la situación real, lo que mejora la eficiencia del uso de los botes de basura, mejora el saneamiento ambiental y mejora la experiencia de los turistas. Al mismo tiempo, el personal de limpieza puede gestionar los botes de basura de manera más eficiente, mejorar la eficiencia del trabajo y reducir el desperdicio de recursos. Todo el sistema está diseñado para proporcionar una solución inteligente y eficiente para la gestión de contenedores de basura, aportando comodidad y mejora a la gestión del saneamiento ambiental en lugares públicos.

imagen-20230728140353572

imagen-20230728140410093

imagen-20230728141958810

2. Resumen de ideas de diseño.

2.1 Selección de hardware

【1】Chip de control principal: STM32F103ZET6

  • La serie STM32F103 es una serie de microcontroladores ARM Cortex-M3 de 32 bits y alto rendimiento lanzada por STMicroelectronics. Se eligió STM32F103ZET6 como chip de control principal porque tiene una alta potencia informática y ricas interfaces periféricas, que pueden satisfacer las necesidades del proyecto.

【2】Módulo de comunicación: NBIOT-BC26

  • NBIOT-BC26 es un módulo de comunicación de Internet de las cosas (NB-IoT) de banda estrecha que admite bajo consumo de energía, amplia cobertura y comunicación IoT de larga distancia. Puede cargar los datos recopilados del bote de basura a la plataforma en la nube a través de la red NB-IoT para lograr monitoreo y administración remota en tiempo real.

【3】Módulo de sensor:

  • Módulo DHT11: se utiliza para recopilar datos de temperatura y humedad ambiente. DHT11 es un sensor digital de temperatura y humedad de bajo costo con una interfaz simple y buen rendimiento, adecuado para las necesidades de monitoreo de temperatura y humedad de este proyecto.
  • Módulo GPS: utilizado para realizar la función de posicionamiento del bote de basura. Seleccione el módulo GPS producido por Zhongke Microelectronics y envíe los datos del GPS a través del puerto serie para obtener con precisión la información de ubicación del bote de basura.
  • Sensor de infrarrojos: se utiliza para detectar si el cubo de basura está lleno. El sensor de infrarrojos puede determinar si hay basura en el bote de basura mediante el reflejo de los rayos infrarrojos, determinando así el estado de desbordamiento del bote de basura.

【5】Pantalla grande de datos: desarrollado usando Qt y ejecutándose bajo el sistema Windows. La gran pantalla de datos muestra la información detallada del contenedor de basura a través de una interfaz gráfica, incluida la temperatura ambiente, la humedad, el posicionamiento GPS y el estado de desbordamiento del contenedor de basura.

La selección de hardware del proyecto incluye chip de control principal, módulo de comunicación, módulo de sensor, sensor de infrarrojos y pantalla de datos grande. Estos componentes de hardware cooperan entre sí para realizar las funciones del sistema inteligente de gestión de contenedores de basura, incluida la recopilación de datos, la transmisión de comunicaciones, las funciones de posicionamiento y la visualización de información.

2.2 Diseño de hardware

[1] Selección del chip de control principal:
como núcleo de todo el sistema, se seleccionó STM32F103ZET6 como chip de control principal. El chip tiene una alta potencia informática y ricas interfaces periféricas, que pueden satisfacer las necesidades del proyecto. El chip de control principal es responsable de la comunicación y el procesamiento de datos con cada módulo de hardware y, al mismo tiempo, controla la transmisión de datos del módulo de comunicación.

[2] Selección del módulo de comunicación:
para realizar la recolección y carga de datos de botes de basura en tiempo real, se seleccionó el módulo de comunicación NBIOT-BC26. NBIOT-BC26 admite comunicación IoT de banda estrecha y presenta bajo consumo de energía, amplia cobertura y transmisión de larga distancia. Puede cargar los datos recopilados a la plataforma Huawei Cloud IoT a través de la red NB-IoT.

【3】Selección del módulo de sensor:

  • El módulo DHT11 se utiliza para recopilar datos de temperatura y humedad ambiente. DHT11 es un sensor digital de temperatura y humedad de bajo costo que genera valores de temperatura y humedad a través de señales digitales. Tiene una interfaz simple y buen rendimiento, y es adecuado para las necesidades de monitoreo de temperatura y humedad de este proyecto.
  • El módulo GPS se utiliza para realizar la función de posicionamiento del bote de basura. Seleccione el módulo GPS producido por Zhongke Microelectronics y envíe los datos del GPS a través del puerto serie para obtener con precisión la información de ubicación del bote de basura.
  • Diseño de sensor de infrarrojos:
    para detectar si el bote de basura está lleno, se utiliza un sensor de infrarrojos. El sensor de infrarrojos puede determinar si hay basura en el bote de basura mediante el reflejo de los rayos infrarrojos, determinando así el estado de desbordamiento del bote de basura. El sensor de infrarrojos está conectado al chip de control principal, recibe la señal del sensor a través del puerto de entrada digital y realiza procesamiento y evaluación.

【4】 Diseño de pantalla grande de datos:
la pantalla grande de datos se desarrolla utilizando Qt y se ejecuta en el sistema Windows. La información detallada del bote de basura se muestra a través de la interfaz gráfica, incluida la temperatura ambiente, la humedad, el posicionamiento GPS y el estado de desbordamiento del bote de basura. El chip de control principal transmite datos en tiempo real a través de la interfaz de comunicación con la pantalla de datos, y la pantalla de datos muestra los datos de acuerdo con los datos recibidos.

La idea completa del diseño del hardware es conectar cada módulo de hardware con el chip de control principal y realizar la recopilación de datos, la transmisión de comunicación, la función de posicionamiento y la visualización de información a través del control y procesamiento de datos del chip de control principal. A través de una selección razonable de componentes de hardware y un diseño de interfaz y conexión apropiados, se realizan las funciones del sistema inteligente de gestión de contenedores de basura.

2.3 Diseño de software

【1】 Diseño de la arquitectura del sistema:
el primer paso en el diseño de software es determinar la arquitectura general del sistema. Según los requisitos del proyecto, se puede adoptar un diseño de arquitectura en capas para dividir el sistema en capa de aplicación, capa de lógica empresarial y capa de controlador. La capa de aplicación es responsable de interactuar con los usuarios, la capa de lógica empresarial maneja la lógica empresarial específica y la capa de controlador se comunica y controla los módulos de hardware.

【2】 Diseño del controlador de hardware:
para cada módulo de hardware, se debe escribir un controlador correspondiente. El chip de control principal se comunica con el módulo de comunicación, el módulo de sensor y el sensor de infrarrojos e interactúa con ellos a través del puerto serie, I2C, SPI y otras interfaces. El controlador de cada módulo de hardware debe incluir funciones tales como inicialización, adquisición de datos y control.

【3】 Procesamiento de datos y control lógico:
el chip de control principal es responsable de recibir datos de cada módulo de hardware y realizar el procesamiento y control lógico. Por ejemplo, después de leer los datos de temperatura y humedad del sensor DHT11, los datos se pueden verificar y convertir, y luego, según el umbral establecido, se puede determinar si se requiere la operación de secado. Al mismo tiempo, el chip de control principal también es responsable de controlar el sensor de infrarrojos para detectar el estado de desbordamiento del bote de basura.

[4] Comunicación y carga de datos:
a través del módulo de comunicación NBIOT-BC26, los datos recopilados se cargan en la plataforma Huawei Cloud IoT a través de la red NB-IoT. El chip de control principal se comunica con el módulo de comunicación, empaqueta los datos que deben cargarse en el formato correspondiente y los envía al módulo de comunicación a través del puerto serie y otras interfaces para implementar la carga de datos.

【5】 Diseño de interfaz de usuario:
el software también necesita diseñar una interfaz de usuario para que los usuarios puedan ver intuitivamente el estado y la información de datos del bote de basura. Puede utilizar herramientas como Qt para el diseño de interfaces para mostrar información como la temperatura ambiente, la humedad, el posicionamiento GPS y el estado de desbordamiento del bote de basura. La interfaz de usuario se comunica con el chip de control principal, recibe datos y los muestra.

Toda la idea de diseño del software se basa en el diseño de la arquitectura del sistema, y ​​las funciones del sistema inteligente de gestión de contenedores de basura se realizan mediante el desarrollo de módulos como controladores de hardware, procesamiento de datos y control lógico, comunicación y carga de datos, y diseño de interfaz de usuario. El diseño de software debe combinarse con el diseño de hardware para garantizar la operación coordinada de recopilación, procesamiento, transmisión y visualización de datos.

2.4 Proceso de interacción del sistema

【1】El usuario abre la aplicación del sistema inteligente de gestión de botes de basura.

【2】Inicialización del sistema:

  • El sistema realiza la inicialización del hardware, incluida la inicialización del chip de control principal, el módulo de comunicación, el módulo de sensor y el sensor de infrarrojos.
  • Asegúrese de que el módulo de comunicación esté conectado a la red NB-IoT y establezca una conexión de comunicación con la plataforma Huawei Cloud IoT.

【3】Monitoreo ambiental:

  • El sistema comienza a monitorear la temperatura y humedad ambiental y obtiene la información de ubicación del bote de basura. El chip de control principal obtiene datos de temperatura y humedad a través del sensor DHT11 y obtiene la información de ubicación del bote de basura a través del módulo GPS.

【4】 Procesamiento de datos y control lógico:

  • El chip de control principal procesa y controla lógicamente los datos recopilados. Puede determinar si es necesario limpiar el bote de basura en función de los datos de temperatura y humedad, y detectar el estado de desbordamiento del bote de basura a través de sensores infrarrojos.

【5】Carga de datos:

  • El chip de control principal carga los datos procesados ​​a la plataforma Huawei Cloud IoT a través del módulo de comunicación. Los datos pueden incluir información como temperatura ambiente, humedad, ubicación GPS y estado de desbordamiento de los botes de basura.
  • Los datos cargados pueden empaquetarse en JSON y otros formatos y transmitirse a la plataforma Huawei Cloud IoT a través de la red NB-IoT.

【6】Visualización de datos:

  • La interfaz de usuario recibe los datos transmitidos desde el chip de control principal y los muestra. Los usuarios pueden ver información como la temperatura ambiente, la humedad, el posicionamiento GPS y el estado de desbordamiento del bote de basura en la interfaz.
  • La visualización de datos se puede presentar en forma de gráficos, texto, imágenes, etc., para que los usuarios puedan comprender intuitivamente el estado del sistema y la información de los datos.

El proceso de interacción de todo el sistema implica la recopilación de datos del módulo de hardware, el procesamiento de datos y el control lógico del chip de control principal, la carga de datos del módulo de comunicación y la visualización de datos y la interacción del usuario de la interfaz de usuario. A través de estos pasos, los usuarios pueden monitorear y administrar fácilmente el estado y la información de datos del bote de basura inteligente.

3. Implementar la plataforma IoT en la nube de Huawei

Sitio web oficial de la nube de Huawei: https://www.huaweicloud.com/

Abra el sitio web oficial y busque Internet de las cosas para encontrarlo rápidamente 设备接入IoTDA.

imagen-20221204193824815

3.1 Introducción a la plataforma IoT

La plataforma Huawei Cloud Internet of Things (servicio en la nube de acceso a dispositivos IoT) proporciona capacidades de acceso y administración para dispositivos masivos, conecta dispositivos físicos a la nube, admite la recopilación de datos de dispositivos en la nube y la nube emite comandos a los dispositivos para control remoto y coopera con Huawei Cloud Otros productos nos ayudan a crear rápidamente soluciones de IoT.

El uso de la plataforma IoT para crear una solución IoT completa incluye principalmente 3 partes: plataforma IoT, aplicaciones comerciales y equipos.

Como capa intermedia que conecta aplicaciones y dispositivos empresariales, la plataforma IoT protege varias interfaces complejas de dispositivos y permite un acceso rápido a los dispositivos. También proporciona potentes capacidades abiertas para ayudar a los usuarios de la industria a crear diversas soluciones de IoT.

Los dispositivos pueden acceder a la plataforma IoT a través de redes fijas, 2G/3G/4G/5G, NB-IoT, Wifi y otras redes, y utilizar protocolos LWM2M/CoAP, MQTT, HTTPS para informar datos comerciales a la plataforma. comandos de control al dispositivo.

Las aplicaciones comerciales implementan escenarios comerciales como la recopilación de datos de dispositivos, la emisión de comandos y la administración de dispositivos llamando a la API proporcionada por la plataforma IoT.

imagen

3.2 Activar servicios de IoT

Dirección: https://www.huaweicloud.com/product/iothub.html

imagen-20221204194233414

De forma predeterminada, se le pedirá que active la versión estándar cuando ingrese. No habrá versión básica después del 1 de enero de 2023.

imagen-20230313171311582

imagen-20230313171325183

Después de la activación, haga clic 总览para ver la información de acceso. Nuestro equipo actual utilizará el protocolo MQTT para conectarse a la plataforma Huawei Cloud, aquí puede ver la dirección y el número de puerto del protocolo MQTT y otra información.

imagen-20230321154943337

Resumir:

端口号:   MQTT (1883)| MQTTS (8883)   
接入地址: 7445c6bcd3.st1.iotda-app.cn-north-4.myhuaweicloud.com

Obtenga información de la dirección IP basada en la dirección del nombre de dominio:

Microsoft Windows [版本 10.0.19044.2728]
(c) Microsoft Corporation。保留所有权利。

C:\Users\11266>ping 7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com

正在 Ping 7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:
来自 117.78.5.125 的回复: 字节=32 时间=42ms TTL=30
来自 117.78.5.125 的回复: 字节=32 时间=35ms TTL=30
来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=30
来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=30

117.78.5.125 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 35ms,最长 = 42ms,平均 = 37ms

C:\Users\11266>

imagen-20230321161044723

Hay dos números de puerto de acceso al protocolo MQTT: 1883 es ​​un puerto no cifrado y 8883 es ​​un puerto de cifrado de certificado. El microcontrolador no puede cargar el certificado, por lo que es más apropiado utilizar el puerto 1883. El próximo ESP8266 utiliza el puerto 1883 para conectarse a la plataforma Huawei Cloud IoT.

3.3 Crear productos

(1) Crear productos

Haga clic en la página del producto, luego haga clic en Crear producto en la esquina superior izquierda.

imagen-20230313171503547

(2) Complete la información del producto

Complete el formulario según el nombre de su producto.

imagen-20230728135430775

(3) La creación del producto es exitosa

imagen-20230728135444283

(4) Agregar modelo personalizado

Una vez creado el producto, haga clic para ingresar a la página de detalles del producto y desplácese hasta la parte inferior para ver la definición del modelo.

Primero haga clic en Modelo personalizado.

imagen-20230313171815860

Cree otra ID de servicio.

imagen-20230321155733514

Luego haga clic en Agregar atributo.

imagen-20230321155756735

3.4 Agregar dispositivo

El producto es un modelo abstracto que pertenece a la capa superior, y luego el equipo real se agrega debajo del modelo del producto. Eventualmente, el dispositivo agregado debe asociarse con el dispositivo real para completar la interacción de datos.

(1) Registrar dispositivo

imagen-20230313173158883

(2) Complete según su propio equipo

imagen-20230728135539727

(3) Guardar información del dispositivo

Después de la creación, haga clic en Guardar y cerrar para obtener la información de la clave del dispositivo creado. Esta información es necesaria al generar tripletas MQTT más adelante.

imagen-20230728135557050

(4) Creación del dispositivo completada

imagen-20230728135620427

3.5 Suscripción y publicación de temas del protocolo MQTT

(1) Introducción al protocolo MQTT

El equipo actual utiliza el protocolo MQTT para comunicarse con Huawei Cloud Platform.

MQTT es un protocolo de transporte de IoT que está diseñado para la transmisión ligera de mensajes de publicación/suscripción para proporcionar servicios de red confiables para dispositivos de IoT en entornos de red inestables y de bajo ancho de banda. MQTT es un protocolo de transmisión ligero desarrollado específicamente para Internet de las cosas. El protocolo MQTT se ha optimizado especialmente para redes y dispositivos de bajo ancho de banda con baja potencia informática, lo que lo hace adaptable a diversos escenarios de aplicaciones de IoT. En la actualidad, MQTT tiene clientes en varias plataformas y dispositivos y ha formado un ecosistema preliminar.

MQTT es un protocolo de cola de mensajes que utiliza el modelo de mensajes de publicación/suscripción para proporcionar aplicaciones de desacoplamiento y publicación de mensajes de uno a muchos. En comparación con otros protocolos, el desarrollo es más simple; el protocolo MQTT funciona en el protocolo TCP/IP; por TCP El El protocolo /IP proporciona una conexión de red estable; por lo tanto, cualquier dispositivo de red con una pila de protocolo TCP puede utilizar el protocolo MQTT. El ESP8266 utilizado en este dispositivo tiene una pila de protocolos TCP y puede establecer una conexión TCP, por lo que con el protocolo MQTT encapsulado en el código STM32 se puede completar la comunicación con la plataforma en la nube de Huawei.

El documento de ayuda para el acceso al protocolo MQTT de Huawei Cloud está aquí: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

imagen

Procesos de negocio:

imagen

(2) Restricciones de uso del protocolo MQTT de Huawei Cloud Platform

describir límite
Versiones de protocolo MQTT compatibles 3.1.1
Diferencias con el protocolo MQTT estándar Admite Qos 0 y Qos 1. Admite personalización de temas. No admite QoS2. No admite will y retiene mensajes.
Niveles de seguridad soportados por MQTTS Adopte la base del canal TCP + protocolo TLS (hasta la versión TLSv1.3)
Número máximo de solicitudes de conexión MQTT por segundo para una sola cuenta Ilimitado
Número máximo de conexiones MQTT admitidas por un solo dispositivo por minuto 1
El rendimiento por segundo de una única conexión MQTT, es decir, el ancho de banda, incluidos los dispositivos y puertas de enlace conectados directamente. 3KB/s
La longitud máxima de un único mensaje de publicación MQTT. Las solicitudes de publicación que excedan este tamaño serán rechazadas directamente. 1MB
Valor recomendado del tiempo de latido de conexión MQTT El tiempo de latido está limitado de 30 a 1200 segundos y la configuración recomendada es 120 segundos.
¿El producto admite temas personalizados? apoyo
Publicación de mensajes y suscripción. El dispositivo sólo puede publicar y suscribir mensajes a su propio tema.
Número máximo de suscripciones por solicitud de suscripción Ilimitado

(3) Formato de suscripción al tema

Dirección del documento de ayuda: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

imagen-20221207153310037

Para los dispositivos, generalmente se suscriben al tema de los mensajes enviados por la plataforma al dispositivo.

Si un dispositivo desea recibir mensajes enviados por la plataforma, debe suscribirse al tema de mensajes enviados por la plataforma al dispositivo. Después de suscribirse, la plataforma envía mensajes al dispositivo y el dispositivo recibirá el mensaje.

Si el dispositivo quiere conocer los mensajes enviados por la plataforma, debe suscribirse al tema marcado en la imagen de arriba.

以当前设备为例,最终订阅主题的格式如下:
$oc/devices/{device_id}/sys/messages/down

最终的格式:
$oc/devices/6419627e40773741f9fbdac7_dev1/sys/messages/down

(4) Formato de publicación del tema

Para los dispositivos, la publicación de temas significa cargar datos a la plataforma en la nube y cargar los datos más recientes del sensor y el estado del dispositivo a la plataforma en la nube.

Esta operación se llama: informe de atributos.

Dirección del documento de ayuda: https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html

imagen-20221207153637391

Según la introducción del documento de ayuda, el tema de publicación del dispositivo actual y el formato de los atributos informados se resumen a continuación:

发布的主题格式:
$oc/devices/{device_id}/sys/properties/report
 
最终的格式:
$oc/devices/6419627e40773741f9fbdac7_dev1/sys/properties/report
发布主题时,需要上传数据,这个数据格式是JSON格式。

上传的JSON数据格式如下:

{
  "services": [
    {
      "service_id": <填服务ID>,
      "properties": {
        "<填属性名称1>": <填属性值>,
        "<填属性名称2>": <填属性值>,
        ..........
      }
    }
  ]
}
根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。

根据这个格式,组合一次上传的属性数据:
{"services": [{"service_id": "stm32","properties":{"DS18B20":18,"motor_water":1,"motor_oxygen":1,"temp_max":10,"water_hp":130,"motor_food":0,"time_food":0,"oxygen_food":3}}]}

3,6 triples MQTT

El inicio de sesión del protocolo MQTT requiere completar la ID de usuario, la ID del dispositivo, la contraseña del dispositivo y otra información. Al igual que cuando normalmente iniciamos sesión en QQ y WeChat, debemos ingresar la contraseña de la cuenta para iniciar sesión. Estos tres parámetros registrados en el protocolo MQTT generalmente se denominan triples MQTT.

A continuación, presentaremos cómo obtener los parámetros tripletes MQTT de Huawei Cloud Platform.

(1) dirección del servidor MQTT

Para iniciar sesión en el servidor MQTT, primero recuerde conocer la dirección y el puerto del servidor.

Dirección del documento de ayuda: https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home

imagen-20230302135718882

El puerto del protocolo MQTT admite 1883 y 8883. La diferencia entre ellos es: 8883 es ​​un puerto cifrado y es más seguro. Sin embargo, es difícil de utilizar en un microcontrolador, por lo que el equipo actual utiliza el puerto 1883 para la conexión.

Con base en el nombre de dominio y el número de puerto anteriores, obtenga la siguiente información de dirección IP y número de puerto: Si el dispositivo admite completar el nombre de dominio, puede ingresar el nombre de dominio directamente; de ​​lo contrario, complete directamente la dirección IP. (La dirección IP se obtiene mediante resolución de nombre de dominio)

华为云的MQTT服务器地址:114.116.232.138
域名:7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com
华为云的MQTT端口号:1883

(2) Generar triples MQTT

Huawei Cloud proporciona una herramienta en línea para generar triples de autenticación MQTT: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

Abra esta herramienta, complete la información del dispositivo (es decir, la información guardada después de crear el dispositivo hace un momento), haga clic en Generar y podrá obtener la información de inicio de sesión de MQTT.

Aquí está la página que se abre:

imagen-20221207154917230

Complete la información del dispositivo: (Las dos líneas anteriores se guardan después de crear el dispositivo)

Obtenga la información del triplete directamente.

imagen-20230321160708924

imagen-20230321160718302

Después de obtener el triplete, cuando el dispositivo inicie sesión para autenticación a través del protocolo MQTT, simplemente complete los parámetros.

ClientId 6419627e40773741f9fbdac7_dev1_0_0_2023032108
Username 6419627e40773741f9fbdac7_dev1
Password 861ac9e6a579d36888b2aaf97714be7af6c77017b017162884592bd68b086a6e

3.7 Simular la prueba de inicio de sesión del dispositivo

Después de los pasos anteriores, se creó el producto, el dispositivo y el modelo de datos, y se obtuvo la información de inicio de sesión de MQTT. A continuación, utilice el software cliente MQTT para simular un dispositivo real para iniciar sesión en la plataforma. Pruebe si la comunicación con el servidor es normal.

(1) Complete la información de inicio de sesión

Abra el software del cliente MQTT y complete la información relevante (el texto de introducción anterior). Luego, haga clic para iniciar sesión, suscribirse al tema y publicar el tema.

imagen-20230321161132971

(2) Abra la página web para ver

Después de completar las operaciones anteriores, abra el backend web de Huawei Cloud y podrá ver que el dispositivo está en línea.

Haga clic en la página de detalles para ver los datos cargados.

En este punto, la implementación de la plataforma en la nube se ha completado y el dispositivo puede cargar datos normalmente.

4. Desarrollo de PC

Para ver cómodamente los datos cargados por el dispositivo y controlarlo de forma remota, Qt se utiliza para desarrollar una computadora host para los sistemas Android y Windows.

Utilice la interfaz API proporcionada por Huawei Cloud Platform para obtener los datos cargados por el dispositivo y también envíe instrucciones al dispositivo para controlarlo.

Para ver cómodamente los datos cargados por el dispositivo y controlarlo de forma remota, Qt se utiliza para desarrollar una computadora host para los sistemas Android y Windows.

Utilice la interfaz API proporcionada por Huawei Cloud Platform para obtener los datos cargados por el dispositivo y también envíe instrucciones al dispositivo para controlarlo.

4.1 Instalación del entorno de desarrollo Qt

Sitio web oficial chino de Qt: https://www.qt.io/zh-cn/imagen-20221207160550486

imagen-20221207160606892

Dirección de descarga de QT5.12.6: https://download.qt.io/archive/qt/5.12/5.12.6

Después de abrir el enlace de descarga, seleccione la siguiente versión para descargar:

qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details

Desconecte la red al instalar el software; de ​​lo contrario, se le pedirá que ingrese a su cuenta.

Al instalar, mingw 32simplemente marque un compilador en la primera casilla de verificación, deje los demás como predeterminados, simplemente haga clic en Siguiente para continuar con la instalación.

imagen-20221203151742653

Nota: Sólo estoy presentando la configuración del entorno del lado de la PC (esto es relativamente simple). El entorno de desarrollo de Android es bastante problemático, puedes ir a mi blog para obtener artículos detallados.

Seleccione el compilador MinGW de 32 bits:

imagen-20221203151750344

4.2 Crear una cuenta IAM

Cree una cuenta IAM, porque en el futuro desarrollo de la computadora host, deberá utilizar la interfaz API de la plataforma en la nube, y estas interfaces requieren un token para la autenticación. En pocas palabras, es autenticación de identidad. Al llamar a la interfaz para obtener el Token, debe completar la información de la cuenta IAM. Entonces, demostremos el proceso a continuación.

Dirección: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users

Al obtener un Token, además de la cuenta AIM, también necesitas las credenciales del proyecto:

faa0973835ab409ab48182e2590f4ad3

imagen-20230321161348409

imagen-20230321161414487

Haga clic en su apodo con el mouse y haga clic en Autenticación de identidad unificada.

imagen-20230321161433209

Haga clic en la esquina superior izquierda 创建用户.

imagen-20230321161450557

imagen-20221207161209880

imagen-20221207161308917

imagen-20221207161327200

Creado con éxito:

imagen-20221212174359962

imagen-20221212174412097

imagen-20230321161557848

4.3 Obtener datos de sombra

Documento de ayuda: https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html

Introducción a la sombra del dispositivo:

设备影子是一个用于存储和检索设备当前状态信息的JSON文档。
每个设备有且只有一个设备影子,由设备ID唯一标识
设备影子仅保存最近一次设备的上报数据和预期数据
无论该设备是否在线,都可以通过该影子获取和设置设备的属性

En pocas palabras: la sombra del dispositivo son los últimos datos cargados por el dispositivo.

En el software que diseñamos, si queremos obtener la información de estado más reciente del dispositivo, utilizamos la interfaz oculta del dispositivo.

Si no está familiarizado con la interfaz, primero puede realizar la depuración en línea: https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow

Interfaz de depuración en línea, puede solicitar la interfaz oculta para comprender la solicitud y el formato de datos devueltos.

imagen-20230321161636567

imagen-20230321161701419

Los datos devueltos por la interfaz oculta del dispositivo son los siguientes:

{
    
    
 "device_id": "6419627e40773741f9fbdac7_dev1",
 "shadow": [
  {
    
    
   "service_id": "stm32",
   "desired": {
    
    
    "properties": null,
    "event_time": null
   },
   "reported": {
    
    
    "properties": {
    
    
     "DS18B20": 18,
     "motor_water": 1,
     "motor_oxygen": 1,
     "temp_max": 10,
     "water_hp": 130,
     "motor_food": 0,
     "time_food": 0,
     "oxygen_food": 3
    },
    "event_time": "20230321T081126Z"
   },
   "version": 0
  }
 ]
}

4.4 Modificar propiedades del dispositivo

Dirección: https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html

Descripción de la interfaz

设备的产品模型中定义了物联网平台可向设备下发的属性,应用服务器可调用此接口向指定设备下发属性。平台负责将属性以同步方式发送给设备,并将设备执行属性结果同步返回。

La interfaz para modificar los atributos del dispositivo permite al servidor emitir instrucciones al dispositivo y controlarlo si es necesario.

Dirección de depuración en línea:

https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=UpdateProperties

La modificación de las propiedades del dispositivo es un comando sincrónico y requiere que el dispositivo esté en línea antes de la depuración. Primero use el cliente MQTT para iniciar sesión en el servidor y simular que el dispositivo se conecta.

Luego depure y envíe los datos de prueba al dispositivo de forma remota.

【1】 Utilice el cliente MQTT para iniciar sesión en el dispositivo primero (este es un comando sincrónico y debe estar en línea para depurar)

imagen-20230321161923007

【2】Haga clic para depurar

imagen-20230321161905033

{
    
    "services":{
    
    "temp_max":100}}

【4】 Como puede ver, el software del cliente MQTT ha recibido el mensaje enviado por el servidor.

imagen-20230313175819901

Dado que es un comando sincrónico, el servidor debe recibir una respuesta del dispositivo para completar exitosamente un proceso. Solo cuando el dispositivo responde puede el servidor determinar que los datos se entregaron exitosamente.

imagen-20230321161941584

¿Cómo responde el dispositivo MQTT?

Descripción del formato de respuesta del dispositivo: https://support.huaweicloud.com/api-iothub/iot_06_v5_3008.html

imagen-20221203163532648

Hagamos la operación real:

Después de que el servidor envía el comando a través de la depuración en línea, el cliente copia el ID de la solicitud, lo agrega al formato del tema publicado y luego responde. El servidor recibe la respuesta y una modificación de atributo se completa perfectamente.

imagen-20230321162053263

Este es el estado exitoso:

imagen-20230321162026282

**El siguiente es un resumen de la solicitud: ** (En respuesta a la solicitud del servidor para modificar los atributos del dispositivo)

上报主题的格式:$oc/devices/{
    
    device_id}/sys/properties/set/response/request_id=

$oc/devices/6419627e40773741f9fbdac7_dev1/sys/properties/set/response/request_id=

响应的数据:
{
    
    "result_code": 0,"result_desc": "success"}

4.5 Diseñar la computadora host

Los 2 anteriores explicaron las interfaces API que deben usarse. A continuación, usamos Qt para diseñar la computadora host, diseñar la interfaz y completar el diseño lógico de toda la computadora host.

【1】Nuevo proyecto Qt

imagen-20230302144331541

Seleccione la ruta del proyecto y colóquela debajo de la ruta en inglés.

imagen-20230321162532573

imagen-20230313180428670

imagen-20230313180451177

imagen-20230313180504518

imagen-20230321162620141

Creado.

Crea una nueva plantilla de Android:

imagen-20230321162657975

imagen-20230321162731010

imagen-20230321162741791

imagen-20230321162812486

【2】Diseño de interfaz

imagen-20230728140933190

【4】 Diseño de código: leer y guardar parámetros de configuración

/*
功能: 保存数据到文件
*/
void Widget::SaveDataToFile(QString text)
{
    
    
    /*保存数据到文件,方便下次加载*/
    QString file;
    file=QCoreApplication::applicationDirPath()+"/"+ConfigFile;
    QFile filesrc(file);
    filesrc.open(QIODevice::WriteOnly);
    QDataStream out(&filesrc);
    out << text;  //序列化写字符串
    filesrc.flush();
    filesrc.close();
}


/*
功能: 从文件读取数据
*/
QString Widget::ReadDataFile(void)
{
    
    
    //读取配置文件
    QString text,data;
    text=QCoreApplication::applicationDirPath()+"/"+ConfigFile;

    //判断文件是否存在
    if(QFile::exists(text))
    {
    
    
        QFile filenew(text);
        filenew.open(QIODevice::ReadOnly);
        QDataStream in(&filenew); // 从文件读取序列化数据
        in >> data; //提取写入的数据
        filenew.close();
    }
    return data; //返回值读取的值
}

【3】 Diseño de código: análisis de datos en la nube

//解析反馈结果
void Widget::replyFinished(QNetworkReply *reply)
{
    
    
    QString displayInfo;

    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

    //读取所有数据
    QByteArray replyData = reply->readAll();

    qDebug()<<"状态码:"<<statusCode;
    qDebug()<<"反馈的数据:"<<QString(replyData);

    //更新token
    if(function_select==3)
    {
    
    
        displayInfo="token 更新失败.";
        //读取HTTP响应头的数据
        QList<QNetworkReply::RawHeaderPair> RawHeader=reply->rawHeaderPairs();
        qDebug()<<"HTTP响应头数量:"<<RawHeader.size();
        for(int i=0;i<RawHeader.size();i++)
        {
    
    
            QString first=RawHeader.at(i).first;
            QString second=RawHeader.at(i).second;
            if(first=="X-Subject-Token")
            {
    
    
                Token=second.toUtf8();
                displayInfo="token 更新成功.";

                //保存到文件
                SaveDataToFile(Token);
                break;
            }
        }
        QMessageBox::information(this,"提示",displayInfo,QMessageBox::Ok,QMessageBox::Ok);
        return;
    }

    //判断状态码
    if(200 != statusCode)
    {
    
    
        //解析数据
        QJsonParseError json_error;
        QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);
        if(json_error.error == QJsonParseError::NoError)
        {
    
    
            //判断是否是对象,然后开始解析数据
            if(document.isObject())
            {
    
    
                QString error_str="";
                QJsonObject obj = document.object();
                QString error_code;
                //解析错误代码
                if(obj.contains("error_code"))
                {
    
    
                    error_code=obj.take("error_code").toString();
                    error_str+="错误代码:";
                    error_str+=error_code;
                    error_str+="\n";
                }
                if(obj.contains("error_msg"))
                {
    
    
                    error_str+="错误消息:";
                    error_str+=obj.take("error_msg").toString();
                    error_str+="\n";
                }

                //显示错误代码
                QMessageBox::information(this,"提示",error_str,QMessageBox::Ok,QMessageBox::Ok);
            }
         }
        return;
    }

    //设置属性
    if(function_select==12 || function_select==13)
    {
    
    
        //解析数据
        QJsonParseError json_error;
        QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);
        if(json_error.error == QJsonParseError::NoError)
        {
    
    
            //判断是否是对象,然后开始解析数据
            if(document.isObject())
            {
    
    
                QJsonObject obj = document.object();
                if(obj.contains("response"))
                {
    
    
                    QJsonObject obj1=obj.take("response").toObject();
                    int val=0;
                    QString success;
                    if(obj1.contains("result_code"))
                    {
    
    
                         val=obj1.take("result_code").toInt();
                    }
                    if(obj1.contains("result_desc"))
                    {
    
    
                         success=obj1.take("result_desc").toString();
                    }

                    if(val==0 && success =="success")
                    {
    
    
                        //显示状态
                        QMessageBox::information(this,"提示","远程命令操作完成.",QMessageBox::Ok,QMessageBox::Ok);
                        return;
                    }
                    else
                    {
    
    
                        //显示状态
                        QMessageBox::information(this,"提示","设备未正确回应.请检查设备网络.",QMessageBox::Ok,QMessageBox::Ok);
                        return;
                    }
                }
            }
         }
    }

    //查询设备属性
    if(function_select==0)
    {
    
    
        //解析数据
        QJsonParseError json_error;
        QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);
        if(json_error.error == QJsonParseError::NoError)
        {
    
    
            //判断是否是对象,然后开始解析数据
            if(document.isObject())
            {
    
    
                QJsonObject obj = document.object();
                if(obj.contains("shadow"))
                {
    
    
                    QJsonArray array=obj.take("shadow").toArray();
                    for(int i=0;i<array.size();i++)
                    {
    
    
                        QJsonObject obj2=array.at(i).toObject();
                        if(obj2.contains("reported"))
                        {
    
    
                            QJsonObject obj3=obj2.take("reported").toObject();


                            if(obj3.contains("properties"))
                            {
    
    
                                QJsonObject properties=obj3.take("properties").toObject();

                                qDebug()<<"开始解析数据....";
                            }
                        }
                    }
                }
            }
         }
        return;
    }
}

5. Implementación del código

5.1 Código de implementación de la plataforma en la nube de conexión BC26

El siguiente es el código de implementación para usar STM32F103ZET6 y BC26 para conectarse a la plataforma Huawei Cloud IoT para implementar el inicio de sesión del dispositivo MQTT, la suscripción de temas y la publicación de temas:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 定义华为云物联网平台的服务器地址、端口号、设备ID和设备密码
#define MQTT_SERVER "mqtt://xxxxxx.iotplatform.com"  // 请替换为实际的服务器地址
#define MQTT_PORT 1883  // 请根据实际情况修改端口号
#define DEVICE_ID "your_device_id"  // 请替换为实际的设备ID
#define DEVICE_PASSWORD "your_device_password"  // 请替换为实际的设备密码

// 定义MQTT相关的参数
#define MQTT_CLIENT_ID "your_client_id"  // 请替换为实际的客户端ID
#define MQTT_TOPIC "your_topic"  // 请替换为实际的主题

// 定义MQTT消息接收回调函数
void mqtt_message_received(char *topic, char *payload) {
    
    
    printf("Received message on topic: %s\n", topic);
    printf("Payload: %s\n", payload);
}

// 建立MQTT连接
void mqtt_connect() {
    
    
    // 连接到华为云物联网平台的MQTT服务器
    // 这里使用的是MQTT的QoS 1级别
    // 请根据实际情况修改QoS级别和其他参数
    char command[256];
    sprintf(command, "AT+QMTCFG=\"aliauth\",0,%d,\"%s\",\"%s\"", MQTT_PORT, DEVICE_ID, DEVICE_PASSWORD);
    printf("Sending command: %s\n", command);
    // 发送AT指令连接到MQTT服务器
    // ...

    // 订阅主题
    sprintf(command, "AT+QMTSUB=0,1,\"%s\",1", MQTT_TOPIC);
    printf("Sending command: %s\n", command);
    // 发送AT指令订阅主题
    // ...
}

// 发布MQTT消息
void mqtt_publish(char *payload) {
    
    
    // 发布消息到指定的主题
    char command[256];
    sprintf(command, "AT+QMTPUB=0,0,0,0,\"%s\"", MQTT_TOPIC);
    printf("Sending command: %s\n", command);
    // 发送AT指令设置发布的主题
    // ...

    sprintf(command, "AT+QMTPUB=0,1,0,0,%d", strlen(payload));
    printf("Sending command: %s\n", command);
    // 发送AT指令设置消息的长度
    // ...

    printf("Sending payload: %s\n", payload);
    // 发送消息的内容
    // ...

    // 等待MQTT服务器返回发布结果
    // ...
}

int main() {
    
    
    // 初始化串口和其他硬件模块
    // ...

    // 连接到华为云物联网平台的MQTT服务器
    mqtt_connect();

    // 进入主循环
    while (1) {
    
    
        // 处理其他任务
        // ...

        // 检查是否有需要发布的消息
        // 如果有,调用mqtt_publish函数发布消息
        // ...

        // 检查是否有接收到的MQTT消息
        // 如果有,调用mqtt_message_received函数处理消息
        // ...
    }

    return 0;
}

5.2 Instrucciones del protocolo MQTT del módulo BC26

El módulo BC26 es un módulo IoT que admite la tecnología de comunicación NB-IoT y puede comunicar y controlar dispositivos externos mediante comandos AT.

Los siguientes son algunos comandos AT comunes y sus funciones relacionadas con el módulo BC26 y el protocolo MQTT:

【1】AT+QMTOPEN: abre la conexión del cliente MQTT.

  • Función: Conéctese al servidor MQTT a través de este comando.
  • Parámetros: dirección del servidor, número de puerto, nombre de usuario y contraseña, etc.
  • Ejemplo: AT+QMTOPEN=0,"mqtt://xxxxxx.iotplatform.com",1883

【2】AT+QMTCLOSE: Cierra la conexión del cliente MQTT.

  • Función: utilice este comando para cerrar la conexión con el servidor MQTT.
  • Parámetros: Ninguno.
  • Ejemplo: AT+QMTCLOSE=0

【3】AT+QMTCONN: Establece la conexión MQTT.

  • Función: utilice este comando para establecer una conexión con el servidor MQTT.
  • Parámetros: ID de cliente, nombre de usuario, contraseña, etc.
  • Ejemplo: AT+QMTCONN=0,“your_client_id”,“your_username”,“your_password”

【4】AT+QMTDISC: Desconecta la conexión MQTT.

  • Función: utilice este comando para desconectarse del servidor MQTT.
  • Parámetros: Ninguno.
  • Ejemplo: AT+QMTDISC=0

【5】AT+QMTSUB: Suscríbete al tema MQTT.

  • Función: utilice este comando para suscribirse al tema MQTT especificado.
  • Parámetros: tema, nivel de QoS, etc.
  • Ejemplo: AT+QMTSUB=0,1,"tu_tema",1

【6】AT+QMTUNS: darse de baja del tema MQTT.

  • Función: utilice este comando para cancelar la suscripción al tema MQTT especificado.
  • Parámetros: tema.
  • Ejemplo: AT+QMTUNS=0,1,"tu_tema"

【7】AT+QMTPUB: Publicar mensajes MQTT.

  • Función: utilice este comando para publicar mensajes en el tema MQTT especificado.
  • Parámetros: tema, contenido del mensaje, nivel de QoS, etc.
  • Ejemplo: AT+QMTPUB=0,0,0,0,"tu_tema"

【8】AT+QMTRECV: Recibe mensajes MQTT.

  • Función: utilice este comando para recibir mensajes recibidos del servidor MQTT.
  • Parámetros: Ninguno.
  • Ejemplo: AT+QMTRECV=0

Estos son algunos comandos AT comunes relacionados con el protocolo MQTT en el módulo BC26.

5.3 Leer los datos de temperatura y humedad del sensor DHT11

El siguiente es el código de implementación para usar STM32F103ZET6 para leer los datos de temperatura y humedad del sensor DHT11:

#include "stm32f10x.h"
#include "dht11.h"

int main(void)
{
    
    
    // 初始化DHT11传感器
    DHT11_Init();

    while (1)
    {
    
    
        // 读取DHT11传感器的温湿度数据
        DHT11_Result result = DHT11_Read();

        if (result.status == DHT11_OK)
        {
    
    
            // 温度数据
            uint8_t temperature = result.temperature;
            // 湿度数据
            uint8_t humidity = result.humidity;

            // 在这里进行温湿度数据的处理和使用
            // ...

            // 延时一段时间后再次读取
            DelayMs(2000);
        }
        else
        {
    
    
            // 读取失败,可以进行相应的错误处理
            // ...
        }
    }
}

En la función principal, los datos de temperatura y humedad del sensor DHT11 se leen continuamente a través de un bucle. Si la lectura es exitosa, resultlos datos de temperatura y humedad se pueden obtener de la estructura y procesarlos en consecuencia. Si la lectura falla, el manejo de errores se puede realizar según sea necesario.

5.4 Código DHT11.c y DHT11.h

dht11.h:

#ifndef DHT11_H
#define DHT11_H

#include "stm32f10x.h"

typedef struct
{
    
    
    uint8_t status;      // 读取状态,0表示成功,其他表示失败
    uint8_t humidity;    // 湿度值
    uint8_t temperature; // 温度值
} DHT11_Result;

void DHT11_Init(void);
DHT11_Result DHT11_Read(void);

#endif

dht11.c:

#include "dht11.h"

#define DHT11_PORT GPIOA
#define DHT11_PIN GPIO_Pin_0

static void DHT11_Delay(uint32_t us)
{
    
    
    uint32_t count = us * 8;
    while (count--)
    {
    
    
        __NOP();
    }
}

static void DHT11_SetOutput(void)
{
    
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}

static void DHT11_SetInput(void)
{
    
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}

static uint8_t DHT11_ReadByte(void)
{
    
    
    uint8_t byte = 0;
    for (uint8_t i = 0; i < 8; i++)
    {
    
    
        while (!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN))
        {
    
    
            // 等待低电平结束
        }
        DHT11_Delay(30);
        if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN))
        {
    
    
            byte |= (1 << (7 - i));
        }
        while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN))
        {
    
    
            // 等待高电平结束
        }
    }
    return byte;
}

void DHT11_Init(void)
{
    
    
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DHT11_PORT, &GPIO_InitStructure);

    GPIO_SetBits(DHT11_PORT, DHT11_PIN);
}

DHT11_Result DHT11_Read(void)
{
    
    
    DHT11_Result result;
    result.status = 1;

    DHT11_SetOutput();
    GPIO_ResetBits(DHT11_PORT, DHT11_PIN);
    DHT11_Delay(18000);
    GPIO_SetBits(DHT11_PORT, DHT11_PIN);
    DHT11_Delay(20);
    DHT11_SetInput();

    if (!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN))
    {
    
    
        while (!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN))
        {
    
    
            // 等待低电平结束
        }
        while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN))
        {
    
    
            // 等待高电平结束
        }

        uint8_t data[5];
        for (uint8_t i = 0; i < 5; i++)
        {
    
    
            data[i] = DHT11_ReadByte();
        }

        uint8_t sum = data[0] + data[1] + data[2] + data[3];
        if (sum == data[4])
        {
    
    
            result.status = 0;
            result.humidity = data[0];
            result.temperature = data[2];
        }
    }

    return result;
}

El archivo dht11.h define la función de inicialización DHT11_Init()y la función de lectura del sensor DHT11 DHT11_Read(), y la estructura DHT11_Result se utiliza para almacenar los resultados de la lectura.

El archivo dht11.c implementa las funciones de inicialización y lectura del sensor DHT11. En la función de inicialización se configura el modo GPIO y la velocidad del pin DHT11. En la función de lectura, los datos de temperatura y humedad del sensor DHT11 se leen y verifican enviando una señal de inicio y recibiendo datos.

5.5 Análisis de datos GPS

Lea los datos de posicionamiento devueltos por el módulo GPS a través del puerto serie 2 en STM32F103ZET6 y analice la longitud, latitud y estado de posicionamiento.

#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>

// 定义串口2接收缓冲区大小
#define RX_BUFFER_SIZE 256

// 定义GPS数据解析状态
typedef enum {
    
    
    GPS_STATE_IDLE,        // 空闲状态
    GPS_STATE_RECEIVING,   // 接收中状态
    GPS_STATE_COMPLETE     // 接收完成状态
} GPS_State;

// 定义接收缓冲区和接收状态变量
char rxBuffer[RX_BUFFER_SIZE];
volatile uint16_t rxIndex = 0;
volatile GPS_State gpsState = GPS_STATE_IDLE;

// 处理接收到的GPS数据
void processGPSData() {
    
    
    // 在这里进行GPS数据解析和处理
    // 解析经纬度和定位状态等信息
    // 根据需要进行相应的操作或显示
    // 例如,打印经纬度和定位状态
    printf("Latitude: %s\n", latitude);
    printf("Longitude: %s\n", longitude);
    printf("Position Fix Status: %s\n", positionStatus);
}

// 串口2接收中断处理函数
void USART2_IRQHandler(void) {
    
    
    if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
    
    
        char data = USART_ReceiveData(USART2);
        
        // 接收到回车换行符表示一条完整的GPS数据
        if (data == '\n') {
    
    
            rxBuffer[rxIndex] = '\0';
            rxIndex = 0;
            gpsState = GPS_STATE_COMPLETE;
        } else {
    
    
            // 将接收到的数据存储到缓冲区中
            rxBuffer[rxIndex] = data;
            rxIndex++;
            
            // 接收缓冲区溢出时进行处理
            if (rxIndex >= RX_BUFFER_SIZE) {
    
    
                rxIndex = 0;
                gpsState = GPS_STATE_IDLE;
            }
        }
    }
}

int main(void) {
    
    
    // 初始化串口2和GPIO引脚
    // 设置串口2的波特率、数据位、停止位等参数
    
    // 使能串口2接收中断
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    NVIC_EnableIRQ(USART2_IRQn);
    
    while (1) {
    
    
        // 如果接收到完整的GPS数据
        if (gpsState == GPS_STATE_COMPLETE) {
    
    
            // 处理接收到的GPS数据
            processGPSData();
            
            // 处理完成后,重置接收状态为IDLE
            gpsState = GPS_STATE_IDLE;
        }
    }
}

Las partes de inicialización del puerto serie y manejo de interrupciones en el código se basan en el uso de la biblioteca estándar.

Supongo que te gusta

Origin blog.csdn.net/xiaolong1126626497/article/details/132991011
Recomendado
Clasificación