FLProg + Nextion HMI。第二课



上一课中,我讨论了Nextion HMI面板以及在Nextion Editor中为此面板创建项目的方法。
在本教程中,我将向您展示如何使用Arduino板上的FLProg程序控制此面板。例如,让我们收集最简单的气象站,它将从温度和湿度传感器DHT-22读取数据并将它们显示在面板上。这些参数的变化图也会绘制出来。面板屏幕的背光亮度将使用可变电阻器进行更改。

测试台布局。


首先,您需要将项目上载到面板(档案中的项目文件是本文末尾的Lesson2.hmi的链接)。
该项目包括三个屏幕。
第一个屏幕用于显示温度(页面“ page0”索引-0)。



它由以下元素组成:
1-带有酒精温度计的图像。
2-元素“进度条”。在它的帮助下,温度计得以模拟。

项目设置。


我建议计划始终通过UART进行全局设置的那些元素(“ vccope”属性设置为“ global”),并在整个项目中为它们分配唯一的名称(“ objname”属性)。这加快了Arduino控制器的工作,并减少了代码。我将解释原因。
尝试编写本地元素的属性时,必须首先从面板请求当前页面(这是一个单独的请求,至少需要20毫秒)。如果页面是元素所属的页面,则将值发送到面板;如果不是,则将要发送的值写入变量(需要相同的存储空间)。当您进入带有元素的页面时,必须立即使用最新的实际值更新其属性,因为渲染页面时,局部变量将使用创建项目时指定的值进行初始化。并且,如果页面上的控制器管理着很多元素,那么切换到该元素时,该控制器将很忙于更新所有元素。
对于全局元素,一切都简单得多。您可以随时为其记录属性值,并且在呈现页面时将使用最后一个值。这意味着无需在发送之前请求页码,也无需更改以存储值。
但是当然,这完全取决于项目。如果面板的项目非常大,并且没有足够的空间容纳全局元素,那么您可以照样从控制器中获取内存并将它们放在本地。
3.用于显示温度的文本框。

项目参数。


剪切的图像被选作背景(属性“ sta”值“剪切图像”)。作为用于裁切的图像,使用与整个页面的背景相同的图像(“ picc”属性是图像库中图像的索引)。因此,可以在透明背景下获得纹理。
正如我在上一课中已经写的那样,面板不知道如何处理小数和负数,并且对于温度而言,这两者都是可行的。因此,为了显示温度值,使用了一个文本字段,最终行将立即从控制器发送到该文本字段中。
4.剪切的图像。

项目参数。


借助于此元素,当温度超过预定极限时,将显示太阳。实际上,可以使用普通图片并更改其可见性,但是由于训练示例,我决定使用此特定元素。我本人很早就了解此元素的意识形态,因此我将尝试说明它是如何工作的。对于他的作品,我拍了两张照片,一张带太阳,另一幅没有太阳。





元素显示附加到它的图像部分(“ picc”属性是图像在图像库中的索引)。该部分的左上角在元素的插入坐标中(属性“ x”和“ y”),并具有元素的宽度和高度(属性“ w”和“ h”)。在控制器程序运行期间,如有必要,元素与图片的绑定将更改。

5.按钮。

项目参数。


当您单击按钮时,它会转到下一页。我使用图片作为按钮的背景。我在两种状态下都使用了相同的图片(“ pic”和“ pic2”属性是图像库中图片的索引),因为按下的状态将永远不可见,当您单击按钮时,它会直接转到下一页。由于我们不会在此按钮中进行任何更改,因此我将其保留为本地名称和默认名称。

在事件“ Touch Press Event”中编码。


第二个屏幕用于显示湿度(页面“ page1”索引-1)。


对于页面的背景,我使用了一张带有湿度计刻度的准备好的图像。


考虑页面中包含的元素。

1.“ Gaude”元素,将模拟湿度计的操作。

项目参数。


由于我们将通过控制器对其进行控制,因此将其设为全局。选择剪切图像(“ sta”属性)作为背景,选择页面的背景图像(“ picc”属性)作为背景。

2.数字字段。

项目参数。


湿度值将显示在此字段中。由于面板不支持使用小数,因此我们将显示不带小数部分的湿度值。剪切的图像被选作背景(属性“ sta”值“剪切图像”)。作为用于裁切的图像,使用与整个页面的背景相同的图像(“ picc”属性是图像库中图像的索引)。为了显示美观,我将对齐方式设置为右侧(属性“ xcen”值-2),然后在其旁边放置一个文本字段(3),其值为“%”。它的背景设置与数字字段的设置相似。

文本字段选项(3)。


4和5。按上一页和下一页。当您按下按钮4时,您将转到第一页,而当您单击按钮5时,您将转到下一页。按钮显示设置类似于首页上的按钮。

按钮4设置(“上一页”)“按钮4”(“上一页”)


的“ Touch Press Event”中的代码。


按钮5设置(“下一页”)按钮5(“下一页”)


的“ Touch Press Event”中的代码。


第三页-温度和湿度变化图(“ page2”索引-2)。


在此页面上将显示温度和湿度的变化图。考虑页面中包含的元素。

1.波形元素。

项目参数。


在上一课中,我已经写了该元素不能(我希望到目前为止)成为全局元素,也就是说,可以切换属性值,但这不会导致任何结果。因此我将其保留在本地(谁知道,但是突然之间他仍然吃掉了全局变量的内存)。该元素中将有两个显示通道(属性“ ch”值-2)。

2和3是显示图轴的简单文本字段。

4-后退。除了事件处理程序中的代码外,它类似于上一个屏幕上的相同按钮。

按钮4(“上一页”)的“ Touch Press Event”中的代码。


我们已经找到了面板,现在让我们来照顾控制器。我不会告诉您如何打开FLProg程序,创建项目并绘制图表。我在上一课中讲过的所有内容(教训1第2课),此外有很多这方面的信息是在培训中心项目现场。因此,我将立即展示现成的电路板,并告诉它们发生了什么。

电路板1.从传感器读取数据。


为了通过DHT-22传感器获得温度和湿度值,使用了B1块-“ DHT11,DHT21,DHT22”(元素库,文件夹“传感器”)。

阻止设置(通过双击来调用)。


在设置中,分配了与传感器的“数据”输出连接的引脚,传感器的类型以及温度和湿度输出的存在。还选择了传感器轮询模式。我设置每5秒轮询一次传感器。

由于Arduino控制器在浮点数上不能很好地工作,并且使用它们会占用大量内存,因此我立即将所有值转换为Integer格式。为此,请使用块B3和B4-“将浮点数转换为整数”(元素库,文件夹“类型转换”),该部分会截断数字的小数部分。为了不损失十分之一度,首先使用块B2-“ MUL(*)”(元素库,文件夹“ Mathematics”)将从传感器获得的温度值乘以10。
然后,以整数格式获得的值将输入到相应的变量中。

面板2.在面板上显示温度值。


在这个项目中,我使用命名连接。您可以在相应的课程中了解有关它们的更多信息
为了限制控制器上的负载,只有在数据更改后才将数据发送到面板是有意义的。因此,我们首先确定数据已更改。为此,使用块B5-“数字变化检测器”(元素库,文件夹-“基础块”)。该单元在其输入处控制数字“值”,并在更改时在输出处生成一个程序执行一个周期的输出脉冲。
之后,我们准备一个字符串以发送到面板文本字段。首先,将温度值乘以10除以Float类型的常数(值为10)。因此,我们得到的温度值的分数为小数。我们使用块B6-“ DIV(/)”(元素库,文件夹“ Mathematics”)进行此操作。然后,使用块B7-“字符串转换”(元素库,文件夹“类型转换”)将以Float格式获得的值转换为字符串。然后,使用块B8-“线的添加”(元素库,文件夹“线”)将所得字符串与字符串常量“ C”连接。结果行被馈送到单元的输入,以将属性值写入Nextion HMI B9面板-“设置参数”(元素库->文件夹“ Nextion HMI Panel”->“ Elements”文件夹)。
该块将值写入指定的属性。

块参数化。

通过双击该块,将打开块编辑器窗口。


如果尚未在项目中创建面板,则需要创建一个面板。如果已经创建了必要的面板,则可以通过按按钮3从下拉列表中进行选择。可以使用“更改面板”按钮(2)更改所选面板。要创建面板,请单击“添加面板”按钮(1)。面板创建窗口将打开。


在此对话框中,选择用于连接面板的端口(在我们的课程中-SoftwareSerial)。如果选择SoftwareSerial,则还必须选择分配为UART端口的RX和TX信号的引脚(在本例中为2和3)。还必须分配一个面板名称。它必须是唯一的。只要有足够的可用UART端口,一个项目中就可以连接多个面板。每个面板的名称在项目中必须唯一。在同一对话框中,您可以添加面板中包含的页面。我们会怎么做。单击添加页面按钮。页面创建窗口打开。


在此窗口中,我们需要输入页面名称及其ID。可以从Nextin编辑器中的项目中了解此信息。


默认情况下,起始页面(在控制器启动时打开)将是ID为0的页面,但是您可以在任何页面的属性中选中“起始页面”框,它将成为起始页面。
在此窗口中,您可以向我们添加此页面上感兴趣的元素。点击“添加项目”按钮。
项目创建窗口打开。


在这里,我们需要选择元素的类型和类型,输入其名称,索引,如果元素是全局元素,则设置相应的复选框。所有这些数据都可以在Nextin编辑器的项目中看到。


填写完所有数据后,单击“完成”,然后在页面创建窗口中以相同的方式在此页面上添加我们感兴趣的所有元素。


在创建页面上的所有元素之后,我们还单击页面创建窗口中的“完成”按钮,然后在使用相同场景创建面板的窗口中,创建页面的其余部分。






我们使用熟悉的“完成”按钮完成面板的创建。
在块编辑器中,选择名称为“ tnt”的页面“ page0”元素“ Text”及其属性“ Text(txt)”。作为值,选择输入。


块已组态。
我们会进一步考虑该计划。
根据经验,可以确定的是,抽出的温度计的-40度的值对应于位于其上的“进度条”元素中的10值,与温度计的50度的值对应于91巴的进展值。根据这一点,我们使用B10-“比例”块(元素库,“比例”文件夹)通过“温度x10”变量对值进行比例缩放,而不会忘记将温度值乘以10。


使用块B11-“设置参数”(元素库->文件夹“ Panel Nextion HMI”->文件夹“ Elements”)将标定的温度值发送到面板。此块的设置。


下一个块B12-“比较器”(元素库,文件夹“比较”)确定当前温度是否超出变量“设定值-热”的默认值的设定值。现在是290(不要忘了我们到处都将温度乘以10)。


块B12被配置为当输入“ I1”处的值超过输入“ I2”处的值时在其输出处输出逻辑单元。


块B13,B14和B15形成离散信号变化检测电路。块B13和B14-Rtrig(元素库,文件夹“触发器”),当出现离散信号的上升沿时,发出持续1个程序周期的输出脉冲。块B14由于其输入处的反相而检测到信号“超出阈值”的后沿。如果任何输入中都有逻辑单元,则块B15 –OR(元素库,文件夹“基本元素”)将逻辑单元输出到其输出。因此,形成信号“当超过阈值时发送数据”。在此信号的前沿,发送命令以更改显示当前温度的文本字段的字体颜色。使用块B17 –“设置参数”(元素库->文件夹“ Nextion HMI Panel”->发送)Elements文件夹)。此块的设置。


使用块B16-“开关”(元素库,文件夹“开关”)选择命令中传送的值。该块的输入逻辑电平低,将值从输入“ 0”传输到输出,将值高的块从输入“ 1”传输到输出。使用块B44和B45-“颜色常数高色”(元素库->“ Nextion HMI Panel”文件夹->“ Color”)设置提供给开关输入的颜色值。在块编辑器中选择颜色(双击块)。


要选择一种颜色,请单击“更改”按钮。颜色选择器打开。


在其中设置分量R(红色),G(绿色)和B(蓝色)的值,选择所需的颜色。
另外,在信号“超过阈值时发送数据”的前沿,发送命令以改变剪切图像的装订。使用块B19-“设置参数”(元素库->“ Nextion HMI Panel”文件夹->“ Elements”文件夹)会发生这种情况。
此块的设置。


使用块B18-“开关”(元素库,文件夹“开关”)选择图像索引。上面已经描述了他的工作。可以在图像库的Nextion Editor项目中查看所需图像的索引值。

随着温度数据的传输完成。让我们继续保持湿度。

电路板3.湿度结论。


就像温度一样,我们首先创建一个信号“湿度变化时发送数据”。我们使用块B20-“数字变化检测器”(元素库,文件夹-“基础块”)进行此操作。前面已经描述了该单元的操作。该信号将值发送到显示湿度的数字字段。这可通过块B21 –“设置参数”(元素库->“ Nextion HMI Panel”文件夹->“ Elements”文件夹)完成。
此块的设置。


根据经验,对于面板设计中绘制的湿度计刻度的0%湿度值,可以肯定地确定,绘制箭头的“盖伊”元素为314,对于100%湿度,其为226。同时,箭头超过了值0。转换为线性值时,我们得到了连续的范围从-46(0%)到226(100%)。根据这些数据,我们配置块B22-“缩放”。
块参数。


由于“ Gauge”元素的值不能为负,因此要计算这些值的箭头角度,如果为负值,则将值360添加到其上。我们使用B23-“ SUMM(+)”块(元素库,数学文件夹)。我们使用块B26-“比较器”(元素库,文件夹“比较”)确定该数字小于0。它的输出控制开关B24-“开关”(元素库,文件夹“ Switch”),并使用块B25-“设置参数”(元素库->文件夹“ Nextion HMI Panel”->文件夹“ Elements”)将所选值发送到面板)
此块的设置。


下一块板显示温度和湿度的变化图。


正如我在课程开始时所写的那样,Waveform元素不知道如何成为全局元素,并且每次打开它所在的页面时都会被重绘。我们必须规避此限制。首先,确定面板上当前加载的页面数。为此,请使用块B27-“获取当前页面的ID”(元素库->文件夹“ Nextion HMI Panel”->文件夹“ Page”)。在此块的设置中,您只需要选择我们将通过此请求访问的面板。


使用块B28-“比较器”(元素库,文件夹“比较”),将从该块中获得的页码与我们所需的页面索引(2)进行比较。如果打开了所需的页面,则将逻辑单元写入变量“图表的打开页面”,如果未打开,则为逻辑零。
使用块B29-“生成器”(元素库,文件夹“ Timers”),将生成一个信号来记录图表上的下一个点。该模块生成具有给定脉冲持续时间和暂停的脉冲。
阻止设置。


选择的发生器类型为“对称多谐振荡器”,这意味着脉冲持续时间等于暂停持续时间。将脉冲持续时间分别设置为5秒时,暂停将保持相同的5秒。脉冲的前沿将每10秒出现一次。块B30-“ Rtrig”(元素库,文件夹“ Triggers”)突出显示了该前沿,并将其写入变量“记录下一个点的命令”。
在“打开图形页面”信号的前沿(将使用块B31-“ Rtrig”(元素库,“触发器”文件夹)进行选择),将生成“发送图形历史”信号。根据此信号,数组的内容将被发送到图表上的面板。对于温度,将使用块B32-“将数组发送到图形”(元素库->“ Nextion HMI Panel”文件夹->“ Graph”文件夹)完成。使用块编辑器配置块。


首先,您需要创建一个数组,其中将存储温度曲线图的历史记录。为此,请单击“创建”按钮。阵列创建窗口打开。


在这个海洋中,您必须输入阵列的名称,键入(使用Byte,因为Waveform元素的最大值为255)。取得的大小等于图表的宽度(330)。
创建后,选择将在其上绘制图形的面板,页面,元素和通道。


以相同的方式,我们配置将带有湿度数据的数组发送到B33面板的块-“将数组发送到图形”(元素库->文件夹“ Nextion HMI Panel”->“ Graph”文件夹)。在其设置中,我们创建另一个数组来存储此数据。


现在,您需要为温度图准备数据。该图表将在其图表的底部距其160点的高度处沿其轴线。为了使温度变化更明显,我们使用块B35将“ Temperature x10”变量的值除以5(即,将实际温度值乘以2),并使用块B36将偏移量相加。结果将输入到变量“图形的温度变化”中。
使用块B37-“堆栈”(元素库,文件夹“数组”),通过堆栈原理将来自变量“命令以记录下一个点的命令”的脉冲写入数组(删除数组的第一个元素,其余的将移位一个,并写入最后一个值)。使用块编辑器对块进行参数化。


在编辑器中,通过单击“选择”按钮选择所需的阵列。
以相同的方式,我们配置B34块-“堆栈”(元素库,文件夹“数组”),通过在相应的数组中进行选择将湿度值写入到数组中。
如果打开了图表页面,则完成了向图表的数组传输,并且接收到记录下一个点的命令,然后将新点的值发送到相应的图表。为了在显示页面时继续构建图形,这是必需的。使用块B38-“与”(元素库,文件夹“基本元素”)监视是否符合这些条件。如果所有输入都有逻辑单元,则此块在其输出处发布一个单元。使用块B40-“在图形上添加点”(元素库->文件夹“ Nextion HMI Panel”->文件夹“ Graph”),将下一个具有偏移的温度值发送到图形。
阻止设置。


还设置了将下一个湿度值发送到B39图表的块-“向图表添加点”(元素库->“ Nextion HMI Panel”文件夹->“ Chart”文件夹)。


完成时间表的总结。

电路板5.调整背光灯的亮度。


使用可变电阻器设置的背光灯值通过“亮度”模拟输入块读取。由于面板背光灯的亮度值设置在0到100的范围内,因此我们使用B41-“ Scale”块将读取值从0-1023范围缩放到0-100范围。
阻止设置。


然后,我们使用块B42-“用于更改数字的检测器”确定该值发生更改的事实。此块具有一些非标准设置。


为了不改变可变电阻器每次移动的亮度,在模块中将死区设置为5。也就是说,当输入值在任一方向上变化超过5时,模块将工作。触发单元后,将使用块B43-“设置背光水平”(元素库->“ Nextion HMI Panel”文件夹->“ System”文件夹)将命令发送到面板以设置新的背光亮度。
块设置


完成控制器程序上的工作。

对于那些对生成的草图skoller代码感兴趣的人。
#include <SoftwareSerial.h>
#include "DHT.h"
DHT _dht1(4, DHT22);

SoftwareSerial Serial100(2, 3);

byte _FLPArray142003126[330] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
byte _FLPArray239384258[330] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int _SUETFLPATemp = 0;
byte _nextionSaveDataVAL_P0_E2;
long _nextionSaveDataPCO_P0_E3;
String _nextionSaveDataTXT_P0_E3;
byte _nextionSaveDataPICC_P0_E4;
int _nextionSaveDataVAL_P1_E2;
long _nextionSaveDataVAL_P1_E4;
String _nextionCommandTempString;
struct _nextionLissenStruct {
  char code;
  String result;
  long number;
};
_nextionLissenStruct _nextionTempLissen;
int nextionGetPageIdTempVar = 0;
int NextionPanel_47525121_PageIdOut = 0;
int _hasNumberChangeInTemp = 0;
int _gtv1;
int _gtv2;
int _gtv3 = 290;
bool _gtv4 = 0;
bool _gtv5 = 0;
int _gtv6;
unsigned long _dht1Tti = 0UL;
float _dht1t = 0.00;
float _dht1h = 0.00;
bool _changeNumber1_Out = 0;
int _changeNumber1_OLV;
bool _nextionSetAttr1_isNU = 0;
bool _nextionSetAttr1_oldState = 0;
bool _nextionSetAttr2_isNU = 0;
bool _nextionSetAttr2_oldState = 0;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
bool _nextionSetAttr3_isNU = 0;
bool _nextionSetAttr3_oldState = 0;
long _swi1;
bool _nextionSetAttr4_isNU = 0;
bool _nextionSetAttr4_oldState = 0;
byte _swi2;
bool _nextionSetAttr5_isNU = 0;
bool _nextionSetAttr5_oldState = 0;
bool _changeNumber2_Out = 0;
int _changeNumber2_OLV;
int _swi3;
bool _nextionSetAttr6_isNU = 0;
bool _nextionSetAttr6_oldState = 0;
bool _trgrt3 = 0;
bool _trgrt3I = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
bool _trgrt5 = 0;
bool _trgrt5I = 0;
bool _nextionAddPointToWave1_OldState = 0;
bool _nextionAddPointToWave2_OldState = 0;
bool _SFLPAS1;
bool _SFLPAS2;
bool _nextionSendArraytToWave1_OldState = 0;
bool _nextionSendArraytToWave2_OldState = 0;
bool _nextionSetLighting1_OldStae = 0;
bool _changeNumber3_Out = 0;
int _changeNumber3_OLV;
void setup()
{
  Serial100.begin(9600);
  _dht1.begin();
  nextionSendCommand("", 100);
  nextionAck(100);
  nextionSendCommand("page 0", 100);
  delay(100);
  nextionAck(100);
}
void loop()
{ nextionGetPageIdTempVar = nextionAskPageNamper(100);
  if ( ! (nextionGetPageIdTempVar < 0) ) {
    NextionPanel_47525121_PageIdOut = nextionGetPageIdTempVar;
  };
  if (_isTimer(_dht1Tti, 5000)) {
    _dht1Tti = millis();
    float tempDht4;
    tempDht4 = _dht1.readTemperature();
    if (!(isnan(tempDht4))) {
      _dht1t = tempDht4;
    }
    tempDht4 = _dht1.readHumidity();
    if (!(isnan(tempDht4))) {
      _dht1h = tempDht4;
    }
  }



  _gtv1 = (int((_dht1t) * (10)));
  _gtv2 = (int(_dht1h));
  if ((_gtv1) > (_gtv3)) {
    if (_trgrt1I) {
      _trgrt1 = 0;
    } else {
      _trgrt1 = 1;
      _trgrt1I = 1;
    }
  } else {
    _trgrt1 = 0;
    _trgrt1I = 0;
  };
  if ((_gtv1) > (_gtv3))
  {
    _swi1 = 63488;
  }
  else
  {
    _swi1 = 2016;
  }
  if (!((_gtv1) > (_gtv3))) {
    if (_trgrt2I) {
      _trgrt2 = 0;
    } else {
      _trgrt2 = 1;
      _trgrt2I = 1;
    }
  } else {
    _trgrt2 = 0;
    _trgrt2I = 0;
  };
  if ((_gtv1) > (_gtv3))
  {
    _swi2 = 2;
  }
  else
  {
    _swi2 = 0;
  }
  if (_changeNumber1_Out) {
    _changeNumber1_Out = 0;
  } else {
    _hasNumberChangeInTemp = _gtv1;
    if (_hasNumberChangeInTemp != _changeNumber1_OLV) {
      _changeNumber1_OLV = _hasNumberChangeInTemp;
      _changeNumber1_Out = 1;
    }
  }
  if (_changeNumber1_Out) {
    if (! _nextionSetAttr1_oldState ) {
      _nextionSetAttr1_oldState = 1;
      _nextionSetAttr1_isNU = 1;
      _nextionSaveDataTXT_P0_E3 =  ((( _floatToStringWitRaz((_gtv1) / (10.00), 1))) + (String(" C"))) ;
    }
  } else {
    _nextionSetAttr1_oldState = 0;
  } if (_nextionSetAttr1_isNU) {
    _nextionCommandTempString = String("page0.tnt.txt=\"") + _nextionSaveDataTXT_P0_E3 + String("\"");
    nextionSendCommand(_nextionCommandTempString.c_str(), 100);  nextionAck(100);
    _nextionSetAttr1_isNU = 0;
  } if (_changeNumber1_Out) {
    if (! _nextionSetAttr2_oldState ) {
      _nextionSetAttr2_oldState = 1;
      _nextionSetAttr2_isNU = 1;
      _nextionSaveDataVAL_P0_E2 =  (map((_gtv1), (-400), (500), (10), (91))) ;
    }
  } else {
    _nextionSetAttr2_oldState = 0;
  } if (_nextionSetAttr2_isNU) {
    _nextionCommandTempString = String("page0.tpb.val=") + String(_nextionSaveDataVAL_P0_E2);
    nextionSendCommand(_nextionCommandTempString.c_str(), 100);  nextionAck(100);
    _nextionSetAttr2_isNU = 0;
  } if (( (_trgrt1) || (_trgrt2) )) {
    if (! _nextionSetAttr3_oldState ) {
      _nextionSetAttr3_oldState = 1;
      _nextionSetAttr3_isNU = 1;
      _nextionSaveDataPCO_P0_E3 =  _swi1 ;
    }
  } else {
    _nextionSetAttr3_oldState = 0;
  }
  if (nextionAskPageNamper(100) == 0) {
    if (_nextionSetAttr3_isNU) {
      _nextionCommandTempString = String("page0.tnt.pco=") + String(_nextionSaveDataPCO_P0_E3);
      nextionSendCommand(_nextionCommandTempString.c_str(), 100);  nextionAck(100);
      _nextionCommandTempString = "ref tnt";
      nextionSendCommand(_nextionCommandTempString.c_str(), 100);  nextionAck(100);
      _nextionSetAttr3_isNU = 0;
    }
  } else {
    _nextionSetAttr3_isNU = 1;
  }
  if (( (_trgrt1) || (_trgrt2) )) {
    if (! _nextionSetAttr4_oldState ) {
      _nextionSetAttr4_oldState = 1;
      _nextionSetAttr4_isNU = 1;
      _nextionSaveDataPICC_P0_E4 =  _swi2 ;
    }
  } else {
    _nextionSetAttr4_oldState = 0;
  }
  if (nextionAskPageNamper(100) == 0) {
    if (_nextionSetAttr4_isNU) {
      _nextionCommandTempString = String("page0.tci.picc=") + String(_nextionSaveDataPICC_P0_E4);
      nextionSendCommand(_nextionCommandTempString.c_str(), 100);  nextionAck(100);
      _nextionCommandTempString = "ref tci";
      nextionSendCommand(_nextionCommandTempString.c_str(), 100);  nextionAck(100);
      _nextionSetAttr4_isNU = 0;
    }
  } else {
    _nextionSetAttr4_isNU = 1;
  }
  if (((map((_gtv2), (0), (100), (-46), (226)))) < (0))
  {
    _swi3 = ((map((_gtv2), (0), (100), (-46), (226)))) + (360);
  }
  else
  {
    _swi3 = (map((_gtv2), (0), (100), (-46), (226)));
  }
  if (_changeNumber2_Out) {
    _changeNumber2_Out = 0;
  } else {
    _hasNumberChangeInTemp = _gtv2;
    if (_hasNumberChangeInTemp != _changeNumber2_OLV) {
      _changeNumber2_OLV = _hasNumberChangeInTemp;
      _changeNumber2_Out = 1;
    }
  }
  if (_changeNumber2_Out) {
    if (! _nextionSetAttr5_oldState ) {
      _nextionSetAttr5_oldState = 1;
      _nextionSetAttr5_isNU = 1;
      _nextionSaveDataVAL_P1_E4 =  _gtv2 ;
    }
  } else {
    _nextionSetAttr5_oldState = 0;
  } if (_nextionSetAttr5_isNU) {
    _nextionCommandTempString = String("page1.humN.val=") + String(_nextionSaveDataVAL_P1_E4);
    nextionSendCommand(_nextionCommandTempString.c_str(), 100);  nextionAck(100);
    _nextionSetAttr5_isNU = 0;
  } if (_changeNumber2_Out) {
    if (! _nextionSetAttr6_oldState ) {
      _nextionSetAttr6_oldState = 1;
      _nextionSetAttr6_isNU = 1;
      _nextionSaveDataVAL_P1_E2 =  _swi3 ;
    }
  } else {
    _nextionSetAttr6_oldState = 0;
  } if (_nextionSetAttr6_isNU) {
    _nextionCommandTempString = String("page1.humG.val=") + String(_nextionSaveDataVAL_P1_E2);
    nextionSendCommand(_nextionCommandTempString.c_str(), 100);  nextionAck(100);
    _nextionSetAttr6_isNU = 0;
  } if (1) {
    if (! _gen1I) {
      _gen1I = 1;
      _gen1O = 1;
      _gen1P = millis();
    }
  } else {
    _gen1I = 0 ;
    _gen1O = 0;
  }
  if (_gen1I) {
    if ( _isTimer ( _gen1P , 5000 )) {
      _gen1P = millis();
      _gen1O = ! _gen1O;
    }
  }
  if (_gen1O) {
    if (_trgrt5I) {
      _trgrt5 = 0;
    } else {
      _trgrt5 = 1;
      _trgrt5I = 1;
    }
  } else {
    _trgrt5 = 0;
    _trgrt5I = 0;
  };
  if (_gtv4) {
    if (_trgrt3I) {
      _trgrt3 = 0;
    } else {
      _trgrt3 = 1;
      _trgrt3I = 1;
    }
  } else {
    _trgrt3 = 0;
    _trgrt3I = 0;
  };
  _gtv4 = (NextionPanel_47525121_PageIdOut) == (2);
  _gtv5 = _trgrt5;
  if (_trgrt3) {
    if ( ! _nextionAddPointToWave1_OldState) {
      _nextionAddPointToWave1_OldState = 1;
      if (nextionAskPageNamper(100) == 2) {
        for (int nextionSATWTemp = 0;  nextionSATWTemp < 330;  nextionSATWTemp ++) {
          _nextionCommandTempString = String ("add 1,1,") + String (_FLPArray142003126[nextionSATWTemp]);
          nextionSendCommand(_nextionCommandTempString.c_str(), 100);
        } delay (50);
      }
    }
  } else {
    _nextionAddPointToWave1_OldState = 0;
  }

  if (_trgrt3) {
    if ( ! _nextionAddPointToWave2_OldState) {
      _nextionAddPointToWave2_OldState = 1;
      if (nextionAskPageNamper(100) == 2) {
        for (int nextionSATWTemp = 0;  nextionSATWTemp < 330;  nextionSATWTemp ++) {
          _nextionCommandTempString = String ("add 1,0,") + String (_FLPArray239384258[nextionSATWTemp]);
          nextionSendCommand(_nextionCommandTempString.c_str(), 100);
        } delay (50);
      }
    }
  } else {
    _nextionAddPointToWave2_OldState = 0;
  }

  if (_gtv5) {
    if (!_SFLPAS1) {
      _SFLPAS1 =  1;
      for (_SUETFLPATemp = 0; _SUETFLPATemp < 329; _SUETFLPATemp = _SUETFLPATemp + 1 ) {
        _FLPArray239384258[_SUETFLPATemp ] = _FLPArray239384258[_SUETFLPATemp + 1];
      }  _FLPArray239384258[329] = _gtv2;
    }
  }  else {
    _SFLPAS1 = 0;
  }
  _gtv6 = ((_gtv1) / (5)) + (160);
  if (_gtv5) {
    if (!_SFLPAS2) {
      _SFLPAS2 =  1;
      for (_SUETFLPATemp = 0; _SUETFLPATemp < 329; _SUETFLPATemp = _SUETFLPATemp + 1 ) {
        _FLPArray142003126[_SUETFLPATemp ] = _FLPArray142003126[_SUETFLPATemp + 1];
      }  _FLPArray142003126[329] = _gtv6;
    }
  }  else {
    _SFLPAS2 = 0;
  }
  if (( (_gtv5) && (!(_trgrt3)) && (_gtv4) )) {
    if ( ! _nextionSendArraytToWave1_OldState) {
      _nextionSendArraytToWave1_OldState = 1;
      if (nextionAskPageNamper(100) == 2) {
        _nextionCommandTempString = String ("add 1,0,") + String (_gtv2);
        nextionSendCommand(_nextionCommandTempString.c_str(), 100); delay (50);
      }
    }
  } else {
    _nextionSendArraytToWave1_OldState = 0;
  }

  if (( (_gtv5) && (!(_trgrt3)) && (_gtv4) )) {
    if ( ! _nextionSendArraytToWave2_OldState) {
      _nextionSendArraytToWave2_OldState = 1;
      if (nextionAskPageNamper(100) == 2) {
        _nextionCommandTempString = String ("add 1,1,") + String (_gtv6);
        nextionSendCommand(_nextionCommandTempString.c_str(), 100); delay (50);
      }
    }
  } else {
    _nextionSendArraytToWave2_OldState = 0;
  }

  if (_changeNumber3_Out) {
    _changeNumber3_Out = 0;
  } else {
    _hasNumberChangeInTemp = (map(( (analogRead (0))), (0), (1023), (0), (100)));
    if (((_hasNumberChangeInTemp > _changeNumber3_OLV) && ((_hasNumberChangeInTemp - _changeNumber3_OLV ) > 5)) || ((_hasNumberChangeInTemp < _changeNumber3_OLV) && ((_changeNumber3_OLV - _hasNumberChangeInTemp ) > 5) ))
    {
      _changeNumber3_OLV = _hasNumberChangeInTemp;
      _changeNumber3_Out = 1;
    }
  }
  if (_changeNumber3_Out) {
    if (!(_nextionSetLighting1_OldStae)) {
      _nextionSetLighting1_OldStae = 1;
      _nextionCommandTempString = String("dim=") + String((map(( (analogRead (0))), (0), (1023), (0), (100))));
      nextionSendCommand(_nextionCommandTempString.c_str(), 100);
    }
  } else {
    _nextionSetLighting1_OldStae = 0;
  }




}
bool _isTimer(unsigned long startTime, unsigned long period )
{
  unsigned long currentTime;
  currentTime = millis();
  if (currentTime >= startTime) {
    return (currentTime >= (startTime + period));
  } else {
    return (currentTime >= (4294967295 - startTime + period));
  }
}
String  _floatToStringWitRaz(float value, int raz)
{
  float tv;
  int ti = int(value);
  String ts = String(ti);
  if (raz == 0) {
    return ts;
  }
  ts += ".";
  float tf = abs(value - ti);
  for (int i = 1; i <= raz; i++ )
  {
    tv = tf * 10;
    ti = int(tv);
    ts += String(ti);
    tf = (tv - ti);
  }
  return ts;
}
void nextionSendCommand(const char* cmd, byte port )
{
  while (Serial100.available()) {
    Serial100.read();
  }
  Serial100.print(cmd);
  Serial100.write(0xFF);
  Serial100.write(0xFF);
  Serial100.write(0xFF);
}
boolean nextionAck( byte port )
{
  uint8_t bytes[4] = {0};
  Serial100.setTimeout(20); if (sizeof(bytes) != Serial100.readBytes((char *)bytes, sizeof(bytes))) {
    return 0;
  }

  if ((bytes[1] == 0xFF) && (bytes[2] == 0xFF) && (bytes[3] == 0xFF)) {
    switch (bytes[0]) {
      case 0x00:
        return false; break;
      case 0x01:
        return true; break;
      default:
        return false;
    }
  }
}
struct _nextionLissenStruct nextionListen( byte port )
{
  char _bite;
  char _end = 0xff;
  String cmd;
  _nextionLissenStruct temp;
  int countEnd = 0;
  delay(10);
  while (Serial100.available() > 0) {
    if (Serial100.available() > 0) {
      _bite = Serial100.read();
      cmd += _bite;
      if (_bite == _end) {
        countEnd++;
      }
      if (countEnd == 3) {
        break;
      }
    }
  }
  temp.result = "";
  temp.code = 'z';
  temp.number = 0;
  switch (cmd[0]) {
    case 'e':
      temp.code = 'e';
      countEnd = 0;
      for (uint8_t i = 0; i < cmd.length(); i++) {
        if (cmd[i] == _end) {
          countEnd++;
        }
        temp.result += String(cmd[i], HEX);
        if (countEnd == 3) {
          return temp;
        }
        temp.result += " ";
      }
      break;
    case 'f':
      temp.code = 'f';
      temp.result = String(cmd[1], DEC);
      return temp;
      break;
    case 'g':
      temp.code = 'g';
      temp.result = String(cmd[2], DEC) + "," + String(cmd[4], DEC) + "," + String(cmd[5], DEC);
      return temp;
      break;
    case 'h':
      temp.code = 'h';
      temp.result = String(cmd[2], DEC) + "," + String(cmd[4], DEC) + "," + String(cmd[5], DEC);
      temp.result = "68 " + temp.result;
      return temp;
      break;
    case 'p':
      temp.code = 'p';
      temp.result = cmd.substring(1, cmd.length() - 3);
      return temp;
      break;
    case 'q':
      temp.code = 'q';
      temp.number = (cmd[4] << 24) | (cmd[3] << 16) | (cmd[2] << 8) | (cmd[1]);
      return temp;
      break;
    default:
      return temp;
      break;
  }
  return temp;
}
int nextionAskPageNamper(byte port)
{
  int result;
  _nextionLissenStruct temp;
  nextionSendCommand("sendme", port);
  temp = nextionListen(port);
  if ((temp.code == 'f') && (temp.result != "")) {
    result = temp.result.toInt();
  } else {
    result = -1;
  }
  return result;
}


带有演示的简短视频。


归档面板的项目和控制器的项目。
在下一课中,我们将从面板上学习如何控制Arduino控制器。

Source: https://habr.com/ru/post/zh-CN392685/


All Articles