• 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
#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ź
  


Wiadomości w tym wątku
Pomoc - przepływomierz + menu - przez XaxaS - 18-07-2019, 15:22
RE: Pomoc - przepływomierz + menu - przez kaczakat - 18-07-2019, 21:59
RE: Pomoc - przepływomierz + menu - przez XaxaS - 22-07-2019, 06:32
RE: Pomoc - przepływomierz + menu - przez kaczakat - 22-07-2019, 14:38
RE: Pomoc - przepływomierz + menu - przez XaxaS - 26-08-2019, 12:07
RE: Pomoc - przepływomierz + menu - przez twjx - 26-08-2019, 13:23
RE: Pomoc - przepływomierz + menu - przez XaxaS - 26-08-2019, 14:44

Skocz do:


Przeglądający: 1 gości