#include <LiquidCrystal_I2C.h>
#define PIN_ULTRASONIC_ECHO (2)
#define PIN_ULTRASONIC_TRIGGER (7)
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
#define DOWN_BUTTON (10)
#define UP_BUTTON (11)
#define POWER_BUTTON (12)
//Gombok
int DOWN_BUTTON_OLDSTATE ; //MENU DOWN Button
int UP_BUTTON_OLDSTATE ; // MENU UP BUtton
int POWER_BUTTON_OLDSTATE ; // PR POWER BUTTON
int DOWN_BUTTON_STATE ; //MENU DOWN Button
int UP_BUTTON_STATE ; // MENU UP BUtton
int POWER_BUTTON_STATE ; // PR POWER BUTTON
unsigned long(POWER_BUTTON_START) = millis();
unsigned long(UP_BUTTON_START) = millis();
unsigned long(DOWN_BUTTON_START) = millis();
// Mérés
void isr_us(void);
unsigned long us_start;
unsigned long us_end;
unsigned long us_time;
bool measurementReady = false;
bool us_start_state = false;
bool us_end_state = false;
// LCD Függvényei
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
void lcd_clear (void);
void lcd_default (void);
void lcd_time_write(float);
void setup() {
Serial.begin(9600);
// Init LCD
lcd.init();
lcd.backlight();
lcd_default();
// Init PR Interupt
pinMode(PIN_ULTRASONIC_ECHO, INPUT_PULLUP);
pinMode(PIN_ULTRASONIC_TRIGGER, OUTPUT);
attachInterrupt(digitalPinToInterrupt(PIN_ULTRASONIC_ECHO), isr_us, CHANGE);
// Init BUTTONS
pinMode(DOWN_BUTTON, INPUT_PULLUP);
pinMode(UP_BUTTON, INPUT_PULLUP);
pinMode(POWER_BUTTON, INPUT_PULLUP);
DOWN_BUTTON_OLDSTATE = digitalRead(DOWN_BUTTON); //MENU DOWN Button
UP_BUTTON_OLDSTATE = digitalRead(UP_BUTTON); // MENU UP BUtton
POWER_BUTTON_OLDSTATE = digitalRead(POWER_BUTTON); // PR POWER BUTTON
digitalWrite(PIN_ULTRASONIC_TRIGGER, HIGH);
}
void loop() {
// Ha a mérés kész
if (measurementReady){
noInterrupts();
measurementReady = false;
unsigned long timeDelta = us_end - us_start;
interrupts();
if (timeDelta != 0) {
lcd_time_write(timeDelta);
Serial.println(timeDelta);
}
}
// POWER BUTTON RED
POWER_BUTTON_STATE = digitalRead(POWER_BUTTON);
if (POWER_BUTTON_STATE != POWER_BUTTON_OLDSTATE and millis() >= POWER_BUTTON_START + 5) {
POWER_BUTTON_OLDSTATE = POWER_BUTTON_STATE;
if (POWER_BUTTON_STATE == HIGH) {
// RELEASED
POWER_BUTTON_START = millis();
}
if (POWER_BUTTON_STATE == LOW) {
// PRESSED
POWER_BUTTON_START = millis();
int triggerState = !digitalRead(PIN_ULTRASONIC_TRIGGER);
digitalWrite(PIN_ULTRASONIC_TRIGGER, triggerState);
lcd_clear ();
lcd.setCursor(0, 0);
lcd.print("READY: ");
if (triggerState) {
lcd.print("ON");
}
else {
lcd.print("OFF");
}
}
}
// UP BUTTON BLUE
UP_BUTTON_STATE = digitalRead(UP_BUTTON);
if (UP_BUTTON_STATE != UP_BUTTON_OLDSTATE and millis() >= UP_BUTTON_START + 5) {
UP_BUTTON_OLDSTATE = UP_BUTTON_STATE;
if (UP_BUTTON_STATE == HIGH) {
// RELEASED
UP_BUTTON_START = millis();
lcd_clear ();
int AO = 1024 - analogRead(7);
lcd.setCursor(0, 0);
lcd.print("LIGHTE : ");
lcd.print(AO);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
for ( int i = 0; i <= AO/64; i++){
lcd.print("#");
}
}
if (UP_BUTTON_STATE == LOW) {
// PRESSED
UP_BUTTON_START = millis();
}
}
// DOWN BUTTON YELLOW
DOWN_BUTTON_STATE = digitalRead(DOWN_BUTTON);
if (DOWN_BUTTON_STATE != DOWN_BUTTON_OLDSTATE and millis() >= DOWN_BUTTON_START + 5) {
DOWN_BUTTON_OLDSTATE = DOWN_BUTTON_STATE;
if (DOWN_BUTTON_STATE == HIGH) {
// RELEASED
DOWN_BUTTON_START = millis();
}
if (DOWN_BUTTON_STATE == LOW) {
// PRESSED
DOWN_BUTTON_START = millis();
}
}
} //loop END
void isr_us(void){
if (measurementReady == false) {
us_time = millis();
bool ECHO = digitalRead(PIN_ULTRASONIC_ECHO);
if (ECHO == LOW and us_start_state == false){
us_start = millis();
us_start_state = true;
us_end_state = false;
//Serial.println("S");
} else if (ECHO == HIGH and us_end_state == false){
measurementReady = true;
us_end = millis();
us_end_state = true;
us_start_state = false;
//Serial.println("E");
}
}
}
void lcd_clear (void){
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
}
void lcd_default (void) {
lcd.setCursor(0, 0);
lcd.print("SHUTTER SPEED ");
lcd.setCursor(0, 1);
lcd.print(" TESTER 2024");
}
void lcd_time_write(float timeDelta){
int ezer = 0;
float time =0;
if (timeDelta > 1000) {
ezer = (timeDelta / 1000 );
timeDelta = timeDelta - (ezer * 1000) ;
time = 1 / float (timeDelta /1000);
Serial.print("time>1000:");
Serial.println(ezer);
Serial.println(time);
}
else if (timeDelta > 100){
time = 1 / float (timeDelta /1000);
Serial.print("time>100:");
Serial.println(time);
}
else {
time = 1000 * (1 / timeDelta);
Serial.print("time<100:");
Serial.println(time);
}
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Time:");
lcd.print(ezer);
lcd.setCursor(7, 1);
lcd.print("+ 1/");
lcd.print(time);
}