迪文科技论坛

 找回密码
 立即注册
搜索
查看: 3883|回复: 12

【开源】迪文屏水处理控制系统

[复制链接]

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
发表于 2021-6-4 11:40:12 | 显示全部楼层 |阅读模式
本帖最后由 lihui163 于 2021-6-8 10:19 编辑

今天给大家分享一个水处理控制系统
不管是大型的水处理系统,还是小型的净水机,智能化控制的话都离不开触摸屏了,从医疗供水到工业饮用水,再到民用净水系统,咱们的迪文屏应用非常广的
我们看看这个饮水机的主要功能
滤芯更换这块,我们采用无线传输数据来提醒需要更换滤芯了,或者喇叭报警方式

上电默认状态:各电磁阀和泵都断电,不工作。
大流量传感器计量的是软化水入口的清洗水量。
清洗次数:累计水量:累计次数:加盐次数:这些在触摸屏上非常直观的显示相关数据
加盐是手动的,加完后需要按键确认。
清洗树脂是自动的,在用户首次安装时,树脂可手动清洗。
更换树脂是手动的,更换完成后需要按键确认。
更换滤芯和活性炭是手动的,更换完成后需要按键确认。
小流量传感器计量的纯净水入口的进水量,根据这个流量值开启R膜增压泵。当瞬时流量大于15mL/s时,10#继电器通电,R膜增压泵启动;当瞬时流量小于1mL/s时,10#继电器断电,R膜增压泵停止。
单片机上电后自动进入工作状态,从Flash中调入系统参数,实时检测各传感器信息(水量累计、流量、电压、电流、水压等7个量)。
当收到触摸屏从欢迎界面到主界面的切换信号时,把各参数上传给触摸屏。
    当清洗水量≥1.2t时,自动清洗树脂:1#继电器通电,电磁阀关闭;3#和4#继电器通电25分钟后断电,进行树脂交换;1#继电器断电,电磁阀开启;9#继电器通电,罐底部排水阀打开,正洗排水5分钟后9#继电器断电,罐底部排水阀关闭;6#继电器通电,超滤排水阀打开,30秒后6#继电器断电,超滤排水阀关闭;此时清洗次数+1,累计次数+1,清洗水量清零。
    当清洗次数=9时,通过蜂鸣器和触摸屏提示信息,提示用户联系专业人员上门加盐,间隔5小时提醒一次,当提醒5次仍没有加盐,停机(1#继电器通电),直到加盐后恢复正常。加盐确定后,加盐次数+1,取消提示。
当清洗次数=10时,反清洗树脂:5#继电器通电2秒后,7#和8#继电器通电,5分钟后5#、7#、8#继电器同时断电。清洗次数清零。
当累计次数=50的倍数时(可自己定义一个滤芯更换变量),更换滤芯和活性炭:通过蜂鸣器和触摸屏提示信息,提示用户联系专业人员上门更换滤芯,间隔5小时提醒一次,不停机,继续使用。更换滤芯按键确认后,取消提示。
当累计次数=300时,更换树脂:通过蜂鸣器和触摸屏提示信息,提示用户联系专业人员上门更换树脂,间隔5小时提醒一次,不停机,继续使用。更换树脂按键确认后,累计次数清零,累计水量清零,取消提示。
需要掉电保存的数据(掉电是随机的):设置参数修改时马上保存(如树脂更换周期、滤芯和活性炭更换周期、R膜更换周期、增压泵启动压力、产品SN、盐桶进水时间、
盐水泵配比时间、反冲洗时间、超滤排水时间等),过程参数可定时保存(如次数,水量等)。系统上电时自动读入。
加水按键:手动加盐后,专业人员点击“加水”按键时,2#继电器通电,盐桶加水,3分10秒后2#继电器断电,停止加水。
恢复出厂设置:所有参数恢复默认值,并写入flash。
系统增压泵启动条件:根据压力传感器的检测值,当压力小于2.5bar且对外供水时,11#继电器通电,启动增压泵;当压力大于4.0bar时,11#继电器断电,关闭增压泵。
    故障自诊断与报警功能:作为系统的辅助功能,但很重要。根据检测到的电压、电流和流量等信息,可靠地判断系统的工作状态,当超出正常状态时,通过触摸屏和蜂鸣器报警提示,便于维修人员排查故障原因。
整体功能还是比较复杂的,具体电气参数如下
1.由于stm32单片机疯涨,现在国产替代,单片机选用STC15F4K48S4。
2.通讯采用232和WIFI
3.电磁阀驱动
4.流量和压力检测
5.电流和电压检测
原理图如下
程序简单分析一下


上面图片主要是单片机把相关数据上传给触摸屏,刚开机写入 默认值
  1. if(special_code!=eeprom_fst) //首次,写入特殊码和默认值
  2.            {
  3.                         resin_change_set=300;//(fac)树脂更换周期,默认值为清洗树脂次数300次
  4.                         set_filter_change=50;//(fac)        滤芯和活性炭更换周期,默认值为清洗树脂次数50次
  5.             set_R_change=100;//(fac)        R膜更换周期,默认值为清洗树脂次数100次

  6. //                        resin_change_set=7;//(test)树脂更换周期,默认值为清洗树脂次数300次
  7. //                        set_filter_change=5;//(test)        滤芯和活性炭更换周期,默认值为清洗树脂次数50次
  8. //            set_R_change=6;//        (test)R膜更换周期,默认值为清洗树脂次数100次
  9.                         pump_start_pres_set=1.0;//增压泵启动压力,默认1.0 bar
  10.                         pump_start_pres_save=pump_start_pres_set*10;
  11.                         SN_set=123456789;//序列号默认是1-9
  12.                         key_set=123456789;//密码默认是1-9
  13. //      add_water_time_set=5;//(test)盐桶进水时间,单位s
  14.                         add_water_time_set=190;//(fac)盐桶进水时间,单位s
  15.                   add_water_time_cnt=((unsigned long int)add_water_time_set*1000);//unit,ms
  16. //                        match_time_set=5;//(test)盐水泵配比时间5s,单位s
  17.                         match_time_set=1500;//(fac)盐水泵配比时间25min,单位s
  18.                         Match_cnt=(unsigned long int)match_time_set*1000;//unit,ms
  19.                         Match_hcnt=(unsigned long int)match_time_set*1000;//unit,ms
  20.                         match_time_min=match_time_set/60.0;//转换成min
  21.                         reverse_clean_set=300;//(fac)反冲洗时间,单位s
  22. //                        reverse_clean_set=5;//(test)反冲洗时间,单位s
  23.                         rev_clean_Time=reverse_clean_set/60.0;//转换成min
  24.                         UF_time_set=30;//(fac)超滤时间,单位s
  25. //                        UF_time_set=5;//(test)超滤时间,单位s
  26.                         UF_time_cnt=UF_time_set;
  27.                         UF_drain_TIME_CNT=(unsigned long int)UF_time_cnt*1000;//unit,ms
  28.                         UF_drain_TIME_hCNT=(unsigned long int)UF_time_cnt*1000;//unit,ms
  29.                         sum_flow_big_save=0;//累计水量保存值
  30.                         clean_times=0;//树脂清洗次数,反冲洗后会清零
  31.                         cnt_add_salt=0;//加盐次数累加量,更换树脂后会清零

  32.                         sum_clean_PP_times=0;//树脂清洗累计次数
  33.                         volume_clean_water_save=0;//清洗水量,单位毫升
  34.                         clean_state=0x00;//状态变量清零
  35.                         add_saltwater_cnt=0;//需要手动加盐的累计清洗次数
  36.                         sum_filter_change=0;//需要更换滤芯的累计清洗次数
  37.                         sum_R_film_change=0;
  38.                         save_para();
  39.                
  40.                 }
复制代码
如果不是第一次开机的话,可以从eeprom中把相关数据上传到屏幕上
  1. else          //读出上次保存的值
  2.            {
  3.                          resin_change_set=256*ByteRead(0x0001)+ByteRead(0x0002);        //树脂更换周期
  4.                          set_filter_change=256*ByteRead(0x0003)+ByteRead(0x0004);        //滤芯和活性炭更换周期
  5.                          set_R_change=256*ByteRead(0x0005)+ByteRead(0x0006);                                        //R膜更换周期
  6.                          pump_start_pres_save=256*ByteRead(0x0007)+ByteRead(0x0008);//增压泵启动压力设置
  7.                          pump_start_pres_set=pump_start_pres_save/10.0;
  8.                          SN_set=((unsigned long int)ByteRead(0x0009)<<24)|((unsigned long int)ByteRead(0x000A)<<16)|((unsigned long int)ByteRead(0x000B)<<8)|(unsigned long int)ByteRead(0x000C);
  9.                          key_set=((unsigned long int)ByteRead(0x000D)<<24)|((unsigned long int)ByteRead(0x000E)<<16)|((unsigned long int)ByteRead(0x000F)<<8)|(unsigned long int)ByteRead(0x0010);
  10.                          add_water_time_set=256*ByteRead(0x0011)+ByteRead(0x0012);        //加水时间设置
  11.                   add_water_time_cnt=((unsigned long int)add_water_time_set*1000);//unit,ms                加水时间倒计时
  12.                          match_time_set=256*ByteRead(0x0013)+ByteRead(0x0014);//单位s,盐水泵配比时间设置
  13.                          Match_cnt=(unsigned long int)match_time_set*1000;//unit,ms
  14.                          Match_hcnt=(unsigned long int)match_time_set*1000;//unit,ms
  15.                   match_time_min=match_time_set/60.0;//转换成min
  16.                          reverse_clean_set=256*ByteRead(0x0015)+ByteRead(0x0016);        //反冲洗时间设置
  17.                          rev_clean_Time=reverse_clean_set/60.0;//转换成min
  18.                          UF_time_set=256*ByteRead(0x0017)+ByteRead(0x0018);
  19.                          UF_time_cnt=UF_time_set;//超滤排水倒计时变量初始化
  20.                         
  21.                          UF_drain_TIME_CNT=(unsigned long int)UF_time_cnt*1000;//unit,ms
  22.                          UF_drain_TIME_hCNT=(unsigned long int)UF_time_cnt*1000;//unit,ms
  23. //                         volume_clean_water_save=256*ByteRead(0x0019)+ByteRead(0x001A);//******清洗水量,单位0.1L
  24. //                         volume_clean_water=volume_clean_water_save/10.0;//单位为L        
  25.                          clean_times=256*ByteRead(0x001B)+ByteRead(0x001C);        //清洗次数
  26.                          cnt_add_salt=256*ByteRead(0x001D)+ByteRead(0x001E);                //加盐次数                                                                                                                                 
  27.                          sum_clean_PP_times=256*ByteRead(0x001F)+ByteRead(0x0020);                //树脂清洗次数
  28.                          sum_flow_big_save=((unsigned long int)ByteRead(0x0021)<<24)|((unsigned long int)ByteRead(0x0022)<<16)|((unsigned long int)ByteRead(0x0023)<<8)|(unsigned long int)ByteRead(0x0024);//******累计水量                                                                                                                                                  
  29.                          clean_state=256*ByteRead(0x0025)+ByteRead(0x0026);
  30.                          add_saltwater_cnt=256*ByteRead(0x0027)+ByteRead(0x0028);
  31.                          sum_filter_change=256*ByteRead(0x0029)+ByteRead(0x002A);
  32.                          sum_R_film_change=256*ByteRead(0x002B)+ByteRead(0x002C);

  33. //                         volume_clean_water_save=256*ByteRead(0x002D)+ByteRead(0x002E);//******清洗水量,单位0.1L
  34. //                         volume_clean_water=volume_clean_water_save/10.0;//单位为L
  35.                            
  36.                                  //sum_pulse_big=256*ByteRead(0x002F)+ByteRead(0x0030);//******脉冲总数
  37.                         
  38.                                  sum_pulse_big=((unsigned long int)ByteRead(0x002D)<<24)|((unsigned long int)ByteRead(0x002E)<<16)|((unsigned long int)ByteRead(0x002F)<<8)|(unsigned long int)ByteRead(0x0030);//******累计水量
  39.                                  
  40.                         if(clean_state&0x80)
  41.                         {
  42.                                  lack_salt_flag=1;        //缺盐报警
  43.                         }else
  44.                         {
  45.                                 lack_salt_flag=0;
  46.                         }
  47.                    if(clean_state&0x40)                //滤芯更换报警
  48.                         {
  49.                                  filter_error_flag=1;
  50.                         }else
  51.                         {
  52.                                 filter_error_flag=0;
  53.                         }
  54.                         if(clean_state&0x20)                //R膜更换报警
  55.                         {
  56.                                  R_film_error_flag=1;
  57.                         }else
  58.                         {
  59.                                 R_film_error_flag=0;
  60.                         }
  61.                         if(clean_state&0x10)                //树脂更换报警
  62.                         {
  63.                                  resin_error_flag=1;
  64.                         }else
  65.                         {
  66.                                 resin_error_flag=0;
  67.                         }
  68.                         
  69.                 }
复制代码

主界面如下


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
 楼主| 发表于 2021-6-8 10:29:30 | 显示全部楼层
本帖最后由 lihui163 于 2021-6-8 10:34 编辑
  1. if(new_data3_flag==1)//如果收到触摸屏发送的数据,收到完整的一帧数据
  2.                         {
  3.                                  Calculate_CRC(receive3_buf+3,UART3_R_length-5);//计算CRC,结果放在全局变量
  4.                                  if(receive3_buf[UART3_R_length-2]==CRC_L && receive3_buf[UART3_R_length-1]==CRC_H)//判断收到的数据是否正确
  5.                                  {
  6.                                          if(UART3_R_length==11)
  7.                                          {
  8.                                           switch(receive3_buf[5])//解析数据
  9.                                                  {
  10.                                                                  
  11.                                                          case 0x0a://超滤排水时间设置
  12.                                                          {
  13.                                                                   UF_time_set=256*receive3_buf[7]+receive3_buf[8];
  14.                                                                  UF_time_cnt=UF_time_set;//超滤排水倒计时变量初始化
  15.                                                                  UF_drain_TIME_CNT=(unsigned long int)UF_time_cnt*1000;//unit,ms
  16.                                                                  
  17.                                                                  UF_drain_TIME_hCNT=(unsigned long int)UF_time_cnt*1000;//unit,ms
  18.                                                                  save_para();
  19.                                                                  break;                                                                                                                                                  
  20.                                                          }
  21.                                                          case 0x0B://反冲洗时间设置
  22.                                                          {
  23.                                                                   rev_clean_Time=(256*receive3_buf[7]+receive3_buf[8]);//转换为带一位小数的分钟
  24.                                                                  reverse_clean_set=rev_clean_Time*60;//转换成秒
  25.                                                                  save_para();
  26.                                                                  break;                                                                                                                                                  
  27.                                                          }
  28.                                                          case 0x0c://盐水泵配比时间设置
  29.                                                          {
  30.                                                                   match_time_min=(256*receive3_buf[7]+receive3_buf[8]);//unit分钟,float
  31.                                                                  match_time_set=match_time_min*60;//转换成秒
  32.                                                                  Match_cnt=(unsigned long int)match_time_set*1000;//unit,ms
  33.                                                                  Match_hcnt=(unsigned long int)match_time_set*1000;//unit,ms
  34.                                                                  save_para();
  35.                                                                  break;                                                                                                                                                  
  36.                                                          }
  37.                                                          case 0x0d://盐桶进水时间设置
  38.                                                          {
  39.                                                                   add_water_time_set=256*receive3_buf[7]+receive3_buf[8];
  40.                                                       add_water_time_cnt=((unsigned long int)add_water_time_set*1000);//unit,ms
  41.                                                                  save_para();
  42.                                                                  break;                                                                                                                                                  
  43.                                                         
复制代码
上述程序是参数设置的,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
 楼主| 发表于 2021-6-8 13:55:15 | 显示全部楼层

上图所示,流量传感器和压力传感器,电压和电流信息都是每秒采样一次
  1. if(time_cnt_unit>=1000)//1秒钟计算一次
  2.                         {
  3.                                 time_cnt_unit=0;
  4.                                 //小流量传感器
  5.                                 T4T3M &=~0x80;                  //定时器4停止 计时
  6.                                 th4=T4H;
  7.                                 tl4=T4L;
  8.                                 th4_2=T4H;
  9.                                 if(th4==th4_2)//
  10.                                 {
  11.                                          pulse_num=th4_2*256+tl4;//计算一秒之内的脉冲数(小流量传感器)
  12.                                          T4H=0x00;//因为这个定时器不产生中断,所以初值设置为0
  13.                                             T4L=0x00;
  14.                                          T4T3M |=0x80;                  //定时器4开始计数                                         
  15.                                          current_flow=pulse_num/1059.0*60;//(pulse_num+5)/24瞬时流量L/min(小流量传感器)
  16.                                  
  17.                                  }
  18.                                 //大流量传感器
  19.                                 T4T3M &=~0x08;                  //定时器3停止 计时
  20.                                 th3=T3H;
  21.                                 tl3=T3L;
  22.                                 th3_2=T3H;
  23.                                 if(th3==th3_2)//
  24.                                 {
  25.                                          pulse_num_big=th3_2*256+tl3;//计算一秒之内的脉冲数(大流量传感器)
  26.                                          T3H=0x00;//因为这个定时器不产生中断,所以初值设置为0
  27.                        T3L=0x00;
  28.                                          T4T3M |=0x08;                  //定时器3开始计数                                         
  29.                                          
  30.                                  
  31.                                 }
  32.                                         TR0=1;
  33.                                        
  34.                                         //AD采样
  35.                                                 adc_reg=GetADCResult(0); //显示通道1,压力
  36.                                                 result=adc_reg*5.0/1024;//转化为电压,用V表示
  37.                                                 pressure=result*1.2;//A ;
  38.                                                 pressure_LCM=pressure*10;//乘以十倍,液晶上压力带一位小数

  39.                                           adc_reg=GetADCResult(1); //显示通道1,12V电压
  40.                                                 result=adc_reg*5.0/1024;//转化为电压,用V表示
  41.                                                 volt12=result*2.470588;//V;
  42.                                        
  43.                                           adc_reg=GetADCResult(2); //显示通道2,12v电流
  44.                                                 result=adc_reg*5.0/1024;//转化为电压,用V表示
  45.                                                 current12V=(result-2.5)/0.444;//A (result-2.5)/0.444;
  46.                                        
  47.                
  48.                                     adc_reg=GetADCResult(3); //显示通道3,24V电流,R膜增压泵
  49.                                                 result=adc_reg*5.0/1024;//转化为电压,用V表示
  50.                                                 R_booster_current=(result-2.5)/0.444;//A         (result-2.5)/0.444;
  51.                                        
  52.                                                 adc_reg=GetADCResult(4); //显示通道4,总循环泵电流,220VAC
  53.                                                 result=adc_reg*5.0/1024;//转化为电压,用V表示
  54.                                                 IMOT=result;//A

  55.                                                 adc_reg=GetADCResult(5); //显示通道4,24V电压
  56.                                                 result=adc_reg*5.0/1024;//转化为电压,用V表示
  57.                                                 volt24=result*5.166667;//V
  58.                                                
  59.                                                
  60.                         }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
 楼主| 发表于 2021-6-8 14:06:14 | 显示全部楼层
源码和工程上传附件了








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

27

主题

75

回帖

911

积分

高级会员

Rank: 4

积分
911
发表于 2021-6-22 16:29:01 | 显示全部楼层
感谢您的分享。目前迪文的主流智能屏产品是基于T5L系列芯片设计的,T5L芯片可以提供一个标准的8051核给客户当做单片机来使用,编程也是标准8051,这个核还可以提供IO、UART、AD/DA等外设接口,替换STC单片机一般是没有问题的。目前T5L芯片的智能屏开发板引出了芯片所有接口,还设置了JTAG仿真接口,会很方便。您后续可以考虑尝试一下~
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
 楼主| 发表于 2021-6-29 09:50:50 | 显示全部楼层
CCN 发表于 2021-6-22 16:29
感谢您的分享。目前迪文的主流智能屏产品是基于T5L系列芯片设计的,T5L芯片可以提供一个标准的8051核给客户 ...

JTAG可以仿真51?
回复

使用道具 举报

27

主题

75

回帖

911

积分

高级会员

Rank: 4

积分
911
发表于 2021-6-29 13:51:56 | 显示全部楼层

是的,通过迪文的仿真器HME05就可以做JTAG仿真了。只是标准智能屏没有把这个仿真口引出来,T5L系列的评估板是有JTAG仿真接口的,各类外设接口也都有。
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
 楼主| 发表于 2021-6-29 16:27:55 | 显示全部楼层
CCN 发表于 2021-6-29 13:51
是的,通过迪文的仿真器HME05就可以做JTAG仿真了。只是标准智能屏没有把这个仿真口引出来,T5L系列的评估 ...

标准的如果把仿真口留出来就好多了
回复

使用道具 举报

27

主题

75

回帖

911

积分

高级会员

Rank: 4

积分
911
发表于 2021-6-29 16:30:38 | 显示全部楼层
lihui163 发表于 2021-6-29 16:27
标准的如果把仿真口留出来就好多了

T5L评估板目前有3.5寸到10.1寸的多个尺寸和分辨率的规格,除了根据屏幕尺寸、分辨率选择了不同型号的T5L芯片外,外设接口等都是相同的。如果需要的话,可以通过业务员获取。
回复

使用道具 举报

2

主题

41

回帖

839

积分

高级会员

Rank: 4

积分
839
发表于 2021-7-20 09:49:08 | 显示全部楼层
lihui163 发表于 2021-6-29 16:27
标准的如果把仿真口留出来就好多了

5寸和4.3寸有五十个引脚的型号
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-24 18:21 , Processed in 0.079377 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表