基于STM32的智慧物联网系统板

1.智慧物联百科

智慧物联,作为物联网与人工智能等前沿技术深度融合的结晶,正引领着新一轮的科技革命与产业变革浪潮。它不仅仅是一个简单的技术概念,而是构建了一个万物互联、智能感知、自主决策的全新生态系统。在这个生态系统中,各式各样的设备与物品,从日常家居用品到工业生产设备,从城市基础设施到自然环境要素,都被赋予了"智慧"的属性,通过内置的传感器技术,它们能够实时采集并传输各种关键数据,如温度、湿度、光照、压力、位置等,这些数据如同物联网的"血液",流淌在每一个节点之间,构建起一个庞大而复杂的信息网络。而网络通信技术的飞速发展,如WiFi、蓝牙、LoRaWAN、NB-IoT等,则为这个信息网络提供了稳定、高效、低成本的传输通道,确保了数据的实时性与准确性,使得智慧物联的应用场景得以无限拓展,无论是智能家居的便捷控制,还是工业生产的自动化监控,亦或是城市管理的智慧化升级,都离不开这些通信技术的有力支撑。

与此同时,云计算与大数据技术的崛起,为智慧物联提供了强大的后台处理能力。云计算平台以其弹性可扩展的计算资源,轻松应对物联网应用中产生的海量数据处理需求,而大数据技术则通过先进的算法与模型,对这些数据进行深度挖掘与分析,揭示出隐藏在数据背后的规律与趋势,为决策提供科学依据。更重要的是,人工智能技术的融入,使得智慧物联系统具备了自主学习与决策的能力,它能够根据历史数据与实时信息,自动调整运行策略,优化资源配置,甚至预测未来趋势,从而在无需人工干预的情况下,实现系统的自我优化与升级。

智慧物联的应用领域广泛而深远,它正深刻改变着我们的生活方式、工作模式与产业结构。在智能家居领域,智慧物联让家居设备实现了互联互通,用户可以通过手机或语音助手轻松控制家中的灯光、空调、窗帘等,享受便捷舒适的居住环境;在工业生产领域,智慧物联推动了制造业的转型升级,通过实时监控生产设备的运行状态,预测并预防故障发生,提高生产效率与产品质量;在城市管理领域,智慧物联则助力构建智慧城市,通过智能交通系统缓解拥堵,通过环境监测系统保护生态环境,通过公共安全系统提升城市安全水平。

此外,智慧物联还在农业、医疗、教育等多个领域展现出巨大的潜力与价值,它正在成为推动社会进步与发展的重要力量。随着技术的不断进步与应用场景的持续拓展,智慧物联的未来将更加广阔,它将进一步融合5G、区块链、边缘计算等新兴技术,构建起更加安全、高效、可持续的物联网生态系统,为人类社会的智能化发展贡献更多智慧与力量。

智慧物联系统板

2.系统板硬件介绍

本系统板采用STM32F103C8T6作为主控MCU,搭配有安信可AI-WB2-12F模组,支持2.4G WIFI和BLE5.0蓝牙,内置TCP/IP协议栈、MQTT物联网协议,支持HTTPS,采用AT指令集开;海凌科V20离线语音模组,可自定义语音识别词条;显示屏采用0.96寸OLED,单色屏幕,采用SPI方式驱动,刷新速度快,显示清晰;采用TYPC-C接口5V驱动,支持串口下载和ST_LINK下载方式;其他外围接口有1个电源指示灯,1个可编程LED、1个复位按键,1个可编程按键;所以可用IO端口均已引出。具体硬件实物如图所示:

3.系统板电路设计

本系统板采用嘉立创EDA设计,所有模组均采用立创提供的封装库,设计简单,方便快捷,硬件电路如下:

整体设计包括有主控MCU核心接口电路、电源电路和下载电路、OLED屏幕接口电路、WIFI模组电路、AI离线语音识别电路、系统复位、LED灯和按键电路。

4.模组介绍

3.1 STM32主控MCU

STM32F103C8T6 是意法半导体(STMicroelectronics)推出的基于 ARM Cortex-M3 内核的 32 位微控制器,具备高性能、低功耗和丰富的外设资源,广泛应用于工业控制、消费电子、物联网和医疗设备等领域。 ARM Cortex-M3 32 位 RISC 处理器,主频 72 MHz,运算性能达 1.25 DMIPS/MHz,支持单周期乘法和硬件除法。64 KB Flash 存储器(用于程序存储)和 20 KB SRAM(用于数据存储),支持通过外扩扩展存储容量。32 位总线宽度,存储器映射中程序从 0x0800_0000 启动,SRAM 位于 0x2000_0000,通过系统总线矩阵连接 AHB 与 APB 外设,确保高效数据通路。

  • 2 个独立 12 位 ADC 模块,最多支持 16 个外部通道(受引脚限制)和 2 个内部通道(温度传感器、内部参考电压 VREFINT),最高采样速率 1 MSPS(14 MHz ADC 时钟下)。
  • 定时器:
    • 高级控制定时器(TIM1):支持 PWM 波形生成、编码器接口。
    • 通用定时器(TIM2-TIM4):支持输入捕获、输出比较、PWM。
    • 基本定时器(TIM6-TIM7):基础计时与中断触发。
    • 系统滴答定时器(SysTick):24 位向下计数器。
    • 看门狗:独立看门狗(IWDG)、窗口看门狗(WWDG)。
  • 通信接口:
    • USART:3 个(USART1-USART3)。
    • SPI:2 个(SPI1-SPI2)。
    • I²C:2 个(I2C1-I2C2)。
    • CAN:1 个。
    • USB:1 个全速接口。

3.2 安信可AI-WB2-12F模组

处理器搭载BL602芯片,内置低功耗32位RISC CPU,配备276KB RAM,支持复杂运算与多任务处理。支持802.11b/g/n协议,最高速率72.2Mbps,兼容20MHz带宽。支持BLE 5.0与Bluetooth Mesh,实现低功耗短距离通信。

安全性能上支持WPS/WEP/WPA/WPA2 Personal/WPA3安全协议,保障数据传输安全。内置安全启动功能,支持ECC-256签名镜像验证,防止固件篡改。

提供AES 128/192/256位加密引擎与SHA-1/224/256哈希算法,强化数据加密能力。

Wi-Fi接收灵敏度:-98dBm(11b模式,1Mbps速率),确保弱信号环境下的稳定连接。BLE输出功率:1Mbps速率下典型值9dBm,支持远距离通信。

支持AT指令集开发,串口通讯方式,帧格式为:115200、8、N、1

3.3 海凌科V20语音识别模组

采用32bit RISC架构内核,运行频率可达240M。加入专门针对信号处理和语音识别所需的DSP指令集。支持浮点运算的FPU运算单元以及FFT加速器,提高语音信号的识别能力。

支持150条本地指令离线识别,识别准确率高。在安静环境下识别率超过95%,在办公室或放音乐的情况下识别率超过75%。支持中英文双语识别,但一个模块只能烧录一种语言。

支持自定义唤醒词、命令词与应答播报词。提供TTS语音播报功能,应答内容可以任意设置。支持发音人音色配置,提供多种音色选择。

3.4 OLED屏幕

0.96寸OLED屏幕,7线接口,SPI通讯方式,采用OLED显示模块可以带来多种优点。首先,OLED显示模块具有良好的色彩表现力和对比度,可以显示高清晰度的图像和字体。其次,OLED显示模块的对比度可调,可以根据环境和用户需求调整亮度。此外,OLED 显示模块[10]的功耗较低,寿命较长,使用寿命可达到5万小时以上。采用OLED显示模块的技术主 要包括OLED材料、触控技术和功耗管理。OLED材料主要包括有机发光二极管和有机材料膜,其具有电致发光、色彩纯度高和能耗低等特点。 在本次多功能手环设计中,采用OLED显示模块[9]可以提高用户体验、降低能源消耗、延长使用寿命等多种优点,此外,OLED显示模块采用的技术也值得一提。OLED即有机发光二极管,相较于传统LCD 显示[6]模块,它具有更高的对比度、更快的响应速度、 更大的视角和更低的功耗,同时还具备更加鲜明、色彩细腻的显示效果。用OLED显示模块的优点不仅体现在外观美观和性能上, 还在于其独特的节能管理能力, 这是众多用户选择它的重要原因之一。

5.测试程序

本次测试程序实现功能为:

  1. 上电播报语音词条。
  2. 配置WIFI模式为STA,通过HTTPS实现网络自动校时。
  3. 进入主循环,通过HTTPS获取实时天气数据。
  4. 语音识别,通过语音方式实现设备控制示例。
c 复制代码
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart1.h"
#include "timer.h"
#include "esp8266.h"
#include "oled.h"
#include "rtc.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define WIFI_NAME "nfj_wifi"
#define PASSWORD "asdfghjkl"
u8 g_rtcflag=0;

/******************解析 天气数据****************
形参:u8* buff原始数据
			u8 *Weather_stat天气数据标志
			u8 *data解析获取到的数据
返回值:0---成功,其他值---失败
************************************************/
u8 Weather_analysis(u8* buff,u8 *Weather_stat,u8 *data)
{
	char *p=NULL;
	u16 i=0;
	p=strstr((char *)buff,(char *)Weather_stat);//获取温度
	if(p)
	{
		p+=strlen((char *)Weather_stat)+2;
		i=0;
		while(*p!='\"' && *p!='\0')
		{
			data[i++]=*p++;
		}
		data[i]='\0';
		return 0;
	}
	else return 1;
}


int main()
{
    LED_Init();//LED
    Key_Init();
    USARTx_Init(USART1,115200);//一个字符的收发时间:1s/(115200/10)=86us
    USARTx_Init(USART2,115200);
    USARTx_Init(USART3,115200);
    OLED_Init();
    OLED_DispalyFont(16,40,16,font_16[4]);
    OLED_DispalyFont(16+16,40,16,font_16[5]);
    OLED_DisplayStr(16+32,40,16,"|");
    OLED_DispalyFont(16+40,40,16,font_16[6]);
    OLED_DisplayStr(16+56,40,16,"|");
    OLED_DisplayStr(16+64,40,16,"26");
    OLED_DispalyFont(16+80,40,16,font_16[7]);
    OLED_Refresh();
    RTC_Init();
    g_rtcflag=1;
    u8 ret=1;
    while(ret)
    {
        ret=ESP8266_STA_HttpInit(WIFI_NAME,PASSWORD);
        printf("ret=%d\n",ret);
        if(ret==0)break;
        USARTx_SendStr(USART3,"AT+RST\r\n");
        Delay_Ms(2000);
    }
    // https://sapi.k780.com/
    //AT+HTTPCLIENTLINE=2,2,,sapi.k780.com,,,?app=life.time&appkey=25273&sign=eae95a712a66e7a97dfd39534e24ffb1&format=json\r\n
    //网络校时
      USARTx_SendStr(USART3,(u8*)"AT+HTTPCLIENTLINE=2,2,,sapi.k780.com,,,?app=life.time&appkey=25273&sign=eae95a712a66e7a97dfd39534e24ffb1&format=json\r\n");
      u16 time2=0;
  while(1)
  {
    if(usart3_flag)
    {
      usart3_buffer[usart3_cnt]='\0';
      /*
      返回的数据格式:JSon
        rx3={"success":"1",
            "result":{
      "timestamp":"1727487843", -->1970/1/1 0:0:0
                "timestamp_ms":"1727487843658",
                 "datetime_1":"2024-09-28 09:44:03",
                  "datetime_2":"2024骞?9??28??09??4??03绉?",
                    "week_1":"6","week_2":"??????,"week_3":"?ㄥ??,"week_4":"Saturday"}}
        解析内容:"timestamp":"1727487843",  --当前秒单位时间 
        需要自行实现:将秒时间转化为:年月日时分秒 
      */
      printf("rx3=%s\r\n",usart3_buffer);
      char data[30];
      if(Weather_analysis(usart3_buffer,"\"timestamp\"",(u8*)data))
      {
        printf("获取网络时间失败\r\n");
        break;
      }
      printf("data=%s\n",data);
      u32 time_sec=atoi(data)+8*60*60;
      //将秒时间写入到RTC计数器中
      //3.配置RTC寄存器
      RTC->CRH&=~(1<<0);//关闭秒中断
      u8 stat=0;
      while(!(RTC->CRL&1<<5))//等待上一次写操作完成
      {
        stat++;
        Delay_Ms(1);
        if(stat>=255)break;
      }
      if(stat>=255)
      {
        printf("RTC初始化失败,无法进入配置模式\r\n");
      }
      RTC->CRL|=1<<4;//进入配置模式  
      //写入秒时间
      RTC->CNTH=(time_sec>>16);//写入高16位
      RTC->CNTL=time_sec;//写入低16位
      //退出配置模式
      RTC->CRL&=~(1<<4);//清除配置模式
      stat=0;
      while(!(RTC->CRL&1<<5))//等待写操作完成
      {
        stat++;
        Delay_Ms(1);
        if(stat>=255)
        {
            printf("RTC初始化失败,退出配置模式失败\r\n");
        }
      }  
      RTC->CRH|=1<<0;//开启秒中断
      STM32_SetNVICPriority(3,3,RTC_IRQn);//设置优先级    
      usart3_cnt=0;
      usart3_flag=0;
      break;
    }  
    time2++;
    Delay_Ms(1);
    if(time2>=65535){
        time2=0;
        break;
    }
  } 
    printf("时间校准完成\r\n");
    //获取天气
    char str[]={"AT+HTTPCLIENTLINE=2,2,,api.seniverse.com,,,v3/weather/now.json?key=SwD4-ybQxhedD1z7U&location=nanchang&language=en&unit=c\r\n"};
            
    //南昌|晴|18c
    char weather[20];
    char temp[20];
    u16 key=0;
    u32 time=500000;
    while(1)
    {
        
        time++;
        time2++;
        Delay_Ms(1);
        if(time>=500000){
            printf("获取天气\r\n");
            USARTx_SendStr(USART3,(u8*)str);
            time=0;
        }
        if(time2>=500){
            LED1=!LED1;
            time2=0;
        }
        key=Key_GetValue(0);
        if(key)
        {
            
           
             
        }
        if(usart3_flag)
        {
            
            usart3_buffer[usart3_cnt]='\0';
            printf("rx3=%s\n",usart3_buffer);
            /*
            rx3={"results":[{"location":{"id":"WT47HJP3HEMP",
            "name":"Nanchang","country":"CN","path":"Nanchang,Nanchang,Jiangxi,China",
            "timezone":"Asia/Shanghai",
            "timezone_offset":"+08:00"},
            "now":{"text":"Sunny","code":"0","temperature":"18"},
            "last_update":"2025-11-21T15:37:34+08:00"}]}
            OK
            
            */
            Weather_analysis(usart3_buffer,"\"text\"",(u8*)weather);
            ret=Weather_analysis(usart3_buffer,"\"temperature\"",(u8*)temp);
            if(ret==0){
                g_rtcflag=0;
                printf("ret=%d\n",ret);
                printf("weather=%s,%s\n",weather,temp);
                OLED_DisplayStr(16+64,40,16,temp);
                OLED_Refresh();
                g_rtcflag=1;    
            }            
            usart3_cnt=0;
            usart3_flag=0;
        }
        if(usart2_flag)
        {
            if(usart2_cnt==3)
            {
                if(usart2_buffer[0]==0x77 && usart2_buffer[2]==0x0a)
                {
                    switch(usart2_buffer[1])
                    {
                        case 1://开灯
                            LED1=0;
                            break;
                        case 7://关灯
                            LED1=1;
                            break;
                    }
                }
            }
            // printf("rx2=%s,%d\n",usart2_buffer,usart2_cnt);
            usart2_flag=0;
            usart2_cnt=0;
        }
        if(usart1_flag)
        {
            usart1_buffer[usart1_cnt]='\0';
            printf("rx1=%s",usart1_buffer);
            USARTx_SendStr(USART3,usart1_buffer);
            usart1_cnt=0;
            usart1_flag=0;
        }
    }
}
相关推荐
小李做物联网16 分钟前
为什么你的老是焊接后通信不成功,物联网焊接注意点
单片机·嵌入式硬件·物联网·课程设计
黑客思维者41 分钟前
新能源物联网系统中硬件加密芯片的安全设计与实践
物联网·安全·新能源·国密·硬件加密
云山工作室1 小时前
血糖浓度测试仪设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
雨疏风骤12401 小时前
【FreeRTOS】任务、任务状态
开发语言·stm32·c#·rtos
Tao____2 小时前
国产开源物联网基础平台
java·物联网·mqtt·开源·设备对接
Darken033 小时前
基于 STM32 ——GPIO输入
stm32·单片机·嵌入式硬件·gpio
影阴3 小时前
stm32 硬件i2c + hal库
stm32·单片机·嵌入式硬件
阿拉斯攀登3 小时前
在STM32上使用FreeRTOS
stm32·单片机·嵌入式硬件
Tao____4 小时前
国产开源物联网平台
java·物联网·mqtt·iot·设备对接