基于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矩阵…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
基于Uniapp的HarmonyOS 5.0体育应用开发攻略
一、技术架构设计 1.混合开发框架选型 (1)使用Uniapp 3.8版本支持ArkTS编译 (2)通过uni-harmony插件调用原生能力 (3)分层架构设计: graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...