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ć:
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.
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;
}
}
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.