#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#define inDelkaInterval A0
#define inPocetImpulzu A2
#define rele_1 4 //D4 LED dioda pomocna
#define inTlacReset 6 //D6 tlacitko
#define inTlacStart 8 //D8 tlacitko
#define inImpuls 10 //D10 I/O impulsy
#define poruchaLED 12 //D12 LED dioda
#define inDelka30 A1 //delka30min
int delkaIntervalVal = 0;
int pocetImpulzuVal = 0;
int delkaIntervalMin = 0;
int pocetImpulzuHod = 0;
//int delkaIntervalMls;
int impulsPocet = 0;
int delka30Val = 0;
int delka30MinSkutHodnota = 0;
int delka30MinPrepocet = 0;
boolean tlacStart = false;
boolean tlacReset = false;
boolean impulsPress = false;
boolean notPorucha = true;
unsigned long startMillis30;
unsigned long startMillis;
unsigned long startMillisInterval;
unsigned long currentMillis;
unsigned long currentIntervalMin;
unsigned long delka30minMillis;
//const unsigned long delka30min = 1800000; // 30 min * 60 000
//const unsigned long delka30min = 300000; //test 5min
long delkaIntervalMls;
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);
DynamicJsonDocument doc(1024);
JsonArray arrayImp = doc.createNestedArray("arrayImp");
void setup() {
Serial.begin(9600);
pinMode(rele_1, OUTPUT);
pinMode(poruchaLED, OUTPUT);
pinMode(inTlacStart,INPUT_PULLUP);
pinMode(inTlacReset,INPUT_PULLUP);
pinMode(inImpuls,INPUT); //pinMode(inImpuls,INPUT);
// initialize the LCD
lcd.init();
//lcd.init();
lcd.backlight();
lcd.clear();
zobrazInitHodnoty();
}
void loop() {
pocetImpulzuVal = analogRead(inPocetImpulzu);
delkaIntervalVal = analogRead(inDelkaInterval);
delka30Val = analogRead(inDelka30);
pocetImpulzuHod = map(pocetImpulzuVal, 0, 1023, 10, 50);
delkaIntervalMin = map(delkaIntervalVal, 0, 1023, 5, 180);
delka30MinSkutHodnota = map(delka30Val, 0, 1023, 30, 180);
delka30MinPrepocet = (delka30MinSkutHodnota/10) *10;
delka30minMillis = delka30MinPrepocet * 60000;
delkaIntervalMls = delkaIntervalMin * 60000;
//delkaIntervalMls = 2 * 60000;
//Serial.print("hodnota: ");
//Serial.print(delkaIntervalMin);
//Serial.print(" Delka intervalu: ");
//Serial.println(delkaIntervalMls);
//Serial.print("Pocet impulzu: ");
//Serial.println(pocetImpulzuHod);
// zmacknuto tlacitko Start
if (digitalRead(inTlacStart) == 0 && tlacStart == false) {
tlacStart = true;
tlacReset = false;
impulsPocet = 0;
digitalWrite(rele_1, HIGH);
startMillisInterval = millis();
lcd.clear();
}
// zmacknuto tlacitko Reset
if (digitalRead(inTlacReset) == 0 && tlacReset == false) {
tlacReset = true;
tlacStart = false;
digitalWrite(poruchaLED, LOW);
impulsPocet = 0;
startMillisInterval = millis();
notPorucha = true;
impulsPress = false;
digitalWrite(rele_1, LOW);
arrayImp.clear();
zobrazInitHodnoty();
}
//if (tlacReset) {
//}
if (tlacStart) {
// impuls = zapnuty stykac=> pripocist Impuls a sepni rele (pokud neni porucha)
if (digitalRead(inImpuls) == 0 && impulsPress == false) {
impulsPress = true;
impulsPocet = impulsPocet + 1;
startMillis = millis();
arrayImp.add(startMillis);
if (notPorucha) {
//##digitalWrite(rele_1, HIGH);
startMillis30 = startMillis;
}
}
// impuls = vypnuty stykac
if (digitalRead(inImpuls) == 1 && impulsPress == true) {
impulsPress = false;
//##digitalWrite(rele_1, LOW);
}
currentMillis = millis();
currentIntervalMin = (currentMillis - startMillisInterval) / 60000; // pouze zobraci cas na LCD
/*
if ((unsigned long)(currentMillis - startMillisInterval) >= delkaIntervalMls) {
//prekroceni delky intervalu => nulovani impulsu a intervalu
impulsPocet = 0;
impulsPress = false;
startMillisInterval = currentMillis;
} else {
// preteceni impulsu v dobe intervalu
if (impulsPocet >= pocetImpulzuHod) {
notPorucha = false;
digitalWrite(poruchaLED, HIGH);
digitalWrite(rele_1, LOW);
}
}
*/
// kontrola v poli na pocet impulsu za nastavene casove obdobi
if (notPorucha) {
for (JsonArray::iterator it=arrayImp.begin(); it!=arrayImp.end(); ++it) {
//Serial.println(it->as<unsigned long>());
if ((unsigned long)(currentMillis - it->as<unsigned long>()) >= delkaIntervalMls) {
arrayImp.remove(it);
}
}
}
// preteceni impulsu v dobe intervalu
if (arrayImp.size() >= pocetImpulzuHod) {
notPorucha = false;
digitalWrite(poruchaLED, HIGH);
digitalWrite(rele_1, LOW);
}
if (impulsPress) {
if ((unsigned long)(currentMillis - startMillis30) >= delka30minMillis) {
notPorucha = false;
digitalWrite(poruchaLED, HIGH);
digitalWrite(rele_1, LOW);
}
}
zobrazHodnoty();
}
}
void zobrazHodnoty() {
//delay(500);
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DOBA CHODU:");
lcd.setCursor(11, 0);
lcd.print(" ");
lcd.setCursor(11, 0);
lcd.print(delka30MinPrepocet);
lcd.setCursor(0, 1);
lcd.print("IMP N:");
lcd.setCursor(6, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(pocetImpulzuHod);
lcd.setCursor(10, 1);
lcd.print("SK:");
lcd.setCursor(13, 1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(arrayImp.size());
lcd.setCursor(0, 2);
lcd.print("CAS N:");
lcd.setCursor(6, 2);
lcd.print(" ");
lcd.setCursor(6, 2);
lcd.print(delkaIntervalMin);
lcd.setCursor(10, 2);
lcd.print("SK:");
lcd.setCursor(13, 2);
lcd.print(" ");
lcd.setCursor(13, 2);
lcd.print(currentIntervalMin);
lcd.setCursor(0, 3);
lcd.print("TOTAL IMP:");
lcd.setCursor(10, 3);
lcd.print(" ");
lcd.setCursor(10, 3);
lcd.print(impulsPocet);
}
void zobrazInitHodnoty() {
delay(500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Press Start ...");
}