• 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
Pomoc - przepływomierz + menu
#1
Witam kolegów,
Jestem nowym użyszkodnikiem i niezbyt doświadczonym programistą (bardzo początkującym). Mam projekt, który muszę jakoś przeboleć.
Mianowicie muszę za pomocą Arduino (mega) odczytać temperaturę i przepływ w urządzeniu. Żeby nie było za łatwo tych urządzeń jest 5 każdy ma swoje dwa czujniki oraz jeden przepływomierz YF-S201. Odczyty mają być wyświetlane na wyświetlaczu LCD 16x4. Najpierw problemem było menu - jakoś się z tym uporałem (choć nie wiem czy do końca poprawnie). Odczyt temperatury nie nastręcza problemów bo jest realizowany na DS18B20. Problem zaczął się z przepływomierzami. Odczyty z tego co rozpoznawałem opierają się na przerwaniach. Wydaje mi się że jeżeli włączę przerwania to zablokują mi cały kod wraz z odczytami temperatury i "menu" czy istnieje jakiś sposób na odczyt nie rujnując całego kodu? oraz prośba o sprawdzenie czy to cudo będzie działać (niestety nie mam jak sprawdzić urządzenie nie znajduje się koło mnie) Przesyłam kod jaki do tej pory udało mi się stworzyć:
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define UP 22
#define DN 23
#define FLOW1 45
#define FLOW2 47
#define FLOW3 49
#define FLOW4 51
#define FLOW5 53

LiquidCrystal_I2C lcd(0x27,16,4);
OneWire oneWire(A5); //Podlaczenie do A5
DallasTemperature sensors(&oneWire);

DeviceAddress TU1A = {0x28, 0x30, 0xE0, 0xFB, 0xA, 0x0, 0x0, 0xA6};
DeviceAddress TU1B = {0x28, 0x69, 0x20, 0xFC, 0xA, 0x0, 0x0, 0xBA};
DeviceAddress TU2A = {0x28, 0xD, 0xC7, 0xFB, 0xA, 0x0, 0x0, 0xA8};
DeviceAddress TU2B = {0x28, 0x33, 0x53, 0xFB, 0xA, 0x0, 0x0, 0xFE};
DeviceAddress TU3A = {0x28, 0x7, 0xDE, 0xFB, 0xA, 0x0, 0x0, 0xE8};
DeviceAddress TU3B = {0x28, 0x2, 0x55, 0xFB, 0xA, 0x0, 0x0, 0xB8};
DeviceAddress TU4A = {0x28, 0x7B, 0xF8, 0xFB, 0xA, 0x0, 0x0, 0x69};
DeviceAddress TU4B = {0x28, 0x18, 0x68, 0xFB, 0xA, 0x0, 0x0, 0x44};
DeviceAddress TU5A = {0x28, 0xDE, 0xAA, 0xFB, 0xA, 0x0, 0x0, 0xC8};
DeviceAddress TU5B = {0x28, 0x90, 0xE5, 0xFB, 0xA, 0x0, 0x0, 0x28};


unsigned char  FLOW1 = 0;
unsigned char  FLOW2 = 0;
unsigned char  FLOW3 = 0;
unsigned char  FLOW4 = 0;
unsigned char  FLOW5 = 0;
// int LPrzycisku = 1; //licznik przycisku
// int SPrzycisku = 1; //status przycisku
// int OSPrzycisku = 1; // ostatni status przycisku
long last_up = 0;
long last_dn = 0;
int statusprzycisku = 1;



void setup() {

pinMode(UP, INPUT_PULLUP);
pinMode(DN, INPUT_PULLUP);
sensors.begin();
}

void loop() {
char wybor=1; //wybor kroku
char n=5; //ilosc kroków
if(digitalRead (UP)==LOW && (millis() - last_up > 30)) // odczyt przycisku up
{
wybor++; //zwiększ krok
if(wybor>=n) wybor=1; //jeżeli krok jest większy lub rowny n wpisz w n krok 1
last_up = millis();
}

if(digitalRead (DN)==LOW && (millis() - last_dn > 30))
{
wybor--;
if(wybor<=0) wybor=n;
last_dn = millis();
}
statusprzycisku = wybor;

switch(statusprzycisku)
{
case 1:   
lcd.begin(16,4); 
lcd.setBacklight(255);
lcd.setCursor(5,0);
lcd.print("UNIT 1");

  sensors.requestTemperatures();

  lcd.setCursor(0,1);
  lcd.print("Temp IN  = sensors.getTempC(TU1A)C");
  lcd.setCursor(0,2);
  lcd.print("Temp OUT = sensors.getTempC(TU1B)C");
  lcd.setCursor(0,3);
 

// lcd.print("Flow  = 6L/min");

break; //pozycja 1 w menu

case 2:
lcd.begin(16,4); 
lcd.setBacklight(255);
lcd.setCursor(5,0);
lcd.print("UNIT 2");

  sensors.requestTemperatures();
   //sensors.requestTemperatures(TU1B)
  lcd.setCursor(0,1);
  lcd.print("Temp IN  = sensors.getTempC(TU2A)C");
  lcd.setCursor(0,2);
  lcd.print("Temp OUT = sensors.getTempC(TU2B)C")
  ;break; //pozycja 2 w menu


case 3:
lcd.begin(16,4); 
lcd.setBacklight(255);
lcd.setCursor(5,0);
lcd.print("UNIT 3");

  sensors.requestTemperatures();
  lcd.setCursor(0,1);
  lcd.print("Temp IN  = sensors.getTempC(TU3A)C");
  lcd.setCursor(0,2);
  lcd.print("Temp OUT = sensors.getTempC(TU3B)C");
  break; // poz 3


case 4:

lcd.begin(16,4); 
lcd.setBacklight(255);
lcd.setCursor(5,0);
lcd.print("UNIT 4");

  sensors.requestTemperatures();
   
  lcd.setCursor(0,1);
  lcd.print("Temp IN  = sensors.getTempC(TU4A)C");
  lcd.setCursor(0,2);
  lcd.print("Temp OUT = sensors.getTempC(TU4B)C");
  break; // poz 4

case 5: lcd.begin(16,4); 
lcd.setBacklight(255);
lcd.setCursor(5,0);
lcd.print("UNIT 5");

  sensors.requestTemperatures();
  lcd.setCursor(0,1);
  lcd.print("Temp IN  = sensors.getTempC(TU5A)C");
  lcd.setCursor(0,2);
  lcd.print("Temp OUT = sensors.getTempC(TU5B)C");
  break; // poz 5

}
}
Proszę o pomoc
pozdr
Robert
 
Odpowiedź
#2
To co tu pokazałeś po prostu nie ma prawa działać, a kod napisany jest w taki sposób, że po prostu widać, że nie wiesz co robisz. Zacznij od kursu Arduino, na FORBOT jest darmowy.
Przerwania, jak nazwa sugeruje, przerywają działanie głównego programu i robią z boku różne operacje. Jeśli są krótkie i nie za często nie zaszkodzą działaniu głównej części programu.
Można to ocenić na podstawie zawartości tego przerwania lub po prostu na podstawie działania. Ale tego nie załączyłeś. Różne funkcje również wyłączają działanie przerwań, jeśli są krótkie impulsy do zliczenia, przerwanie go nie zauważy. Tak czy inaczej wskazanie zrobienia kursu, napisz kilkaset różnych programów i może jakoś dojdziesz do celu.
Na pewno nie trzeba inicjalizować ekranu przed każdym użyciem, a funkcje lepiej wykonywać niż wypisywać ich nazwy na ekran.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Trochę zabawy i kod zacznie działać.
Ale ja nie o tym.
Z tego co zrozumiałeś, to odczyt przepływomierza jest na przerwaniach, a Tobie to się nie podoba.
Wyobraź sobie, że obierasz ziemniaki, ale żona tudzież koleżanka poprosiła Cie, aby policzył marchewki, które Ci ona podaje. Po prostu od czasu do czasu prosi Cię abyś włożył do kosza marchewkę i zapisał aktualny stan w koszu.
Problem polega na tym, że ona podaje te marchewki co 20 do 30 sekund, a ty obierasz ziemniaka 60 sekund.
Masz dwa wyjścia. Albo odbierasz marchewkę między ziemniakami, czyli wtedy kiedy masz chwilkę czasu na jej odbiór i akurat w tym czasie Twoja kobieta Ci ją podaje (jak jej nie odbierzesz, to ją z powrotem zabiera), albo po prostu przerwać na chwilę obieranie ziemniaka i odebrać tę marchewkę, wrzucić ją do kosza i zapisać +1.
Ja osobiście zainteresował bym się temerem1, a konkretniej Input Capture Unit (wejście na pinie 8, czyli ICP1 w Arduino UNO). Sprzęt sam będzie sobie liczył impulsy bez udziału rdzenia procesora, a naszym zadanie jest tylko odczytywanie i kasowanie rejestru co, na przykład, sekundę.
Prosta sprawa, a można sporo się nauczyć o naszym poczciwym AVR.
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ź
#4
Dzięki za zainteresowanie, jak juz napisałem wcześniej, może niezbyt wyraźnie jestem mocno początkujący a dostalem taki projekt. Do tego celu mam arduino Mega. Problem polega na podlaczeniu 5 przepływomierzy, program ma za zadanie podczas odczytu przeplywu odczytać temperaturę dla danej jednostki i wyswietlic je na ekranie czyli: UNIT1 TEMP WE=23C TEMP WY =21C PRZEPŁYW = 4 L/m dl i pierwszym przyciskiem przechodzić z urządzenia 1 do 5 a drugim od 5 do 1
Dziękuję za rady postaram się zmodernizować kod i wrzucę tutaj. Nadal nie wiem jak to ogarnąć w całości ale postaram się.
Pozdrawiam
Robert
 
Odpowiedź
#5
Raczej każdy się domyśla, że jesteś początkującym, inaczej nie byłoby ani Arduino w tym projekcie ani tych postów.
A co do menu to nie potrzebujesz żadnego. Po prostu wystarczy prawidłowo obsłużyć odczyt dwóch przycisków i stan aktualnego zestawu trzymać w zmiennej. Adekwatnie do aktualnej zmiennej wyświetlasz zestaw danych czujników od 0-4 (czy tam od 1-5).
ICP podane przez @Robson Kerman może być dobrym tropem, bo zwykle Atmega ma 1 wejście ICP w popularnych Arduino, a akurat MEGA2560 z Arduino MEGA ma ich 5, może taki był cel ćwiczenia.
Co do marchewek to właśnie z żonami jest problem, normalny człowiek da marchewkę i pozwoli wrócić do pracy, a żona przy okazji zajmie tyle czasu, że ziemniaczki pouciekają z koszyka. Jeśli są to impulsy w ilości powiedzmy kilka kHz to przerwania by wystarczyły, obsługa przerwania do pojedyncze us, dla pewności trzeba by zerknąć do biblioteki one wire kiedy wyłączają przerwania. Tej której używam wyłącza tylko na bity 0 i 1, czyli po około 50uS. Jeśli  w tym czasie będzie jakiś impuls to zostanie zauważony, ale przerwanie by go zliczyć będzie wywołane po ponownym włączeniu przerwań. Można też im całkiem zakomentować wyłączanie przerwania, brać tylko te odczyty, które mają poprawne CRC - i tak jest sprawdzane.
Co do przycisków to użyj gotowej biblioteki (bounce2, easybutton), dla ułatwienia, dla pogrzebania w środku.
To raczej tak sobie wygląda:
Kod:
if(digitalRead (DN)==LOW && (millis() - last_dn > 30))
{
wybor--;
if(wybor<=0) wybor=n;
last_dn = millis();
}
Powinieneś jeszcze sprawdzać jaki był wcześniej stan przycisku, by nie było tak, że jak dotkniesz przycisk na 35ms to on przeskoczy o 2. Czyli tylko jeśli jest wciśnięty, a wcześniej nie był, i jest wciśnięty od 30ms to zmieniasz zmienną wyboru. Potrzebna jest zmienna do przechowania poprzedniego stanu.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#6
Witam po dość długiej przerwie. Próbowałem coś nie coś zrobić z tym kodem. Problemy odczytu temperatury i pomiar przepływów udało mi się zrealizować bez użycia przerwań - działa dobrze. Natomiast nadal mam problem z menu. Nie wiem jak z tego wybrnąć przesyłam kod który udało mi się stworzyć:
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

/*
#define F1 45
#define F2 47
#define F3 49
#define F4 51
#define F5 53
*/
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //Adres wyświetlacza
OneWire oneWire(A5); //Podlaczenie do A5
DallasTemperature sensors(&oneWire);

//Adresy czujników:
DeviceAddress TU1A = {0x28, 0x30, 0xE0, 0xFB, 0xA, 0x0, 0x0, 0xA6};
DeviceAddress TU1B = {0x28, 0x69, 0x20, 0xFC, 0xA, 0x0, 0x0, 0xBA};
DeviceAddress TU2A = {0x28, 0xD, 0xC7, 0xFB, 0xA, 0x0, 0x0, 0xA8};
DeviceAddress TU2B = {0x28, 0x33, 0x53, 0xFB, 0xA, 0x0, 0x0, 0xFE};
DeviceAddress TU3A = {0x28, 0x7, 0xDE, 0xFB, 0xA, 0x0, 0x0, 0xE8};
DeviceAddress TU3B = {0x28, 0x2, 0x55, 0xFB, 0xA, 0x0, 0x0, 0xB8};
DeviceAddress TU4A = {0x28, 0x7B, 0xF8, 0xFB, 0xA, 0x0, 0x0, 0x69};
DeviceAddress TU4B = {0x28, 0x18, 0x68, 0xFB, 0xA, 0x0, 0x0, 0x44};
DeviceAddress TU5A = {0x28, 0xDE, 0xAA, 0xFB, 0xA, 0x0, 0x0, 0xC8};
DeviceAddress TU5B = {0x28, 0x90, 0xE5, 0xFB, 0xA, 0x0, 0x0, 0x28};

const int UP = 22;     // przypisanie przycisku do pinu 22
const int DN = 23;     // przypisanie przycisku do pinu 23
const int F1 = 45;
const int F2 = 47;
const int F3 = 49;
const int F4 = 51;
const int F5 = 52;
long last_up = 0;       // deklaracja zmiennej + wyzerowanie
long last_dn = 0;
int LPrzycisku = 0; //licznik przycisku
int SPrzycisku = 0; //status przycisku
int OSPrzycisku = 0; // ostatni status przycisku
int X;
int Y;
float TIME = 0;
float FREQUENCY = 0;
float WATER = 0;
//float TOTAL = 0;
float flow = 0;
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;

void setup() {

pinMode(UP, INPUT_PULLUP); //ustawienie UP na przycisk pullup
pinMode(DN, INPUT_PULLUP); // j.w. tylko DN
pinMode(F1,INPUT);
pinMode(F2,INPUT);
pinMode(F3,INPUT);
pinMode(F4,INPUT);
pinMode(F5,INPUT);

sensors.begin();                // inicjalizacja czujników
lcd.begin(16,4);  //inicjalizacjia wyświetlacza
lcd.setBacklight(255); //podświetlenie
lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("UNIT");
  lcd.setCursor(0,1);
  lcd.print("Temp IN =");
  lcd.setCursor(14,1);
  lcd.print("\xDF""C");
  lcd.setCursor(0,2);
  lcd.print("Temp OUT=");
  lcd.setCursor(14,2);
  lcd.print("\xDF""C");
  lcd.setCursor(0,3);
  lcd.print("Flow =");
  lcd.setCursor(11,3);
  lcd.print("L/min");

 
}
void loop()
{
 
sensors.requestTemperatures();  // wysyłanie zapytania do czujników

SPrzycisku = digitalRead(UP); // odczyt przycisku UP z pinu 22
      if (SPrzycisku != OSPrzycisku) // jeżeli była zmiana
      {
    if (SPrzycisku == LOW && (millis() - last_up > 30)) // i jest przycisnietyprzycisk UP przez 30ms
    {
         LPrzycisku++; // zwiększ licznik liczby nacisniec
         if(LPrzycisku==4) //jezeli licznik przycisku osiagnal 5
                   {
      LPrzycisku=0; // wróc do 1
                   }
     last_up = millis(); // zapisz aktualny czas w zmiennej
     }
        }
        // jak wyżej tylko dla przycisku DN:
SPrzycisku = digitalRead(DN);
      if (SPrzycisku != OSPrzycisku)
      {
    if (SPrzycisku == LOW && (millis() - last_up > 30))
    {
         LPrzycisku++;
         if(LPrzycisku==0)
                   {
      LPrzycisku=4;
                   }
     last_up = millis();
     }
        }

OSPrzycisku=SPrzycisku; // zapisz stan przcisku jako ostatni stan przycisku

switch (LPrzycisku)
{

case 0:
    LPrzycisku==0;
    {
    U1();
    break;
    }

case 1:
    LPrzycisku==1;
    {
    U2();
    break;
    }

case 2:
    LPrzycisku==2;
    {
    U3();
    break;
    } 

case 3:
    LPrzycisku==3;
    {
    U4();
    break;
    }
case 4:
    LPrzycisku==4;
    {
    U5();
    break;
    }
}
// if (digitalRead(UP) != OSPrzycisku) 
       return;
// if (digitalRead(DN) != OSPrzycisku)
       return;
}
void U1()
{
sensors.requestTemperatures();
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000UL){
    zapamietanyCzas = aktualnyCzas;
  lcd.setCursor(11,0);
  lcd.print("1");
  lcd.setCursor(9,1);      
  lcd.print (sensors.getTempC(TU1A)); //wyswietl aktualna temperature z czujnika
  lcd.setCursor(9,2);     
  lcd.print (sensors.getTempC(TU1B));//wyswietl aktualna temperature z czujnika
 
  X = pulseIn(F1, HIGH);     //czas trwania impulsu
  Y = pulseIn(F1, LOW);      //czas braku impulsu
  TIME = X + Y;              //czas trwania całości
  FREQUENCY = 1000000/TIME;
  WATER = FREQUENCY/15;
  if(WATER > 0)
{
  lcd.setCursor(0,3);
  lcd.setCursor(6,3);
  lcd.print(WATER);

}
else
{
lcd.setCursor(6,3);
lcd.print("0.00");
}

if (digitalRead(UP) != OSPrzycisku) 
       return;
if (digitalRead(DN) != OSPrzycisku)
       return;
  

}
}
void U2()
{
  sensors.requestTemperatures();
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000UL){
    zapamietanyCzas = aktualnyCzas;
  lcd.setCursor(11,0);
  lcd.print("2");
  lcd.setCursor(9,1);
  lcd.print (sensors.getTempC(TU2A));
  lcd.setCursor(9,2); 
  lcd.print (sensors.getTempC(TU2B));
 
  X = pulseIn(F2, HIGH); //czas trwania impulsu
  Y = pulseIn(F2, LOW); //czas braku impulsu
  TIME = X + Y; //czas trwania całości
  FREQUENCY = 1000000/TIME;
  WATER = FREQUENCY/15;
  if(WATER > 0)
{
  lcd.setCursor(6,3);
  lcd.print(WATER);

}
else
{
lcd.setCursor(6,3);
lcd.print("0.00");
}

if (digitalRead(UP) != OSPrzycisku) 
       return;
if (digitalRead(DN) != OSPrzycisku)
       return;
    

}
}
void U3()
{
sensors.requestTemperatures();
aktualnyCzas = millis();
  if (aktualnyCzas - zapamietanyCzas >= 1000UL)
  {
    zapamietanyCzas = aktualnyCzas;
                                                 
  lcd.setCursor(11,0);
  lcd.print("3");
  lcd.setCursor(9,1);                            
  lcd.print (sensors.getTempC(TU3A));         
  lcd.setCursor(9,2);                        
  lcd.print (sensors.getTempC(TU3B));
 
  X = pulseIn(F3, HIGH);     //czas trwania impulsu
  Y = pulseIn(F3, LOW);     //czas braku impulsu
  TIME = X + Y;           //czas trwania całości
  FREQUENCY = 1000000/TIME;
  WATER = FREQUENCY/15;
  if(WATER > 0)
{
  lcd.setCursor(6,3);
  lcd.print(WATER);
}
else
{
lcd.setCursor(6,3);
lcd.print("0.00");
}

if (digitalRead(UP) != OSPrzycisku) 
       return;
if (digitalRead(DN) != OSPrzycisku)
       return;
     

}
}
void U4()
{
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000UL){
    zapamietanyCzas = aktualnyCzas;
    sensors.requestTemperatures();
    lcd.setCursor(11,0);
     lcd.print("4");
     lcd.setCursor(9,1);                                                      
  lcd.print (sensors.getTempC(TU4A));                                    
  lcd.setCursor(9,2);                                                     
  lcd.print (sensors.getTempC(TU4B));                              
 
  X = pulseIn(F4, HIGH);                //czas trwania impulsu
  Y = pulseIn(F4, LOW);                   //czas braku impulsu
  TIME = X + Y;                         //czas trwania całości
  FREQUENCY = 1000000/TIME;
  WATER = FREQUENCY/15;
  if(WATER > 0)
{                
  lcd.setCursor(6,3);
  lcd.print(WATER);
                                   
}
else
{
lcd.setCursor(6,3);
lcd.print("0.00");
}

if (digitalRead(UP) != OSPrzycisku) 
       return;
if (digitalRead(DN) != OSPrzycisku)
       return;
     

}
}

void U5()
{
  sensors.requestTemperatures();
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000UL){
    zapamietanyCzas = aktualnyCzas;
  lcd.setCursor(11,0);
  lcd.print("5");
  lcd.setCursor(9,1);                                                          
  lcd.print (sensors.getTempC(TU5A));                                            
  lcd.setCursor(9,2);                                                                 
  lcd.print (sensors.getTempC(TU5B));                                           
 
  X = pulseIn(F5, HIGH);             //czas trwania impulsu
  Y = pulseIn(F5, LOW);             //czas braku impulsu
  TIME = X + Y;                     //czas trwania całości
  FREQUENCY = 1000000/TIME;
  WATER = FREQUENCY/15;
  if(WATER > 0)
{
             
  lcd.setCursor(6,3);
                              
  lcd.print(WATER);
                               
}
else
{
lcd.setCursor(6,3);
lcd.print("0.00");
}

if (digitalRead(UP) != OSPrzycisku) 
       return;
if (digitalRead(DN) != OSPrzycisku)
       return;
     
}
}
Niestety z przełączaniem urządzeń mam nadal problemy nie chcą się przełączać, nie wspominając o tym że przy ostatnim "unit" zawiesza się program i muszę resetować od 1 do jest ok, mam również problem z tym aby gdy nie ma przepływu wyświetlać "0.00" wyskakuje mi wtedy "inf".
Próbowałem szukać rozwiązań w bounce2 oraz easybutton ale nie byłem w stanie poprawnie użyć odpowiedniej składni. 
Ps. Ciekawostka - 10 czujników nie poszło mi na 1 rezystorze 4k7 tylko musiałem podzielić na dwie sekcje. 
 
Odpowiedź
#7
Na początku chciałbym zaznaczyć iż jestem początkującym programistą Arduino jeżeli w mojej wypowiedzi są jakiekolwiek błędne informacje to proszę o skorygowanie ich.

Sformatuj kod źródłowy, jeżeli używasz Arduiono IDE to naciśnij CTRL+T będzie bardziej czytelny dla Ciebie i innych osób.

Kod:
void loop()
{

  sensors.requestTemperatures();  // wysyłanie zapytania do czujników <= tą linie bym usunął

Pierwszy odczyt zrealizowałbym w setup()

Kod:
void setup() {

   ...
   ...
   ...
   sensors.requestTemperatures();
   //wyświetlenie danych na ekranie LCD
}

Jeżeli jesteś początkującym programistom to rozbiły bym projekt na mniejsze projekty tzn. obsługa menu, naciśnięcie przycisku i zmiana tekstu np. domyślnie tekst "czujnik1", naciśnięcie down tekst "czujnik2", itd. jak to będzie działać to bym dodał odczyt temperatury.

Trudno stwierdzić dlaczego się nie przełączają wyniki może czas oczekiwania na odczyt jest zbyt krótki, tego nie wiem i należałoby sprawdzić jaki jest czas odczytu z czujników. Spróbuj poniższą linię zmienić np. na 5000 i zobaczyć co się stanie.

Kod:
if (aktualnyCzas - zapamietanyCzas >= 1000UL){
 
Odpowiedź
#8
Co do zawieszania się programu już znalazłem przyczynę - zliczanie było o jedna cyfrę za mało zamiast 0-5 wpisałem 1-5 i program się wykrzaczył. Faktycznie zmienię położenie request'a. Kod między czasie mi się zmienił próbowałem menu rozwiązać za pomocą bounce2 niestety nie zawsze działa jak bym tego chciał. co do programu jest on podzielony na sekcje temperaturę odczytuje prawidłowo z przepływem również nie mam problemów natomiast jak pisałem wcześniej mam diabelny problem z menu i przyciskami. jutro wrzucę nowy sformatowany kod. dziś niestety nie mam już możliwości.
Dzięki za zainteresowanie
Pozdrawiam
X.
======================
Edit:
wspomniany kod:
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Bounce2.h>

#define  UP 22     // przypisanie przycisku do pinu 22
#define  DN 23     // przypisanie przycisku do pinu 23

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //Adres wyświetlacza
OneWire oneWire(A5); //Podlaczenie do A5
DallasTemperature sensors(&oneWire);

//Adresy czujników:
DeviceAddress TU1A = {0x28, 0x30, 0xE0, 0xFB, 0xA, 0x0, 0x0, 0xA6};
DeviceAddress TU1B = {0x28, 0x69, 0x20, 0xFC, 0xA, 0x0, 0x0, 0xBA};
DeviceAddress TU2A = {0x28, 0xD, 0xC7, 0xFB, 0xA, 0x0, 0x0, 0xA8};
DeviceAddress TU2B = {0x28, 0x33, 0x53, 0xFB, 0xA, 0x0, 0x0, 0xFE};
DeviceAddress TU3A = {0x28, 0x7, 0xDE, 0xFB, 0xA, 0x0, 0x0, 0xE8};
DeviceAddress TU3B = {0x28, 0x2, 0x55, 0xFB, 0xA, 0x0, 0x0, 0xB8};
DeviceAddress TU4A = {0x28, 0x7B, 0xF8, 0xFB, 0xA, 0x0, 0x0, 0x69};
DeviceAddress TU4B = {0x28, 0x18, 0x68, 0xFB, 0xA, 0x0, 0x0, 0x44};
DeviceAddress TU5A = {0x28, 0xDE, 0xAA, 0xFB, 0xA, 0x0, 0x0, 0xC8};
DeviceAddress TU5B = {0x28, 0x90, 0xE5, 0xFB, 0xA, 0x0, 0x0, 0x28};


const int F1 = 45;
const int F2 = 47;
const int F3 = 49;
const int F4 = 51;
const int F5 = 52;
long last_up = 0;       // deklaracja zmiennej + wyzerowanie
long last_dn = 0;
int LPrzycisku = 0; //licznik przycisku
int SPrzycisku = 0; //status przycisku
int OSPrzycisku = 0; // ostatni status przycisku
int X;
int Y;
float TIME = 0;
float FREQUENCY = 0;
float WATER = 0;
float flow = 0;
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
void setup() {

pinMode(UP, INPUT_PULLUP); //ustawienie UP na przycisk pullup
debouncer1.attach(UP);
debouncer1.interval(20);
pinMode(DN, INPUT_PULLUP); // j.w. tylko DN
debouncer2.attach(DN);
debouncer2.interval(20);
pinMode(F1,INPUT);
pinMode(F2,INPUT);
pinMode(F3,INPUT);
pinMode(F4,INPUT);
pinMode(F5,INPUT);


 
sensors.begin();                // inicjalizacja czujników
lcd.begin(16,4);  //inicjalizacjia wyświetlacza
lcd.setBacklight(255); //podświetlenie
lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("UNIT");
  lcd.setCursor(0,1);
  lcd.print("Temp IN =");
  lcd.setCursor(14,1);
  lcd.print("\xDF""C");
  lcd.setCursor(0,2);
  lcd.print("Temp OUT=");
  lcd.setCursor(14,2);
  lcd.print("\xDF""C");
  lcd.setCursor(0,3);
  lcd.print("Flow =");
  lcd.setCursor(11,3);
  lcd.print("L/min");
  sensors.requestTemperatures();  // wysyłanie zapytania do czujników
 
}
void loop()
{
 

  int value1 = debouncer1.read();
  int value2 = debouncer2.read();
//  debouncer1.update();
  // debouncer2.update();
if (value1 == LOW) && (SPrzycisku != OSPrzycisku))
{
         LPrzycisku++;         // zwiększ licznik liczby nacisniec
         if(LPrzycisku==5)         //jezeli licznik przycisku osiagnal 5
                   {
         LPrzycisku=0;         // wróc do 1
                   }
}
if (value2 == LOW) && (SPrzycisku != OSPrzycisku))
      {
         LPrzycisku--;
         if(LPrzycisku==0)
                   {
      LPrzycisku=5;
                   }

     }

OSPrzycisku=SPrzycisku; // zapisz stan przcisku jako ostatni stan przycisku

switch (LPrzycisku)
{

case 0:
    LPrzycisku==1;
    {
    U1();
    break;
    }

case 1:
    LPrzycisku==2;
    {
    U2();
    break;
    }

case 2:
    LPrzycisku==3;
    {
    U3();
    break;
    } 

case 3:
    LPrzycisku==4;
    {
    U4();
    break;
    }
case 4:
    LPrzycisku==5;
    {
    U5();
    break;
    }
}

 
}
void U1()
{
//sensors.requestTemperatures();

aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000UL){
    zapamietanyCzas = aktualnyCzas;
   
  lcd.setCursor(11,0);
  lcd.print("1");
  lcd.setCursor(9,1);       
  lcd.print (sensors.getTempC(TU1A)); //wyswietl aktualna temperature z czujnika
  lcd.setCursor(9,2);     
  lcd.print (sensors.getTempC(TU1B));//wyswietl aktualna temperature z czujnika
 
  X = pulseIn(F1, HIGH);     //czas trwania impulsu
  Y = pulseIn(F1, LOW);      //czas braku impulsu
  TIME = X + Y;              //czas trwania całości
  FREQUENCY = 1000000/TIME;
  WATER = FREQUENCY/15;
  if(WATER > 0)
{
  lcd.setCursor(0,3);
  lcd.setCursor(6,3);
  lcd.print(WATER);

}
else
{
lcd.setCursor(6,3);
lcd.print("0.00");
}
debouncer1.read();
debouncer1.update();
debouncer2.read();
debouncer2.update();
}

}
void U2()
{
 // sensors.requestTemperatures();
  //debouncer1.update();
  //debouncer2.update();
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000UL){
    zapamietanyCzas = aktualnyCzas;
  lcd.setCursor(11,0);
  lcd.print("2");
  lcd.setCursor(9,1);
  lcd.print (sensors.getTempC(TU2A));
  lcd.setCursor(9,2); 
  lcd.print (sensors.getTempC(TU2B));
 
  X = pulseIn(F2, HIGH); //czas trwania impulsu
  Y = pulseIn(F2, LOW); //czas braku impulsu
  TIME = X + Y; //czas trwania całości
  FREQUENCY = 1000000/TIME;
  WATER = FREQUENCY/15;
  if(WATER > 0)
{
  lcd.setCursor(6,3);
  lcd.print(WATER);

}
else
{
lcd.setCursor(6,3);
lcd.print("0.00");
}

debouncer1.read();
debouncer1.update();
debouncer2.read();
debouncer2.update();

}
 
}
void U3()
{
// sensors.requestTemperatures();
//debouncer1.update();
// debouncer2.update();
aktualnyCzas = millis();
  if (aktualnyCzas - zapamietanyCzas >= 1000UL)
  {
    zapamietanyCzas = aktualnyCzas;
  lcd.setCursor(11,0);
  lcd.print("3");
  lcd.setCursor(9,1);                             
  lcd.print (sensors.getTempC(TU3A));         
  lcd.setCursor(9,2);                         
  lcd.print (sensors.getTempC(TU3B));         
 
  X = pulseIn(F3, HIGH);     //czas trwania impulsu
  Y = pulseIn(F3, LOW);     //czas braku impulsu
  TIME = X + Y;           //czas trwania całości
  FREQUENCY = 1000000/TIME;
  WATER = FREQUENCY/15;
  if(WATER > 0)
{
  lcd.setCursor(6,3);
  lcd.print(WATER);
}
else
{
lcd.setCursor(6,3);
lcd.print("0.00");
}   
debouncer1.read();
debouncer1.update();
debouncer2.read();
debouncer2.update();
}
 
}
void U4()
{
//sensors.requestTemperatures();
// debouncer1.update();
// debouncer2.update();
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000UL){
    zapamietanyCzas = aktualnyCzas;
    sensors.requestTemperatures();
    lcd.setCursor(11,0);
     lcd.print("4");
     lcd.setCursor(9,1);                                                       
  lcd.print (sensors.getTempC(TU4A));                                     
  lcd.setCursor(9,2);                                                     
  lcd.print (sensors.getTempC(TU4B));                               
 
  X = pulseIn(F4, HIGH);                //czas trwania impulsu
  Y = pulseIn(F4, LOW);                   //czas braku impulsu
  TIME = X + Y;                         //czas trwania całości
  FREQUENCY = 1000000/TIME;
  WATER = FREQUENCY/15;
  if(WATER > 0)
{                 
  lcd.setCursor(6,3);
  lcd.print(WATER);
                                   
}
else
{
lcd.setCursor(6,3);
lcd.print("0.00");
}
  debouncer1.read();
debouncer1.update();
debouncer2.read();
debouncer2.update();

}
 
}

void U5()
{
  sensors.requestTemperatures();
// debouncer1.update();
//  debouncer2.update();
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000UL){
    zapamietanyCzas = aktualnyCzas;
  lcd.setCursor(11,0);
  lcd.print("5");
  lcd.setCursor(9,1);                                                           
  lcd.print (sensors.getTempC(TU5A));                                             
  lcd.setCursor(9,2);                                                                 
  lcd.print (sensors.getTempC(TU5B));                                           
 
  X = pulseIn(F5, HIGH);             //czas trwania impulsu
  Y = pulseIn(F5, LOW);             //czas braku impulsu
  TIME = X + Y;                     //czas trwania całości
  FREQUENCY = 1000000/TIME;
  WATER = FREQUENCY/15;
  if(WATER > 0)
{
             
  lcd.setCursor(6,3);         
  lcd.print(WATER);
                               
}
else
{
lcd.setCursor(6,3);
lcd.print("0.00");
}
  debouncer1.read();
debouncer1.update();
debouncer2.read();
debouncer2.update();
     
}

}
pozdr.
X.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości