【DIY】自动鱼缸控制系统——【三】

        就蹭这个标题吧,编程方面只涉及一点,绝大部分都和之前的一样,只是这次直接用了ESP32做的草缸。主要就说一个二氧化碳发生器的设计,以及一个定时UVC杀菌的设计。控制系统代码很简单:

// 
// 
// 

#include "AirControl.h"

uint8_t AirControl::channel = 6;
double AirControl::freq = 2441.40625;
uint8_t AirControl::resolution = 15;
uint8_t AirControl::AirPin;
uint32_t AirControl::AirPWM = 4096;			//32767
bool AirControl::PWMChanged = true;

unsigned long AirControl::SleepStart;
unsigned long AirControl::WorkStart;
unsigned long AirControl::SleepTime=60000;
unsigned long AirControl::WorkTime=1000;

void AirControl::Init(uint8_t pin)
{
	AirPin = pin;
	pinMode(AirPin, OUTPUT);
	digitalWrite(AirPin, LOW);
	ledcSetup(channel, freq, resolution);   // 设置通道0-7最高80mHz,8-15恒定40mHz
	ledcAttachPin(AirPin, channel);         // 将通道与对应的引脚连接
	SleepStart = millis();
	WorkStart = 0;
}

void AirControl::SetSpeed(int32_t Speed)
{
	AirPWM = uint32_t(0.01f * float(Speed) * 32767.0f);
	if (AirPWM < 8)AirPWM = 0;
	if (AirPWM > 32700)AirPWM = 32768;
	PWMChanged = true;
}

void AirControl::Loop(bool isLight)
{
	if (PWMChanged) {
		PWMChanged = false;
		Serial.print("AirPWM"); Serial.println((uint32_t)AirPWM);
	}
	if (isLight) {
		if (SleepStart != 0UL && WorkStart == 0UL) {
			if (millis() - SleepStart > SleepTime) {		//休息完毕
				WorkStart = millis();
				SleepStart = 0UL;
				ledcWrite(channel, AirPWM);
				Serial.println("2WORK");
			}
			else {
				ledcWrite(channel, 0);
			}
		}
		else if (SleepStart == 0UL && WorkStart != 0UL) {
			if (WorkStart + millis() > WorkTime) {		//工作完毕
				WorkStart = 0UL;
				SleepStart = millis();
				ledcWrite(channel, 0);
				Serial.println("2SLEEP");
			}
			else {
				ledcWrite(channel, AirPWM);
			}
		}
		else {
			SleepStart = millis();
			WorkStart = 0;
		}
	}
	else {
		SleepStart = millis();
		WorkStart = 0;
	}
}
// 
// 
// 

#include "UVCControl.h"
uint8_t UVCControl::UVCPin;
long UVCControl::StartTime = 0 * 3600 + 0 * 60 + 0;
long UVCControl::EndTime = 2 * 3600 + 0 * 60 + 0;

void UVCControl::Init(uint8_t pin)
{
	UVCPin = pin;
	pinMode(UVCPin, OUTPUT);
	digitalWrite(UVCPin, HIGH);	//UVC测试
}

void UVCControl::Loop(long NetTimeSecByDay)
{
	if (NetTimeSecByDay < 0)return;
	if (EndTime > StartTime) {	//本天
		if (NetTimeSecByDay >= StartTime && NetTimeSecByDay <= EndTime) {
			digitalWrite(UVCPin, HIGH);
		}
		else {
			digitalWrite(UVCPin, LOW);
		}
	}
	else {						//跨天
		if (NetTimeSecByDay >= StartTime || NetTimeSecByDay <= EndTime) {
			digitalWrite(UVCPin, HIGH);
		}
		else {
			digitalWrite(UVCPin, LOW);
		}
	}
	
}

这些控制都是建立在同步了时间之后,以秒为单位的。ESP32的PWM(LEDC)和Arduino比可以自定义的东西多一些,这次没有写有限状态机,就这么点控制,懒得写了(其实到现在也没弄HMI屏幕)。

然后说一下这两个的设计方案:

一、柠檬酸+小苏打+可乐瓶子+蠕动泵

虽然化学专业学的也不错,但实际真没用几下,也就不用卖弄了。众所周知(×)问度娘,小苏打(碳酸氢钠)的溶解度比较小,柠檬酸的比较大,反应产物柠檬酸钠的更大一些,方案就有了:

蠕动泵(可以控制速度,防止二氧化碳的压力导致倒流)抽柠檬酸饱和溶液滴入小苏打。称量啥啥的一概没有哈:

1、大半瓶水,加入柠檬酸直到饱和(意思就是你咋晃荡瓶子底下的柠檬酸都不再溶解了)

2、小半瓶小苏打,甭加水,干的就行。

3、导管接入1的瓶子底部(另留一个孔让空气进入),另一端接蠕动泵入水端

4、蠕动泵另一端接入2的瓶子底部(不到底也无所谓),瓶口另开一孔接出气软管,这个瓶子需要密封良好。

5、控制蠕动泵每隔几秒工作一次(细分的时间越短,工作时间越短气体越平稳,但并没有什么太大的用处不是么)

当1瓶内的饱和柠檬酸没了,重新填充,2瓶只需倒掉上层清液。

当2瓶内未溶解的碳酸氢钠没了,重新填充,1瓶重新加大半瓶饱和柠檬酸。

OK,没什么浪费,2个1L的可乐瓶子,如上述操作,坚持一星期差不多。价格自己某宝看看消耗品的价格算一下,应该不在贵的里面。

二、紫外LED+不锈钢密封罐+小流量泵

#include<cstdio>
using namespace std;

#define t 0.001	//1‰未处理 
//假定流经过滤器的水完全净化,水流回缸内即混合均匀。 
//共n升水、每秒过滤器处理x升
double n,x;
int lastk=101;

long long math(){
	double k=1.0;
	long long s=0;
	while(k>t){
		if(int(k*100)!=lastk){
			lastk=int(k*100);
			printf("%04d秒: %.2lf\%\n",s,k*100.0);
		}
		k-=k*x/n;
		s+=1;
	}
	printf("%04d秒: %.2lf\%\n",s,k*100.0);
	return s;
}

int main(){
	printf("输入缸内总水升数:") ;
	scanf("%lf",&n);
	printf("输入净化器每秒处理升数:");
	scanf("%lf",&x);
	long long s=math();
	int hh=s/3600;
	int mm=s%3600/60;
	int ss=s%60;
	printf("达到1‰未处理需要:%02d小时%02d分%02d秒\n",hh,mm,ss);
	return 0;
}

简单的写一个小程序,100L大约2小时就可以了,3小时后面的1小时也没有太大收益。使用一个小泵就可以,我用的某宝上十块左右5V的那种小潜水泵,大的不可以,会导致杀菌灯照射时常不够,加大罐子没地方放,LED的功率也不够了。在不锈钢密封罐子里放泵,进出水口密封好,安装紫外LED密封好。进水管放在泵室,出水管放在物理过滤前面。设置半夜的时候开俩小时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清晨曦月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值