#include <Wire.h>
#include <LiquidCrystal_I2C.h> // biblioteka do LCD
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4 ,5 ,6 ,7 ,3, POSITIVE);
int motorpin1 = 6; // wyjscia silnika pin 6
int motorpin2 = 7; // wyjscie silnika pin 7
int UV = 8; // przekaznik lampa UV 8
int Vacum = 9; // przekaznik pompa podcisnienia 9
#define pinUP 12 // klawisz + pin 12
#define pinDOWN 11 // klawisz - pin 11
#define pinOK 10 // klawisz OK pin 10
long start; // zmienna okreslająca start procesu
int czas; // czas trwania procesu, w sekundach
int minuty; // bez komentarza
int sekundy; // bez komentarza
int ustaw(int c) // c - defaultowy czas (na początek do ustawiania)
{
lcd.clear();
lcd.setCursor(0,0);lcd.print("< Ustaw Czas Pracy >");
lcd.setCursor(0,1);lcd.print(" min- >");
pokazCzas(c); // pokazujemy czas procesu do ustawienia
while(digitalRead(pinOK!=LOW)) // trwa tak długo aż naciśniemy przycisk OK
{
if(digitalRead(pinUP)==LOW){delay(3);if(digitalRead(pinUP)==LOW){c+=10;if(c>4800)c=4800;pokazCzas(c);}} // klawisz +
if(digitalRead(pinDOWN)==LOW){delay(3);if(digitalRead(pinDOWN)==LOW){c-=10;if(c<0)c=0;pokazCzas(c);}} // klawisz -
delay(150); // aby za szybko nie przeskakiwał czas gdy wciśniemy przycisk na dłużej
}
lcd.clear();lcd.setCursor(0,0);lcd.print(" Czas Ustawiony ");delay(2000); // kosmetyka
return c; // funkcja zwraca ustawiony czas
}
// --- uniwersalna funkcja pokazująca aktualny czas procesu, czas jaki upłynął, itp. ---
void pokazCzas(int c) // c - aktualny czas procesu
{
char buf[20]; memset(buf,0,sizeof(buf)); // zamiast pozycjonowania LCD proponuję to właśnie
minuty=c/60;sekundy=c%60; // obliczamy mniuty i sekundy
if(minuty>59){minuty=0;sekundy=0;} // po przekroczeniu 60 minut liczymy od nowa
snprintf(buf,sizeof(buf),"%02d:%02d",minuty,sekundy); // sprytna funkcja (radzę poczytać o niej :-)
lcd.setCursor(6,1);lcd.print(buf); // kosmetyka LCD
}
// --- funkcja do ustawiania czasu trwania procesu -----------------
// --- funkcja do odliczania czasu (zapalnik zegarowy do bomby :-)---
void odliczanie(int ile)
{
start=millis(); // startujemy funkcją millis()
int akt_czas=ile; // zmienna pomocnicza do żonglerki czasem
while(akt_czas>0) // tak długo, aż odliczanie się nie skończy
{
akt_czas=czas-(millis()-start)/1000; // żonglerka czasem
pokazCzas(akt_czas); // pokaz czasu jaki pozostał
if(digitalRead(pinOK)==LOW) // jeśli wciśniesz OK to natychmiastowe przerwanie procesu
{
akt_czas=0;pokazCzas(akt_czas); // zerowanie czasu
lcd.setCursor(0,1);lcd.print("Proces Przerwany");delay(2000); // kosmetyka
}
}
}
// --------------------------------------------------------------
void setup () {
pinMode(pinUP,INPUT_PULLUP); // klawisz +
pinMode(pinDOWN,INPUT_PULLUP); // klawisz -
pinMode(pinOK,INPUT_PULLUP); // klawisz OK
pinMode(motorpin1,OUTPUT);
pinMode(motorpin2,OUTPUT);
pinMode(UV, OUTPUT);
pinMode(Vacum, OUTPUT);
lcd.begin(20,4); // wyświetlacz 16x2
lcd.begin(20,4);
lcd.backlight(); // zalaczenie podwietlenia
delay(3850);
lcd.clear();
}
// -----------------------------------------------------------
void loop ()
{
czas=ustaw(300); // ustawiamy czas (domyślnie 5 minut)
lcd.clear();lcd.print("Start Odliczania"); // kosmetyka
digitalWrite(motorpin1,LOW);digitalWrite(motorpin2,HIGH); // Twoje motory ON
delay(1000);digitalWrite(motorpin1,HIGH);
odliczanie(czas); // start odliczania
digitalWrite(motorpin2,LOW);delay(1000); digitalWrite(motorpin1,LOW); // motory OFF
lcd.clear();lcd.print(" Koniec Cyklu");delay(3000);lcd.clear(); // kosmetyka
}