本帖最后由 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.电流和电压检测 原理图如下 程序简单分析一下
上面图片主要是单片机把相关数据上传给触摸屏,刚开机写入 默认值- if(special_code!=eeprom_fst) //首次,写入特殊码和默认值
- {
- resin_change_set=300;//(fac)树脂更换周期,默认值为清洗树脂次数300次
- set_filter_change=50;//(fac) 滤芯和活性炭更换周期,默认值为清洗树脂次数50次
- set_R_change=100;//(fac) R膜更换周期,默认值为清洗树脂次数100次
- // resin_change_set=7;//(test)树脂更换周期,默认值为清洗树脂次数300次
- // set_filter_change=5;//(test) 滤芯和活性炭更换周期,默认值为清洗树脂次数50次
- // set_R_change=6;// (test)R膜更换周期,默认值为清洗树脂次数100次
- pump_start_pres_set=1.0;//增压泵启动压力,默认1.0 bar
- pump_start_pres_save=pump_start_pres_set*10;
- SN_set=123456789;//序列号默认是1-9
- key_set=123456789;//密码默认是1-9
- // add_water_time_set=5;//(test)盐桶进水时间,单位s
- add_water_time_set=190;//(fac)盐桶进水时间,单位s
- add_water_time_cnt=((unsigned long int)add_water_time_set*1000);//unit,ms
- // match_time_set=5;//(test)盐水泵配比时间5s,单位s
- match_time_set=1500;//(fac)盐水泵配比时间25min,单位s
- Match_cnt=(unsigned long int)match_time_set*1000;//unit,ms
- Match_hcnt=(unsigned long int)match_time_set*1000;//unit,ms
- match_time_min=match_time_set/60.0;//转换成min
- reverse_clean_set=300;//(fac)反冲洗时间,单位s
- // reverse_clean_set=5;//(test)反冲洗时间,单位s
- rev_clean_Time=reverse_clean_set/60.0;//转换成min
- UF_time_set=30;//(fac)超滤时间,单位s
- // UF_time_set=5;//(test)超滤时间,单位s
- UF_time_cnt=UF_time_set;
- UF_drain_TIME_CNT=(unsigned long int)UF_time_cnt*1000;//unit,ms
- UF_drain_TIME_hCNT=(unsigned long int)UF_time_cnt*1000;//unit,ms
- sum_flow_big_save=0;//累计水量保存值
- clean_times=0;//树脂清洗次数,反冲洗后会清零
- cnt_add_salt=0;//加盐次数累加量,更换树脂后会清零
- sum_clean_PP_times=0;//树脂清洗累计次数
- volume_clean_water_save=0;//清洗水量,单位毫升
- clean_state=0x00;//状态变量清零
- add_saltwater_cnt=0;//需要手动加盐的累计清洗次数
- sum_filter_change=0;//需要更换滤芯的累计清洗次数
- sum_R_film_change=0;
- save_para();
-
- }
复制代码 如果不是第一次开机的话,可以从eeprom中把相关数据上传到屏幕上- else //读出上次保存的值
- {
- resin_change_set=256*ByteRead(0x0001)+ByteRead(0x0002); //树脂更换周期
- set_filter_change=256*ByteRead(0x0003)+ByteRead(0x0004); //滤芯和活性炭更换周期
- set_R_change=256*ByteRead(0x0005)+ByteRead(0x0006); //R膜更换周期
- pump_start_pres_save=256*ByteRead(0x0007)+ByteRead(0x0008);//增压泵启动压力设置
- pump_start_pres_set=pump_start_pres_save/10.0;
- 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);
- 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);
- add_water_time_set=256*ByteRead(0x0011)+ByteRead(0x0012); //加水时间设置
- add_water_time_cnt=((unsigned long int)add_water_time_set*1000);//unit,ms 加水时间倒计时
- match_time_set=256*ByteRead(0x0013)+ByteRead(0x0014);//单位s,盐水泵配比时间设置
- Match_cnt=(unsigned long int)match_time_set*1000;//unit,ms
- Match_hcnt=(unsigned long int)match_time_set*1000;//unit,ms
- match_time_min=match_time_set/60.0;//转换成min
- reverse_clean_set=256*ByteRead(0x0015)+ByteRead(0x0016); //反冲洗时间设置
- rev_clean_Time=reverse_clean_set/60.0;//转换成min
- UF_time_set=256*ByteRead(0x0017)+ByteRead(0x0018);
- UF_time_cnt=UF_time_set;//超滤排水倒计时变量初始化
-
- UF_drain_TIME_CNT=(unsigned long int)UF_time_cnt*1000;//unit,ms
- UF_drain_TIME_hCNT=(unsigned long int)UF_time_cnt*1000;//unit,ms
- // volume_clean_water_save=256*ByteRead(0x0019)+ByteRead(0x001A);//******清洗水量,单位0.1L
- // volume_clean_water=volume_clean_water_save/10.0;//单位为L
- clean_times=256*ByteRead(0x001B)+ByteRead(0x001C); //清洗次数
- cnt_add_salt=256*ByteRead(0x001D)+ByteRead(0x001E); //加盐次数
- sum_clean_PP_times=256*ByteRead(0x001F)+ByteRead(0x0020); //树脂清洗次数
- 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);//******累计水量
- clean_state=256*ByteRead(0x0025)+ByteRead(0x0026);
- add_saltwater_cnt=256*ByteRead(0x0027)+ByteRead(0x0028);
- sum_filter_change=256*ByteRead(0x0029)+ByteRead(0x002A);
- sum_R_film_change=256*ByteRead(0x002B)+ByteRead(0x002C);
- // volume_clean_water_save=256*ByteRead(0x002D)+ByteRead(0x002E);//******清洗水量,单位0.1L
- // volume_clean_water=volume_clean_water_save/10.0;//单位为L
-
- //sum_pulse_big=256*ByteRead(0x002F)+ByteRead(0x0030);//******脉冲总数
-
- 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);//******累计水量
-
- if(clean_state&0x80)
- {
- lack_salt_flag=1; //缺盐报警
- }else
- {
- lack_salt_flag=0;
- }
- if(clean_state&0x40) //滤芯更换报警
- {
- filter_error_flag=1;
- }else
- {
- filter_error_flag=0;
- }
- if(clean_state&0x20) //R膜更换报警
- {
- R_film_error_flag=1;
- }else
- {
- R_film_error_flag=0;
- }
- if(clean_state&0x10) //树脂更换报警
- {
- resin_error_flag=1;
- }else
- {
- resin_error_flag=0;
- }
-
- }
复制代码
主界面如下
|