• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przepływomierz, po dodaniu DS18B20 pomiary skaczą
#1
Question 
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:
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++;
}
 
Odpowiedź
#2
Ponowne włączenie przerwań powinno być przed obsługą lcd, czy gdzieś w linii 58.
Lcd na i2c, to straszny zjadacz czasu.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
sensors.requestTemperatures(); - przy domyślnej dokładności czujników DS 12bitów to polecenie trwa około 750ms.
Należy włączyć w setup tryb asynchroniczny dla ONE WIRE. Robisz odczyt i zlecasz pomiar, po sekundzie (lub rzadziej) powtarzasz. Odczyt temperatury jest wtedy sprzed sekundy. Im rzadziej tym lepiej. Można np. w każdej dziesiątej sekundzie zlecać pomiar i odczytywać w kolejnej. Komunikacja z ONE WIRE i tak zabierze wtedy dużo z życia uC, ale będzie to 20ms z każdej sekundy (czy wybranego interwału) zamiast 750ms.
DS18B20.setWaitForConversion(0); - po tym poleceniu samemu dbasz o to by nie pytać o temperaturę zanim nie minie czas konwersji, taki tryb asynchroniczny.
Ewentualnie w setup można dodać pierwszy odczyt i jeden delay(1000) by po uruchomieniu nie pokazał głupot z tej odwrotnej kolejności.
A całość dla DS (i całej reszty programu) powinna być zrobiona jak to:
" if((millis() - oldTime) > 1000) // Only process counters once per second
{
"
Można też sekundę podzielić na odcinki po 50-100ms i w każdym zlecić jakiś zestaw zadań do wykonania. Tak często jak to jest niezbędne do działania, ale nie częściej.
Jak złożysz do kupy czas komunikacji I2C i ONE WIRE to program jest jedną wielką czkawką.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości