Сътворих един топломер от водомер с монтиран хол датчик и два МСР9701 на входящата и изходящата вода на един радиатор, кода е малко от нета малко от мен и работи почти чудесно.
Тъкмо да публикувам въпроса и реших да пробвам малко нов код и то взе че се получи, не знам дали е правилния код но работи и помни последните показания при спиране на водата и при намаляване на температурната разлика.
Ето кода
Тъкмо да публикувам въпроса и реших да пробвам малко нов код и то взе че се получи, не знам дали е правилния код но работи и помни последните показания при спиране на водата и при намаляване на температурната разлика.
Ето кода
Код: Избери всички
volatile int flow_frequency; // Measures flow sensor pulses
// Calculated litres/hour
float vol = 0.0,l_minute;
unsigned char flowsensor = 2; // Sensor Input
unsigned long currentTime;
unsigned long cloopTime;
#include <LiquidCrystal_I2C.h>
int decimalPrecision = 1;
int sensorPin0 = A0;
int sensorPin1 = A1;
int temperature0 = 0;
int temperature1 = 0;
int E = 0;
int Ehi = -1;
//define I2C address......
LiquidCrystal_I2C lcd(0x27, 20, 4);
void flow () // Interrupt function
{
flow_frequency++;
}
void setup()
{
lcd.init();
lcd.clear();
lcd.backlight();
pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Water Heat Meter");
lcd.setCursor(0,1);
lcd.print("Home Made");
currentTime = millis();
cloopTime = currentTime;
}
void loop ()
{
float E;
float Ehi;
float temperature0 = 0;
temperature0 = (analogRead(sensorPin0) * 5 / 1024.0) - 0.4;
temperature0 = temperature0 / 0.0195;
float temperature1 = 0;
temperature1 = (analogRead(sensorPin1) * 5 / 1024.0) - 0.4;
temperature1 = (temperature1 / 0.0195)+0.6;
currentTime = millis();
// Every second, calculate and print litres/hour
if(currentTime >= (cloopTime + 1000))
{
cloopTime = currentTime; // Updates cloopTime
if(flow_frequency != 0){
// Pulse frequency (Hz) = 3Q, Q is flow rate in L/min.
l_minute = (flow_frequency / 0.58); // (Pulse frequency x 60 min) / 3Q = flowrate in L/hour
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Rate: ");
lcd.print(l_minute);
lcd.print(" L/M");
l_minute = l_minute/60;
lcd.setCursor(0,1);
vol = vol +l_minute;
lcd.print("Vol:");
lcd.print(vol);
lcd.print(" L");
lcd.setCursor(0,2);
lcd.print("T Low ");
lcd.print(temperature0,decimalPrecision);
lcd.setCursor(10,2);
lcd.print(" T Hi ");
lcd.print(temperature1,decimalPrecision);
lcd.setCursor(0,3);
E = (temperature1 - temperature0) * 0.001163 * vol;
if (E > Ehi) Ehi = E;
lcd.print("Energy ");
lcd.print(Ehi);
lcd.print(" kW");
flow_frequency = 0; // Reset Counter
Serial.print(l_minute, DEC); // Print litres/hour
Serial.println(" L/Sec");
}
else {
Serial.println(" flow rate = 0 ");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Rate: ");
lcd.print( flow_frequency );
lcd.print(" L/M");
lcd.setCursor(0,1);
lcd.print("Vol:");
lcd.print(vol);
lcd.print(" L");
lcd.setCursor(0,2);
lcd.print("T Low ");
lcd.print(temperature0,decimalPrecision);
lcd.setCursor(10,2);
lcd.print(" T Hi ");
lcd.print(temperature1,decimalPrecision);
lcd.setCursor(0,3);
E = (temperature1 - temperature0) * 0.001163 * vol;
if (E > Ehi) Ehi = E;
lcd.print("Energy ");
lcd.print(Ehi);
lcd.print(" kW");
}
}
}