基于STC32的智能灯控测试

发布时间 2023-12-14 23:22:31作者: 破旧信箱

我们要实现的功能是通过官方的例子改写以实现自己项目的要求:

项目要求:1.通过定时器实现灯亮十分钟后自动关灯

     2.检测到有人来时开灯,并保持十分钟

     3.若亮灯十分钟内还有人来,则刷新时间

     4.将开灯和关灯的日志信息通过AIP技术存到EEPROM中,实现掉电不丢失

      

步骤:

首先,在stc官网提供的教程中下载例子

链接:https://www.stcai.com/filedownload/720640

下载之后找到

 这是一个关于STC32中用IAP技术将FLASH当成逻辑上的EEPROM来使用,手册中也有介绍和范例代码

 接着用keil打开项目(keil需要提前配置好有关STC32MCU的内容,在官方手册中也有详细步骤)

打开项目后可以看到如下目录:

 然后找到Demo.c文件中的定时器0部分

我们可以根据自己的需要改变其中的内容,我现在要做的是实现每十分钟关灯一次,则将变量timcount设置为十分钟所对应的毫秒数的值(这里的定时器初始化中设置是1ms)

由于只是测试,我们就设置为10秒钟关灯。则对应将timcount的值设置为10000,当时间到达后就进行关灯操作,由于原代码中并没有定义灯的引脚,则可以用P40,也就是实验箱中灯的总开关来模拟灯的引脚。

  还需要注意一个问题就是,我们在灯已经是关闭状态下是不需要执行关灯操作的,所以可以定义一个表示灯状态的变量,比如u8 Tnumber,定义好之后通过这个来判断是否到达设置的时间

 

接下来做第二个功能,当有人来时开灯

STC32单片机提供IO中断,需要下载中断扩展,否则在中断号超出31之后就会编译报错。

打开exit.c文件,找到对应中断,这里为了演示定义的是P35这个按键

 

 建议在使用的时候,将中断内容放到主程序里,将代码改成上面的之后进行测试,若正常则是当P35按下之后蜂鸣器响,松开后关闭。

 

接下来就是编写日志存储部分,在EEPROM中可以用于存储数据的是64K的空间,对应0x0000到0xFFFF

由于EEPROM中一位最多为OxFF,所以只能存0-255,所以我这里采用的思路,是将几位连在一起同时使用,记录的时候,使用下图的方式同时存8位

首先我们需要一个变量,用于记录系统总运行时间,由于需要防止中途掉电,所以使用EEPROM1的第0xFFFE位(十进制的65,534位)来记录

定义为u32 sysTime,然后这个变量以秒为单位,所以在之前定时器0的基础上,还要加上每过一秒sysTime加1,并且加1以后需要存到EEPROM中。

然后自己定义一个getTime函数用于将总时间转换成标准的年月日时分秒,再定义一个函数用于保存系统总运行时间。

 

 

编写一个记录函数,在每次检测到有人来并且开灯的记录开灯时间,当自动关灯时也记录。

void LogMsg(const char* message) {
// 实现日志记录的代码
}

最后就是定义一个系统总开灯时间,当灯开启的时候在定时器里面自增。当我们想查看节能比例时可以通过(系统总未开灯时间/系统总运行时间)非常直观的看到节能效果。