Engee 文档
Notebook

Arduino支持包:模拟光敏电阻输入

在前面的示例中,Arduino支持包广泛考虑了数字输出,在此示例中,我们将继续使用模拟输入。 使用Arduino支持包,我们在Engee模型中实现了一个程序,用于从光敏电阻读取信号并处理传入数据以实现照明传感器。

导言

以前,光传感器逻辑的实现在类似的例子中为MIC32Амур。在这里,我们使用支持包自动将模型传输到控制器。

该示例使用:

*Arduino Mega调试板,
*面包板,
*光敏电阻(LDR)GL5516,
*4.7kOhm电阻(2个),
*连接电线。

该模型的任务是根据光敏电阻电路中限流电阻两端的电压降值计算照度。

硬件部分

如下图所示连接元素。:

scheme_bb.png

限流电阻两端的压降幅度将由微控制器模拟输入A0处的ADC处理。 用于处理传入信号的Engee模型如下所示。

示例模型

目标配置块(EDM-Target-Arduino)的设置将保持与前面示例中的相同-[LED矩阵](https://engee.com/community/ru/catalogs/projects/arduino-led-matritsa )。

在博客中,从模拟通道读取(Arduino-analogRead)将所用模拟通道的引脚编号设置为A0-54。

model.png

在电路中,使用最简单的数学块计算光敏电阻的电阻。 R_LDR 基于来自ADC通道a0的数字值。

照明;照明 Lux 反过来,它是由光敏电阻的电阻值从变量的耦合函数确定的 .

函数定义

光敏电阻电阻和照度之间的关系可以从其特性来确定,例如,根据图。[护照资料]第4页1(https://static.chipdip.ru/lib/642/DOC048642822.pdf )。

让我们从特征区域采取以下中心点:

In [ ]:
x_Ohm = [3e4, 7e3, 2e3];
y_Lux = [1, 10, 100];

依赖性本身可以定义为形式的幂函数

哪里 -光敏电阻电阻[欧姆], -照明[勒克斯], -系数, -指数。

为了优化函数并找到先前定义的特征点的系数,我们添加了以下包:

In [ ]:
]add LsqFit
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
]add Statistics
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`

接下来,让我们继续直接查找函数的系数。:

In [ ]:
using Plots; gr(format=:png)
using LsqFit, Statistics

model(x_Ohm, p) = p[1] .* x_Ohm .^ p[2]

# 初始参数
p0 = [1e7, -1.0]

# 曲线拟合
fit = curve_fit(model, x_Ohm, y_Lux, p0)

# 公式参数
a, b = fit.param
println("公式:y=∠a*x^(∠b)")

# R2的计算
ss_res = sum((y_Lux .- model(x_Ohm, fit.param)).^2)  # 残差的平方和
ss_tot = sum((y_Lux .- mean(y_Lux)).^2)              # 总平方和
r2 = 1 - ss_res/ss_tot

println("R² = $r2")
Формула: y = 1.1357055990804273e8 * x ^ (-1.8343597148570423)
R² = 0.9999842359959972

当然,计算 这是没有必要调整两个点的功能。 我们使用此估计值来确保构造的曲线通过起点。 绘制曲线和平面上的点:

In [ ]:
plot(x_Ohm, y_Lux)
plot!(collect(1e3:3e4), a.*collect(1e3:3e4).^b)
Out[0]:
No description has been provided for this image

得到的系数:

In [ ]:
@show a;
@show b;
a = 1.1357055990804273e8
b = -1.8343597148570423

它们也包含在模型的回调中。

准备工作

使用这段代码,我们自动启动Engee服务器程序。综合服务:

In [ ]:
import .engee.package as epkg

const PKGNAME = "Engee-Device-Manager"

function epkg_start(pkg::String)
    if !epkg.isinstalled(pkg)
        @info "Package not installed. Installing and Starting..."
        epkg.install(pkg)
        @info "Package is up to date. Starting..."
        println("连接到服务器的链接:\n"*epkg.start(pkg))
    else
        updates = epkg.checkupdates(pkg)
        if isnothing(updates)
            @info "Package is up to date. Starting..."
            println("连接到服务器的链接:\n"*epkg.start(pkg))
        else
            @info "Updates available. Reinstalling and Starting..."
            epkg.update(pkg)
            @info "Package is up to date. Starting..."
            println("连接到服务器的链接:\n"*epkg.start(pkg))
        end
    end
end

epkg_start(PKGNAME)
Пакет поддержки 'Engee-Device-Manager' установлен.
У вас установлена актуальная версия пакета поддержки 'Engee-Device-Manager'.
[ Info: Package is up to date. Starting...

同样在幕后,[像往常一样](https://engee.com/community/ru/catalogs/projects/bc465b1d-9127-43a4-b73a-de7999ea6510 ),让我们启动Engee客户端程序。集成和连接我们的设备.

模型执行

让我们交互运行模型,观察室内光线亮度变化时光敏电阻电阻和照度的计算进度。

正如我们所看到的,环境亮度的变化导致计算出的照明值的相应变化。 此外,对于开发的传感器的"战斗"使用,当然,计算值应该与来自可信仪表的照明值相关。

结论

在示例中,根据我们的需要,我们从Arduino支持包中查看了数字输入单元的工作,从光传感器的实现开始。