STM32+HUAWEI CLOUD IOT는 음주 운전 모니터링 시스템을 만듭니다: 차에 타자마자 모니터링

개요: 운전실에 설치되어 특정 기능에 따라 알코올 농도를 식별하고 운전 안전을 함께 감독할 수 있는 시스템을 설계합니다.

이 기사는 HUAWEI CLOUD 커뮤니티 " 음주 및 운전 모니터링 시스템 기반 STM32 + HUAWEI CLOUD IOT Design [Play with HUAWEI CLOUD] ", 작성자: DS Xiaolong에서 공유됩니다.

1. 소개

사람들의 생활 수준이 향상됨에 따라 점점 더 많은 교통 사고를 줄이고 없애기 위해 교통 사고로 인한 교통 사고도 사람들의 관심을 끌었습니다.캡에는 특정 기능에 따라 알코올 농도를 식별 할 수있는 시스템이 있습니다. 음주운전을 인지하면 경보를 울리고 지정된 비상연락처에 문자를 보내 가족들에게 음주운전 사실을 알리고 함께 운전안전을 감독한다. GPS 데이터는 Huawei Cloud IoT 플랫폼에 업로드되고 지도 모듈은 특정 위치를 표시하기 위해 호출됩니다.주 제어 칩은 STM32 단일 칩 마이크로컴퓨터를 채택하고 GSM 모듈은 IM800C를 채택합니다. 시스템은 또한 실시간으로 감지된 알코올 함량을 표시할 수 있는 LCD 디스플레이가 있습니다.알코올이 한도를 초과하면 지역 부저가 운전자에게 알림을 주기 위해 경보를 울립니다.

음주운전을 측정하는 기준은 다음과 같습니다.

(1) 음주운전이란 운전자의 혈중알코올농도가 20mg/100ml 이상 80mg/100ml 미만인 운전행위를 말한다. (2) 음주운전이란 운전자의 혈중 알코올 농도가 80mg/100ml 이상인 운전행위를 말한다.

필요한 하드웨어는 다음과 같습니다.

(1) STM32 시스템 보드

(2) 알코올 감지 센서

(3) LCD 디스플레이

(4) 전원 모듈

(5) SIM800C 모듈

(6) 부저 모듈

(7) GPS 모듈 – SIM800C 내부의 GPS 기능을 사용하여 GPS 데이터를 가져옵니다.

테스트를 위해 몇 가지 Erguotou를 만들었습니다.

호스트 컴퓨터는 QT로 개발되었으며 HUAWEI CLOUD의 응용 프로그램 측 인터페이스를 호출하여 장치에서 업로드한 데이터를 가져옵니다. 그런 다음 Baidu 인터페이스를 호출하여 GPS 포지셔닝의 위치를 ​​얻습니다.

2. HUAWEI CLOUD에 로그인하여 클라우드 장치 생성

2.1 제품 만들기

화웨이 클라우드 공식 웹사이트:  https://www.huaweicloud.com/

여기에서 액세스 프로토콜의 포트 번호와 주소를 볼 수 있습니다.

MQTT (1883)	a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com

장치가 액세스하는 프로토콜은 MQTT를 선택하고 포트는 1883에 해당합니다.

다음으로 제품 만들기를 계속하고 제품 페이지를 클릭하고 오른쪽 상단 모서리를 클릭하여 제품을 만듭니다.

2.2 장치 생성

내 기기 정보는 다음과 같습니다.

设备ID
625cd29cecf9c41c38215ba5_1126626497

设备密钥
1126626497
    
{
    "device_id": "625cd29cecf9c41c38215ba5_1126626497",
    "secret": "1126626497"
}

2.3 제품 모델 정의

이 단계는 보고 장치의 속성, 즉 장치의 데이터 유형 정의를 설정하는 단계입니다.

2.4 MQTT 로그인 키 생성

제품 및 장치를 생성한 후에는 MQTT 프로토콜을 통해 HUAWEI CLOUD 서버에 로그인하는 방법을 알아야 합니다.

자세한 공식 소개는 다음과 같습니다.  https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112

MQTT 장치 로그인 키 생성 주소:  https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

다음은 MQTT 프로토콜 장치 로그인의 매개변수입니다.

2.5 MQTT 클라이언트 소프트웨어로 로그인

모든 매개변수를 확보한 다음 테스트용 MQTT 클라이언트를 사용하여 HUAWEI CLOUD에 로그인합니다.

HUAWEI CLOUD IoT 플랫폼의 도메인 이름은 다음과 같습니다. a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com

HUAWEI CLOUD IoT 플랫폼의 IP 주소는 다음과 같습니다. 121.36.42.100

소프트웨어에서 매개변수가 올바르게 채워지면 장치가 성공적으로 연결된 것을 볼 수 있습니다.

그런 다음 장치 페이지를 열면 장치가 온라인 상태임을 확인할 수 있습니다.

2.6 보고 데이터

공식 문서:  https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112

이 문서는 MQTT 보고 데이터의 형식을 설명합니다.

요약 형식:

//订阅主题: 平台下发消息给设备
$oc/devices/625cd29cecf9c41c38215ba5_1126626497/sys/messages/down

//设备上报数据
$oc/devices/625cd29cecf9c41c38215ba5_1126626497/sys/properties/report

//上报的属性消息 (一次可以上报多个属性,在json里增加就行了)
{"services": [{"service_id": "MQ3","properties":{"MQ3":50}}]}

이 시점에서 장치 데이터가 성공적으로 보고되었으며 더 많은 속성을 추가해야 하는 경우 프로세스에 따라 계속 추가할 수 있습니다.

3. STM32 코드 구현

알코올 농도 센서의 워밍업 시간은 약 20초에서 1분이며, 그 이후에는 수집된 데이터가 안정됩니다. 예열 모듈은 뜨겁고 뜨겁습니다. 이는 정상적인 현상입니다.

3.1 시스템 개략도

3.2 프로그램 다운로드

USB를 통한 프로그램 다운로드:  다운로드 소프트웨어는 소프트웨어 패키지 디렉토리에 있습니다.

프로그래밍을 시작하기 위해 클릭한 후 보드의 리셋 버튼을 클릭하여 프로그램을 다운로드하고, 실패하면 여러 번 다시 시도하십시오. 정상적인 효과는 다음과 같습니다.

일반 프로그램이 실행된 후 직렬 포트 디버깅 도우미를 열고 다음과 같이 초기화 정보를 확인합니다.

3.3 글꼴 모듈로

3.4 main.c 코드

keil 프로젝트는 여기에서 얻을 수 있습니다:  https://download.csdn.net/download/xiaolong1126626497/81993720

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "oled.h"
#include "adc.h"
#include <string.h>
#include <stdlib.h>
#include "font.h"
#include "sim800c.h"
#include "mqtt.h"

/*
硬件连接方式:
1. TFT 1.44 寸彩屏接线
GND   电源地
VCC   接5V或3.3v电源
SCL   接PC8(SCL)
SDA   接PC9(SDA)
RST   接PC10
DC    接PB7
CS    接PB8
BL	  接PB11

2. 蜂鸣器
VCC--->3.3V
DAT--->PA6
GND--->GND

3. 酒精检测传感器MQ3
VCC--->3.3V
GND--->GND
DAT--->PA1

4. 板载LED灯接线
LED1---PA8
LED2---PD2

5. 板载按键接线
K0---PA0 
K1---PC5 
K2---PA15

6. SIM800C--GSM模块
GND----GND
VCC--->3.3V
PA2----SIM800C_RXD
PA3----SIM800C_TXD
*/

//华为物联网服务器的设备信息
#define MQTT_ClientID "62381267575fb713ee164ad2_xl_1_0_0_2022032106"
#define MQTT_UserName "62381267575fb713ee164ad2_xl_1"
#define MQTT_PassWord "124344feff3e3d96ff6af13cf36af36766619ff1eeee40e99cbae9b7b9739fe4"

//订阅与发布的主题
#define SET_TOPIC  "$oc/devices/62381267575fb713ee164ad2_xl_1/sys/messages/down"  //订阅
#define POST_TOPIC "$oc/devices/62381267575fb713ee164ad2_xl_1/sys/properties/report"  //发布
//设置连接的路由器信息
#define CONNECT_WIFI  "Xiaomi_meizi6"   //将要连接的路由器名称 --不要出现中文、空格等特殊字符
#define CONNECT_PASS "12170307yu"       //将要连接的路由器密码

#define CONNECT_SERVER_IP "a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com"   //服务器IP地址
#define CONNECT_SERVER_PORT 1883            //服务器端口

//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;	   
#define JTAG_SWD_DISABLE   0X02
#define SWD_ENABLE         0X01
#define JTAG_SWD_ENABLE    0X00		  
void JTAG_Set(u8 mode)
{
	u32 temp;
	temp=mode;
	temp<<=25;
	RCC->APB2ENR|=1<<0;     //开启辅助时钟	   
	AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
	AFIO->MAPR|=temp;       //设置jtag模式
}
u16 MQ3_data=0; //酒精浓度
float MQ3_data_float=0; //mg/l

char data_buff[100];
//酒精超标提示
u8 sim800c_buff[100]="Drunk driving reminder";

int main()
{
    u8 state=0;
    u8 key=0;
    u32 time_cnt=0;
    JTAG_Set(JTAG_SWD_DISABLE); //释放PA15
    LED_Init();  //LED灯初始化
    BEEP_Init(); //蜂鸣器初始化
    KEY_Init();  //按键初始化
    USART1_Init(115200); //串口1初始化-打印调试信息
    Lcd_Init();    //LCD初始化
    Lcd_Clear(0);  //清屏为黑色
    LCD_LED_SET;   //通过IO控制背光亮		
    AdcInit();     //ADC初始化--检测酒精传感器的值
    TIMER2_Init(72,20000);//辅助串口2接收,超时时间为20ms
    USART2_Init(115200); //可能的波特率(测试):  57600 、9600、115200
    USART3_Init(115200);//串口-WIFI
    TIMER3_Init(72,20000); //超时时间20ms
    
    //预热视频
    LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[20],RED,0);
    LCD_ShowChineseFont(16,16*3,16,HZ_FONT_16[21],RED,0);
    LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[22],RED,0);
    LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[23],RED,0);
    LCD_ShowChineseFont(16*4,16*3,16,HZ_FONT_16[24],RED,0);
    LCD_ShowChineseFont(16*5,16*3,16,HZ_FONT_16[25],RED,0);
    LCD_ShowChineseFont(16*6,16*3,16,HZ_FONT_16[26],RED,0);
    LCD_ShowChineseFont(16*7,16*3,16,HZ_FONT_16[27],RED,0);
    //delay_ms(30000); //初始化时间30秒
    delay_ms(5000); //初始化时间5秒
    Lcd_Clear(0);  //清屏为黑色
    
   //采集数据的真实数据
   LCD_ShowChineseFont(0,16*2,16,HZ_FONT_16[0],RED,0);
   LCD_ShowChineseFont(16,16*2,16,HZ_FONT_16[1],RED,0);
   LCD_ShowChineseFont(16*2,16*2,16,HZ_FONT_16[2],RED,0);
   LCD_ShowChineseFont(16*3,16*2,16,HZ_FONT_16[3],RED,0);
   
   //酒精含量计算结果
   LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[4],RED,0);
   LCD_ShowChineseFont(16,16*3,16,HZ_FONT_16[5],RED,0);
   LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[6],RED,0);
   LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[7],RED,0);

    //酒精超标显示
    Gui_DrawFont_GBK16(0,16*4,RED,0,(u8*)"        ");
    LCD_ShowChineseFont(0,16*4,16,HZ_FONT_16[16],RED,0);
    LCD_ShowChineseFont(16,16*4,16,HZ_FONT_16[17],RED,0);
    LCD_ShowChineseFont(16*2,16*4,16,HZ_FONT_16[18],RED,0);
    LCD_ShowChineseFont(16*3,16*4,16,HZ_FONT_16[19],RED,0);

    //初始化SIM800C
    state=SIM800C_InitCheck();
    printf("SIM800C初始化状态:%d\r\n",state);
    DelayMs(1000);
    
    //设置文本模式
    state=SIM800C_SetNoteTextMode();
    printf("设置文本模式状态:%d\r\n",state);
    DelayMs(1000);
    
    //
    
      printf("正在初始化WIFI请稍等.\r\n");
    
    for(i=0;i<5;i++)
    {
        if(ESP8266_Init()==0)
        {
            esp8266_state=1;
            break;
        }
        else
        {
            esp8266_state=0;
            printf("ESP8266硬件检测错误.\n");  
        }
    }
  
   if(esp8266_state)
   {
       printf("准备连接服务器....\r\n");
        //非加密端口
        printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1));
         
        //2. MQTT协议初始化	
        MQTT_Init(); 

        //3. 连接服务器  
        for(i=0;i<5;i++)
        {
            if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0)
            {
                esp8266_state=1;
                break;
            }
            esp8266_state=0;
            printf("服务器连接失败,正在重试...\n");
            delay_ms(500);
        }
        printf("服务器连接成功.\n");

        //3. 订阅主题
        if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
        {
           printf("主题订阅失败.\n");
        }
        else
        {
           printf("主题订阅成功.\n");
        } 
   }
    
   while(1)
   {
        key=KEY_Scan();
        if(key)
        {
            printf("key=%d\r\n",key);
        }
       
        //控制LED灯
        if(key==2)
        {
            LED2=!LED2;
        }    
        
        //手动控制蜂鸣器测试
        //手动发送短信测试
        if(key==1)
        {
            BEEP=1;
            delay_ms(100);
            BEEP=0;

            sprintf((char*)sim800c_buff,"Drunk driving reminder:%d",MQ3_data);
            //发送短信
            if(SIM800C_SendNote((u8*)"13800138000",sim800c_buff,strlen((char*)sim800c_buff))==0)
            printf("短信发送成功\r\n");
            else
            printf("短信发送失败\r\n");
        }
        
        //轮询时间到达
        if(time_cnt>300)
        {
            time_cnt=0;
            LED1=!LED1;
            //获取空气质量
            MQ3_data=GetAdcCHxDATA(1);
            printf("采集MQ3数据:%d\r\n",MQ3_data);
          
             //上报数据
            sprintf(data_buff,"{\"services\": [{\"service_id\":\"STM32\",\"properties\":{\"MQ3\":%d}]}",
            MQ3_data);
            
            MQTT_PublishData(POST_TOPIC,data_buff,0);
            
               //上报数据
            sprintf(data_buff,"{\"services\": [{\"service_id\":\"STM32\",\"properties\":{\"MQ3\":%d}]}",
            MQ3_data);
            
            MQTT_PublishData(POST_TOPIC,data_buff,0);
            
            //LCD屏实时显示酒精浓度     
            //采集数据
            sprintf(data_buff,"%d",MQ3_data);
            Gui_DrawFont_GBK16(72,16*2,RED,0,(u8*)"       ");
            Gui_DrawFont_GBK16(72,16*2,RED,0,(u8*)data_buff);
            
            //酒精含量
            //MQ3_data_float=((float)MQ3_data*(5.0/4096))*0.36-1.08;
            MQ3_data_float=((float)MQ3_data*(5.0/4096))*0.36;
            sprintf(data_buff,"%0.2f mg/L",MQ3_data_float);
            printf("计算酒精浓度:%s\r\n",data_buff);
            Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)"        ");
            Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)data_buff);  
            
             //判断酒精浓度是否超标,设置阀值
            if(MQ3_data>2000)
            {
                sprintf((char*)sim800c_buff," :%d",MQ3_data);
                //发送短信
                if(SIM800C_SendNote((u8*)"18171571217",sim800c_buff,strlen((char*)sim800c_buff))==0)
                printf("短信发送成功\r\n");
                else
                printf("短信发送失败\r\n");
            }
            
            //采集的值越小,表明酒精浓度越高。反之越大。
            //根据阀值显示不同的文字提示
            if(MQ3_data>2000)
            {
                 //你已酒驾
                Gui_DrawFont_GBK16(0,16*4,RED,0,(u8*)"        ");
                LCD_ShowChineseFont(0,16*4,16,HZ_FONT_16[8],RED,0);
                LCD_ShowChineseFont(16,16*4,16,HZ_FONT_16[9],RED,0);
                LCD_ShowChineseFont(16*2,16*4,16,HZ_FONT_16[10],RED,0);
                LCD_ShowChineseFont(16*3,16*4,16,HZ_FONT_16[11],RED,0);
            }
            //正常稳定范围采集的值是500左右
            else
            {
                //安全范围
                Gui_DrawFont_GBK16(0,16*4,RED,0,(u8*)"        ");
                LCD_ShowChineseFont(0,16*4,16,HZ_FONT_16[16],RED,0);
                LCD_ShowChineseFont(16,16*4,16,HZ_FONT_16[17],RED,0);
                LCD_ShowChineseFont(16*2,16*4,16,HZ_FONT_16[18],RED,0);
                LCD_ShowChineseFont(16*3,16*4,16,HZ_FONT_16[19],RED,0);
            }
        }
        
        DelayMs(10);
        time_cnt++;
	 }
}

더 많은 학습 콘텐츠는 IoT 사물 인터넷 커뮤니티에 주목해주세요. 

HUAWEI CLOUD IoT Assistant WeChat 계정(hwc-iot)을 추가하고 자세한 내용을 보려면 "읽기"라고 답장하세요.

 

HUAWEI CLOUD의 새로운 기술에 대해 처음으로 알아보려면 팔로우를 클릭하세요~

{{o.name}}
{{m.name}}

추천

출처my.oschina.net/u/4526289/blog/5520031