基于stm32的智能闹钟设计与实现有STM32源程序+(原理图+RGB+源代码)

摘  要

伴随着经济和科技的不断提升和发张,人们的物质条件越来越高,人们对于智能化的需求也越来越广泛,智能家居逐步融入市民生活中,目前我国越来越多的科技公司逐步扩展智能家居产业链,打破科技垄断,让更多人能够普遍使用智能家居。

本文从家居角度出发,选择研究STM32单片机进行开发,以STM32F103C8T6最小系统板作为核心,能结合温湿度测量和闹钟响铃功能和闹钟调整功能,在硬件方面让其结合一起,通过屏幕显示,使其结合一起。软件设计方面,通过ESP8266 WIFI模块实现数据联通,让手机下发命令控制闹钟实现,同时硬件端也可以进行操控闹钟实现,达到数据的互通,不拘束于硬件实体的闹钟实现。

关键词:智能闹钟;STM32;单片机

ABSTRACT

With the continuous improvement and development of economy and science and technology, people's material conditions are getting higher and higher, people's demand for intelligence is becoming more and more extensive, smart home is gradually integrated into the life of citizens, at present, more and more technology companies in China are gradually expanding the smart home industry chain, breaking the monopoly of science and technology, so that more people can generally use smart home.

In this paper, from the perspective of home furnishing, we choose to study the STM32 microcontroller for development, with the STM32F103C8T6 minimum system board as the core, which can combine temperature and humidity measurement, alarm clock ringing function and alarm clock adjustment function, and combine them together in terms of hardware, and make them combine through screen display. In terms of software design, data communication is realized through the ESP8266 WIFI module, so that the mobile phone can issue commands to control the alarm clock, and the hardware side can also control the alarm clock to achieve data interoperability and realize the alarm clock that is not bound to the hardware entity.

Key words: Intelligent alarm clock; STM32;MCU

目  录

第1章 绪论

1.1 选题的背景与意义

1.2 本文主要目的及主要工作

1.3 本文主要结构

第2章 系统功能分析

2.1 温度和湿度检测功能

2.2 小程序功能

2.3 闹钟和时间功能

第3章 系统硬件设计

3.1 系统芯片

3.2 ST-LINK V2仿真器

3.3 OLED显示模块

3.4 直插式按键设计

3.5 双轴摇杆按键

3.6 温度湿度模块设计

3.7 WIFI模块

3.8 无源蜂鸣器模块

3.9 USB转TTL模块

第4章 系统软件设计

4.1 单片机软件程序设计

4.1.1 STM32程序开发环境

4.1.2 智能闹钟主程序流程设计

4.1.3 智能闹钟主要功能程序设计

4.2 MQTT服务器设计

4.3 小程序开发软件程序设计

4.3.1小程序开发环境

4.3.2 小程序开发程序设计

第5章 系统功能测试

5.1 硬件端功能测试

5.1.1 硬件端采集数据测试

5.1.2 硬件闹钟功能测试

5.1.3 硬件端上发数据测试

5.1.4 硬件端采集数据测试

5.2 小程序功能测试

5.2.1 小程序采集数据测试

5.2.2 小程序下发命令测试

第6章 总结与展望

6.1 总结

6.2 展望

参考文献

致谢

第1章 绪论

1.1 选题的背景与意义

从1946年计算机问世以来,计算机的发展已经经历了四代,由电子管时代不如晶体管时代到中小规模集成电路时代,到现在超大规模集成电路时代,计算机元件不断更新换代,人们对于计算机的运用也随着时代的发展越来越深。随着单片机的出现以及升级,人类生活也随之得到质的提升,单片机应用在如今也已经广泛进入百姓的生活中,给百姓带来实质性的便利,智能冰箱,智能打印机,智能洗衣机等无不彰显单片机技术开发已经普及,步入百姓生活中。

智能家居发展前景越来越广阔,自从半导体技术不断发展,智能家居市场也逐步扩大,随着智能家居技术的优化升级,市场产业链完善,2021年第四季度中国智能家居市场增长出货量超2.2亿台。接下来,智能家居也会进一步升级,普及,智能家居销售量也会继续增加,进入百姓生活中,预计到2030年,智能家居的销售量仍保持良好。

目前,用单片机进行也发的控制系统已经更加多功能化的被设计出来运用于百姓生活中,并且通过WIFI模块更加贴切百姓日常生活,随着WIFI技术普及,很多智能家居联通了手机对智能家居进行操作,也更好联合多种家电设备之间的协调性,同时,智能家居的设计让老年人也更加方便懂得如何使用智能家居。很多基于单片机的系统设计都极大的促进百姓生活,如基于STM32的便携式智能气象站设计,采集天气数据上传到上位机,方便了百姓生活,更加清楚了解到天气的实时情况,操作简便,安全可靠,基于云平台设计的智能家居系统设计,多功能智能家居系统,基于STM32的智能家居红外系统设计,让百姓通过手机就可以方便对家中智能家居进行控制,促进了智能家居的普及以及运用,让多个设备之间进行协调,温室系统设计,用温湿度测量模块等对温室进行自动化管理,从经济上促进了市场发展,有利于百姓生活,不用手动对温湿度进行测量并且手动调整,系统自动化解决了一系列繁琐的问题,基于老年智能手环设计,面向老年人的智能家居系统设计,对老年人的需求进行针对性研究,我国老年人群体愈发扩大,老年人生活也应该得到密切关注,如何方便老年人生活也是单片机控制系统下的设计方向。本文设计智能闹钟也将从百姓生活基础出发,设计一款利于便于百姓生活的智能闹钟。

1.2 本文主要目的及主要工作

如今智能家居行业愈发扩大,结合背景,本文从简单的需求出发,以智能闹钟为主要目的,集成百姓日常需求,设计一种基于STM32单片机的智能闹钟,综合了闹钟调整功能,温度和湿度检测,闹钟控制,时间显示,闹钟到时响铃功能,借助MQTT服务器,ESP8266 WIFI模块实现手机小程序观测时间和温度和湿度,小程序下发和收集命令对硬件端进行控制。

对于智能闹钟,本文主要将其分为两方面进行设计,一方面是硬件结构设计,一方面是软件结构设计。

硬件结构设计主要基于智能闹钟选择合适模块,智能闹钟硬件上选择OLED屏幕显示模块进行显示,按键模块进行闹钟的开启和关闭,摇杆模块进行闹钟时间的增加和减少,温度湿度传感器模块对环境进行检测,无源蜂鸣器模块,当闹钟时间等于程序时间时,无源蜂鸣器响特定音乐,ESP8266 WIFI模块对小程序和硬件端进行联通,将上述模块进行结合设计一款智能闹钟。综上模块准备完成后,对硬件电路进行设计,确保硬件电路接口正常,配置电平正常。

软件结构设计主要对于程序代码进行主要设计。本文软件结构设计从三个层次进行设计,依次将智能闹钟设计并完成。

1、对于单片机的软件程序设计,本文从STM32单片机软件程序设计起始,主要介绍开发软件工具,开发语言,之后对于ESP8266模块,OLED模块,摇杆模块,按键模块,DHT11模块等硬件进行初始化,进行程序初始化。对于配置好的模块,本文介绍如何配置代码总和出来,将闹钟状态,闹钟时间,程序设定时间,温度湿度显示在OLED屏幕上。同时配置MQTT和发送客户端,确保可以正常上发数据到小程序,同时接收小程序下发闹钟时间数据,对硬件端的闹钟时间进行修改。

2、设计小程序,对于小程序的设计与实现,本文使用微信开发者工具进行实现,本文介绍了如何用微信小程序进行主页面显示,如何用小程序实现闹钟时间的加减,如何设计小程序页面,在小程序上配置MQTT服务器,使其可以收集和下发命令。

3、配置MQTT服务器,本文介绍如何配置MQTT,使其能够收集硬件端的上发命令数据并且上传给微信小程序客户端,同时小程序如何下发数据到MQTT服务器再下发到硬件端,配置CJSON来分析数据。

1.3 本文主要结构

本文分别通过五章内容介绍基于STM32的智能闹钟设计与实现。

第一章为绪论,主要介绍课题研究的背景及其含义,主要分析智能家居技术的日益增长,智能家居市场的扩大,以及智能家居对于百姓日常生活的便利性。

第二章为系统功能分析,主要介绍小程序时间功能,硬件时间功能,家居环境温度和湿度检测功能,摇杆控制闹钟时间功能,小程序控制闹钟时间功能,按键开启和关闭闹钟时间功能,小程序开启和关闭闹钟功能。

第三章为系统硬件设计,主要介绍以STM32F103C8T6为核心,结合本文需求完成系统硬件设计,完成OLED屏幕模块,直插式按键模块,摇杆模块,DHT11温度和湿度检测模块,蜂鸣器模块的硬件电路设计。

第四章为系统软件设计,主要介绍如何完成综合模块,让时间,闹钟时间,蜂鸣器模块,DHT11温度和湿度检测模块,OLED屏幕显示模块,ESP8266 WIFI模块初始化,然后让其数据再结合一起;小程序如何完成界面设计,小程序如何更改闹钟时间和更改闹钟开启和关闭状态;介绍如何通过ESP8266 WIFI模块,结合小程序和硬件端的数据,让其互通,小程序能收集来自硬件端的实时时钟数据,闹钟数据,温度和湿度数据,闹钟开启或者关闭数据,硬件端实现收集小程序下发数据,对下发数据进行分析采集,并成功更改到硬件端中。

第五章为系统功能测试,主要介绍对智能闹钟进行测试,分析小程序和硬件端是否实现数据互通,数据是否能上传到MQTT服务器,温度和湿度,闹钟状态,闹钟时间,程序实时时间,是否正确上传到小程序客户端,小程序客户端是否能正常下发命令到硬件端中,改变闹钟状态和闹钟时间。

第六章为总结与展望,主要介绍本系统在编译程序研究中遇到了多个挑战,包括代码优化、性能调优和错误调试等问题。为克服这些困难,意识到自身代码能力有限,需要耐心和毅力,并不断思考和尝试不同的解决方案。通过查阅资料和书籍解决漏洞,如正确获取小程序下发命令数据并在OLED屏幕上显示。采取了学习、交流和利用工具等策略。

研究成果包括成功获取家居环境温湿度并显示、控制闹钟开关、通过摇杆和按钮调整时钟分钟、实现时钟匹配时蜂鸣器发声。创新点在于结合硬件端与小程序,使闹钟具备多功能。不足之处在于WIFI距离限制和网络速度差异。

展望: 智能闹钟已初步设计成功,但仍有改进空间。计划学习优化代码,并替换WIFI技术以提升网络连接稳定性和范围。继续努力提升代码能力和技术水平,与同行合作攻克难题,推动行业发展。

第2章 系统功能分析

2.1 温度和湿度检测功能

家庭环境温度直接影响到百姓生活的舒适度,人类是恒温动物,对于温度和湿度都有着要求,所以对于温度和湿度,稍有不舒服,就会改变人们的心情或者是工作效率,所以尤为引起人类重视。日常生活中,二十多度的温度最为贴近人类温度,所以人类感到适宜,当接近三十度或者低于十五度上下时,人们就会对其感到炎热或者是寒冷,这时候就要根据OLED显示的温度或者小程序上显示的温度,对家居环境进行调整,例如打开空调,调整适宜的温度。同样的在生活中,过高的湿度会导致家居环境渗水,百姓也会对环境不适应,过低的湿度会导致人们口干舌燥,所以要通过湿度检测器上传给OLED显示屏幕或者是小程序里的数据,及时发现湿度的变化,对环境湿度进行调整,打开抽湿器或者增湿器选择合适的挡位及时将湿度调整到对人类适宜的湿度。

2.2 小程序功能

作为智能闹钟,智能体现在可以通过手机小程序对闹钟进行一系列的远程操控,也可以通过小程序对闹钟的状态和闹钟时间有直观了解,也可以获取由硬件端上传的温度和湿度数据以及程序的实时时间。本文的智能闹钟系统让百姓可以通过小程序对闹钟的时间以及状态进行调整,确保即使闹钟不在身旁也可以通过手机进行远距离更改闹钟状态或者时间,在小程序上通过简单的按钮,一键点击开启或者关闭可以实时调整硬件端的闹钟状态,方便百姓生活,通过简单的小程序就可以更改闹钟状态。小程序也可以通过点击按钮来加减闹钟时间的时钟和分钟,本文设计了四个按键分别对应小程序上时钟的增加和减少,分钟的增加和减少,更改小程序上的闹钟时间会及时更改到硬件端中,同时硬件端闹钟状态以及时间的调整也可以通过小程序观察到。小程序可以实时观察到实时的温度和湿度,方便快捷就可以获取当前家居环境的温度和适度,从而对当前家居温度和湿度状况进行分析,选择合适的操作例如打开空调或者打开抽湿器和加湿器对当前环境进行调整。

2.3 闹钟和时间功能

时间主要通过STM32内置时钟函数来初始化程序时间作为基调,初始化后时钟会自然增长显示到OLED屏幕上和小程序上。闹钟功能主要通过摇杆模块和直插式按键模块对闹钟的时钟和分钟以及闹钟状态进行调整,小程序可以直接观察并改变闹钟状态,而硬件端直插式按键则通过OLED显示开启或者关闭,用摇杆模块对闹钟的时钟和分钟进行加或减,当摇杆往X轴右推,程序获取摇杆状态,闹钟分钟增加,反之闹钟分钟减少,当摇杆往Y轴方向前推时,闹钟时钟对应增加,小程序中闹钟时间对应增加,反之闹钟时钟减少,当摇杆综合X轴方向和Y轴方向,斜方向往X轴右边和Y轴正方向推时,闹钟的分钟和时钟同时增加,小程序中对应闹钟的时钟和分钟也对应增加。

第3章 系统硬件设计

3.1 系统芯片

本文选择STM32F103C8T6最小系统,STM32F103C8T6是一款32位ARM Cortex-M3内核为控制器,支持多种通信接口,例如SPI,I2C和USART,以及丰富的通用定时器和PWM通道。我们可以通过STM32F103C8T6开发板开发出高性能,低功耗的嵌入式系统。STM32F103C8T6最小系统原理图和模块如下图3.1、图3.2所示。

3.1 STM32F103C8T6最小系统

3.2 STM32F103C8T6模块图

STM32F103C8T6关键引脚定义表如图3.3所示:

3.3 引脚定义表

本文用RTC实时时钟为系统提供时钟功能,选择LSI振荡器时钟,LSI时钟频率大约为40kHZ,LSI无法由备用电源供电,故主电源掉电时,RTC走时会暂停。

本文使用STM32F103C8T6复位电路提供复位功能,复位功能可以让系统恢复初始状态,不用重新下载程序,按键SW按下时就会电路复位,按键悬空时程序正常运行,复位电路的设计如图3.4所示。

3.4 复位电路图

3.2 ST-LINK V2仿真器

ST-LINK V2仿真器主要用于下载程序,当下载中,指示灯会红黄闪烁,当下载成功后,红灯保持常亮。其中,ST-LINK V2仿真器上3.3V连STM32F103C8T6的VB引脚,配置LSI时钟,ST-LINK V2连接方式如下SWCLK: 接DLCK;SWDIO:接DIO;GND:接GND;3.3V:接3.3V电源;ST-LINK V2实物如图3.5所示。电路设计如图3.6所示。

3.5 ST-LINK V2实物

3.6 ST-LINK V2电路图

3.3 OLED显示模块

本智能闹钟选择1.8寸彩色TFT显示屏高清IPS LCD液晶屏为显示模块,显示屏可以直观显示获取到的数据,例如温湿度数据,闹钟数据,闹钟状态数据,时钟数据。1.8寸显示屏可以更加清晰观测到数据显示,同时可以初始化几种颜色作为背景颜色,

OLED显示模块提供了八个接口,本文用SPI通信方式配置OLED显示模块,根据实际情况,其针脚以及其对应连接方式如下:

VCC:接3.3V电源;

GND:接地(STMF103C8T6中的G);

SCLK:接PA0;

SDA:接PA1;

RES:接PA11;

DC:接PA12;

CS:接PA4

BL:接PA5;

OLED显示模块以及电路设计图分别如图3.7,图3.8所示。

3.7 OLED显示模块实物

3.8 OLED电路设计图

3.4 直插式按键设计

本文通过实际发现PS2双轴按键摇杆按键功能并不能正常使用,故用直插式按键进行替代,初始闹钟状态为零,当按下直插式按键时,闹钟状态为1,代表闹钟开启,再次按下时,闹钟状态取反为0,此时闹钟状态为关闭状态,即使程序时间等于闹钟时间也不会启动闹钟功能。本文直插式按键为四脚引脚,分为上下两端,一端接GND,一端接PB13。直插式按键实物图如图3.9所示,电路设计图如图3.10所示。

3.9 直插式按键实物

3.10 直插式按键电路图

3.5 双轴摇杆按键

双轴摇杆模块分为X轴和Y轴,通过X轴和Y轴我们可以分别实现闹钟功能中分钟和时钟的加减,斜方向为两个综合。PS2双轴摇杆模块连接方式如下:

GND:接GND;

+5V:接3.3V电源;

VRX:接PA6;

VR Y:接PA7;

PS2摇杆模块实物图以及PS2电路设计图分别如图3.11和图3.12所示。

3.11 PS2双轴摇杆模块实物

3.12 PS2双轴摇杆电路设计

3.6 温度湿度模块设计

本文选择DHT11传感器作为温度湿度模块来监测家居环境的温度和湿度,获取的温度和湿度可以在闹钟上显示,让闹钟功能不再单一,同时综合了温度计和湿度计和闹钟一起,让家居环境更为简洁,一个智能闹钟兼具其他功能。本智能闹钟选择控制DHT11的数据接口也就是DATA连接到PA8中,VCC选择3.3V电源。DHT11传感器实物图如图3.13所示,DHT11电路图如图3.14所示。

3.13 DHT11实物

3.14 DHT11电路设计图

3.7 WIFI模块

WIFI是日常生活中比较常用的,目前WIFI基本覆盖了家家户户,因此我们用ESP8266 WIFI作为WIFI通信模块,作为智能闹钟与服务器的一条大道,双方可以通过这个交流数据,也让用户可以通过WIFI在手机小程序上进行操控。通过串口通信将数据上发。本文使用串口2进行发送数据,。ESP8266 WIFI模块连接方式如下所示:

3V3:接3.3V电源;

GND:接GND;

TX:接PA3;

RX:接PA2;

RST:接PA14;

ESP8266 WIFI模块实物图如下图3.15所示。

3.15 ESP8266 WIFI实物

我们选择串口二与ESP8266 WIFI模块通信,通信需要ESP8266 WIFI模块的RX与TX和STMF103C8T6的RXD与TXD交叉连线,连线图如下图3.16所示。

3.16 ESP8266 WIFI模块电路设计

3.8 无源蜂鸣器模块

本文选择无源蜂鸣器作为闹钟响铃的模块,无源蜂鸣器的发声与有源蜂鸣器的发声方式略有不同,有源蜂鸣器只会发出固定声音,而无源蜂鸣器可以通过改变频率改变发声,可以发出一首音乐的声音。无源蜂鸣器的发声主要靠改变PWM波来进行控制发声,主要在占空比和频率上,占空比决定了闹钟发声的声音大小,而频率则决定了音调,我们可以填写对应的音调关系,让无源蜂鸣器发出一段音乐,下图3.17为无源蜂鸣器的实物图。

3.17 无源蜂鸣器实物图

连接方式:本文将IO口连在PB8中,GND接GND,VCC接3.3V电源,连接方式如下图3.18所示。

3.18 无源蜂鸣器电路设计

3.9 USB转TTL模块

本文选择USB转TTL-CH340模块作为串口助手的硬件,该模块有3.3V,5V,TXD,RXD,GND,VCC六个引脚,同样我们使用串口通信,让其TXD与RXD与STM32F103C8T6中的串口1的RXD和TXD分别连接,本文也将利用此硬件作为测试中不可或缺的一个模块,通过它,可以将硬件中的数据发给串口助手检查程序流通是否正常,数据是否正常,可以辨别WIFI是否正常联通,温度和湿度数据是否成功上传,闹钟状态和时间是否正常收发。连接方式我们只需将USB端口连到电脑,另一端连接方式为TXD:连PA10;RXD连PA10。USB转TTL-CH340模块实物如下图3.19所示。

3.19 USBTTL-CH340模块实物

CH340引脚部分连接方式如下图3.20所示,其中VCC和3.3V用跳线帽连接。

3.20 USBTTL-CH340模块电路设计

第4章 系统软件设计

4.1 单片机软件程序设计

4.1.1 STM32程序开发环境

本文使用C语言对STM32单片机进行程序开发,C语言广泛用于开发。本系统使用Keil Uvision5 MDK软件作为开发工具,Keil5页面简单,包括程序编译,程序调试功能,程序流程检测功能,不但可以将代码编译下载到单片机,还能通过打断检测,方便观测数据或者程序卡在哪一步。Keil5开发界面如下图4.1所示。

4.1 Keli5开发界面

4.1.2 智能闹钟主程序流程设计

本文设计的智能闹钟采用STM32F103C8T6单片机作为主控制,主要实现以下功能:温湿度、直插式按键、摇杆状态的读取,OLED数据的处理、WIFI模块的通信功能。主程序流程设计如下:

  1. 系统通电启动,系统初始化,配置LSI时钟作为程序时钟源,通过LSI得到不断自增的时钟源,初始化时间。
  2. STM32单片机通过读取温度湿度传感器的数据,PS2摇杆的数据,直插式按键的数据,通过程序判断是否开启闹钟,执行无源蜂鸣器。
  3. STM32将程序时间,闹钟时间数据,闹钟状态数据,温度和湿度数据由OLED屏幕显示,同时将数据上传服务器。
  4. 小程序获取上传到的数据,通过小程序页面显示温度和湿度,闹钟开启或者关闭状态,闹钟时间以及程序时间。
  5. 小程序下发命令更改闹钟状态,闹钟时间。小程序下发命令到服务器中,硬件端获取数据并进行更改。

主程序流程图如图4.2所示。

4.2 程序流程图

4.1.3 智能闹钟主要功能程序设计

(1) OLED显示模块设计

OLED我们使用SPI通信方式,配置SPI,关键代码如下所示:

SCL=SCLK接PA0

#define LCD_SCLK_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_0)

#define LCD_SCLK_Set() GPIO_SetBits(GPIOA,GPIO_Pin_0)

SDA=MOSI接PA1

#define LCD_MOSI_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_1)

#define LCD_MOSI_Set() GPIO_SetBits(GPIOA,GPIO_Pin_1)

OLED显示函数代码如下:

显示字符函数如下:

void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode);

显示字符串函数如下:

void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode);

显示整数变量如下:

void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey);

(2)直插式按键程序设计

获取PB13电平,当按键按下时,获取电平信号为0

int CLOCK_tab =  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13); //获取电平信号

delay_ms(10);//消抖

当获取到电平信号,也就是当程序识别到按键按下时,闹钟信号取反,闹钟状态发生改变。

if(CLOCK_tab==0){clockcount++;clocksignal1=!clocksignal1;delay_ms(10);}

直插式按键输出闹钟状态关键代码如下:

LCD_ShowIntNum(0,100,clocksignal1,2,LIGHTBLUE,WHITE,16);

(3)双轴摇杆程序设计

双轴识别状态核心代码如下:

//当识别到PS2摇杆往X轴方向右移时,闹钟分钟增加

if (ps2Value == XRIGHT){minute1++;}

//当识别到摇杆往X轴方向左移时,闹钟分钟减少

if (ps2Value == XLEFT){ minute1--;}

//当识别到摇杆往Y轴方向前移时,闹钟时钟增加

if (ps2Value == YBEFORE){ hour1++;}

//当识别到摇杆往Y轴方向后移时,闹钟分钟减少

if (ps2Value == YAFTER){ hour1--;}

//当识别到摇杆往X轴方向右移且Y轴方向前移时,闹钟分钟和时钟增加

if (ps2Value == TOPRIGHT){ hour1++;minute1++;}

//当识别到摇杆往X轴方向右移且Y轴方向后移时,闹钟分钟增加,闹钟时钟减少

if (ps2Value == LOWRIGHT){ hour1--;minute1++;}

//当识别到摇杆往X轴方向左移时且Y轴方向前移,闹钟分钟减少,闹钟时钟增加

if (ps2Value == TOPLEFT){ hour1++;  minute1--; }

//当识别到摇杆往X轴方向左移时且Y轴方向后移,闹钟分钟和时钟都减少

if (ps2Value == LOWLEFT){ hour1--; minute1--;}

//当闹钟分钟数大于等于60,闹钟时钟+1,闹钟分钟重置

if(minute1>=60){hour1++;minute1=0;}   

//当闹钟时钟数大于等于24,闹钟时钟数重置。

 if(hour1>=24){ hour1=0; }

(4)程序时间显示

 本系统主要通过STM32内部晶振作为时钟,配置LSI为时钟源,时间会自然增长,其中MyRTC_Time[3]代表时钟,MyRTC_Time[4]代表分钟,MyRTC_Time[5]代表秒数,显示闹钟时钟和分钟关键代码如下:

LCD_ShowString(0,0,"H:",LIGHTBLUE,WHITE,16,0);

LCD_ShowIntNum(20,0,MyRTC_Time[3],2,LIGHTBLUE,WHITE,16);

LCD_ShowString(0,20,"M:",LIGHTBLUE,WHITE,16,0);

LCD_ShowIntNum(20,20,MyRTC_Time[4],2,LIGHTBLUE,WHITE,16);

LCD_ShowString(0,40,"S:",LIGHTBLUE,WHITE,16,0);

LCD_ShowIntNum(20,40,MyRTC_Time[5],2,LIGHTBLUE,WHITE,16)

LCD_ShowString(60,0,"CLOH:",LIGHTBLUE,WHITE,16,0);

LCD_ShowIntNum(100,0,hour1,2,LIGHTBLUE,WHITE,16);

LCD_ShowString(60,20,"CLOM:",LIGHTBLUE,WHITE,16,0);

LCD_ShowIntNum(100,20,minute1,2,LIGHTBLUE,WHITE,16);

OLED显示闹钟时钟和分钟如下图4.3所示

4.3 OLED显示时间和闹钟

(4)温度和湿度程序设计,温度和湿度主要通过DHT11探测获取,通过OLED显示函数进行输出。关键代码如下所示:

LCD_ShowIntNum(0,60,dht11_data[2],2,LIGHTBLUE,WHITE,16);

LCD_ShowIntNum(20,60,dht11_data[3],2,LIGHTBLUE,WHITE,16);

LCD_ShowChar(17,60,'.',LIGHTBLUE,WHITE,16,0);

LCD_ShowString(40,60,"%C",LIGHTBLUE,WHITE,16,0);

LCD_ShowIntNum(0,80,dht11_data[0],2,LIGHTBLUE,WHITE,16);

LCD_ShowIntNum(20,80,dht11_data[1],2,LIGHTBLUE,WHITE,16);

LCD_ShowChar(17,80,'.',LIGHTBLUE,WHITE,16,0);

LCD_ShowString(40,80,"%",LIGHTBLUE,WHITE,16,0);

OLED屏幕显示温度和湿度如下图4.4所示。

4.4 温湿度显示

(6)闹钟响铃程序设计

闹钟响铃功能主要由无源蜂鸣器提供响铃,无源蜂鸣器主要通过控制PWM进行设计。当闹钟信号为1且闹钟时间等于程序时间时,闹钟响铃,闹钟关键代码如下:

if(MyRTC_Time[3]==hour1&&MyRTC_Time[4]==minute1){signal1=1;}else{signal1=0;}

if(signal1==1&&clocksignal1==1){musicPlay();}//musicPlay为响铃功能

(7)ESP8266 WIFI程序设计

ESP8266 WIFI主要作为本系统交互的一个重要功能,通过它我们上发数据到MQTT服务器中,ESP8266 WIFI模块关键函数如下所示:

const char *devSubTopic[] = {"/mysmartclock/sub"};//编写上传的主题

const char devPubTopic[] = "/mysmartclock/pub";//编写收发的主题

"AT+CWJAP=\"X30\",\"cslz2346\"\r\n" //编写WIFI名称以及密码,连接手机

"AT+CIPSTART=\"TCP\",\"broker.emqx.io\",1883\r\n" //编写服务器

while(OneNet_DevLink()) //接入OneNET

delay_ms(500);

OneNet_Subscribe(devSubTopic, 1);

dataPtr = ESP8266_GetIPD(3);   //程序主代码中收发数据

if(dataPtr != NULL)

{ OneNet_RevPro(dataPtr); }

delay_ms(10);

//上传时钟分钟,温度,湿度,闹钟状态数据

sprintf(PUB_BUF,"{\"Temp\":%d.%d,\"Hum\":%d.%d,\"Hour\":%d,\"Minute\":%d,\"Second\":%d,\"Clock\":%d,\"hour\":%d,\"minute\":%d}",dht11_data[2],dht11_data,dht11_data[0],dht11_data[1],MyRTC_Time[3],MyRTC_Time[4],MyRTC_Time[5],clocksignal1,hour1,minute1);

以下关键代码为对收发数据进行解析:

json_value = cJSON_GetObjectItem(json,"CLOCK_SW");

if(json_value != 0){

if(json_value->valueint == 0){

clocksignal1=0;//当接收到小程序闹钟信号为零时,程序相应改变

}else{clocksignal1=1;}}

// 解析hour

json_value = cJSON_GetObjectItem(json, "hour");

if (json_value != 0) {

// 更新程序中的hour变量

hour1 = json_value->valueint;}

// 解析minute

json_value = cJSON_GetObjectItem(json, "minute");

if (json_value != 0) {

// 更新程序中的minute变量

minute1 = json_value->valueint;

4.2 MQTT服务器设计

本文选择MQTT服务器作为小程序和硬件端的桥梁,设备通过服务器上行和下发数据,MQTT在本设计中起到重要的作用,MQTT服务器网站主界面如下图4.5所示。

4.5 MQTT服务器界面

进入MQTT网站中,填写相关信息,填写方式如下

Name:填6666;

Cilent ID:填mqttx_db964b30;

Host选择wss,填写broker.emqx.io;

Post:填8084;

Path:填/mqtt,

填写界面以及对应填写如下图4.6所示。

4.6 MQTT基础信息填写

配置基础信息后,配置上下发主题,要与单片机中主程序主题对应,上发主题填写:/mysmartclock/sub,下发主题填写:/mysmartclock/pub,填写界面以及对应填写内容分别如图4.7和4.8所示。

4.7 配置sub

4.8 配置pub

当上发主题与下发主题成功填写后,可以在MQTT主界面直接观测到硬件端或者小程序端上发给MQTT服务器的数据,同时在白色框内,可以填/mysmartclock/pub,以JSON格式填写温度湿度等数据,点击发送按钮发送上传,如下图4.9所示。

4.9 MQTT服务器收发数据

4.3 小程序开发软件程序设计

4.3.1小程序开发环境

小程序本文选择微信开发者工具作为软件编译工具,微信开发者工具可以在编译代码后显示小程序界面效果,对开发者无疑更为方便,同时也可以在小程序端观测获取到的数据,更为直接方便观测数据。微信开发者工具开发界面如下图4.10所示。

4.10 微信小程序开发界面

4.3.2 小程序开发程序设计

小程序设计主要划分为两个大模块来显示,第一个大模块中头部显示硬件端上传的时间,然后显示闹钟时间以及对应闹钟按键,以下是设计对应组件页面布局以及颜色和背景的关键代码。

显示时分秒以及对应数据

<view class="Time-card_value">{{Hour}}</view>

<view class="Time-card_title">时</view>

 <view class="Time-card_value">{{Minute}}</view>

 <view class="Time-card_title">分</view>

<view class="Time-card_value">{{Second}}</view>

<view class="Time-card_title">秒</view>

显示闹钟时间

 <text class="clock-text"> 闹钟{{hour}}</text>

 <text class="clock-text">{{minute}}分 </text>

显示闹钟时间调整按钮

 <button class="btn" bindtap="addHour">+</button>

 <button class="btn" bindtap="subHour">-</button>

  <button class="btn" bindtap="addMinute">+</button>

  <button class="btn" bindtap="subMinute">-</button>

将时间显示组件设计为圆角蓝底白字的样式,关键代码如下所示:

.Time {

  background-color: #0880f0;

  color: #fff;

  border-radius: 36rpx;

  padding: 36rpx 40rpx;

}

设计分布格局样式。

.Time .Time-card {

  border-radius: 36rpx;

  display: flex;

  justify-content: space-between;

}

设计标题样式。

.Time .Time-card .Time-card_title {

  font-size: 52rpx;

  color: #f8f7f7;

}

设计时间显示样式。

.Time .Time-card .Time-card_value {

  font-size: 52rpx;

  font-weight: bold;

  color: #f7f3f3;

}

设计闹钟按钮样式为蓝底样式,关键代码如下所示:

.btn {

  width: 40rpx;

  height: 80rpx;

  font-size: 40rpx;

  background-color: #51a2ee;

}

设计完成后如下图4.11所示。

4.11 时间以及闹钟显示

设计四个板块分别存储硬件端上传的温度,湿度,闹钟开关,以及自定义舒适度板块,相关页面布局核心代码如下。

    <!--温度-->

        <view class="data-card_title">温度</view>

        <view class="data-card_value">{{Temp}}℃</view>

    <!--湿度-->

             <view class="data-card_title">湿度</view>

        <view class="data-card_value">{{Hum}}%</view>

    <!--闹钟-->

        <view class="data-card_title">闹钟</view>

          <switch checked="{{Clock}}" bindchange="onClockChange" color="#3d7ef9" />

    <!--舒适度-->

        <view class="data-card_title">舒适度</view>

        <view class="data-card_value">80</view>

   将上述四个板块设计为相互独立且为白色底,圆角的四个板块,关键代码如下所示。

设计四个模块大致高度以及相应布局。

  position: relative;

  background-color: #fff;

  height: 160rpx;

  box-shadow: 0 0 8rpx #d6d6d6;

  border-radius: 36rpx;

  display: flex;

  justify-content: space-between;

设计四个模块内容布局

  position: absolute;

  right: 24rpx;

  top: 36rpx;

  text-align: right;

  white-space: nowrap;

设计四个模块中标题文字的对应样式

data-card_title 

  font-size: 28rpx;

  color: #7f7f7f;

设计四个模块相对应数据颜色的样式

data-card_value 

  font-size: 52rpx;

  font-weight: bold;

  color: #7f7f7f;

}

设计温度,湿度,闹钟,舒适度主题图片设计关键代码如下所示:

温度

 <image class="data-card_icon" src="/static/temp.png" />

湿度

<image class="data-card_icon" src="/static/hum.png" />

闹钟

<image class="data-card_icon" src="/static/clock.png" />

舒适度

 <image class="data-card_icon" src="/static/feel.png" />

主题图片如下图4.12,图4.13,图4.14,图4.15所示。

4.12 温度显示图片

4.13 温度显示图片

4.14 温度显示图片

4.15 温度显示图片

设计完成后,四个模块样式大概为白底,灰字,圆角的样式,如下图4.16所示。

4.16 模块样式

小程序页面中设计主页与用户按钮,对应关键代码如下所示:

"iconPath": "static/home.png",

"selectedIconPath": "static/home_active.png"

对应图片如图4.17和图4.18所示。

4.17 主页显示图片

4.18 用户显示图片

综合两大模块,设计出简单易懂的图形界面,显示闹钟时间,程序时间,温度,湿度,以及闹钟开关,如下图4.19所示。

4.19 小程序页面

将页面布局完成后,设计对硬件端数据处理的代码以及在小程序页面中闹钟功能的对应功能。

硬件端上传数据主要通过MQTT服务器上传,小程序编译器中对应硬件端以及MQTT服务器的主题名字进行相应编写,关键代码如下:

const mqttHost= 'broker.emqx.io'//mqtt服务器域名

const mqttPort =8084 //mqtt服务器端口

const deviceSubTopic ='/mysmartclock/sub' //设备订阅Topic (小程序发布命令的Topic)

const devicePubTopic ='/mysmartclock/pub' //设备发布Topic (小程序发布订阅数据的Topic)

硬件端上传的数据主要为JSON格式,小程序端要对该数据进行解析,关键代码如下所示:

try {

      dataFromDev =JSON.parse(message)

      console.log(dataFromDev);

      that.setData({

        Temp:dataFromDev.Temp,

        Hum:dataFromDev.Hum,

        Hour:dataFromDev.Hour,

        Minute:dataFromDev.Minute,

        Second:dataFromDev.Second,

        Clock:dataFromDev.Clock,

        hour:dataFromDev.hour,

        minute:dataFromDev.minute

      })

  } 

小程序通过上述代码可以成功对硬件端发送到MQTT服务器中的数据进行解析,将其显示到小程序中。同时,小程序中闹钟增加删减以及对应开启关闭状态也要发送到MQTT服务器中,让硬件端获取,关键代码如下所示:

闹钟时钟增加功能,当调整时钟大于23时,时钟重置为0。

  addHour() {

    let hour = this.data.hour + 1;

    if (hour > 23) {

      hour = 0;

    }

闹钟时钟减少功能,当调整时钟小于0时,时钟重置为23。

  subHour() {

    let hour = this.data.hour - 1;

    if (hour < 0) {

      hour = 23;

    }

闹钟分钟增加功能,当调整时钟大于59时,时钟重置为0。

  addMinute() {

    let minute = this.data.minute + 1;

    if (minute > 59) {

      minute = 0;

    }

闹钟分钟减少功能,当调整时钟小于0时,时钟重置为59。

  subMinute() {

    let minute = this.data.minute - 1;

    if (minute < 0) {

      minute = 59;

    }

对增改后的闹钟时钟和分钟数据进行JSON格式转化并且上传到MQTT服务器中,当成功修改后,小程序端显示成功下发指令-修改小时数。

    const jsonData = JSON.stringify(dataToSend);

    this.data.client.publish(mpPubTopic, jsonData, function (err) {

      if (!err) {

        console.log('成功下发指令-修改小时数');

      }

    });

    const jsonData = JSON.stringify(dataToSend);

    this.data.client.publish(mpPubTopic, jsonData, function (err) {

      if (!err) {

        console.log('成功下发指令-修改分钟数');

      }

    });

// 构建包含hour和minute的JSON数据

   const dataToSend = {

    CLOCK_SW: sw ? 1 : 0, // 闹钟开关状态

    hour: that.data.hour, // 当前小时数

    minute: that.data.minute // 当前分钟数

  };

  // 将包含hour和minute的JSON数据转换为字符串

  const jsonData = JSON.stringify(dataToSend);

当在闹钟开启关闭模块中点击一次,对应数据发生改变,小程序端发送闹钟状态数据到MQTT服务器中,对应硬件端进行更改。

  if(sw){

  that.data.client.publish(mpPubTopic,jsonData,function (err) {

    if(!err){console.log('成功下发指令-开启闹钟');}

  })

  }else{

    that.data.client.publish(mpPubTopic,jsonData,function (err) {

      if(!err){console.log('成功下发指令-关闭闹钟');}

    })

通过上述代码编写,小程序主题本文设计主体代码已完成。

第5章 系统功能测试

5.1 硬件端功能测试

5.1.1 硬件端采集数据测试

将设备连接好,本系统通过OLED屏幕模块观测采集数据,主要观测OLED屏幕中能否正常显示程序时间,程序闹钟状态,闹钟时间,温度和湿度数据,OLED显示如图5.1所示。

5.1 OLED显示

串口助手显示温度湿度上传数据如图5.2所示。

5.2 温湿度采集测试

5.1.2 硬件闹钟功能测试

调整PS2摇杆以及单词点击直插式按键,我们可以将闹钟状态设为1,如图5.3所示,我们成功开启闹钟,即按下按键,将闹钟时间调整为5时1分测试摇杆功能,将分钟增加,观察串口助手是否由闹钟增加显示如图5.4,OLED显示如图5.5所示。

5.3 串口助手闹钟状态显示

5.4 串口助手分钟增加显示

5.5 调整闹钟效果

5.1.3 硬件端上发数据测试

通过串口助手我们可以直观看到数据是否正常上发,WIFI是否成功连接,如图5.6所示,WIFI成功连接,实际通常通常会遇到以下卡顿,如果串口助手显示卡在0.AT,则代表线没连好,卡在4. CWJAP,则说明WiFi没连接,卡在5. CIPSTART,则需断电重连,卡在oneNet,代码不对,特别注意服务器地址。如图5.7所示,可以看到硬件端成功上发数据温度,湿度,程序时间,闹钟状态,闹钟时间。

5.6 WIFI成功连接显示

5.7 串口助手显示

通过MQTT页面可以看到数据正常上发,如图5.8所示。

5.8 硬件上发MQTT

5.1.4 硬件端采集数据测试

当小程序点击按键,增加分钟数或者调整闹钟状态时,可以通过串口助手或者观察是否正常收发,将闹钟状态调为开启,闹钟时间调为6时1分。调整后串口助手收到数据,如图5.9所示。

5.9 采集数据

通过OLED显示如图5.10所示,我们看到闹钟时间成功调整为6时1分,闹钟状态成功变成1,也确定成功采集。

5.10 OLED采集显示

5.2 小程序功能测试

5.2.1 小程序采集数据测试

在硬件端将闹钟状态调为0,也就是闹钟关闭,闹钟时间调为8时1分,小程序页面如图5.11所示。

5.11 小程序采集

小程序控制台也成功收到数据,如下图5.12所示。

5.12 小程序控制台采集数据

5.2.2 小程序下发命令测试

本系统可以让小程序界面改变闹钟时间和闹钟开关状态,我们将闹钟状态设为开启,闹钟时间设为20时34分。在MQTT页面我们可以成功看到下发成功,如图5.13所示。

5.13 小程序下发命令

小程序中我们也可以看到成功修改闹钟状态,闹钟分钟和闹钟时钟,分别如下图5.14,图5.15,图5.16所示。

5.14 开启闹钟

5.15 修改闹钟分钟

5.16 修改闹钟时钟

第6章 总结与展望

6.1 总结

本系统在编译程序的研究过程中,遇到了许多困难和挑战,例如代码优化、性能调优和错误调试等问题。在面对这些困难时,自身意识到代码能力不够强,要想取得成功,必须具备耐心和毅力,同时搜寻合适的解决方法不断地思考和尝试不同的解决方案。在遇到漏洞的时候,积极翻阅书本和查阅网上相关资料排除漏洞,例如在获取小程序下发命令数据时,如何正确获取数据并且显示到OLED屏幕上。

为了克服困难,采取了一系列的策略和方法。首先,不断地学习和积累知识,提升自身代码水平,还积极参与讨论和交流,与同行进行深入的探讨,从中获取灵感和启发。此外,还利用各种工具和资源,如调试器、性能分析器等,帮助定位和解决问题。

本文的研究成果如下:

(1):系统通过温度湿度传感器成功获取到家居环境的温度和湿度并且通过OLED屏幕和小程序页面显示。

(2):系统通过直插式按键和小程序闹钟开关功能调控闹钟开关状态。

(3):系统可以通过PS2双轴摇杆和小程序四个按钮实现闹钟时钟和分钟的改变。

(4):系统实现当闹钟时间的时钟和分钟等于程序时间的时钟和分钟时,蜂鸣器发出声音。

本文创新点在于在传统闹钟上,开发小程序,让闹钟不在基于硬件端,可以硬件端与小程序相互结合,同时结合家居环境中比较重要的温度和湿度,将其结合在智能闹钟上,这样人们在使用时可以一个闹钟实现多种功能。

本文不足在于(1):WIFI模块存在距离限制,当超过一定距离,小程序与硬件端无法联通;(2)服务器与WIFI模块始终存在网速差异,数据无法及时发送到服务器,或者小程序数据无法及时发送到硬件端,会有一定冲突情况存在。

6.2 展望

智能闹钟已经按照最初设计想法设计成功,并且通过系统功能测试,智能闹钟已经实现闹钟按时响铃,闹钟时间上传小程序,摇杆控制闹钟时间,小程序控制命令等功能,模块之间用杜邦线进行连接,面包板为底座,本文设计的智能闹钟可以进一步优化为产品,优化外观以及将模块在硬件上焊接在一起,不过软件结构上仍有不足,希望在今后学习中继续跟进继续优化代码。

主要展望在于用更好的通信技术替换WIFI技术,让其网络连接更加稳定,同时连接范围更为广泛。

总的来说,设计该智能闹钟是一项具有挑战性的工作,其中充满了各种困难和障碍。本文在其中取得了一定的成果。在未来的研究中,将继续努力提升自身代码能力与技术水平,与同行共同合作,共同攻克编译程序领域的难题,为推动行业的发展做出更大的贡献。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值