15-01-2022, 10:37
Witam,
Zrobiłem przepływomierz według tego poradnika https://www.instructables.com/How-to-Use...-Tutorial/
Wszystko ładnie działało do póki nie dodałem obsługi czujników DS18B20. Po dodaniu odczytów temperatury pomiary z przepływomierza strasznie "skaczą".
Co mogę zrobić aby ustabilizować pomiary z przepływomierza?
Mój zmodyfikowany kod:
Zrobiłem przepływomierz według tego poradnika https://www.instructables.com/How-to-Use...-Tutorial/
Wszystko ładnie działało do póki nie dodałem obsługi czujników DS18B20. Po dodaniu odczytów temperatury pomiary z przepływomierza strasznie "skaczą".
Co mogę zrobić aby ustabilizować pomiary z przepływomierza?
Mój zmodyfikowany kod:
Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(3); //Podłączenie do 3
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki
LiquidCrystal_I2C lcd(0x27, 20, 4); // Ustawienie adresu układu na 0x27
byte sensorInterrupt = 0; // 0 = digital pin 2
byte sensorPin = 2;
float calibrationFactor = 0.45;
volatile byte pulseCount;
float flowRate;
unsigned long oldTime;
void setup()
{
sensors.begin(); //Inicjalizacja czujnikow
lcd.begin(20,4);
lcd.backlight(); // załączenie podświetlenia
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);
pulseCount = 0;
flowRate = 0.0;
oldTime = 0;
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
void loop()
{
sensors.requestTemperatures(); //Pobranie temperatury z czujników
if(flowRate > 60 & sensors.getTempCByIndex(1) > 5){ //włączenie pompy na pinie 4
digitalWrite(4, HIGH);
}
else {
digitalWrite(4, LOW);
}
if((millis() - oldTime) > 1000) // Only process counters once per second
{
detachInterrupt(sensorInterrupt);
flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
oldTime = millis();
unsigned int frac;
//lcd.clear(); //wyczysc ekran
lcd.setCursor(0,0);
lcd.print("PRZEPLYW");
lcd.setCursor(10,0);
lcd.print(int(flowRate));
lcd.print(" L/min ");
lcd.setCursor(0,1);
lcd.print("ODZYSK");
lcd.setCursor(10,1);
lcd.print((int(flowRate)*60*1.16*(sensors.getTempCByIndex(0) - sensors.getTempCByIndex(1)))/1000);
lcd.print(" kW/h ");
lcd.setCursor(0,3);
lcd.print("T1 ");
lcd.print(sensors.getTempCByIndex(0));
lcd.setCursor(10,3);
lcd.print("T2 ");
lcd.print(sensors.getTempCByIndex(1));
pulseCount = 0;
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
}
void pulseCounter()
{
pulseCount++;
}