基于EPS32C3电脑远程开机模块设计

news2024/11/24 19:30:38

基于EPS32C3电脑远程开机模块设计

前言

缘起,手头资料太多了,所以想组一台NAS放在家里存储数据。在咸鱼淘了一套J3160主板加机箱,加上几块硬盘组建NAS。

对于NAS,我的需求是不用的时候关机(节省功耗),要用的时候开机。

网上的开机棒太贵了,也不够安全。

还不如自己制作一个,趁暑假期间(没去实习好亏),刚好手头有一些之前本科毕设用剩下的ESP32C3模块。加上继电器就可以实现远程开机了。

云平台选择腾讯的物联开发平台。无他-因为有ESP32官方例程。

工程修改自乐鑫官方的
Smart Light 使用 ESP32、ESP32S2 配合 腾讯连连小程序 演示了一个智能灯控制方案。

所以这里就不展示其配置过程了,详细内容见Smart LightREADME

接线原理图

IO2–IN

COM–BN

NO–PowerSW

DC±-3V3

DC–GND。

基于EPS32C3电脑远程开机模块接线

代码

short_switch就是短按。短按开机。

long_switch就是长按。长按强制关机。

GPIO初始化

继电器控制的引脚初始化。对于IO2。

esp_err_t lgpio_init()
{
    //zero-initialize the config structure.
    gpio_config_t io_conf = {};
    //disable interrupt
    io_conf.intr_type = GPIO_INTR_DISABLE;
    //set as output mode
    io_conf.mode = GPIO_MODE_OUTPUT;
    //bit mask of the pins that you want to set,e.g.GPIO18/19
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
    //disable pull-down mode
    io_conf.pull_down_en = 0;
    //disable pull-up mode
    io_conf.pull_up_en = 0;
    //configure GPIO with the given settings
    gpio_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;
}

任务切换逻辑

  1. 获取腾讯云参数后进入相应的函数。

  2. 设置继电器引脚–控制继电器通。

  3. 设置继电器引脚–控制继电器断。

  4. 更新按钮的状态。

  5. 将值写回参数上传回腾讯云。


/* 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远程开机、电脑远程开机、服务器远程开机。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日OJ_牛客_骆驼命名法(递归深搜)

目录 牛客_骆驼命名法(简单模拟) 解析代码 牛客_骆驼命名法(简单模拟) 骆驼命名法__牛客网 解析代码 首先一个字符一个字符的读取内容: 遇到 _ 就直接跳过。如果上一个字符是 _ 则下一个字符转大写字母。 #inclu…

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒…

LEAN 类型理论之注解(Annotations of LEAN Type Theory)-- 小结(Summary)

在证明LEAN类型理论的属性前,先对LEAN类型理论所定义的所有推演规则做一个小结,以便后面推导LEAN类型理论的属性。各部分的注解请查看对应文章。 注:这些都是在《LEAN类型理论》中截取出来的,具体内容,读者可参考该论…

ApacheKafka中的设计

文章目录 1、介绍1_Kafka&MQ场景2_Kafka 架构剖析3_分区&日志4_生产者&消费者组5_核心概念总结6_顺写&mmap7_Kafka的数据存储形式 2、Kafka的数据同步机制1_高水位(High Watermark)2_LEO3_高水位更新机制4_副本同步机制解析5_消息丢失问…

Redis典型应用 - 分布式锁

文章目录 目录 文章目录 1. 什么是分布式锁 2. 分布式锁的基本实现 3. 引入过期时间 4. 引入校验Id 5. 引入 watch dog(看门狗) 6. 引入redlock算法 工作原理 Redlock的优点: 总结 1. 什么是分布式锁 在一个分布式系统中,也可能会出现多个节点访问一个共…

QT 编译报错:C3861: ‘tr‘ identifier not found

问题: QT 编译报错:C3861: ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中, 解决方案 就直接用类名引用 :QObject::tr( )

关于易优cms自定义字段不显示的问题

今天在该易优cms自定义字段&#xff0c;折腾了大半天没显示出来&#xff0c;原来是改错对方了。 主要引用的时候 要放在list标签内&#xff0c;不要看文档&#xff0c;把addfields 放在list标签上 例如 {eyou:list loop8} <li><a href"{$field.arcurl}">…

基于yolov8的电动车佩戴头盔检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的电动车佩戴头盔检测系统利用了YOLOv8这一先进的目标检测模型&#xff0c;旨在提高电动车骑行者的安全意识&#xff0c;减少因未佩戴头盔而导致的交通事故风险。YOLOv8作为YOLO系列的最新版本&#xff0c;在检测速度和精度上均进行了优化&#xff0c;…

✨机器学习笔记(一)—— 监督学习和无监督学习

1️⃣ 监督学习&#xff08;supervised learning&#xff09; ✨ 两种主要类型的监督学习问题&#xff1a; 回归&#xff08;regression&#xff09;&#xff1a;predict a number in infinitely many possible outputs. 分类&#xff08;classification&#xff09;&#xff1…

C#串口助手初级入门

1.创建项目 修改项目名称与位置&#xff0c;点击创建 2.进入界面 在视图中打开工具箱&#xff0c;鼠标拖动&#xff0c;便可以在窗口添加控件&#xff0c;右边可以查看与修改属性 3.解决方案资源管理器 发布之前&#xff0c;需要修改相关的信息&#xff0c;比如版本号&#x…

Lombok jar包引入和用法

大家好&#xff0c;今天分享一个在编写代码时的快捷方法。 当我们在封装实体类时&#xff0c;会使用set、get等一些方法。如下图&#xff0c;不但费事还影响代码的美观。 那么如何才能减少代码的冗余呢&#xff0c;首先lib中导入lombok的jar包并添加库。 此处我已导入&#xf…

插件:清理maven错误缓存.bat

插件&#xff1a;https://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd7zenhttps://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd7zen没错误缓存时&#xff1a; 有错误缓存时&#xff1a;

真实案例分享:零售企业如何避免销售数据的无效分析?

在零售业务的数据分析中&#xff0c;无效分析不仅浪费时间和资源&#xff0c;还可能导致错误的决策。为了避免这种情况&#xff0c;企业必须采取策略来确保他们的数据分析工作能够产生实际的商业价值。本文将通过行业内真实的案例&#xff0c;探讨零售企业如何通过精心设计的数…

springboot数据库连接由localhost改成IP以后访问报错500(2024/9/7

步骤很详细&#xff0c;直接上教程 情景复现 一.没改为IP之前正常 二.改完之后报错 问题分析 SQL没开启远程连接权限 解决方法 命令行登入数据库 mysql -u root -p切换到对应数据库 use mysql;设置root用户的连接权限允许其他IP连接数据库 update user set host % whe…

jmeter执行python脚本,python脚本的Faker库

jmeter安装 jython的插件jar包 通过如下地址下载jython-standalone-XXX.jar包并放到jmeter的XXX\lib\ext目录下面 Downloads | JythonThe Python runtime on the JVMhttps://www.jython.org/download.html 重启jmeter在JSR223中找到jython可以编写python代码执行 python造数据…

一种快速生成CSV的方法

事情是这个样子的 在QQ群在聊把如何100万数据导出成CSV文件&#xff1f;会不会很慢&#xff1f; 俺回了一句“现在的机器性能好&#xff0c;没啥问题”。 然后大家开始谈论机器的配置了。哎&#xff0c;俺的机器配置有点差。 然后俺就进行了一个测试。 测试数据 数据定义…

【C++二分查找】2439. 最小化数组中的最大值

本文涉及的基础知识点 C二分查找 LeetCode2439. 最小化数组中的最大值 给你一个下标从 0 开始的数组 nums &#xff0c;它含有 n 个非负整数。 每一步操作中&#xff0c;你需要&#xff1a; 选择一个满足 1 < i < n 的整数 i &#xff0c;且 nums[i] > 0 。 将 num…

C++ | Leetcode C++题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {int n s.size(), m t.size();vector<vector<int> > f(m 1, vector<int>(26, 0));for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; …

.Net6/.Net8(.Net Core) IIS中部署 使用 IFormFile 上传大文件报错解决方案

描述 最近使用.Net6 WebAPI IFormFile对象接收上传文件时大于30MB(兆)的文件就会报错 原因分析 IIS上传文件有大小默认限制大约28.6MB 解决办法 .无论是Net6还是.Net8写法都一样 方法一&#xff1a;IIS可视化操作 1.打开Internet Information Services (llS)管理器&…

Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计

产品概述 香蕉派 Banana Pi BPI-SM9 16-ENC-A3 深度学习计算模组搭载算能科技高集成度处理器 BM1688&#xff0c;功耗低、算力强、接口丰富、兼容性好。支持INT4/INT8/FP16/BF16/FP32混合精度计算&#xff0c;可支持 16 路高清视频实时分析&#xff0c;灵活应对图像、语音、自…