基于NodeMCU的物联网电灯控制系统设计
最终效果
基于NodeMCU的物联网电灯控制系统设计

上图展现了小程序关灯过程的数据传输过程:用户下达关灯指令→小程序下发关灯指令→MQTT服务器接收关灯指令→下位机接收与处理关灯指令。
项目介绍
该项目是“物联网实验室监测控制系统设计(仿智能家居)”项目中的“家电控制设计”中的“电灯控制”子项目,最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小程序设计”等内容。本文只介绍“电灯控制”部分。
项目功能实现的大致思路为:单片机先识别出当前处在的控制模式:为自动模式时,单片机采集光照传感器传来的光照强度数据,以此来控制灯的开闭;为手动模式时,用户的语音指令和小程序上的开关是一对双开关。单片机会识别这对双开关的最后一次命令,以此来控制灯的开闭。为自动模式或语音控制时,单片机会将灯的状态实时更新到MQTT服务器上,使小程序上的开关状态得到及时更新。控制模式通过语音指令切换。
硬件设计
接线
ESP-12F | GY-302 | LU_ASR01 | LED |
3v3 | VCC | 5V | |
GND | GND | G | |
D1 | SCL | ||
D2 | SDA | ||
D7 | + | ||
D8 | - | ||
RX | TX |
PCB设计
此电路板仅是为了代替杜邦线而已,上面只有引脚排座,而没有任何电子元件。
工程 - 立创开源硬件平台
成本
ESP-12F | GY-302 | LU_ASR01 | LED |
27.9 | 7.4 | 47.5 | 2.5 |
其中共需85元左右来购买该项目所需的模块。此外还需1根数据线、焊接工具(电烙铁、锡丝、引脚排座)、PCB打板或若干杜邦线。
软件设计
LU-ASR01
该功能实现的原理及流程可参考:Arduino中借助LU-ASR01实现语音识别-CSDN博客
使用LU-ASR01语音识别开发板的语音识别功能。当语音识别模块识别到特定语音时,通过串口输出特定字符。此时,NodeMCU的串口会接收到这个特定字符,从而得知用户说出的特定语音。待识别语音、输出字符和输出语音之间的对应关系如下表所示:
待识别语音 | 输出字符 | 输出语音 |
自动模式 | a | 已进入自动模式 |
手动模式 | m | 已进入手动模式 |
开灯 | 1 | 已开灯 |
关灯 | 0 | 已关灯 |
代码
天问Block IDE中的程序如下:
ESP-12F
本次的开发环境为Arduino IDE,开发板型号为NodeMCU 0.9 (ESP-12 Module)。
本系统软件部分的流程如下图所示。初始化完成之后,系统默认进入自动模式(60LX为实验室环境昏暗与明亮的分界值)。之后会根据语音、小程序或光照值数据控制灯状态。
连接WiFi以及与MQTT服务器双向通信,可参考:利用ESP-01S中继实现STM32F103C8T6与MQTT服务器的串口双向通信_stm32串口接收esp01s数据-CSDN博客
获取光照强度,可参考:Arduino中使用GY-302测量环境中的光照强度-CSDN博客
解析JSON数据,可参考:Arduino中解析JSON数据-CSDN博客
控制LED,可参考:未完待续
代码
Arduino IDE中的程序如下:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <Arduino.h>
#include <Wire.h> //IIC
#include <math.h>// 设置wifi接入信息和MQTT服务器
const char* wifiname = "DOILMSBOIOT";
const char* password = "doilmsboiot";
const char* mqttServer = "broker.emqx.io";bool receive_MQTT_message_flag = false; //1表示收到来自MQTT的信息但还未处理,0表示未收到来自MQTT的信息或已处理WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);// 待解析的json文件
String json = "{\"lamp\":0}";// 创建DynamicJsonDocument对象
const size_t capacity = JSON_OBJECT_SIZE(1) + 24 ; //1表示待解析的JSON对象中有1对数据,24为解析过程中需要的额外空间,可在此网站计算 https://arduinojson.org/v6/assistant/#/step1
DynamicJsonDocument doc(capacity);bool lamp_Bool_MQTT = false ; // 解析出的来自MQTT的灯的开关状态int BH1750address = 0x23; //GY-302-BH1750的iic通讯地址
byte buff[2]; //用来储存GY-302-BH1750的iic传来的原始数据
long int light = 0; //光照值char serial_information = '\0'; //从串口获得的信息bool auto_flag = true; //是否为自动模式,即用光照传感器的值来决定灯的开关状态。它的反面为手动模式,可通过串口(语音)和MQTT(小程序)控制void setup()
{Serial.begin(9600); WiFi.mode(WIFI_STA); //设置ESP8266工作模式为无线终端模式connectWifi(); // 连接WiFimqttClient.setServer(mqttServer, 1883); // 设置MQTT服务器和端口号mqttClient.setCallback(receiveCallback); // 设置MQTT订阅回调函数connectMQTTserver(); // 连接MQTT服务器Wire.begin(); //iic启动led_initial();
}void loop()
{ if (mqttClient.connected()) // 如果开发板成功连接服务器{ mqttClient.loop(); // 处理信息(收到信息后的回调函数)以及心跳} else // 如果开发板未能成功连接服务器{ connectMQTTserver(); // 则尝试连接服务器并订阅主题}if (receive_MQTT_message_flag == 1) //收到来自MQTT的信息但还未处理{ deserializeJson(doc, json); // 反序列化数据// 解析收到的数据信息lamp_Bool_MQTT = doc["lamp"].as<bool>();}BH1750_Init(BH1750address);if (BH1750_Read(BH1750address) == 2) //如果光照模块有数据传来{light = ((buff[0] << 8) | buff[1]) / 1.2;Serial.print(light,DEC);Serial.println(" lx");}if (Serial.available() > 0) //如果串口有数据传来{serial_information = Serial.read();Serial.print("接收到的串口数据为:");Serial.println(serial_information);} if(serial_information == 'm') //manual手动模式{auto_flag = false;serial_information = '\0';}if(serial_information == 'a') //auto自动模式{auto_flag = true;serial_information = '\0';}if(auto_flag == true) //如果为自动模式{if(light < 60) //光线弱{turn_on_light(); //开灯pubMQTTmsg(true);}else //光线强{turn_off_light(); //关灯pubMQTTmsg(false);}}else //如果为手动模式,即可通过串口(语音)和MQTT(小程序)控制{if(serial_information == '1') //收到的串口(语音)指令为开灯,且尚未处理此信息{turn_on_light();pubMQTTmsg(true);serial_information = '\0';}if(serial_information == '0') //收到的串口(语音)指令为关灯,且尚未处理此信息{turn_off_light();pubMQTTmsg(false);serial_information = '\0';}if(receive_MQTT_message_flag == true && lamp_Bool_MQTT == true) //收到的MQTT(小程序)指令为开灯,且尚未处理此信息{turn_on_light();receive_MQTT_message_flag = false;}if(receive_MQTT_message_flag == true && lamp_Bool_MQTT == false) //收到的MQTT(小程序)指令为关灯,且尚未处理此信息{turn_off_light();receive_MQTT_message_flag = false;}}delay(200);
}int BH1750_Read(int address)
{int i = 0;Wire.beginTransmission(address);Wire.requestFrom(address, 2);while (Wire.available()) {buff[i] = Wire.read(); // receive one bytei++;}Wire.endTransmission();return i;
}void BH1750_Init(int address)
{Wire.beginTransmission(address);Wire.write(0x10); Wire.endTransmission();
}// 连接MQTT服务器并订阅主题
void connectMQTTserver()
{// 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)String clientId = "esp8266-" + WiFi.macAddress();if (mqttClient.connect(clientId.c_str())) //如果成功连接MQTT服务器{ Serial.print("MQTT Server Has Connected. ");Serial.print("Server Address: ");Serial.println(mqttServer);Serial.print("ClientId: ");Serial.println(clientId);subscribeTopic(); // 订阅指定主题} else {Serial.print("MQTT Server Connect Failed. Client State:");Serial.println(mqttClient.state());delay(3000);}
}// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length)
{Serial.print("Message with the topic of [ ");Serial.print(topic);Serial.println(" ] has been received.");Serial.print("Content: ");for (int i = 0; i < length; i++) {Serial.print((char)payload[i]);json[i] = (char)payload[i]; //将收到的信息赋给json,以便后续解析和发射信号}Serial.println("");receive_MQTT_message_flag = 1; //表示收到来自MQTT的信息但还未处理Serial.print("Message Length (Bytes) : ");Serial.println(length);Serial.println(" ");
}void pubMQTTmsg(bool led_status) //向MQTT发布消息
{String topicString = "deviceControl2"; //发布信息的主题char publishTopic[topicString.length() + 1]; strcpy(publishTopic, topicString.c_str());String messageString = led_status ? "{\"lamp\":true}" : "{\"lamp\":false}"; //发布信息的内容char publishMsg[messageString.length() + 1]; strcpy(publishMsg, messageString.c_str());if(mqttClient.publish(publishTopic, publishMsg, true)) //如果成功发布信息;publish函数第三个参数用于设置保留信息{Serial.print("Publish Topic: ");Serial.println(publishTopic);Serial.print("Publish Retained message: ");Serial.println(publishMsg); Serial.println(""); } else //如果未能成功发布信息{Serial.println("Message Publish Failed."); }
}// 订阅指定主题
void subscribeTopic()
{String topicString = "deviceControl3/lamp"; // 订阅的主题名称char subTopic[topicString.length() + 1]; strcpy(subTopic, topicString.c_str());if(mqttClient.subscribe(subTopic)) //如果成功订阅主题{Serial.print("Subscrib Topic: ");Serial.println(subTopic);Serial.println("");} else {Serial.print("订阅主题失败");}
}// ESP8266连接wifi
void connectWifi()
{WiFi.begin(wifiname, password);Serial.println("Connecting to WiFi");while (WiFi.status() != WL_CONNECTED) //等待WiFi连接,当wifi未连接时,持续输出".";成功连接后输出连接成功信息{delay(1000);Serial.print(".");}Serial.println("");Serial.println("WiFi Connected!"); Serial.println("");
}void led_initial() //灯初始化
{pinMode(D7, OUTPUT);pinMode(D8, OUTPUT);
}void turn_on_light() //开灯
{digitalWrite(D7, HIGH);digitalWrite(D8, LOW);
}void turn_off_light() //关灯
{digitalWrite(D7, LOW);digitalWrite(D8, HIGH);
}
相关文章:
基于NodeMCU的物联网电灯控制系统设计
最终效果 基于NodeMCU的物联网电灯控制系统设计 小程序关灯 上图展现了小程序关灯过程的数据传输过程:用户下达关灯指令→小程序下发关灯指令→MQTT服务器接收关灯指令→下位机接收与处理关灯指令。 项目介绍 该项目是“物联网实验室监测控制系统设计(…...
源码安装redis后配置redis开机自启动
initd风格 #!/bin/sh ### BEGIN INIT INFO # Provides: redis # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/stop Redis server ### END…...
WebRTC服务质量(11)- Pacer机制(03) IntervalBudget
WebRTC服务质量(01)- Qos概述 WebRTC服务质量(02)- RTP协议 WebRTC服务质量(03)- RTCP协议 WebRTC服务质量(04)- 重传机制(01) RTX NACK概述 WebRTC服务质量(…...
22.跳过报错(最简) C#例子
这是一个跳过报错的例子,如果代码出错了会自动跳过,代码正确了就正常执行。 然而这不是一种推荐的做法,正确的做法应该是使用bool类型的值去检测代码运行结果,然后分支判断,在代码内部解决错误。 这只是一种好玩的做…...
windows 本地node版本快速升级
文章目录 前言一、前置条件二、使用步骤1.查看node 安装位置2.下载指定的node 版本3.下载后进行解压缩4. 删除覆盖原来的node文件夹内容5. 验证 总结 前言 Node.js 是一个开源、跨平台的JavaScript运行时环境,它允许开发者在服务器端运行JavaScript代码。Node.js 基…...
windows安装mongodb
一.安装包准备 1.服务端下载 https://www.mongodb.com/try/download/communitya 按需选择,我们这里选择社区版 直接点download浏览器下载可能比较慢,可以尝试copy link后用三方下载软件,会快很多。 2.命令行客户端下载 https://www.mong…...
一文读懂混合专家模型(MoE)
一文读懂混合专家模型(MoE) 概述 混合专家模型(Mixture of Experts,MoE)是一种机器学习和深度学习中的模型架构,它通过多个“专家”子模型来处理不同类型的输入数据或任务。在MoE模型中,输入数…...
自然语言处理(NLP)中的事件检测和事件抽取
事件检测和事件抽取是自然语言处理(NLP)中的两个重要任务,主要用于从文本中识别和提取事件及其相关信息。这两个任务在信息检索、情报分析、新闻摘要等应用中具有重要意义。 事件检测(Event Detection) 事件检测的目…...
深度学习:基于MindSpore NLP的数据并行训练
什么是数据并行? 数据并行(Data Parallelism, DP)的核心思想是将大规模的数据集分割成若干个较小的数据子集,并将这些子集分配到不同的 NPU 计算节点上,每个节点运行相同的模型副本,但处理不同的数据子集。…...
unity NAudio 获取电脑是否静音
测试,这两个办法都可以 打包出来也可以hu 想获取电脑是否静音出现编辑器模式下正常 打包出来失败 需要把 Api Compatibility Level改成.NET 4.x...
SemiDrive E3 MCAL 开发系列(6)– Icu 模块的使用
一、 概述 本文将会介绍 SemiDrive E3 MCAL Icu 模块的简介以及基本配置,其中还会涉及到 Xtrg 模块的配置。此外会结合实际操作的介绍,帮助新手快速了解并掌握这个模块的使用,文中的 MCAL 是基于 PTG3.0 的版本,开发板是官方的 …...
leetCode322.零钱兑换
题目: 给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。 你可以认为每种硬币的数量是无限的。 示例1࿱…...
【Python】什么是元组(Tuple)?
什么是元组(Tuple)? 元组(Tuple)是 Python 中的一种 不可变 的数据结构,用于存储多个元素。它类似于列表(List),但与列表不同的是,元组一旦创建,…...
zentao ubuntu上安装
#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz(https://www.zentao.net/downloads.html) https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…...
文档解析丨高效准确的PDF解析工具,赋能企业非结构化数据治理
在数据为王的时代浪潮中,企业数据治理已成为组织优化运营、提高竞争力的关键。随着数字化进程的加速,企业所积累的数据量呈爆炸式增长,数据类型也愈发多样化,这些数据构成了现代企业数据资产的重要组成部分。 然而,传…...
Unity 实现Canvas显示3D物体
新建一个UI相机,选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体,并将3D物体的层级设置为UI层 适当的放缩3DObjParent,让3D物体能显示出来…...
OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载
在人工智能的浪潮中,OpenAI的12天发布会无疑是2024年科技界的一场盛宴。从12月5日开始,OpenAI连续12天每天发布一个新应用或功能,标志着AI技术的又一次飞跃。本文将梳理这些激动人心的发布,带你一探究竟。 OpenAI发布会概览 Ope…...
cellphoneDB进行CCI以及可视化
除了cellchat,在单细胞转录组或者空间组的分析中,cellphoneDB也是一个常用的细胞通讯软件,这个数据库更注重配受体关系,对于有明确先验知识的配受体研究比较友好。 但值得注意的是,它的数据库只包括人的基因名称信息&…...
Facebook 上的社群文化:连接与共享
随着社交媒体的普及,Facebook作为全球最大的社交平台之一,不仅改变了人们的沟通方式,还塑造了独特的社群文化。在Facebook上,用户可以轻松地与朋友、家人保持联系,同时也能加入兴趣相投的群组、参与讨论和共享内容。社…...
数据库的概念和操作
目录 1、数据库的概念和操作 1.1 物理数据库 1. SQL SERVER 2014的三种文件类型 2. 数据库文件组 1.2 逻辑数据库 2、数据库的操作 2.1 T-SQL的语法格式 2.2 创建数据库 2.3 修改数据库 2.4 删除数据库 3、数据库的附加和分离 1、数据库的概念和操作 1.1 物理数据库…...
word运行时错误‘-2147221164(80040154)’ 没有注册类的解决办法
目录 问题描述解决方案 问题描述 解决方案 打开C盘找到路径C:\Users\Administrator\AppData\Roaming\Microsoft\Word\STARTUP或者在everything中搜索“Microsoft\Word\STARTUP”删除NEWebWordAddin.dotm文件即可正确打开word。...
Oracle数据库高级应用与优化策略
Oracle数据库高级应用与优化策略 在数据驱动的时代,Oracle数据库作为企业级数据库管理的佼佼者,以其强大的数据处理能力、高可用性和安全性,在众多行业领域中扮演着不可或缺的角色。本文旨在深入探讨Oracle数据库的高级应用与优化策略,通过具体代码使用案例,帮助开发者和…...
笔记:使用python对飞书用户活跃度统计的一个尝试
说明 一个python练习 代码 import json import time import openpyxl from openpyxl import load_workbook from datetime import datetime, timedelta import lark_oapi as lark from lark_oapi.api.admin.v1 import *def data_r(start_date, end_date):r_data []client la…...
讲解substr函数
substr JavaScript 中的 substr语法示例注意 PHP 中的 substr语法示例 Python 中的等价方法语法示例 其他语言Java 补充 substr 是编程中用于截取字符串的一个方法或函数,其功能是从一个字符串中提取出一部分子字符串。不同的编程语言中,这个功能的实现方…...
宏任务和微任务的区别
在 JavaScript 的异步编程模型中,宏任务(Macro Task)和微任务(Micro Task)是事件循环(Event Loop)机制中的两个重要概念。它们用于管理异步操作的执行顺序。 1. 宏任务 (Macro Task) 宏任务是较…...
设计模式介绍
设计模式是软件开发中常见问题的经典解决方案。它们是经过验证的、可重用的设计经验,可以帮助程序员构建可维护、可扩展和可靠的对象导向软件。 设计模式通常分为三大类:创建型、结构型和行为型。以下是每种类型中一些常见的设计模式,…...
flask后端开发(11):User模型创建+注册页面模板渲染
目录 一、数据库创建和配置信息1.新建数据库2.数据库配置信息3.User表4.ORM迁移 二、注册页面模板渲染1.导入静态文件2.蓝图注册路由 一、数据库创建和配置信息 1.新建数据库 终端中 CREATE DATABASE zhiliaooa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2…...
Ubuntu 中安装 RabbitMQ 教程
简介 RabbitMq作为一款消息队列产品,它由Erlang语言开发,实现AMQP(高级消息队列协议)的开源消息中间件。 应用场景 异步处理 场景说明:用户注册后,注册信息写入数据库,再发邮件、短信通知。 …...
【开源免费】基于SpringBoot+Vue.JS网上摄影工作室系统(JAVA毕业设计)
本文项目编号 T 103 ,文末自助获取源码 \color{red}{T103,文末自助获取源码} T103,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
Metricbeat安装教程——Linux——Metricbeat监控ES集群
Metricbeat安装教程——Linux 一、安装 下载安装包: 官网下载地址:https://www.elastic.co/cn/downloads/beats/metricbeat 上传包到linux 切换到安装目录下 解压:tar -zxvf metricbeat-7.17.1-linux-x86_64.tar.gz 重命名安装文件夹 mv met…...
torch.nn.Embedding模块介绍
torch.nn.Embedding 是 PyTorch 中的一个嵌入层模块,用于将离散的整数索引(如单词或标记的 ID)映射到连续的密集向量空间中。常用于自然语言处理(NLP)中的词嵌入,但也适用于任何需要将类别数据转换为密集向量表示的场景。 参数说明 torch.nn.Embedding(num_embeddings, …...
<数据集>风力发电机损伤识别数据集<目标检测>
数据集下载链接 <数据集>风力发电机损伤识别数据集<目标检测>https://download.csdn.net/download/qq_53332949/90187097数据集格式:VOCYOLO格式 图片数量:2527张 标注数量(xml文件个数):252…...
【Python运维】自动化备份与恢复系统的实现:Python脚本实战
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着信息化进程的加速,数据的重要性日益增加,数据丢失的风险也随之增加。为了保证数据安全,定期备份和及时恢复数据是必不可少的操作。本…...
PTA数据结构编程题7-1最大子列和问题
我参考的B站up的思路 题目 题目链接 给定K个整数组成的序列{ N 1 , N 2 , …, N K },“连续子列”被定义为{ N i , N i1 , …, N j },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 1…...
Elasticsearch-模糊查询
模糊查询 前缀搜索:prefix 概念:以xx开头的搜索,不计算相关度评分。 注意: 前缀搜索匹配的是term,而不是field。 前缀搜索的性能很差 前缀搜索没有缓存 前缀搜索尽可能把前缀长度设置的更长 语法: GET &…...
C#学习1:C#初接触,一些基础内容备忘和相关报错说明
目录 1 C#基本语法格式 1.1 基础规则 1.2 以if为例子 2 一些写法 2.1 时间相关 2.2 对数写法 2.3 关于使用random 2.4 UnityEngine.Random.value 2.5 PerlinNoise 函数 PerlinNoise 函数本身的输出范围 3 各种报错 3.0 unity里对C#报错内容超级详细 3.1 error cs1…...
机器学习的方法
机器学习方法主要分为三种:监督学习、无监督学习、半监督学习。 1.监督学习 神经网络、朴素贝叶斯、线性回归、逻辑回归、随机森林、支持向量机(SVM)都是典型的监督学习方法。 监督学习,即监督机器学习,之所以叫监督…...
el-pagination 为什么只能展示 10 条数据(element-ui@2.15.13)
好的,我来帮你分析前端为什么只能展示 10 条数据,以及如何解决这个问题。 问题分析: pageSize 的值: 你的 el-pagination 组件中,pageSize 的值被设置为 10:<el-pagination:current-page"current…...
vulhub-wordpress靶场
一.主题上传漏洞 来到靶场点击主题选择add new 这里有一个上传主题的地方 我们可以去网上找到wordpress主题下载一个 wordpress模板 网页设计模板 免费 免费下载 - 爱给网 下载完成后对我们有用的东西只有这一个目录,把它拖出来 点开moban目录后,创建…...
Docker 默认安装位置迁移
一、找到 Docker 默认安装位置 [roothost-192-168-0-1 ~]# docker info Client:Version: 26.1.0Context: defaultDebug Mode: falseServer:Containers: 31Running: 31Paused: 0Stopped: 0Images: 128Server Version: 26.1.0Storage Driver: overlay2Backing Filesystem:…...
【机器学习】SVM支持向量机(一)
介绍 支持向量机(Support Vector Machine, SVM)是一种监督学习模型,广泛应用于分类和回归分析。SVM 的核心思想是通过找到一个最优的超平面来划分不同类别的数据点,并且尽可能地最大化离该超平面最近的数据点(支持向量…...
无需配置设备,借助GitHub快速编译项目并直接运行!
引言 你是否曾经有过类似的烦恼,发现了一个有趣的项目,想要测试一下,但是自己的设备没有对应的开发环境或者受制于自己的设备,不想或者不能去配置对应的开发环境,应该怎么办呢?这种情况下,其实…...
【C#联合halcon实现绘制ROI功能】
前言 C#联合halcon实现绘制ROI功能: C#联合Halcon,使用HDrawingObject、HDrawingObjectXld,绘制矩形、方向矩形、圆形、椭圆、自定义ROI。支持拖动、重设大小、选中,右键复制、粘贴、删除功能。 运行结果 代码 代码结构 MainFo…...
语言模型的革命:大型概念模型(LCM)的崛起
在人工智能领域,Meta最近推出的一项重大突破正在引起研究人员和开发者的广泛关注:大型概念模型(Large Concept Models,简称LCM)。这一创新彻底改变了我们对语言模型的理解,并为未来AI技术的进展指明了新的方…...
在C#中获取程序的命令行参数
实现此目的的一种方法是重写程序的Main方法并赋予其一个字符串数组参数,如下面的代码所示。 static void Main(string[] args) {foreach (string arg in args){lstArguments.Items.Add(arg);} } 这种方法是从 C 编程语言继承而来的。 我更喜欢下面的方法…...
R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
全文链接:https://tecdat.cn/?p38667 摘要:在母婴暴露于空气污染对儿童健康影响的研究中,常需对孕期暴露情况与健康结果进行回归分析。分布滞后非线性模型(DLNM)是一种常用于估计暴露 - 时间 - 响应函数的统计方法&am…...
小程序基础 —— 08 文件和目录结构
文件和目录结构 一个完整的小程序项目由两部分组成:主体文件、页面文件: 主体文件:全局文件,能够作用于整个小程序,影响小程序的每个页面,主体文件必须放到项目的根目录下; 主体文件由三部分组…...
bishengjdk-8
title: 深入探索 BishengJDK-8:技术魅力与优势尽显 date: 2024-12-29 category: blog tags:- BishengJDK-8- Java 开发- 性能优化- 技术剖析 sig: BishengJDK archives: 2024-12 author:- way_back summary: BishengJDK-8 作为一款备受瞩目的 JDK 版本,以…...
Android9.x SurfaceView源码分析
前言 本文是继Android 深入理解SurfaceView再次对SurfaceView进行源码分析。 看了下代码,上篇文章是基于Android7.x的,本篇基于Android9.x再次进行分析, Android从7.0开始支持SurfaceView动画,并建议7.0之后使用SurfaceView替代TextureView,这里主要在Android9.0上分析Su…...
分布式 IO 模块助力冲压机械臂产线实现智能控制
在当今制造业蓬勃发展的浪潮中,冲压机械臂产线的智能化控制已然成为提升生产效率、保障产品质量以及增强企业竞争力的关键所在。而分布式 IO 模块的应用,正如同为这条产线注入了一股强大的智能动力,开启了全新的高效生产篇章。 传统挑战 冲压…...