#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 TimeStartButton; //Gomb Lenyomás kezdete
unsigned long TimeEndButton; //Gomb Lenyomás vége
unsigned long TimeValueButton; //Eltelt idő
unsigned long TimeStateButton; // Gomb státusváltozás kezdet
int LastStateButton; //Gomb előző állapota
int StateButton; // A gomb pillanatnyi állapota
// 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 State_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);
TimeStartButton = micros();
}
void loop() {
// Nyomogomb
StateButton = digitalRead((BUTTON_PIN));
if (LastStateButton != StateButton and micros() >= TimeStateButton + 3) {
LastStateButton = StateButton;
if (StateButton == HIGH) {
// RELEASED
TimeStateButton = micros();
TimeEndButton = micros();
TimeValueButton = TimeEndButton - TimeStartButton;
Hanyad = TimeValueButton;
float H = 1/(Hanyad/1000);
Serial.print(" released :");
Serial.println(TimeValueButton);
Serial.print("1/");
Serial.println(H);
digitalWrite(LED_R, LOW);
digitalWrite(PR_VCC, PR_VCC_State );
}
if (StateButton == LOW) {
// PRESSED
TimeStateButton = micros();
TimeStartButton = micros();
Serial.println(" pressed");
digitalWrite(LED_R, HIGH);
PR_VCC_State = !PR_VCC_State;
}
}
// Érzékelő
State_PR = digitalRead(PR_DO);
if (lastState_PR != State_PR) {
lastState_PR = State_PR;
if (State_PR == HIGH) {
Serial.print(" NO LIGHT :");
TIME_VALUE_PR = TIME_END_PR - TIME_START_PR;
Serial.println(TIME_VALUE_PR);
lcd.setCursor(0, 0);
lcd.print(" ");
Ezer=int(TIME_VALUE_PR/1000000);
if (Ezer > 0) {
Serial.print(Ezer);
Serial.print(" + 1/");
Hanyad = TIME_VALUE_PR - Ezer * 1000000;
float H = float (1/Hanyad)*10000000;
Serial.println( H );
lcd.setCursor(0, 0);
lcd.print(Ezer);
lcd.print(" + 1/");
lcd.print( H );
}
else {
Serial.print(" 1/");
Hanyad = TIME_VALUE_PR - Ezer * 1000000;
float H = float (1/Hanyad)*10000000;
Serial.println( H );
lcd.setCursor(3, 0);
lcd.print(" 1/");
lcd.print( H );
}
}
else {
Serial.println(" LIGHT ");
}
}
}
void isr_PR(void) {
if (digitalRead(PR_DO) == HIGH) {
STATE_START_PR = micros();
TIME_END_PR = micros();
}
else {
if (digitalRead(PR_DO) == LOW) {
STATE_START_PR = micros();
TIME_START_PR = micros();
}
}
}