基于STM32的智能教室控制系统设计

目录

1、设计要求

2、系统功能

2、演示视频 

 3、系统设计框图

4、软件设计流程图

5、原理图

 6、主程序


🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智能教室。

        随着物联网技术的不断进步,物联网应用已经渗透到各个领域,包括教育。智能教室作为物联网技术在教育中的应用之一,旨在提供更智能、高效和互动性的学习环境。智能教室作为一种新型的教育设施,受到了广泛的关注和研究。国外的研究团队和大学也在积极探索和开发基于物联网的智能教室系统,以提高教学质量和学生学习体验。

设备的详细功能见网盘。

链接:https://pan.baidu.com/s/1uWSZX2zbZwy9sYwwnvyktQ?pwd=5132 
提取码:5132

1、设计要求

设计了一款智能教室系统,该系统以单片机为核心,通过温度传感器dht11对教室温湿度进行数据采集,然后利用采集的数据判断是否超过阈值,如果超过阈值就通过继电器开启风扇或者空调。超声波模块安装在教室的门口用来检测学生的到课人数,每进入一个学生就加一,并把人数上传到蓝牙APP,蓝牙APP可以控制教室的风扇或者空调的开启,按键模块也可以控制,OLED显示模块用来显示上面的数据,包括温湿度、到课人数和模式。

2、系统功能

  1. 红外传感器安装在门口用来检测到课人数,并把人数显示在手机APP上。)
  2. DHT11传感器用来检测室内的温湿度,用采集到的数据判断教室的舒适度,来控制是否开启空调或者风扇。
  3. 光敏传感器用来采集室内光线,判断是否开启灯。
  4. 利用按键一键开启多媒体。
  5. 手机蓝牙app可以控制温湿度的阈值,也可以直接控制空调或者风扇、灯。
  6. OLED显示屏实时显示教室环境信息。

3、演示视频 和实物

D4-基于STM32的智能教室控制系统设计

 4、系统设计框图

 智能教室分为三个部分,如下图所示:第一部分是外部传感器,负责采集教室的温湿度以及到课人数并将数据发送到STM32;第二部分是系统的核心控制部分,是STM32,负责数据的接收与处理,并发送到执行部分;第三部分是由空调、风扇和多媒体黑板等组成的执行部分,这部分用继电器代替,根据接收的信号进行工作。

设计框图

5、软件设计流程图

利用核心板编程初始化温度采集模块,并对采集到的温度进行相应处理后,在OLCD屏幕显示实际温度数据,当实际环境温度超过设计上限警戒值时,继电器电路导通,风扇导通,开始给教室降温。当环境温度降到规定下限警戒值时,风机不转,实现风机自动停机并随环境温度改变自行调速,同时提示当前环境温度。对射式红外传感器放在教室门口检测进入到课人数,并显示在OLED上。教室的控制分为手动和自动模式,自动模式下教室的灯和风扇由环境的光照强度和温湿度数据控制,自动模式下可以通过手机蓝牙APP控制。实现远程控制,同时蓝牙APP可以接收,查看环境信息以及设备状态。

 

6、原理图

原理图
PCB板

 7、主程序

#include "stm32f10x.h"   // 有问题和需求的,可以联系VX:lwfw123456789
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "delay.h"
#include "OLED.h"
#include "dht11.h"      //温湿度传感器
#include "Key.h"
#include "jidianqi.h"
#include "OLED.h"
#include "Serial.h"
#include "LED.h"
#include "Buzzer.h"
#include "Motor.h"
#include "CountSensor.h"
#include "AD.h"

uint16_t AD0;          //存储ADC的值
uint8_t KeyNum;      //存储按键值
uint8_t RxData;      //蓝牙接收到的数据
u8 temp, humi;      //存储温湿度
float temp1;     //adc转换值

u8 t = 0;          //温湿度读取值的间隔
float guang;              //存储AD模拟值转换为电压的值
uint32_t bufe[3];      //存储传感器采集的数据
u8 state = 1;
u8 state1 = 1;
u8 ren;              //教室实时人数
u8 flag;       

u8 WenYui = 28;    //阈值
u8 GuangYu  = 20;      //光照强度阈值

void ctrlue()               //自动模式
{
    //输出设备自动逻辑控制

    if (guang <= GuangYu)       //光照
    {
         LED1_ON();
        OLED_ShowChinese(4, 3, 12);     //  开
    }
    else
    {
			 LED1_OFF();
        OLED_ShowChinese(4, 3, 13);   //关
      
    }

    if (bufe[0] >= WenYui)      //温度
    {
        Motor_SetSpeed(40);
        OLED_ShowChinese(4, 8, 12);

    }
    else
    {
        Motor_SetSpeed(0);
        OLED_ShowChinese(4, 8, 13);
    }

    if (bufe[1] >= 33)      //温度
    {
        Buzzer_ON();
    }
    else
    {
        Buzzer_OFF();
    }
}

void shoudong()                 //手动模式
{
    if (Serial_GetRxFlag() == 1)  //蓝牙接收部分
    {
        RxData = Serial_GetRxData();     //蓝牙接收
        OLED_ShowHexNum(1, 1, RxData, 2);
        switch (RxData)   //控制阈值
        {
        case 1:
            state = 0; //设备开
            break;
        case 2:
            state = 1; //设备关
            break;
        case 3:
            Motor_SetSpeed(40);   //风扇开
				OLED_ShowChinese(4, 8, 12);
            break;
        case 4:
            Motor_SetSpeed(0);    //风扇关
				OLED_ShowChinese(4, 8, 13);
            break;
        case 5:
            LED1_ON();   // 灯开
				 OLED_ShowChinese(4, 3, 12);
            break;
        case 6:
            LED1_OFF(); // 灯关
				 OLED_ShowChinese(4, 3, 13);
            break;
        default:
            break;
        }
    }
}


int main(void)     //主函数
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    delay_init();      //延时函数初始化
    SystemInit();

    Key_Init();    //按键初始化
    LED_Init();    //LED灯初始化
    AD_Init();

    OLED_Init();     //屏幕初始化
    Buzzer_Init();    //蜂鸣器初始化
    Motor_Init();     //电机初始化
    CountSensor_Init();   //对射式红外传感器初始化


    if (flag == 0)
    {
        OLED_ShowChinese(2, 1, 36);    //显示名字学号信息
        OLED_ShowChinese(2, 2, 37);    //显示名字学号信息
        OLED_ShowChinese(2, 3, 38);    //显示名字学号信息
        OLED_ShowChinese(2, 4, 39);    //显示名字学号信息
        OLED_ShowChinese(2, 5, 40);    //显示名字学号信息
        OLED_ShowString(2, 11, "20-3");  
        OLED_ShowString(3, 1, "202002270085");  //学号信息
        flag = 1;
        delay_ms(1000);   //延时
        delay_ms(1000);
        delay_ms(1000);
        OLED_Clear();
    }
    OLED_ShowChinese(1, 3, 8);    //显示智能教室

    OLED_ShowChinese(1, 3, 8);    //显示智能教室
    OLED_ShowChinese(1, 4, 9);
    OLED_ShowChinese(1, 5, 14);
    OLED_ShowChinese(1, 6, 15);
    OLED_ShowChinese(1, 8, 13);

    OLED_ShowChinese(2, 1, 16); //显示光照和温度
    OLED_ShowChinese(2, 2, 17);
    OLED_ShowString(2, 5, ":");
    OLED_ShowChinese(2, 5, 2);
    OLED_ShowChinese(2, 6, 4);
    OLED_ShowString(2, 13, ":");  


    OLED_ShowChinese(3, 1, 18);  //显示人数和湿度
    OLED_ShowChinese(3, 2, 19);
    OLED_ShowString(3, 5, ":");
    OLED_ShowChinese(3, 5, 3);
    OLED_ShowChinese(3, 6, 4);
    OLED_ShowString(3, 13, ":");

    OLED_ShowChinese(4, 1, 20);   //显示灯和风扇
    OLED_ShowString(4, 3, ":");
    OLED_ShowChinese(4, 5, 21);
    OLED_ShowChinese(4, 6, 22);
    OLED_ShowString(4, 13, ":");

    OLED_ShowChinese(4, 3, 13); //开关显示
    OLED_ShowChinese(4, 8, 13);

    Serial_Init();   //串口1初始化
    while (1)
    {
        ren = CountSensor_Get();                    // 人数采集
        OLED_ShowNum(3, 6, ren, 2);

        AD0 = AD_GetValue(ADC_Channel_3);    //光照强度传感器      PA0
			  if (AD0 > 4000)AD0 = 4000;
        guang = (u8)(100 - (AD0 / 40));
       
        OLED_ShowNum(2, 6, guang, 2);  //oled显示光照强度
        OLED_ShowString(2, 8, "%");

        if (t % 10 == 0)                         //温湿度采集
        {
            DHT11_Read_Data(&temp, &humi);  //读取温湿度并显示在OLED上
            bufe[0] = temp;
            bufe[1] = humi;
            OLED_ShowNum(2, 14, bufe[0], 2);
            OLED_ShowString(2, 16, "C");
            OLED_ShowNum(3, 14, bufe[1], 2);
            OLED_ShowString(3, 16, "%");
            bufe[2] = 70 - guang;
            printf("\r\nWen=%d\r\n", bufe[0]);   //蓝牙上传数据
            printf("Shi=%d\r\n", bufe[1]);
            printf("Ren=%d\r\n", ren);
            printf("Guang=%d\r\n", bufe[2]);
        }
        t++;
        KeyNum = Key_GetNum();               //按键检查
        if (KeyNum == 1)    //设备启动按键 PB10
        {
            delay_ms(20);
            if (KeyNum == 1)
            {
                state++;
                if (state > 1)
                {
                    state = 0;
                }
            }
        }
        if (state == 0)
        {
            LED2_ON();             //开启指示灯
            OLED_ShowChinese(1, 8, 12); // 开
        }
        if (state == 1)
        {
            LED2_OFF();

            LED1_OFF();   //照明灯
						OLED_ShowChinese(4, 3, 13);
            Buzzer_OFF();
					  Motor_SetSpeed(0);        //关闭风扇
					OLED_ShowChinese(4, 8, 13);
            OLED_ShowChinese(1, 8, 13); //  关
        }

        if (KeyNum == 2 & state == 0) //一键控制自动或者手动   PB11
        {
            delay_ms(20);
            if (KeyNum == 2)
            {
                state1++;
                if (state1 > 1)
                {
                    state1 = 0;
                }
            }
        }
        if (state1 == 0)
        {
            ctrlue();   // 自动模式
            OLED_ShowNum(1, 1, 1, 1);
        }
        if (state1 == 1)
        {
            shoudong();   // 手动模式
            OLED_ShowNum(1, 1, 0, 1);
        }
    }
}


8、总结

本文采用STM32F03CT6单片机设计了一款智能教室控制系统,可以给学生提供一个舒适的学习环境,实现了自动控制教室环境,自动检测到课人数,减少了课堂管理的时间,提高了教学质量。

作者:5132毕业设计

物联沃分享整理
物联沃-IOTWORD物联网 » 基于STM32的智能教室控制系统设计

发表回复