基于StarKit的智能自习室

背景:
共享自习室因其相对低廉的价格、优越的学习环境,愈加受到社会上考研、考公人群的欢迎,利用物联网技术可以将自习室的管理变得更加高效灵活、也可以让室内环境更加舒适,而基于物联网的智慧自习室在将来一定会有很好的发展空间。我们利用基于CTWing平台的StarKit开发板,结合板载的温湿度传感器、红外光电传感器、马达的相关功能,实现了如下设计方案:温度控制系统与温度预警系统、近距警报功能、客流统计功能。
基本原理:
对传感器探测探测到的数据进行判决,依据判决结果执行相关处理操作。
图 1 开发板(扩展一个蜂鸣器

功能介绍:
1、温度控制系统与温度预警系统
我们利用板载温湿度传感器,实现对室内温度的实时监控,并将监控到的温湿度数据时刻上传到CTWing平台;在本设计中,我们将温度划分为三个不同的梯度,分别是:
a)适宜:温度 T<30℃
b)过高:温度 30℃<T<40℃
c)温度异常: 温度T>40℃
具体实现:
当温度处于适宜区间时,空调控制系统休眠,开发板的LED恒定显示为绿色,表明当下环境的温度较为适宜、舒适。
图2 温度适宜

图2 温度适宜
当检测温度过高,开发板上的LED进行红蓝闪烁,表明当下环境温度较高;当温度过高持续一段时间后,板载马达启动,代表空调控制系统启动。

温度过高,红蓝闪烁
当温度超过出于异常区间时,说明室内已不适宜学习,甚至可能存在火灾风险,我们通过给开发板扩展添加一个蜂鸣器来发出警报信号。
此外,用户还可以根据自己的需要灵活使用空调系统,我们用板载的按键KEY1代表空调开关,用户可以自行控制。
2、近距警报功能:
部分自习者可能存在坐姿不良问题,我们在桌面、椅子响应位置布置红外光电传感器,当用户距离桌面过近时可以发出蜂鸣声提醒;
具体实现:
时刻监测板载红外光电传感器IR的信号,如果检测到传感器被遮挡时间超过一定时限,说明客户出现坐姿异常,蜂鸣器发出提醒。
3、客流统计功能
如果一个书桌前的红外光电传感器长时间被遮挡,说明这个书桌当前属于被占用的状态,相关的信息将上传到云端;根据红外光电传感器,我们还可以统计当下自习室内书桌的使用情况,我们把响应数据上传到云端。
具体实现:
时刻监测板载红外光电传感器IR的信号,如果检测到传感器被遮挡时间超过一定时限,说明该书桌目前被占用,通过send_sensor_data函数将相关信息传送至CTWing平台;当IR传感器被遮挡时,定义IRcounter来对此数值进行计数,表明被使用书桌的数量,并且将此数据上传至云平台。
数据上传

前景展望:
目前共享经济逐渐变得火热,而且考研、考公人群在持续扩大,社会对于具有良好学习条件的自习室的需求会逐渐增大,而在日本、韩国,商业自习室已经发展地较为成熟,相信在未来,结合物联网的智慧自习室在中国也将得到迅速发展。
此外,本系统的具有的温度控制系统、近距离警报功能以及红外计数功能的拓展性、移植性比较强,可以应用在广泛的场景中,比如卧室、景区、博物馆、库房这些对于温度要求比较严苛的场景;利用近距离警报系统可以用于提示行人前方存在的危险;计数功能可以用于实时统计景区客流量、监控流水线等等,可扩展性比较强。
附录:
1、自定义的变量、扩展蜂鸣器定义IO引脚以及状态等

#define 	LOUDER_PIN  GPIOB,GPIO_PIN_4
#define 	LOUDER_ON  1
#define 	LOUDER_OFF  0

	int8_t ret;
	static uint8_t IR_status = true;
	static uint8_t KEY1_status = true;
	static float TEMP_status = 0;
	static int timeG30 = 0;
	static bool window_status = 0;
	static int IRcounting = 0;
	//HAL_GPIO_WritePin(LOUDER_PIN, (GPIO_PinState)LOUDER_OFF);		
	setStatus(LED1_DEVICE_ID,LED_OFF);

2、具体功能实现

//IR counting
		int *IRcount = &IRcounting;
		getStatus(IR, &BSP_status3);
		if( BSP_status3.IR_status == 0 )
		{			
			THREAD_OS_DELAY(200);
			
			getStatus(IR, &BSP_status3);
			if( BSP_status3.IR_status == 0)
			{
				os_log("IR status change\r\n");
				if( IRcounting > 10)
				{
						setStatus(MOTOR1,MOTOR_RUN);
						THREAD_OS_DELAY(1500);
						motor_write(MOTOR1, 0);		
						*IRcount = 0;
				}
				else
				{
						*IRcount += 1;	
				}
				
				IR_status = BSP_status.IR_status;
				send_sensor_data();
			}
		}


//MOTOR controled by KEY1;window controled by key1
		bool *window_status_tmp = &window_status;
		getStatus(KEY1, &BSP_status);
		if( BSP_status.key_value != KEY1_status )
		{			
			THREAD_OS_DELAY(100);
			
			getStatus(KEY1, &BSP_status);
			if( BSP_status.key_value != KEY1_status)
			{
				os_log("IR status change\r\n");
				if( BSP_status.key_value == 1 )
				{
						setStatus(MOTOR1,MOTOR_RUN);
						THREAD_OS_DELAY(1500);
						motor_write(MOTOR1, 0);
						*window_status_tmp = ~(*window_status_tmp);
				}
				else
				{
					setStatus(MOTOR1,MOTOR_OFF);
				}
				KEY1_status = BSP_status.key_value;
				send_sensor_data();
			}
		}

// temperature control function version1
		getStatus(HUM_TEMP, &BSP_status);
		int *time = &timer;
		if (BSP_status.temp <30 )
		{
			setStatus(LED0_DEVICE_ID,LED_GREEN);
			setStatus(LED1_DEVICE_ID,LED_GREEN);
		}	
		else if( BSP_status.temp > 30 && BSP_status.temp < 40 )
		{			
			THREAD_OS_DELAY(100);
			
			getStatus(HUM_TEMP, &BSP_status);
			if( BSP_status.temp > 30 && BSP_status.temp < 40)
			{
				os_log("TEM status change\r\n");
				setStatus(LED0_DEVICE_ID,LED_RED);
				THREAD_OS_DELAY(300);
				setStatus(LED0_DEVICE_ID,LED_BLUE);
				THREAD_OS_DELAY(300);
				setStatus(LED0_DEVICE_ID,LED_RED);
				THREAD_OS_DELAY(300);
				setStatus(LED0_DEVICE_ID,LED_BLUE);
				*time += 1000;
				if( *time > 10000)
				{
						setStatus(MOTOR1,MOTOR_RUN);
						THREAD_OS_DELAY(1500);
						motor_write(MOTOR1, 0);
						*time = 0;
				}	
				//IR_status = BSP_status.IR_status;
				send_sensor_data();
			}
		}
		else
		{
				HAL_GPIO_WritePin(LOUDER_PIN, (GPIO_PinState)LOUDER_ON);
				THREAD_OS_DELAY(2500);			
				HAL_GPIO_WritePin(LOUDER_PIN, (GPIO_PinState)LOUDER_OFF);					
				send_sensor_data();
		}

//IR control buzzer
		getStatus(IR, &BSP_status);
		if( BSP_status.IR_status != IR_status )
		{			
			THREAD_OS_DELAY(2000);
			
			getStatus(IR, &BSP_status);
			if( BSP_status.IR_status != IR_status)
			{
				os_log("IR status change\r\n");
				if( BSP_status.IR_status == 1 )
				{
					HAL_GPIO_WritePin(LOUDER_PIN, (GPIO_PinState)LOUDER_ON);		
					THREAD_OS_DELAY(1500);
					HAL_GPIO_WritePin(LOUDER_PIN, (GPIO_PinState)LOUDER_OFF);		
					
				}
				else
				IR_status = BSP_status.IR_status;
				send_sensor_data();
			}
		}
		
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值