12-01-2022, 20:51
Witam. Zacznę od tego, że jestem amatorem, więc sam projekt (podstawa znaleziona w internecie, ale przerobiłem go i rozbudowałem dla własnych potrzeb), jak i realizacja może mieć wiele niedociągnięć ale w teorii i w emulatorze działa
Chciałem zrobić układ dla pieca CO, który zliczałby ilość spalonego węgla (czas pracy podajnika 230V), wynik resetował co 24h, a odliczanie rozpoczynał od nowa. Dodatkowo na wyświetlaczu pokazuje spalanie z poprzedniego dnia oraz czas do końca dnia.
Ta część działa poprawnie, ale chciałem odliczać ilość spalonego węgla do czasu ponownego napełnienia zbiornika (przyciskiem reset pomiaru) i tutaj jest problem, bo wynik sam się resetuje co jakiś czas. Symulowanie pracy podajnika poprzez mostek działa poprawnie, ale gdy używam przekaźnika z cewką 230V resetuje pomiar. Po podmianie przekaźnika na gotowy układ wykrywający napięcie sieciowe oraz dołożeniu rezystora podciągającego 10k delikatnie poprawiło sytuację, ale co jakieś kilkanaście przełączeń znów resetuje pomiar.
Prosiłbym o pomoc, co może być powodem, próbowałem zmiany sterowania potencjałem 0, 5V, zmiany wejścia, nawet przejście z płytki UNO (ewentualne uszkodzenie sterownika) na Mega 2560 nie pomogło. Skończyły mi się pomysły więc byłbym wdzięczny za Wasze sugestie.
Chciałem zrobić układ dla pieca CO, który zliczałby ilość spalonego węgla (czas pracy podajnika 230V), wynik resetował co 24h, a odliczanie rozpoczynał od nowa. Dodatkowo na wyświetlaczu pokazuje spalanie z poprzedniego dnia oraz czas do końca dnia.
Ta część działa poprawnie, ale chciałem odliczać ilość spalonego węgla do czasu ponownego napełnienia zbiornika (przyciskiem reset pomiaru) i tutaj jest problem, bo wynik sam się resetuje co jakiś czas. Symulowanie pracy podajnika poprzez mostek działa poprawnie, ale gdy używam przekaźnika z cewką 230V resetuje pomiar. Po podmianie przekaźnika na gotowy układ wykrywający napięcie sieciowe oraz dołożeniu rezystora podciągającego 10k delikatnie poprawiło sytuację, ale co jakieś kilkanaście przełączeń znów resetuje pomiar.
Prosiłbym o pomoc, co może być powodem, próbowałem zmiany sterowania potencjałem 0, 5V, zmiany wejścia, nawet przejście z płytki UNO (ewentualne uszkodzenie sterownika) na Mega 2560 nie pomogło. Skończyły mi się pomysły więc byłbym wdzięczny za Wasze sugestie.
Kod:
#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;
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(przycisk1,INPUT_PULLUP); //przycisk resetowania calego wegla
pinMode(8, INPUT_PULLUP);
digitalWrite(8, HIGH);
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; // ilość podawanego węgla (825g/3m => 4,58g/s => 0,00458g/ss)
ssekundy3=(czasStop-czasStart);
suma3=(ssekundy3+suma3); // suma czasu pracy [ss] dla obliczania sumy spalania
suma4=suma3*0.00458; // 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);
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(m);
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(8) == LOW)
{
suma3=0;
ssekundy3=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;
}
}