基于EPS32C3电脑远程开机模块设计
基于EPS32C3电脑远程开机模块设计
前言
缘起,手头资料太多了,所以想组一台NAS放在家里存储数据。在咸鱼淘了一套J3160主板加机箱,加上几块硬盘组建NAS。
对于NAS,我的需求是不用的时候关机(节省功耗),要用的时候开机。
网上的开机棒太贵了,也不够安全。
还不如自己制作一个,趁暑假期间(没去实习好亏),刚好手头有一些之前本科毕设用剩下的ESP32C3模块。加上继电器就可以实现远程开机了。
云平台选择腾讯的物联开发平台。无他-因为有ESP32官方例程。
工程修改自乐鑫官方的
Smart Light 使用 ESP32、ESP32S2 配合 腾讯连连小程序 演示了一个智能灯控制方案。
所以这里就不展示其配置过程了,详细内容见Smart Light的README。
接线原理图
IO2–IN
COM–BN
NO–PowerSW
DC±-3V3
DC–GND。

代码
short_switch就是短按。短按开机。
long_switch就是长按。长按强制关机。
GPIO初始化
继电器控制的引脚初始化。对于IO2。
esp_err_t lgpio_init()
{//zero-initialize the config structure.gpio_config_t io_conf = {};//disable interruptio_conf.intr_type = GPIO_INTR_DISABLE;//set as output modeio_conf.mode = GPIO_MODE_OUTPUT;//bit mask of the pins that you want to set,e.g.GPIO18/19io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;//disable pull-down modeio_conf.pull_down_en = 0;//disable pull-up modeio_conf.pull_up_en = 0;//configure GPIO with the given settingsgpio_config(&io_conf);return gpio_set_level(GPIO_OUTPUT_IO_0,1);
}
app_main.c初始化
static esp_err_t example_driver_init(void)
{lightbulb_config_t config = {//1. Select and configure the chip
#ifdef CONFIG_LIGHTBULB_DEMO_DRIVER_SELECT_WS2812.type = DRIVER_WS2812,.driver_conf.ws2812.led_num = CONFIG_WS2812_LED_NUM,.driver_conf.ws2812.ctrl_io = CONFIG_WS2812_LED_GPIO,
#endif
#ifdef CONFIG_LIGHTBULB_DEMO_DRIVER_SELECT_PWM.type = DRIVER_ESP_PWM,.driver_conf.pwm.freq_hz = CONFIG_PWM_FREQ_HZ,
#ifdef CONFIG_IDF_TARGET_ESP32C2/* Adapt to ESP8684-DevKitM-1 * For details, please refer to: * https://docs.espressif.com/projects/espressif-esp-dev-kits/zh_CN/latest/esp8684/esp8684-devkitm-1/user_guide.html*/.driver_conf.pwm.invert_level = true,
#endif
#endif
#ifdef CONFIG_LIGHTBULB_DEMO_DRIVER_SELECT_SM2135E.type = DRIVER_SM2135E,.driver_conf.sm2135e.freq_khz = 400,.driver_conf.sm2135e.enable_iic_queue = true,.driver_conf.sm2135e.iic_clk = CONFIG_SM2135E_IIC_CLK_GPIO,.driver_conf.sm2135e.iic_sda = CONFIG_SM2135E_IIC_SDA_GPIO,.driver_conf.sm2135e.rgb_current = SM2135E_RGB_CURRENT_20MA,.driver_conf.sm2135e.wy_current = SM2135E_WY_CURRENT_40MA,
#endif// 2. Configure the drive capability.capability.enable_fades = true,.capability.fades_ms = 800,.capability.enable_status_storage = false,.capability.mode_mask = COLOR_MODE,.capability.storage_cb = NULL,//3. Configure driver io
#ifdef CONFIG_LIGHTBULB_DEMO_DRIVER_SELECT_PWM.io_conf.pwm_io.red = CONFIG_PWM_RED_GPIO,.io_conf.pwm_io.green = CONFIG_PWM_GREEN_GPIO,.io_conf.pwm_io.blue = CONFIG_PWM_BLUE_GPIO,
#endif
#ifdef CONFIG_LIGHTBULB_DEMO_DRIVER_SELECT_SM2135E.io_conf.iic_io.red = OUT3,.io_conf.iic_io.green = OUT2,.io_conf.iic_io.blue = OUT1,.io_conf.iic_io.cold_white = OUT5,.io_conf.iic_io.warm_yellow = OUT4,
#endif//4. Limit param.external_limit = NULL,//5. Gamma param.gamma_conf = NULL,//6. Init param.init_status.mode = WORK_COLOR,.init_status.on = false,.init_status.short_on = false,.init_status.long_on = false,.init_status.hue = 0,.init_status.saturation = 100,.init_status.value = 100,};return lightbulb_init(&config);
}
控制继电器开闭
简单的控制继电器的操作,通过输出引脚低电平控制继电器闭合。
esp_err_t lightbulb_set_short_switch(bool status)
{esp_err_t err = ESP_OK;LIGHTBULB_MUTEX_TAKE(portMAX_DELAY);s_lb_obj->status.short_on = status;if (status == true){gpio_set_level(GPIO_OUTPUT_IO_0,0);vTaskDelay(1500 / portTICK_RATE_MS);gpio_set_level(GPIO_OUTPUT_IO_0,1);s_lb_obj->status.short_on = !status;}LIGHTBULB_MUTEX_GIVE();return err;
}esp_err_t lightbulb_set_long_switch(bool status)
{esp_err_t err = ESP_OK;LIGHTBULB_MUTEX_TAKE(portMAX_DELAY);s_lb_obj->status.short_on = status;if (status == true){gpio_set_level(GPIO_OUTPUT_IO_0,0);vTaskDelay(15000 / portTICK_RATE_MS);gpio_set_level(GPIO_OUTPUT_IO_0,1);s_lb_obj->status.short_on = !status;}LIGHTBULB_MUTEX_GIVE();return err;
}
获取腾讯云指令按钮的值
bool lightbulb_get_short_switch(void)
{LIGHTBULB_CHECK(s_lb_obj, "not init", return ESP_ERR_INVALID_ARG);LIGHTBULB_MUTEX_TAKE(portMAX_DELAY);bool result = s_lb_obj->status.short_on;LIGHTBULB_MUTEX_GIVE();return result;
}bool lightbulb_get_long_switch(void)
{LIGHTBULB_CHECK(s_lb_obj, "not init", return ESP_ERR_INVALID_ARG);LIGHTBULB_MUTEX_TAKE(portMAX_DELAY);bool result = s_lb_obj->status.long_on;LIGHTBULB_MUTEX_GIVE();return result;
}
任务切换逻辑
-
获取腾讯云参数后进入相应的函数。
-
设置继电器引脚–控制继电器通。
-
设置继电器引脚–控制继电器断。
-
更新按钮的状态。
-
将值写回参数上传回腾讯云。
/* Callback to handle commands received from the QCloud cloud */
static esp_err_t light_get_param(const char *id, esp_qcloud_param_val_t *val)
{if (!strcmp(id, "power_switch")) {val->b = lightbulb_get_switch();} else if (!strcmp(id, "value")) {val->i = lightbulb_get_value();} else if (!strcmp(id, "hue")) {val->i = lightbulb_get_hue();} else if (!strcmp(id, "saturation")) {val->i = lightbulb_get_saturation();} else if (!strcmp(id, "comp_switch_s")) {val->b = lightbulb_get_short_switch();} else if (!strcmp(id, "comp_switch_l")) {val->b = lightbulb_get_long_switch();}ESP_LOGI(TAG, "Report id: %s, val: %d", id, val->i);return ESP_OK;
}/* Callback to handle commands received from the QCloud cloud */
static esp_err_t light_set_param(const char *id, const esp_qcloud_param_val_t *val)
{esp_err_t err = ESP_FAIL;ESP_LOGI(TAG, "Received id: %s, val: %d", id, val->i);if (!strcmp(id, "power_switch")) {err = lightbulb_set_switch(val->b);} else if (!strcmp(id, "value")) {err = lightbulb_set_value(val->i);} else if (!strcmp(id, "hue")) {err = lightbulb_set_hue(val->i);} else if (!strcmp(id, "saturation")) {err = lightbulb_set_saturation(val->i);} else if (!strcmp(id, "comp_switch_s")) {err = lightbulb_set_short_switch(val->b);} else if (!strcmp(id, "comp_switch_l")) {err = lightbulb_set_long_switch(val->b);} else {ESP_LOGW(TAG, "This parameter is not supported");}/* Report driver changes to the cloud side */esp_qcloud_iothub_report_all_property();return err;
}
腾讯云三元组配置

安装云平台的内容一一对应填入。

更改数据模板
添加数据模板
{"version": "1.0","profile": {"ProductId": "65BEMES9XM","CategoryId": "141"},"properties": [{"id": "power_switch","name": "电灯开关","desc": "控制电灯开灭","required": true,"mode": "rw","define": {"type": "bool","mapping": {"0": "关","1": "开"}}}, {"id": "comp_switch_s","name": "电脑开关点按","desc": "电脑开关机点按","required": true,"mode": "rw","define": {"type": "bool","mapping": {"0": "关","1": "开"}}},{"id": "comp_switch_l","name": "电脑开关长按","desc": "电脑开关机长按","required": true,"mode": "rw","define": {"type": "bool","mapping": {"0": "关","1": "开"}}},{"id": "saturation","name": "饱和度","desc": "","mode": "rw","define": {"type": "int","min": "0","max": "100","start": "0","step": "1","unit": ""},"required": false}, {"id": "value","name": "明度","desc": "","mode": "rw","define": {"type": "int","min": "0","max": "100","start": "0","step": "1","unit": ""},"required": false}, {"id": "hue","name": "色调","desc": "","mode": "rw","define": {"type": "int","min": "0","max": "360","start": "0","step": "1","unit": ""},"required": false}],"events": [{"id": "hardware_fault","name": "Hardware_fault","desc": "Report hardware fault","type": "fault","required": false,"params": [{"id": "name","name": "Name","desc": "Name like: memory,tf card, censors ...","define": {"type": "string","min": "0","max": "64"}}, {"id": "error_code","name": "Error_Code","desc": "Error code for fault","define": {"type": "int","unit": "","step": "1","min": "0","max": "2000","start": "1"}}]}],"actions": []
}
使用方法
登录腾讯云-物联开发平台
公共实例
设备管理

点击设备的查看界面
进入在线调试
下发指令。
远程开机。
愉快的使用吧。


工程地址
longchentian/ESP32-Remote-PC-Power-On-via-Tencent-Cloud: ESP32-Remote-PC-Power-On-via-Tencent-Cloud:esp32远程电脑开机(基于腾讯云) (github.com)
基于EPS32C3电脑远程开机模块设计资源-CSDN文库
后记
没时间折腾,直接更改EPS32的官方例程。
仅仅添加了几行代码实现了想要的工程。
原理很简单,代码写得也很简陋,仅供参考。
等有空了(大概率没空),后续添加电脑状态识别(Power LED+和Power LED-),接入引脚读取电平。
有闲置电脑的同学可以折腾起来,实现NAS远程开机、电脑远程开机、服务器远程开机。
相关文章:
基于EPS32C3电脑远程开机模块设计
基于EPS32C3电脑远程开机模块设计 前言 缘起,手头资料太多了,所以想组一台NAS放在家里存储数据。在咸鱼淘了一套J3160主板加机箱,加上几块硬盘组建NAS。 对于NAS,我的需求是不用的时候关机(节省功耗),要用的时候开机…...
深度解析 Netty 性能卓越的背后原因
一、引言 在当今数字化时代,构建高性能、高可靠的网络应用成为了技术领域的关键需求。Netty 作为一款备受推崇的网络应用框架,以其出色的性能在众多框架中脱颖而出。深入探究 Netty 性能卓越的原因,不仅能够帮助开发者更好地理解和运用这一框…...
虚幻引擎(Unreal Engine)技术使得《黑神话悟空传》大火,现在重视C++的开始吃香了,JAVA,Go,Unity都不能和C++相媲美!
虚幻引擎(Unreal Engine)火了黑神话游戏。 往后,会有大批量的公司开始模仿这个赛道! C 的虚拟引擎技术通常指的是使用 C 语言开发的游戏引擎,如虚幻引擎(Unreal Engine)等。以下是对 C 虚拟引…...
华为-2022-测试面试题
文章目录 一、源数组a,将a中所有元素乘以2之后组成一个新数组,则这个新数组就叫双倍数组,给你一个数组a,判断它是不是双倍数组,如果是则输出源数组,不是则输出空数组。二、如果想把一个文件移动到另一个文件…...
Linux-(系统启动、用户管理)
目录 前言 关机&重启命令 基本介绍 注意细节 用户登录和注销 注意: 用户管理 基本介绍 添加用户 指定/修改密码 删除用户 查询用户信息 切换用户 查看当前用户登录用户 用户组 新增组 删除组 查看所有组 修改用户所属组 创建用户时指定用户…...
机器学习:opencv--图像形态学
目录 前言 一、常用形态学操作 二、腐蚀和膨胀 1.图像腐蚀 2.图形膨胀 三、开运算和闭运算 1.开运算 2.闭运算 四、顶帽和黑帽 1.顶帽 2.黑帽 五、梯度运算 总结 前言 图像形态学是一种用于处理和分析图像形状和结构的技术。 一、常用形态学操作 膨胀(…...
网络基础入门指南(一)
前言 在这个高度互联的世界里,互联网已成为日常生活不可或缺的一部分。然而,对于许多人来说,网络是如何工作的仍然是个谜。本文旨在为那些对网络基础知识感兴趣的朋友提供一个简单的介绍,帮助大家更好地理解互联网的基本原理和技…...
【项目】云备份
云备份 云备份概述框架 功能演示服务端客户端 公共模块文件操作模块目录操作模块 服务端模块功能划分功能细分模块数据管理热点管理 客户端模块功能划分功能细分模块数据管理目录检查文件备份 云备份 概述 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中。…...
WebGL系列教程二(环境搭建及初始化Shader)
目录 1 前言2 新建html页面3 着色器介绍3.1 顶点着色器、片元着色器与光栅化的概念3.2 声明顶点着色器3.3 声明片元着色器 4 坐标系(右手系)介绍5 着色器初始化5.1 给一个画布canvas5.2 获取WebGL对象5.3 创建着色器对象5.4 获取着色器对象的源5.5 绑定着色器的源5.6 编译着色器…...
keepalive和nginx高可用集群
keepalived 和 nginx 高可用集群搭建 主备模式 zyj86主机和zyj87主机安装nginx和keepalived yum install nginx keepalived -y systemctl enable --now nginx.service keepalived.service主调度器配置 编辑zyj86主机(主)配置文件 vi /etc/keepalived…...
二分查找题总结
二分查找题总结 hot100搜索插入位置搜索二维矩阵在排序数组中查找元素的第一个和最后一个位置搜索旋转排序数组寻找旋转排序数组中的最小值寻找两个正序数组的中位数 hot100 搜索插入位置 题目链接: 35.搜索插入位置 代码: class Solution {public in…...
仕考网:公务员面试流程介绍
通知进面信息——资格审查——面试签到——抽签候考 面试形式: 面试分为结构化和无领导小组两种形式 1.在结构化面试中,当轮到某位考生时,引导员将在候考室宣布其编号,随后考生跟随引导人员前往考场入口。考生在开始考试时需回…...
(十五)SpringCloudAlibaba-Sentinel持久化到Nacos
前言 在前面我们已经将Sentinel配置的规则持久化到系统的文件中。本章节我们将Sentinel持久化到Nacos中; 传送门(Sentinel数据持久化到文件)https://blog.csdn.net/weixin_45876411/article/details/140742963 默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但…...
GitHub图床
GitHub图床 文章目录 GitHub图床图床介绍Github访问GitHub手动修改hostsgithub520 加速器创建账户创建仓库创建token PicGoTypora 图床介绍 图床 存放图片的地方 为什么设置图床呢 在我认识图床之前, 有一个问题 [^放在typora上面的图片, 其实是一个链接, 并且将图片存放在本地…...
记一次高版本view-design的组件迁移到自身项目的低版本
背景 npm i -S view-design当前老项目使用view-design这个组件库,但是当我们去官网查看该组件库最新版本,竟然发现没有博主想用的image/ImagePreivew这两个基础组件 说实话,有点离谱了哈!! 自己造轮子? …...
QT运行ROS工程
文章目录 使用QT创建ROS工程项目配置修改cmake环境配置运行设置 运行 使用QT创建ROS工程 工程名字和路径 下一步(直接选择默认选项就可以)->完成 完成之后 是这样的 接下来在工作空间里面创建功能包 鼠标选中src点击右键->添加新文件 name::功能包的名字…...
电脑技巧:如何在Win11电脑上调整设置,让屏幕更加护眼?
目录 一、调整屏幕亮度 二、启用夜间模式 三、调整色彩设置 四、使用第三方护眼软件 五、保持良好的用眼习惯 总结 随着长时间使用电脑的人越来越多,护眼问题也变得越来越重要。Win11作为更新的操作系统,提供了更多的设置选项来帮助我们保护眼睛。本文将详细介绍如何在…...
【数据结构】排序算法篇二
【数据结构】排序算法篇二 1. 快速排序(hoare版本)(1)基本思想:(2)动态图解:(3)代码实现:(4)特性总结: 2. 快速…...
python进阶篇-day09-数据结构与算法(非线性结构与排序算法)
非线性结构(树状结构) 特点: 每个节点都可以有n个子节点(后继节点) 和 n个父节点(前驱节点) 代表: 树, 图...... 概述 属于数据结构之 非线性结构的一种, 父节点可以有多个子节点(后续节点) 特点 有且只有1个根节点 每个节点都可以有1个父节点及任意个子节点, 前提: 根节点除…...
线性代数基础
Base 对于矩阵 A,对齐做 SVD 分解,即 U Σ V s v d ( A ) U\Sigma V svd(A) UΣVsvd(A). 其中 U 为 A A T AA^T AAT的特征向量,V 为 A T A A^TA ATA的特征向量。 Σ \Sigma Σ 的对角元素为降序排序的特征值。显然,U、V矩阵…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
