查看: 1026|回复: 7

[已解决] 使用串口屏UART HMI与Arduino通信,并实现控制功能

[复制链接]

该用户从未签到

发表于 2019-5-12 15:33 | 显示全部楼层 |阅读模式
各位大佬帮帮忙,我在用一块串口屏做毕设。快答辩了,还是有些问题,强大佬们帮帮忙,不胜感谢file:///C:\Users\97047\AppData\Local\Temp\SGPicFaceTpBq\10568\10170888.png
现在的进展是我可以将获取到的传感器(温湿度)值显示在屏幕中,但还有一部分控制的功能需要实现。
主要是对设定的温度进行实时比对,然后控制继电器开断来控制一个报警器。
此外还要加入一个定时的功能,在一段时间后让继电器全部断开。
如图,现在已经能显示数据了,我想把报警温度(用滑块设置)发送到Arduino UNO板子上,让板子去判断并控制继电器开断
第二就是最右边的定时功能,定时都是固定的,但也要发到板子上,如何让板子区分收到的是温度还是定时呢?
自己的编程能力实在不行,请大佬给个模板,或者 逻辑思路。真的非常感谢,小弟在这里抱拳了。

kittenblock中小学创客名师推荐的图形化编程软件


#include "DFRobot_I2CMultiplexer.h"
//传感器都是I2C的,所以用了拓展板
#include <Wire.h>
#include <ClosedCube_SHT3XD.h>
//sht3x系列的温湿度传感器

DFRobot_I2CMultiplexer I2CMulti(0x70);   //I2C 拓展版Default Address: 0x70 
ClosedCube_SHT3XD sht3xd;

float T,RH;//浮点型的温湿度值
int a,b,c,d,x;//串口屏不能直接显示浮点型,用于将温湿度值整数小数分开再显示
int sign1=3;//四路继电器信号
int sign2=4;
int sign3=5;
int sign4=6;

int starttime;//定时开始
int dur;//定时时长
String dd;

float T0,T1,T2,T3,T4,Tp;//存储每个端口的温度值,TP为平均

void setup(void)
{
  Serial.begin(115200);
  sht3xd.begin(0x44);
  I2CMulti.selectPort(0);       //Select Port 0
  I2CMulti.selectPort(1);       //Select Port 1
  I2CMulti.selectPort(2);       //Select Port 2
  I2CMulti.selectPort(3);       //Select Port 3
  I2CMulti.selectPort(4);       //Select Port 4
  pinMode(sign1,OUTPUT);
  pinMode(sign2,OUTPUT);
  pinMode(sign3,OUTPUT);
  pinMode(sign4,OUTPUT);
  starttime = millis();//mills函数来控制定时时长
}

void loop(void)
{
  I2CMulti.selectPort(0);//选择端口
  printResult(sht3xd.readTempAndHumidity(REPEATABILITY_HIGH, MODE_POLLING, 50));//传感器的结果输出函数
  T0 = T;//存储温度值
  xianshi1();//显示函数,输出到串口屏指定控件
  delay(100);
  //后面的与上相同
  I2CMulti.selectPort(1);
  printResult(sht3xd.readTempAndHumidity(REPEATABILITY_HIGH, MODE_POLLING, 50));
  T1 = T;
  xianshi2();
  delay(100);
  
  I2CMulti.selectPort(2);
  printResult(sht3xd.readTempAndHumidity(REPEATABILITY_HIGH, MODE_POLLING, 50));
  T2 = T;
  xianshi3();
  delay(100);
  
  I2CMulti.selectPort(3);
  printResult(sht3xd.readTempAndHumidity(REPEATABILITY_HIGH, MODE_POLLING, 50));
  T3 = T;
  xianshi4();
  delay(100);
  
  I2CMulti.selectPort(4);
  printResult(sht3xd.readTempAndHumidity(REPEATABILITY_HIGH, MODE_POLLING, 50));
  T4 = T;
  xianshi5();
  delay(100);
//问题主要从这里开始,获取串口数据
  Tp=(T0+T1+T2+T3+T4)/5;//求平均温度
//检测串口是否有数据
  while(Serial.available()>0)
  {
    int x=Serial.read();//读取数据
  }
    //当温度低于报警温度且运行时间在定时时间内
  if (Tp < x)
  {
     digitalWrite(sign1,LOW);  //报警器关闭
     digitalWrite(sign2,HIGH); //汽阀开启
  }
  //当温度高于报警温度且运行时间在定时时间内
  else if(Tp > x)
  {
    digitalWrite(sign1,HIGH);  //报警器响
    digitalWrite(sign2,LOW); //汽阀关闭
  } 
  dingshi();
}
void printResult(SHT3XD result) //传感器结果输出函数
{
    T=result.t;
    RH=result.rh;
    a=T;
    b=(T-a)*100;
    c=RH;
    d=(RH-c)*100;
}

void dingshi()//定时函数
{
 while(Serial.available()>0)
 {
  dd=Serial.readString(); 
//想通过固定的字符串做标志位,设定时长
 if(dd=="111")
 {
  dur=600000;
  if(millis() - starttime > dur)
  {
    starttime = millis();
    digitalWrite(sign1,HIGH);
    digitalWrite(sign2,LOW);
    digitalWrite(sign3,LOW);
  }
  else
  {
    digitalWrite(sign1,LOW);
    digitalWrite(sign2,HIGH);
    digitalWrite(sign2,HIGH);
  }
  }
  if(dd=="222")
  {
    dur=900000;
  if(millis() - starttime > dur)
  {
    starttime = millis();
    digitalWrite(sign1,HIGH);
    digitalWrite(sign2,LOW);
    digitalWrite(sign3,LOW);
  }
  else
  {
    digitalWrite(sign1,LOW);
    digitalWrite(sign2,HIGH);
    digitalWrite(sign2,HIGH);
  }
  }
  if(dd=="333")
  {
    dur=1200000;
  if(millis() - starttime > dur)
  {
    starttime = millis();
    digitalWrite(sign1,HIGH);
    digitalWrite(sign2,LOW);
    digitalWrite(sign3,LOW);
  }
  else
  {
    digitalWrite(sign1,LOW);
    digitalWrite(sign2,HIGH);
    digitalWrite(sign2,HIGH);
  }
  }
  if(dd=="444")
  {
    dur=1500000;
  if(millis() - starttime > dur)
  {
    starttime = millis();
    digitalWrite(sign1,HIGH);
    digitalWrite(sign2,LOW);
    digitalWrite(sign3,LOW);
  }
  else
  {
    digitalWrite(sign1,LOW);
    digitalWrite(sign2,HIGH);
    digitalWrite(sign2,HIGH);
  }
  }
}
}
void xianshi1()//显示1号温度传感器数据
{
  Serial.print("A.t8.txt=\"");
  Serial.print(a);
  Serial.print(".");
  Serial.print(b);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.print("A.t9.txt=\"");
  Serial.print(c);
  Serial.print(".");
  Serial.print(d);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
} 
void xianshi2()//显示2号温度传感器数据
{
  Serial.print("A.t10.txt=\"");
  Serial.print(a);
  Serial.print(".");
  Serial.print(b);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.print("A.t11.txt=\"");
  Serial.print(c);
  Serial.print(".");
  Serial.print(d);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
} 
void xianshi3()//显示3号温度传感器数据
{
  Serial.print("A.t12.txt=\"");
  Serial.print(a);
  Serial.print(".");
  Serial.print(b);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.print("A.t13.txt=\"");
  Serial.print(c);
  Serial.print(".");
  Serial.print(d);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
} 
void xianshi4()//显示4号温度传感器数据
{
  Serial.print("A.t14.txt=\"");
  Serial.print(a);
  Serial.print(".");
  Serial.print(b);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.print("A.t15.txt=\"");
  Serial.print(c);
  Serial.print(".");
  Serial.print(d);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
} 
void xianshi5()//显示5号温度传感器数据
{
  Serial.print("A.t16.txt=\"");
  Serial.print(a);
  Serial.print(".");
  Serial.print(b);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.print("A.t17.txt=\"");
  Serial.print(c);
  Serial.print(".");
  Serial.print(d);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
} 

屏幕中各个控件及ID

屏幕中各个控件及ID

目前完成的显示功能

目前完成的显示功能
  • TA的每日心情
    奋斗
    2019-8-20 21:11
  • 签到天数: 170 天

    [LV.7]常住居民III

    发表于 2019-5-12 17:24 | 显示全部楼层
    你是不是有多个参数设置需要传到ardunino开发板?
    有多少个,你就在程序中设置多少个全局变量,发送的时候以逗号或分隔
    接收到的时候是你全部的设置参数字符串,用一个字符数组变量如re_date[200]进行接收
    使用循环对接收到的字符进行分割,然后赋值给你对应的变量,
    按你发送的顺序你就知道你接收到的顺序
    把分割后的字符转换成你定义的变量类型
    后面的看你写的程序你就该就会了
    打赏作者鼓励一下!

    该用户从未签到

     楼主| 发表于 2019-5-12 19:40 | 显示全部楼层
    老殷 发表于 2019-5-12 17:24
    你是不是有多个参数设置需要传到ardunino开发板?
    有多少个,你就在程序中设置多少个全局变量,发送的时候以 ...

    其实主要是两个,报警的温度和定时的时长。设定的温度通过滑块赋值给了n0数字控件显示,确认键按下的事件是将n0中的数值发送到串口。定时没想搞麻烦就取了四个固定的时长,放入了四个变量,每按下一个按键就会发送一个变量的值。您的意思我大概明白。可我的编程学的实在不堪,就您说的数组我不会用。如果您有时间能给个模板之类的吗?如何分割也想请教一下。

    该用户从未签到

     楼主| 发表于 2019-5-12 21:31 | 显示全部楼层
    老殷 发表于 2019-5-12 17:24
    你是不是有多个参数设置需要传到ardunino开发板?
    有多少个,你就在程序中设置多少个全局变量,发送的时候以 ...

    设置的报警温度和时长要传到板子上,温度是n0数字控件中显示的数值,在按下确定键后发送到串口。
    时长是固定的四个按钮控件。每个控件下放置了一个设置好的变量,按下对应的按钮会将变量发送到串口。这个变量可以是字符串也可以是数值。
    您的意思我大概明白,但我就是编程学的太差了,这个字符数组变量怎么设置有如何分割,您能给个链接或者简单的实例吗?谢谢
  • TA的每日心情
    无聊
    2016-12-23 16:50
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2019-5-12 22:35 | 显示全部楼层
    上面那位朋友的解决方法是Arduino串口批量数据的接收和处理,并不适用于你的项目。
    你在屏幕上点击按钮才会发送数据给Arduino,并且是每次发送一个数据,不需要什么数组来处理。
    唯一要做的是如何区分这些数据!也就是给数据做标记。
    这个你就要看串口屏的说明了,是否可以在发送数据的时候添加自定义的字符,如果可以的话,那你在不同数据前加上不同的字符就行了,Arduino收到后判断一下就能区分不同数据。

    该用户从未签到

     楼主| 发表于 2019-5-15 09:19 | 显示全部楼层
    skyhome 发表于 2019-5-12 22:35
    上面那位朋友的解决方法是Arduino串口批量数据的接收和处理,并不适用于你的项目。
    你在屏幕上点击按钮才会 ...

    串口屏给的资料里就一个串口输出语句“ prints va0.val,1” va0.val是要发送的数据和属性,1是长度。
    不知道您原来用的是这样的吗?按您的意思,可以在事件框中输入两个prints语句,一个用来发送特定字符,一个用来发送数据,但是在Arduino中的判断程序要如何编写呢?您能小写一段给个指导吗。我只知道Arduino中有这样的读值函数,但后续编写不会,麻烦您写一段可以吗?

    kittenblock中小学创客名师推荐的图形化编程软件

    while(Serial.available()>0)
       {  char inchar=Serial.read();
          delay(100);
          if()}
    串口输出语句.jpg

    该用户从未签到

    发表于 2019-5-15 11:15 | 显示全部楼层
    不知道,看上去很高级
  • TA的每日心情
    无聊
    2016-12-23 16:50
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2019-5-15 22:20 | 显示全部楼层
    prints函数的“备注第3条”中已经很清楚的说明配合printh可以为数据做标记。
    就是要发送2条命令,先用一个16进制标记不同数据,用printh 发送,再用prints发送数据,统计一下两条命令共发送了几个16进制数据,假设是5个。那么Arduino端循环接收5个数据,放在String变量中。判断第一个接收的字符就能知道是哪个组件发送的数据了。
    String readdata="";
    while ( Serial.available() >0 )
      {
          for (int i=0; i<5; i++){                  
               readdata+=char(Serial.read());
           }
         }  

    if ( readdata[0]=="xxx" ) {   //判断第一个字符是什么,下面代码你自己写吧
    }
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    Arduino lcd屏幕亮了但是不显示字符
    Arduino lcd屏幕亮了但是
    Arduino的lcd屏亮了但是上面没有字符显示,串进去的滑动变阻器也旋过了,但是还是没有
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    [限时福利]5分钟带你快速了解新一代开发板:M5STACK
    [限时福利]5分钟带你快速
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    【Arduino】108种传感器模块系列实验(98)---L298N电机驱动板
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    两个ESP8266通过云端实现远程数据交互
    两个ESP8266通过云端实现
    原理简述:利用发布订阅模式。一个ESP8266作为消息发布者,另一个ESP8266作为消息订阅
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表