#include <LiquidCrystal_I2C.h>
// LCD panel
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// Gomb
#define BUTTON_PIN 12
unsigned long TIME_START; //Lenyomás kezdete
unsigned long TIME_END; //Lenyomás vége
unsigned long TIME_VALUE; // eltelt idő
unsigned long STATE_START; //
int lastState = HIGH;
int value;
// Led RED
#define LED_R 8
// Photo resistor
#define PR_VCC 7
#define PR_DO 2
unsigned long TIME_START_PR; //Mérés kezdete
unsigned long TIME_END_PR; //Mérés vége
float TIME_VALUE_PR; //Eltelt idő
unsigned long STATE_START_PR;
unsigned long LAST_STATE_START_PR;
int lastState_PR = LOW;
int value_PR = digitalRead(PR_DO);
int PR_VCC_State = HIGH;
int EZER;
float HANYAD;
// Függvények
void isr_PR(void);
void setup() {
// Init
lcd.init();
lcd.backlight();
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
digitalWrite(BUTTON_PIN, HIGH);
pinMode(PR_VCC, OUTPUT);
digitalWrite(PR_VCC, HIGH);
pinMode(PR_DO, INPUT_PULLUP);
digitalWrite(PR_DO, LOW);
attachInterrupt(digitalPinToInterrupt(2), isr_PR, CHANGE);
TIME_START = millis();
}
void loop() {
// Nyomogomb
value = digitalRead((BUTTON_PIN));
if (lastState != value and millis() >= STATE_START + 3) {
lastState = value;
if (value == HIGH) {
// RELEASED
STATE_START = millis();
TIME_END = millis();
TIME_VALUE = TIME_END - TIME_START;
HANYAD = TIME_VALUE;
int H = 1/(HANYAD/10000);
Serial.print(" released :");
Serial.println(TIME_VALUE);
Serial.print("1/");
Serial.println(H);
digitalWrite(LED_R, LOW);
digitalWrite(PR_VCC, PR_VCC_State );
}
if (value == LOW) {
// PRESSED
STATE_START = millis();
TIME_START = millis();
Serial.println(" pressed");
digitalWrite(LED_R, HIGH);
PR_VCC_State = !PR_VCC_State;
}
}
// Érzékelő
value_PR = digitalRead(PR_DO);
if (lastState_PR != value_PR) {
lastState_PR = value_PR;
if (value_PR == HIGH) {
Serial.print(" NO LIGHT :");
TIME_VALUE_PR = TIME_END_PR - TIME_START_PR;
Serial.println(TIME_VALUE_PR);
EZER=(TIME_VALUE_PR/1000);
lcd.setCursor(0, 0);
lcd.print(" ");
if (EZER > 0) {
Serial.print(EZER);
Serial.print(" + 1/");
Serial.println(float((1/TIME_VALUE_PR)*1000));
lcd.setCursor(0, 0);
lcd.print(EZER);
lcd.print(" + 1/");
lcd.print(float((1/TIME_VALUE_PR-(EZER*1000))*1000));
}
else {
Serial.print(" 1/");
Serial.println(float((1/TIME_VALUE_PR)*1000));
lcd.setCursor(3, 0);
lcd.print(" 1/");
lcd.print(float((1/TIME_VALUE_PR)*1000));
}
}
else {
Serial.println(" LIGHT ");
}
}
}
void isr_PR(void) {
if (digitalRead(PR_DO) == HIGH) {
STATE_START_PR = millis();
TIME_END_PR = millis();
}
else {
if (digitalRead(PR_DO) == LOW) {
STATE_START_PR = millis();
TIME_START_PR = millis();
}
}
}