智能家居app排名(智能家居软件app下载)越早知道越好
信息来源:互联网 发布时间:2023-11-28
点击关注+星标与非网eefocus,可获取20份行业报告、产业研究合集。扫码加入电子行业社群讨论设计的目的大
点击关注+星标与非网eefocus,可获取20份行业报告、产业研究合集。扫码加入电子行业社群讨论
设计的目的大部分家用电器开关仍旧是传统的机械式按键开关,原因是传统式的电器开关开发周期短,制作成本低,方案成熟,但是传统的遥控家电开关已经不能满足人们对家电控制的要求,传统的遥控器具有单一性, 每种遥控器只能控制一种家用电器,随着家用电器的逐步增加,使得众多的遥控器很难去分辨。
随着科学技术的快速发展,人们对生活品质的要求也不断提高,开始追求更好的生活方式因此,为了适应物质生活的需求,智能家居小助手系统应运而生例如:回到家时,饭已煮好,房间温度合适,热水器中的水也已经加热,既舒服又方便。
另外,用户还能随时改变家用电器的工作状态,既节能又安全智能家居( Smart Home)小助手系统是以家为平台,兼备建筑、自动化,智能化于一体的高效、舒适、安全、便利的家居环境采用智能手机APP、网页、小程序等进行家电的控制具有夸时代的进步,因为通过WiFi的方式不再受到遥控器型号的限制,传统的家用电器开关需要匹配的遥控器才能进行有效的操作,当有了WiFi技术,操作的便利性得到很大的提高。
简介STM32单片机设计的智能家居小助手,结合单片机的外围电路实现对整个系统的控制,报警电路由蜂鸣器组成,单片机显示部分采用OLED显示可以通过查看OLED或者按键设置温湿度、光照强度的阀值,利用通过STM32单片机采集温湿度、光照强度、雨滴模块等的数据通过连接WIFI使用ESP8266模块发送数据到服务端,然后通过网页、小程序、APP来显示和修改数据,从而可以相互通信。
而且我们只需要增加或者减小在核心板的传感器,从而测量环境中的数据。设计思路
采用STM32单片机作为主控芯片,ESP8266 WIFI 模块作为无线接收和发射模块,利用手机 APP 、网页、小程序对家用电器进行控制研究手机终端作为信号的发出源,通过连接WIFI 信号,利用相应的控制软件以 WIFI 网络信号为载体发送相关数据信号,WiFi 模块主要的任务就是作为一个载体,将终端发送来的信号传递给单片机,以单片机为中心的控制模块就实时完成数据的处理,CPU处理之后将会输出相应的电平控制继电器,来实灯光的亮灭等一系列智能家居的功能。
硬件电路模块:STC89C52、DHT11(温湿度模块)、BH1750(光照强度模块)、蜂鸣器、LED、ESP8266、步进电机、土壤湿度模块等等软件设计:APP、小程序、网页(1)单片机采集数据,可以通过OLED的UI菜单可以显示对应的数据。
(2)单片机通过串口发送数据给ESP8266,然后ESP8266通过WIFI发送数据到MQTT服务端(3)通过查看OLED,可以通过按键设置温湿度、光照强度、土壤湿度等每一个模块对应的阀值,从而更好的控制。
(4)通过小程序、APP、网页,可以控制LED、风扇等设备。(5)系统设计完成3路家电开关的开启与关闭控制,相互之间不能有干扰。(6)显示时间,这样方便实用。
硬件设备
软件小程序
设计流程硬件首先通过STM32主控器读取温湿度及光照模块的具体数值,然后通过计算转为实际单位数值;将得到的具体环境数值通过ESP8266-wifi模块发送至远程服务器端,在通过前端显示出来前端的显示目前由微信小程序实现。
蜂鸣器作为环境报警响应,有被动式及主动式被动式因环境参数超过预定标准触发主动式可通过实体按键或小程序进行通断LED作为日光灯功能,有自动式及主动式自动式通过判断环境亮度自行触发主动式可通过实体按键或小程序进行灯的通断。
软件小程序设计小程序使用 MPVUE 构架开发,使用开发工具:VSCODE+微信开发工具。
基础使用1.安装全局vue-clinpm install --global vue-cli@2.92.创建一个mpvue-quickstart模板的新项目vue init mpvue/mpvue-quickstart project
3.安装依赖cd projectnpm installnpm run dev成功后可以看到以下文件夹:
主要介绍src目录和static 目录 ,static 目录主要放静态文件。src目录下有:
pages 主要用于写view ,compontents 写template,utils写public jspages下边写view ,一般的文件结构都是类似 index.vue main.js main.json 这样的三个文件,
index.vue 写我们的vue文件,mpvue 支持大多数的vue语法,例如具体支持什么不支持什么:http://mpvue.com/mpvue/#_9 请传送致官网main.js :暴露index.vue 文件
main.json 写配置文件
使用微信api1.首先导出wx
然后在需要的页面使用
main.js
接下来是indx.vue 文件
wx.getLocation是获取当前的地理位置、速度。整个index.vue文件如下
查看天气
服务器设计我们使用自己的云服务器安装开源的EMQ服务器,通过EMQ,我们可以通过MQTT可以让8266和小程序、网页和APP结合。EMQ服务器可以实现高并发,多用户在线访问,也不会网络出现问题。
EMQ下载下载地址:https://www.emqx.io/downloads#broker下载界面如下图所示:
我们此处选择了开原版版本号为:v4.2.11系统和软件:Linux/centos7/zip下载后的文件为: emqx-centos7-4.2.11-x86_64.zip具体命令如下:unzip emqx-centos7。
-4.2.11-x86_64.zipemqttd目录结构如下图所示:
bin目录结构如下图所示:
启动EMQ服务器具体命令如下:./emqttd start该命令在bin目录下启动状态查询确认具体命令如下:./emqttd_ctl status该命令在bin目录下访问地址:http://39.97.125.79:18083。
这里的IP地址,是我本地虚拟机中CentOS系统的IP地址,服务器部署在那台主机上,应该把IP地址换成对应主机的真实地址。访问后会出现登陆界面,如下图所示:
输入用户名和密码,尝试是否能正常登陆。用户名:admin密码:public登陆后如果出现下图的界面,则表示EMQ服务器已正常运行。
MQTT服务器安装完成,MQTT使用EMQX,STM32通过WIFI模块把数据上传MQTT服务器,然后小程序订阅STM32设备的主题,就可以获取STM32设备的数据,同样STM32可以订阅小程序的主题Code
STM32main.c#include"led.h"#include"key.h"#include"beep.h"#include"delay.h"#include"sys.h"#include"timer.h"
#include"usart.h"#include"dht11.h"#include"bh1750.h"#include"oled.h"#include"exti.h"#include"stdio.h"
u8 alarmFlag = 0;//是否报警的标志u8 alarm_is_free = 10;//报警器是否被手动操作,如果被手动操作即设置为0u8 humidityH; //湿度整数部分u8 humidityL;
//湿度小数部分u8 temperatureH; //温度整数部分u8 temperatureL; //温度小数部分externchar oledBuf[20];float Light = 0;
//光照度u8 Led_Status = 0;char PUB_BUF[256];//上传数据的bufconstchar *devSubTopic[] = {"/mysmarthome/sub"};const
char devPubTopic[] = "/mysmarthome/pub";intmain(void){ unsignedshort timeCount = 0; //发送间隔变量 delay_init();
//延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 LED_Init();
//初始化与LED连接的硬件接口 KEY_Init(); //初始化与按键连接的硬件接口 EXTIX_Init(); //外部中断初始化 BEEP_Init();
DHT11_Init(); BH1750_Init(); Usart1_Init(115200);//debug串口 Usart2_Init(115200);//stm32-8266通讯串口
OLED_Init(); OLED_ColorTurn(0);//0正常显示,1 反色显示 OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示 OLED_Clear();
TIM2_Int_Init(4999,7199); TIM3_Int_Init(2499,7199); UsartPrintf(USART_DEBUG, " Hardware init OK\r\n"
); BEEP = 0;//鸣叫提示接入成功 delay_ms(250); BEEP = 1;while(1) {if(timeCount % 40 == 0)//1000ms / 25 = 40 一秒执行一次
{/********** 温湿度传感器获取数据**************/ DHT11_Read_Data(&humidityH,&humidityL,&temperatureH,&temperatureL);
UsartPrintf(USART_DEBUG,"温度:%d.%d 湿度:%d.%d",humidityH,humidityL,temperatureH,temperatureL);
/********** 光照度传感器获取数据**************/if (!i2c_CheckDevice(BH1750_Addr)) { Light = LIght_Intensity();
UsartPrintf(USART_DEBUG,"当前光照度为:%.1f lx\r\n", Light); }if(alarm_is_free ==
10)//报警器控制权是否空闲 alarm_is_free == 10 初始值为10 {if((humidityH < 80) && (temperatureH < 30) && (Light <
1000))alarmFlag = 0;else alarmFlag = 1; }if(alarm_is_free < 10)alarm_is_free++; }if
(++timeCount >= 200) // 5000ms / 25 = 200 发送间隔5000ms { Led_Status = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4);
//读取LED0的状态 UsartPrintf(USART_DEBUG, "OneNet_Publish\r\n");sprintf(PUB_BUF,"{\"Hum\":%d.%d,\"Temp\":%d.%d,\"Light\":%.1f,\"Lique\":1200,\"Natu\":1400,\"Smoke\":1250,\"Led\":%d,\"Beep\":%d}"
, humidityH,humidityL,temperatureH,temperatureL,Light,Led_Status?0:1,alarmFlag); UsartPrintf(USART2,PUB_BUF);
timeCount = 0; } delay_ms(10); }}bh1750.c#include"bh1750.h"#include"sys.h"
/* 应用说明: 在访问I2C设备前,请先调用 i2c_CheckDevice() 检测I2C设备是否正常,该函数会配置GPIO*/staticvoidI2C_BH1750_GPIOConfig
(void);/**********************************************************************************************************
* 函 数 名: i2c_Delay* 功能说明: I2C总线位延迟,最快400KHz* 形 参:无* 返 回 值: 无*********************************************************************************************************
*/staticvoidi2c_Delay(void){uint8_t i;/* 下面的时间是通过逻辑分析仪测试得到的 工作条件:CPU主频72MHz ,MDK编译环境,1级优化。
循环次数为10时,SCL频率 = 205KHz 循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us 循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us
*/for (i = 0; i < 10; i++);}/**********************************************************************************************************
* 函 数 名: i2c_Start* 功能说明: CPU发起I2C总线启动信号* 形 参:无* 返 回 值: 无*********************************************************************************************************
*/voidi2c_Start(void){/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */ BH1750_I2C_SDA_1(); BH1750_I2C_SCL_1();
i2c_Delay(); BH1750_I2C_SDA_0(); i2c_Delay(); BH1750_I2C_SCL_0(); i2c_Delay();}/**********************************************************************************************************
* 函 数 名: i2c_Start* 功能说明: CPU发起I2C总线停止信号* 形 参:无* 返 回 值: 无*********************************************************************************************************
*/voidi2c_Stop(void){/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */ BH1750_I2C_SDA_0(); BH1750_I2C_SCL_1();
i2c_Delay(); BH1750_I2C_SDA_1();}/**********************************************************************************************************
* 函 数 名: i2c_SendByte* 功能说明: CPU向I2C总线设备发送8bit数据* 形 参:_ucByte : 等待发送的字节* 返 回 值: 无*********************************************************************************************************
*/voidi2c_SendByte(uint8_t _ucByte){uint8_t i;/* 先发送字节的高位bit7 */for (i = 0; i < 8; i++) { if
(_ucByte & 0x80) { BH1750_I2C_SDA_1(); }else { BH1750_I2C_SDA_0();
} i2c_Delay(); BH1750_I2C_SCL_1(); i2c_Delay(); BH1750_I2C_SCL_0();
if (i == 7) { BH1750_I2C_SDA_1(); // 释放总线 } _ucByte <<= 1; /* 左移一个bit */
i2c_Delay(); }}/**********************************************************************************************************
* 函 数 名: i2c_ReadByte* 功能说明: CPU从I2C总线设备读取8bit数据* 形 参:无* 返 回 值: 读到的数据*********************************************************************************************************
*/uint8_ti2c_ReadByte(void){uint8_t i;uint8_t value;/* 读到第1个bit为数据的bit7 */ value = 0;for (i = 0; i <
8; i++) { value <<= 1; BH1750_I2C_SCL_1(); i2c_Delay();if (BH1750_I2C_SDA_READ())
{ value++; } BH1750_I2C_SCL_0(); i2c_Delay(); }return value;
}/**********************************************************************************************************
* 函 数 名: i2c_WaitAck* 功能说明: CPU产生一个时钟,并读取器件的ACK应答信号* 形 参:无* 返 回 值: 返回0表示正确应答,1表示无器件响应*********************************************************************************************************
*/uint8_ti2c_WaitAck(void){uint8_t re; BH1750_I2C_SDA_1(); /* CPU释放SDA总线 */ i2c_Delay(); BH1750_I2C_SCL_1();
/* CPU驱动SCL = 1, 此时器件会返回ACK应答 */ i2c_Delay();if (BH1750_I2C_SDA_READ()) /* CPU读取SDA口线状态 */ re =
1;else re = 0; BH1750_I2C_SCL_0(); i2c_Delay();return re;}/**********************************************************************************************************
* 函 数 名: i2c_Ack* 功能说明: CPU产生一个ACK信号* 形 参:无* 返 回 值: 无*********************************************************************************************************
*/voidi2c_Ack(void){ BH1750_I2C_SDA_0(); /* CPU驱动SDA = 0 */ i2c_Delay(); BH1750_I2C_SCL_1();
/* CPU产生1个时钟 */ i2c_Delay(); BH1750_I2C_SCL_0(); i2c_Delay(); BH1750_I2C_SDA_1(); /* CPU释放SDA总线 */
}/**********************************************************************************************************
* 函 数 名: i2c_NAck* 功能说明: CPU产生1个NACK信号* 形 参:无* 返 回 值: 无*********************************************************************************************************
*/voidi2c_NAck(void){ BH1750_I2C_SDA_1(); /* CPU驱动SDA = 1 */ i2c_Delay(); BH1750_I2C_SCL_1();
/* CPU产生1个时钟 */ i2c_Delay(); BH1750_I2C_SCL_0(); i2c_Delay(); }/**********************************************************************************************************
* 函 数 名: I2C_BH1750_GPIOConfig* 功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现* 形 参:无* 返 回 值: 无*********************************************************************************************************
*/staticvoidI2C_BH1750_GPIOConfig(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(BH1750_RCC_I2C_PORT, ENABLE);
/* 打开GPIO时钟 */ GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SCL_PIN | BH1750_I2C_SDA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /* 开漏输出 */ GPIO_Init(BH1750_GPIO_PORT_I2C, &GPIO_InitStructure);
/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */ i2c_Stop();}/**********************************************************************************************************
* 函 数 名: i2c_CheckDevice* 功能说明: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在* 形 参:_Address:设备的I2C总线地址
* 返 回 值: 返回值 0 表示正确, 返回1表示未探测到*********************************************************************************************************
*/uint8_ti2c_CheckDevice(uint8_t _Address){uint8_t ucAck; i2c_Start(); /* 发送启动信号 *//* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */
i2c_SendByte(_Address | BH1750_I2C_WR); ucAck = i2c_WaitAck(); /* 检测设备的ACK应答 */ i2c_Stop();
/* 发送停止信号 */return ucAck;}//BH1750写一个字节//返回值 成功:0 失败:非0 uint8_tBH1750_Byte_Write(uint8_t data)
{ i2c_Start();//发送写地址 i2c_SendByte(BH1750_Addr|0);if(i2c_WaitAck()==1)return1;//发送控制命令 i2c_SendByte(data);
if(i2c_WaitAck()==1)return2; i2c_Stop();return0;}//BH1750读取测量数据//返回值 成功:返回光照强度 失败:返回0uint16_tBH1750_Read_Measure
(void){uint16_t receive_data=0; i2c_Start();//发送读地址 i2c_SendByte(BH1750_Addr|1);if(i2c_WaitAck()==
1)return0;//读取高八位 receive_data=i2c_ReadByte(); i2c_Ack();//读取低八位 receive_data=(receive_data<<
8)+i2c_ReadByte(); i2c_NAck(); i2c_Stop();return receive_data; //返回读取到的数据}//BH1750s上电voidBH1750_Power_ON
(void){ BH1750_Byte_Write(POWER_ON);}//BH1750s断电voidBH1750_Power_OFF(void){ BH1750_Byte_Write(POWER_OFF);
}//BH1750复位 仅在上电时有效voidBH1750_RESET(void){ BH1750_Byte_Write(MODULE_RESET);}//BH1750初始化voidBH1750_Init
(void){ I2C_BH1750_GPIOConfig(); /* 配置GPIO */ BH1750_Power_ON(); //BH1750s上电//BH1750_RESET(); //BH1750复位
BH1750_Byte_Write(Measure_Mode);//SysTick_Delay_ms(120);}//获取光照强度floatLIght_Intensity(void){return
(float)(BH1750_Read_Measure()/1.1f*Resolurtion);}WIFI-ES8266 code···#include#include
#include// change next line to use with another board/shield#include//#include // for WiFi shield
//#include // for WiFi 101 shield or MKR1000#includeWiFiUDP ntpUDP;// You can specify the time server pool and the offset (in seconds, can be
// changed later with setTimeOffset() ). Additionaly you can specify the// update interval (in milliseconds, can be changed using setUpdateInterval() ).
NTPClient timeClient(ntpUDP,"ntp1.aliyun.com",60*60*8,30*60*1000);WiFiClient espClient;PubSubClient client
(espClient);constchar* wifissid = "iPhone xr"; //改成自己家wificonstchar* password = "qwertyuiop"; //改成自己家wifi
constchar* mqtt_server = "wusiyuan.top";constchar* mqtt_id = "LYY_ESP"; //改成自己的QQ号+_ESP// 订阅主题
constchar* Mqtt_sub_topic = "mysmarthome/sub1"; //订阅主题// 传感器发送的数据constchar* Mqtt_pub_topic =
"mysmarthome/pub1"; //上报消息给手机APP的TOPIC long lastMsg = 0; //定时用的String comdata = "";voidsetup(){ pinMode(
2, OUTPUT); Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback);
}voidsetup_wifi(){ WiFi.begin(wifissid, password);while (WiFi.status() != WL_CONNECTED) { delay(500
); }}voidcallback(char* topic, byte* payload, unsignedint length){ String msg=""; String LED_set =
""; String BEEP_set = "";for (int i = 0; i < length; i++) { msg+= (char)payload[i]; } Serial.println(msg);
}voidreconnect(){while (!client.connected()) {if (client.connect(mqtt_id)) { client.subscribe(Mqtt_sub_topic,
1); } else { delay(5000); } }}voidloop(){if (!client.connected()) { reconnect(); } client.loop();
long now = millis();if (now - lastMsg > 100) { lastMsg = now;char serialRead;while (Serial.available())
{ comdata += char(Serial.read()); delay(2); }if (comdata.length() > 0) { String json = comdata;
client.publish(Mqtt_pub_topic,json.c_str()); comdata = ""; } }}小程序Code
设备一 {{area}}-{{city}}





2021
;const mqttUrl = wxs://wusiyuan.top:8084/mqtt;exportdefault { data() {return { client: {}, Temp:
0, //温度 Hum: 0, //湿度 Light: 0, //光照 Lique:0, //有毒气体 Natu:0, //天然气 Smoke:
0, //烟雾 Led: false, //LED状态 Beep: false, area: "请求中", //城区 city: "请求中", //城市 airText:
"请求中", //空气优良 airValue: 0, //空气指数 weather: "请求中", //天气 weatherAdvice: "请求中"//天气建议 };
}, components: {}, methods: { onLedChange(event) { var that = this; console.log(event.mp.detail);
let sw = event.mp.detail.value; that.Led = sw;if (sw) { that.client.publish("mysmarthome/sub"
,A, function(err) {if (!err) { console.log("成功下发命令——开灯"); } }
); } else { that.client.publish("mysmarthome/sub",B, function(err) {if (!err) {
console.log("成功下发命令——关灯"); } } ); } }, onBeepChange(event) {
var that = this; console.log(event.mp.detail); let sw = event.mp.detail.value; that.Beep = sw;
if (sw) { that.client.publish("mysmarthome/sub",C, function(err) {if (!err) { console.
log("成功下发命令——打开报警器"); } } ); } else { that.client.publish("mysmarthome/sub"
,D, function(err) {if (!err) { console.log("成功下发命令——关闭报警器"); } }
); } } },// created() {// // let app = getApp()// }, onShow() { var that = this
; that.client = connect(mqttUrl); that.client.on("connect", function() { console.log("成功连接mqtt服务器!"
); that.client.subscribe("mysmarthome/pub", function(err) {if (!err) { console.log("成功订阅设备上行数据Topic!"
); } }); }); that.client.on("message", function(topic, message) { console.log(topic);
// message是16进制的Buffer字节流 let dataFromDev = {}; dataFromDev = JSON.parse(message); console.
log(dataFromDev); that.Temp = dataFromDev.Temp; that.Hum = dataFromDev.Hum; that.Light = dataFromDev.Light;
that.Led = dataFromDev.Led; that.Beep = dataFromDev.Beep; that.Lique = dataFromDev.Lique;
that.Natu = dataFromDev.Natu; that.Smoke = dataFromDev.Smoke; }); wx.getLocation({ type:
"wgs84", success(res) {const latitude = res.latitude;const longitude = res.longitude;const key =
"f7c21a960b0e47d1a97c13a91f7799c6";// console.log("LYY"); wx.request({ url: `https://free-api.heweather.net/s6/weather/now?location=${longitude},${latitude}&key=${key}`, //获取天气数据的api接口地址
success(res) {//console.log(res.data);const { basic, now } = res.data.HeWeather6[0]; console.
log(basic);// console.log(now); that.area = basic.admin_area; that.city = basic.parent_city;
that.weather = now.cond_txt; wx.request({ url: `https://free-api.heweather.net/s6/air/now?location=${that.city}&key=${key}`, //获取空气数据的api接口地址
success(res) {// console.log(res.data);const { air_now_city } = res.data.HeWeather6[0];
// console.log(air_now_city);const { aqi, qlty } = air_now_city; that.airText = qlty; that.airValue = aqi;
} }); } }); wx.request({ url: `https://free-api.heweather.net/s6/weather/lifestyle?location=${longitude},${latitude}&key=${key}`, //获取空气数据的api接口地址
success(res) { console.log(res.data);const { lifestyle} = res.data.HeWeather6[0];
console.log(lifestyle) that.weatherAdvice = lifestyle[1].txt } });
} }); }};.wrapper { padding: 15px; .header-wrapper { background-color: #
3d7ef9; border-radius: 20px; color: #fff; box-shadow: #d6d6d6 0px 0px 5px; padding: 15px
30px; .header-title { display: flex; justify-content: space-between; } .header-text {
font-size: 32px; font-weight: 400; display: flex; justify-content: space-between;
} .weather-advice { margin-top: 20px; font-size: 12px; } } .copyright-wrapper {
display: flex; justify-content: center; .copyright { color: #d6d6d6; position: fixed;
bottom: 50px; } } .data-wrapper { margin-top: 20px; display: flex; justify-content: space-between;
.data { background-color: #fff; width: 150px; height: 80px; border-radius: 20
px; display: flex; justify-content: space-around; padding: 08px; box-shadow: #d6d6d6
0px 0px 5px; .data-logo { height: 36px; width: 36px; margin-top: 15px; }
.data-text { margin-top: 15px; color: #7f7f7f; .data-title { text-align: right;
} .data-value { font-size: 26px; } } } }}
↑火爆课程,限时优惠券!
免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186

