• 【毕业设计】单片机与NBIOT通信模块 - 单片机 物联网 stm32



    1 简介

    Hi,大家好,这里是丹成学长,NBIOT是近几年不比较火的远程通信模块,是物联网的重要技术,今天学长向大家详细介绍什么是NBIOT,NBIOT模块能做什么,以及但单片机如何使用NBIOT模块

    单片机与NBIOT通信模块

    大家可用于 课程设计 或 毕业设计


    单片机-嵌入式毕设选题大全及项目分享:

    https://blog.csdn.net/m0_71572576/article/details/125409052


    2 NBIOT 简介

    基于蜂窝的窄带物联网(Narrow Band Internet of Things, NB-IoT)成为万物互联网络的一个重要分支。NB-IoT构建于蜂窝网络,只消耗大约180KHz的带宽,可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。

    NB-IoT是IoT领域一个新兴的技术,支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWAN)。NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接。据说NB-IoT设备电池寿命可以提高至至少10年,同时还能提供非常全面的室内蜂窝数据连接覆盖。

    重点:NBIOT是一种通信技术,是用于通信的!单片机通过该模块可以与外接互联网进行数据交互!

    2.1 NBIOT 的特点

    • 频谱窄:200kHz;
    • 终端发射窄带信号提升了信号的功率谱密度,提升了信号的覆盖增益,并且提升了频谱利用效率;
    • 相同的数据包重复传输也可获得更好的覆盖增益;
    • 另外该技术降低了终端的激活比,降低了终端基带的复杂度。
    • NB-IOT四大能力:广覆盖,海量连接,更低功耗,更低芯片成本。
    • NB-IOT基于现有蜂窝网络的技术,可以通过升级现网来快速支持行业市场需求,成为GUL网络上的第四种模式。

    2.2 NBIOT 的优点

    • NB-IOT与其他的LPWA技术LoRa,Sigfox的比较优势
    • 可以重用现网资源,支持广覆盖
    • 标准化技术,支持切换移动性好。产业链丰富
    • 20dB+增益(vs GSM)
    • 授权频谱,抗干扰性好

    2.3 NBIOT能做什么

    • 智能水表
    • 智能停车
    • 宠物智能跟踪
    • 智能自行车
    • 智能烟雾检测器
    • 智能马桶
    • 智能售货机
    • 等等等等

    NBIOT 模块使用

    这里以市面上常见的NB260模块为例:
    在这里插入图片描述
    NB260是基于移远NB-IOT模块:BC26的小系统板,板载了IPEX射频天线座,5V转3.3V LDO稳压电源,MicroSIM卡座,ESD防护电路,开机电路等,即插即用。

    NB260小系统板采用2.54标准间距排针,引出BC26模块的全部可用GPIO口,整板尺寸仅 25mm*33.02mm,便于嵌入到客户产品中。

    支持的频段
    在这里插入图片描述

    引脚信号

    NB260引脚排列如下图所示。

    CON1(P1)右侧一列信号为:GND,VIN,TXD,RXD,PEN,RST,EINT,NRI(NRI电压域1.8V,若用作唤醒MCU,可以简单串联1K电阻然后上拉后与MCU的GPIO口相连。),该列信号还与NB101,NB200兼容,可以相互替换。

    在这里插入图片描述

    SIM卡槽

    NB260采用自弹式MicroSIM卡槽,注意SIM卡插入方向为:卡缺口朝外。

    工作模式

    在这里插入图片描述

    4 实现效果

    (以下为学长作品)
    stm32 + NBIOT模块构建的家庭烟雾报警系统(智能家居的一部分)
    在这里插入图片描述

    在这里插入图片描述

    NBIOT指纹签到系统:

    在这里插入图片描述

    5 STM32 驱动NBIOT模块

    #include"nbiot.h"
    /***************************************************************************************
    函数名:send_NB_IoT
    功  能:发送数据到NB模块
    参  数:cmd 要发送的数据或者命令
    返回值:
    例  子:
    说  明: 
    作  者:丹成学长,q746876041
    ****************************************************************************************/
    void send_NB_IoT(u8 *cmd)
    {
    	
    	while(*cmd!='\0')
    	{
    	  USART_SendData(USART2,*cmd++);
    	  while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==Bit_RESET);	//发送数据结束
    	}
    }
    
    /***************************************************************************************
    函数名:NB_IoT_ack_chack
    功  能://检查NB模块应答是否符合预期   
    参  数:
    返回值:
    例  子:
    说  明:  memset(a, 0, sizeof a);  //清空数组  
    作  者:丹成学长,q746876041
    ****************************************************************************************/
    u8 NB_IoT_ack_chack(u8 *str)
    {
    	  delay_ms(10);
    		if(USART2_RX_STA!=0)
    		{
    			 USART2_RX_STA=0;
    			   
    			 if(strstr((const char*)USART2_RX_BUF,(const char*)str))//符合预期
           { 
    			     memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF);    
      				 return 0;
    			 }
    			 else //不符合预期  
           { 
    			     memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF);    
    			     return 1;
    			 }                             	
    		} 
    		else 
    		{ 
    			  memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF);  //清空数组  		 
    		    return  1;
    		}
    }
    u8 NB_IotConect()
    {
    	u8 x=1;
    	cmd1:send_NB_IoT("AT\r\n");//  指令测试
    	    if(!NB_IoT_ack_chack("OK"))  x=0;
    	    else   goto cmd1;
    	return x;
    }
    /***************************************************************************************
    函数名:NB_IoT_ZDFW
    功  能:自动附着网络
    参  数:
    返回值:
    例  子:
    说  明:
    作  者:丹成学长,q746876041
    ****************************************************************************************/
    u8 NB_IoT_ZDFW()
    {
    	    u8  x=0;
    cmd1: send_NB_IoT("AT+NCONFIG=AUTOCONNECT,TRUE\r\n") ;  
    			if(!NB_IoT_ack_chack("OK"))  x++ ;
    	    else   goto cmd1;
    cmd2: send_NB_IoT("AT+CFUN=1\r\n") ;     
    			if(!NB_IoT_ack_chack("OK"))  x++ ;
    	    else   goto cmd2;		
    cmd3: send_NB_IoT("AT+NRB\r\n") ; 
    	    if(!NB_IoT_ack_chack("REBOOTING"))  x++ ;
    	    else   goto cmd3;	
    		//确认自动附网
    cmd4:	send_NB_IoT("AT+NBAND?\r\n");  
    			if(!NB_IoT_ack_chack("+NBAND:5"))  x++ ;
    			else   goto cmd4;		
    cmd5: send_NB_IoT("AT+CFUN?\r\n"); 
    			if(!NB_IoT_ack_chack("+CFUN:1"))   x++ ;
    			else   goto cmd5;		
    cmd6: send_NB_IoT("AT+CIMI\r\n");
    			if(!NB_IoT_ack_chack("460113007651563")) x++ ;
    			else   goto cmd6;		
    cmd7:send_NB_IoT("AT+CSQ\r\n");  //确认信号质量第一个参数应该 1-30 之间
    			delay_ms(10);
    			if(USART2_RX_BUF[7]>'0'&&USART2_RX_BUF[7]<'3')
    			{
    				memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF); 
    				USART2_RX_STA=0;
    				
      			x++ ;
    		  }
    			else 
    			{
    				memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF); 
    				USART2_RX_STA=0;
    				goto cmd7;
    		  }	
    cmd8: send_NB_IoT("AT+CGATT?\r\n");
    			if(!NB_IoT_ack_chack("+CGATT:1")) x++ ;
    			else   goto cmd8;
    cmd9:send_NB_IoT("AT+CEREG?\r\n");
    			if(!NB_IoT_ack_chack("+CEREG:0,1")) x++ ;
    			else   goto cmd9;
    cmd10:send_NB_IoT("AT+CSCON?\r\n");
    		  if(!NB_IoT_ack_chack("+CSCON:0")) x++ ;
    		  else   goto cmd10;  		 
    cmd11:send_NB_IoT("AT+CGPADDR\r\n"); 
          if(!NB_IoT_ack_chack("+CGPADDR:0,10.")) x++ ;
    	 	  else   goto cmd11; 
    	    if(x==11)  return 0;//自动附着网络成功
    	    else       return 1;//自动附网失败
    	
    }
    /***************************************************************************************
    函数名:NB_IoT_conect_COAP
    功  能:COAP连接
    参  数:
    返回值:
    例  子:
    说  明:
    作  者:丹成学长,q746876041
    ****************************************************************************************/
    u8 NB_IoT_conect_COAP()
    {
    	    u8  x=0;
    cmd1: send_NB_IoT("AT+CGSN=1\r\n") ;  
    			if(!NB_IoT_ack_chack("+CGSN:356566078248721"))  x++ ;
    	    else   goto cmd1;
    cmd2: send_NB_IoT("AT+NCDP=180.101.147.115,5683\r\n") ;     
    			if(!NB_IoT_ack_chack("OK"))  x++ ;
    	    else   goto cmd2;	
    cmd3: send_NB_IoT("AT+NRB\r\n") ; 
    	    if(!NB_IoT_ack_chack("REBOOTING"))  x++ ;
    	    else   goto cmd3;	
    cmd4:	send_NB_IoT("AT+NCDP?\r\n");  
    			if(!NB_IoT_ack_chack("+NCDP:180.101.147.115,5683"))  x++ ;
    			else   goto cmd4;			
    cmd5: send_NB_IoT("AT+NSMI=1\r\n"); 
    			if(!NB_IoT_ack_chack("OK"))   x++ ;
    			else   goto cmd5;		
    cmd6: send_NB_IoT("AT+NNMI=2\r\n");
    			if(!NB_IoT_ack_chack("OK")) x++ ;
    			else   goto cmd6;
    cmd7:			send_NB_IoT("AT+NMGS=3,000102\r\n");  
          if(!NB_IoT_ack_chack("OK")) x++ ;
    			else   goto cmd7;
    	    if(x==7)  return 0;//COAP连接成功
    	    else      return 1; //COAP连接失败
    }
    /***************************************************************************************
    函数名:NBIoTInit
    功  能:NBIoT初始化
    参  数:
    返回值:
    例  子:
    说  明:
    作  者:丹成学长,q746876041
    ****************************************************************************************/
    void	NBIoTInit()
    	
    	{
    		      NB_IotConect();
    		      NB_IoT_ZDFW();
    		      NB_IoT_conect_COAP();
    //		      send_NB_IoT("AT+NMGS=10,53544d33325f4e423735\r\n"); //发送设备名字:STM32_NB75
    //		    POINT_COLOR=BLUE;	//设置字体为蓝色 
    //				LCD_ShowString(50,80 ,250,16,16,"NBIoT conecting...");
    //				if (!NB_IotConect())           LCD_ShowString(50,80 ,250,16,16,"NB_IotConect success!");
    //				else                          LCD_ShowString(50,80 ,250,16,16,"NB_IotConect error!!");
    //				LCD_ShowString(50,100 ,250,16,16,"NBIoT Net conecting...");
    //				if(!NB_IoT_ZDFW())     		    LCD_ShowString(50,100,250,16,16,"NBIoT ZDFW success!                  ");					 //自动附着网络
    //				else                          LCD_ShowString(50,100,250,16,16,"NBIoT ZDFW error!                     "); 
    //				LCD_ShowString(50,120 ,250,16,16,"NBIoT COAP conecting...");
    //				if(!NB_IoT_conect_COAP())			LCD_ShowString(50,120,250,16,16,"NBIoT COAP success!        ");//COAP连接
    //				else                          LCD_ShowString(50,120,250,16,16,"NBIoT COAP error!         ");
    //		     send_NB_IoT("AT+NMGS=2,0005\r\n");  
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187

    单片机-嵌入式毕设选题大全及项目分享:

    https://blog.csdn.net/m0_71572576/article/details/125409052


    6 最后

  • 相关阅读:
    函数栈帧的创建和销毁
    TensorRT 学习(二):Pytorch 模型转 TensorRT C++ 流程
    python机器学习入门之opencv的使用(超详细,必看)
    类和对象(上)
    含文档+PPT+源码等]精品基于Uniapp+SSM实现的新闻APP[包运行成功]计算机毕业设计安卓项目源码
    Docker的一些理解
    SpringCloud微服务实战——搭建企业级开发框架(五十):集成移动端推送功能的系统通知公告数据库设计
    python中的小问题01--使用cmd命令行中的pip3下载的包(模块)在pycharm中无法获取
    dynamic-datasource + parallelStream数据源切换失效
    python 执行远程shell命令tail并实时输出示例
  • 原文地址:https://blog.csdn.net/m0_71572576/article/details/125444379