控制智慧教室实验

实验内容

  • 使用蜂巢套件控制智慧教室硬件。

实验目的

  • 掌握蜂巢套件与智慧教室的联动过程。

实验环境

实验所需要硬件及软件如下:

实验所需要硬件

序号 名称 数量 备注
1 电脑 1台 系统Windows7及以上
2 STM32底座 2个  
3 WiFi模块 1个  
4 LED模块 1个  
5 ST_LINK下载器 1个  
6 ST_LINK下载器连接线 1根  
7 OneNET平台显示PM2.5实验 1份  

实验所需软件

  • MDK5 安装步骤

  • ST-LINK 驱动安装步骤

  • Git 软件下载(可选)

STM32底座

STM32底座

WiFi模块

WiFi模块

LED模块

LED模块

ST-Link下载器 & ST-Link下载器连接线

STLink下载器

实验原理

WIFI技术基本概念

  • WIFI英语全称是Wireless Fidelity,中文译成无线保真。WIFI是建立连接和进行通讯的手段,它对应一套通讯的规则,保证让两个节点能互相连接,设备连接建立后,通过TCP/IP和UDP等协议,传输数据,连接互联网络。WIFI模块的STA模式和AP模式。

  • AP模式:Access Point,提供无线接入服务,允许其它无线设备接入,提供数据访问,一般的无线路由/网桥工作在该模式下。AP和AP之间允许相互连接。Sta模式(SP模式):Station类似于无线终端,sta本身并不接受无线的接入,它可以连接到AP,一般无线网卡即工作在该模式。对照表如下

AP模式和SP模式对照表

分类 AP模式 SP模式
接入网络 接受 不接受
网卡 需要 不需要
终端 有线 无线

WiFi模块原理图

WiFi模块原理图

RS485总线标准

  • RS485采用平衡发送和差分接收方式实现通信:发送端将串行口的ttl电平信号转换成差分信号a,b两路输出,经过线缆传输之后在接收端将差分信号还原成ttl电平信号。由于传输线通常使用双绞线,又是差分传输,所以有极强的抗共模干扰的能力,总线收发器灵敏度很高,可以检测到低至200mv电压。故传输信号在千米之外都是可以恢复。rs-485最大的通信距离约为1219m,最大传输速率为10mb/s,传输速率与传输距离成反比,在100kb/s的传输速率下,才可以达到最大的通信距离,如果需传输更长的距离,需要加485中继器。rs-485采用半双工工作方式,支持多点数据通信。rs-485总线网络拓扑一般采用终端匹配的总线型结构。即采用一条总线将各个节点串接起来,不支持环形或星型网络。如果需要使用星型结构,就必须使用485中继器或者485集线器才可以。rs-485总线一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。

  • UART与RS-485性能对比

  • 抗干扰性:RS485 接口是采用平衡驱动器和差分接收器的组合,抗噪声干扰性好。RS232 接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰。
  • 传输距离:RS485 接口的最大传输距离标准值为 1200 米(9600bps 时),实际上可达 3000 米。RS232 传输距离有限,最大传输距离标准值为 50 米,实际上也只能用在 15 米左右。
  • 通信能力:RS-485 接口在总线上是允许连接多达128个收发器,用户可以利用单一的 RS-485 接口方便地建立起设备网络。RS-232只允许一对一通信。
  • 传输速率:RS-232传输速率较低,在异步传输时,波特率为20Kbps。RS-485 的数据最高传输速率为 10Mbps。
  • 信号线:RS485 接口组成的半双工网络,一般只需二根信号线。RS-232 口一般只使用 RXD、TXD、GND 三条线。
  • 电气电平值:RS-485的逻辑”1”以两线间的电压差为+(2-6)V表示;逻辑”0”以两线间的电压差为-(2-6)V表示。在 RS-232-C 中任何一条信号线的电压均为负逻辑关系。即:逻辑”1”,-5- -15V;逻辑”0 “ +5- +15V。

实验底座RS485总线原理

  • 每个底座周边都有RS485总线接口,由底座的485信号由MCU的UART信号+MAX3485 485总线转换芯片组成。 RS485总线原理

实验步骤

① 在geogle浏览器输入网址:https://iiot.stepiot.com 打开网站。

② 输入帐号,登陆网站。

③ 点开事务管理->开放API。

④ 点击查看按钮,查看到token,将token复制。

⑤ 将WiFi模块、LED模块分别安装在STM32底座上,确认各个节点,如下图所示,ST_LINK连接WIFI节点连接。

⑥ 打开 Keil 5 (即安装的MDK5)工程软件,点击工具栏: ` Project -> Open Project`,选择工程文件:控制智慧教室\ConnectBC\WIFI-V11\USER\WiFi.uvprojx并打开,如下图,双击启动工程。

⑦ 打开http_utils.h,填写token并保存。

⑧ 打WIFI.h,修改WIFI热点的名字与密码,修改后保存。

⑨ 编译工程,然后将程序下载到WIFI节点的底座。

⑩ 将STLink连接到按键节点,点击工具栏: ` Project -> Open Project,选择工程文件:控制智慧教室\ConnectBC\KEY\USER\LED.uvprojx`并打开。

⑪ 编译工程,然后将程序下载到节点底座中,如下图。

⑫ LED节点与WIFI节点拼接,从STM32底座上取下STLink的USB线在重新接上,给设备重新上电。

⑬ 观察实验: 按键S1 控制灯,打开或者关闭; 按键S2 控制门锁,打开或者关闭; 按键S3 控制窗帘,闭合或者打开。

代码讲解

按键节点

① 程序目录结构,如下图。CORE文件夹为STM32内核代码,HALLIB文件文件夹为底层HAL库文件。我们主要关心,main.c及HARDWARE中的代码。

  • slip协议是在按键节点与WIFI节点之间使用的通信协议。
  • uCOSII,是实时操作系统。

-w240

② main.c->main.c中初始化UCOSII、启动开始任务Start_Task()。

int main(void)
{ 
    uint8_t i = 0;

    OS_CPU_SysTickInit();
	OSInit();   
 	OSTaskCreate(Start_Task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
	OSStart();	    
}

③ main.c-> Start_Task()中,中对串口、LED模块、RS485协议进行初始化。初始化完成后。创建按键扫描任务CC_Task()及485同步通信任务Sync_Task()。

void CC_Task(void *pdata)
{
    uint8_t temp;
    pdata = pdata;
    while(1)
    {
        OSTimeDly(1);
        temp = LedMod_KeyPoll(); 
        if((kv==0)&&(temp)){
            kv = temp;        
        }        
    }
}
void Sync_Task(void *pdata)
{
    INT8U err,i;
    pdata = pdata;
    while(1)
    {
        OSSemPend(&SemRecvSync,0,&err);    
        if(RSLIP.flg == 1)
        {
            RSLIP.flg = 0;  
            printf("get req1\r\n");
            if((kv)&&(RSLIP.cid == CID_POLL)&&(RSLIP.rid == LocalDeviceId))
            {
                printf("get req2\r\n");
                Rs485_Send(LocalDeviceId,WIFI_ID,CID_KEY,1,&kv);
                kv = 0;
            }
        }        
    }
}

WIFI节点

① 程序目录结构。如下图。CORE文件夹为STM32内核代码,HALLIB文件文件夹为底层HAL库文件。我们主要关心,main.c、http_utils.c及HARDWARE中的代码。

  • 其中,slip协议是在按键节点与WIFI节点之间使用的通信协议。
  • 平台联动代码,智慧教室平台与蜂巢套件之间使用http协议进行通信控制,平台联动代码是两者之间的接口。
  • uCOSII,是实时操作系统。

-w235

② main.c->main(),初始化UCOSII系统,启动开始任务Start_Task()。

int main(void)
{
  OS_CPU_SysTickInit();
	OSInit();   
 	OSTaskCreate(Start_Task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
	OSStart();	
}

main.c->Start_Task()任务中,初始化串口、WIFI模块(连接平台)、slip协议,并启动Sync_Task任务。

void Start_Task(void *pdata)
{
    UART1_Init(115200);//初始化串口1
    UART2_Init(115200);//初始化串口2
    UART3_Init(115200);
    printf("this usart3 printf\r\n");
    Rs485_Init();
    TIM3_Init(1000-1,64-1);//初始化定时器3
    slip_init(&RSLIP);
         
    SemRecvSync = *OSSemCreate (0);
    
    OSTaskCreate(Sync_Task,(void *)0,(OS_STK *)&SYNC_TASK_STK[SYNC_STK_SIZE-1],SYNC_TASK_PRIO);//创建起始任务
    OSTaskCreate(CC_Task,(void *)0,(OS_STK *)&CC_TASK_STK[CC_STK_SIZE-1],CC_TASK_PRIO);//创建起始任务  
    OSTaskDel(START_TASK_PRIO);    
}

main.c->Sync_Task任务,定时请求按键,并依据按键值控制灯、门锁及窗帘。

if((++Count100Hz)>=100)
{
    Count100Hz = 0;
    Rs485_Send(LocalDeviceId,KEY_ID,CID_POLL,0,(void*)0);  
}
if(RSLIP.data[0] == 0x01)
{
    LinghtState = 1 - LinghtState;
    if(LinghtState){
        HTTP_SendCommand("turnOnLight"); 
    }
    else if(LinghtState == 0){
        HTTP_SendCommand("turnOffLight");                   
    }
}
else if(RSLIP.data[0] == 0x02)
    {
        LockState = 1 - LockState;
        if(LockState){
            HTTP_SendCommand("openDoorLock"); 
        }
        else if(LockState == 0){
            HTTP_SendCommand("closeDoorLock");                   
        }
    }
    else if(RSLIP.data[0] == 0x03)
    {
        CurtainsState = 1 - CurtainsState;
        if(CurtainsState){
            HTTP_SendCommand("openCurtain"); 
        }
        else if(CurtainsState == 0){
            HTTP_SendCommand("closeCurtain");                   
        }
    }             

常见问题

  1. 弹出警告窗口,不能下载程序。

    • 请确认STLink驱动、STM32F103C8的DFP包是否安装。
    • STLink仿真器是否正常接入。
  2. 下载代码后程序没观察到实验现象。

    • 请重新上电,或者按下底座上的复位按键。
    • 模块没有安装稳妥。
  3. 连接不了平台设备没有上线。

    • WIFI名字、WIFI密码、token是否有效正确。