//piec_co_v2.1
// LICZNIK ILOŚCI PODAWANEGO WĘGLA
// Czas ustawiono na gotowo (odmmierzanie co 24h), odliczanie co 0,001s
// Rozdzielone podawanie czasu w godzinach i minutach.
// Wprowadzono zmienne: "float" żeby mieć wynik po przecinku.
// Suma zuzycia wegla az do zresetowania przyciskiem.
//v2.1 - poprawiono przelicznik węgla po odmierzeniu podawanego węgla w 2023r
//
//
// Do zrobienia:
// Odliczanie czasu trzeba przeniesc poza petle.
// Poprawic odliczanie czasu (parę sekund różnicy na wyswietlaczu i w monitorze.
#include <LiquidCrystal.h>
uint8_t flaga1,flaga2;
uint32_t czasStart,czasStart2,czasStart3,czas3,czasStop,ssekundy,suma,hm,m,ssekundy3,suma3;
//ssekundy3, suma3, suma4 (do zliczania calosci wegla)
int h;
float suma1, suma2, suma4;
int inputPin = 10;
const int przycisk=A0;
const int przycisk1=A3; //przycisk resetowania calego wegla
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
void setup()
{
Serial.begin(9600);
pinMode(przycisk,INPUT_PULLUP);
pinMode(inputPin, INPUT);
digitalWrite(inputPin, HIGH); //rezystor podiciagajacy (wg ksiazki)
pinMode(przycisk1,INPUT_PULLUP); //przycisk resetowania calego wegla
//pinMode(8, INPUT_PULLUP);
//digitalWrite(8, HIGH); //CHYBA aktywacja wewnętrznego rezystora podwyższającego
czas3=86399000;
}
void loop()
{
czasStart2=millis();
if(!digitalRead(przycisk))
{
flaga1=1; //sprawdzenie stanu przycisku, jeśli 0 wcisniety, uwaga - flaga1 ustawiam na 1
}
else
{
flaga1=0; //jesli przycisk jest wcisniety i poprzednio nie byl to rozpoczynamy zliczanie sekund
}
if(flaga1 && !flaga2)
{
czasStart=millis(); //jesli przycisk nie jest wcisniety i poprzednio byl to konczymy zliczanie zliczanie
}
if(!flaga1 && flaga2)
{
czasStop=millis();
ssekundy=(czasStop-czasStart);
suma=(ssekundy+suma); // suma czasu pracy [ss]
suma1=suma*0.00458*1.07; // ilość podawanego węgla (825g/3m => 4,58g/s => 0,00458g/ss) 1,07 <- korekta po przeliczeniu podawania w 2023r
ssekundy3=(czasStop-czasStart);
suma3=(ssekundy3+suma3); // suma czasu pracy [ss] dla obliczania sumy spalania
suma4=suma3*0.00458*1.07; // ilosc podawanego wegla dla obliczania sumy spalania
{
lcd.begin(16, 2); //Deklaracja typu
lcd.setCursor(0, 0); //Ustawienie kursora
lcd.print(suma1/1000); //Wyświetlenie tekstu
lcd.setCursor(5, 0);
lcd.print("kg");
lcd.setCursor(0, 1); //Ustawienie kursora
lcd.print(suma2/1000);
lcd.setCursor(5,1);
lcd.print("kg");
lcd.setCursor(8, 0);
lcd.print(suma4/1000);
lcd.setCursor(13,0);
lcd.print(" ");
lcd.setCursor(14, 0);
lcd.print("kg");
if (czasStart2 < 86400000) //Odliczanie czasu do pierwszego wyzerowania
{
hm=((86400000-czasStart2)/60000);
h=hm/60;
m=hm-(h*60);
lcd.setCursor(11,1);
lcd.print(h);
lcd.setCursor(13,1);
lcd.print(':');
lcd.setCursor(14,1);
lcd.print(m);
}
else //Odliczanie czasu do kolejnego wyzerowania
{
hm=((czas3-czasStart2)/60000);
h=hm/60;
m=hm-(h*60);
lcd.setCursor(11,1);
lcd.print(h);
lcd.setCursor(13,1);
lcd.print(':');
lcd.setCursor(14,1);
lcd.print(m);
}
}
}
flaga2=flaga1; //aktualny stan przycisku przypisujemy do wartosci poprzedniego stanu
if (!digitalRead(przycisk1) && digitalRead(inputPin) == LOW)
{
suma3=0;
ssekundy=0;
}
if (czasStart2 >= 86400000 & czas3 <86400000) //odmierzenie pierwszego pomieru
{
suma2=suma1;
suma=0;
ssekundy=0;
czas3=czas3+1000;
}
else //odmierzenie kolejnych pomiarów
if (czas3 >= czasStart2-czas3)
{
suma2=suma1;
czas3=czas3+86400000;
suma=0;
ssekundy=0;
}
}