#include <LiquidCrystal_I2C.h>
#define PIN_ULTRASONIC_ECHO (2)
#define PIN_ULTRASONIC_TRIGGER (A1)
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
#define DOWN_BUTTON (11)
#define UP_BUTTON (12)
#define POWER_BUTTON (13)
//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;
bool measurementReady = 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);
// Tömb deklaráció
const int rows = 14;
const int cols = 2;
int ShutterTimeArray[rows][cols] = {
{1000, 1},
{500, 2},
{300, 3},
{250, 4},
{200, 5},
{125, 8},
{100, 10},
{60, 16},
{30, 33},
{15, 66},
{10, 100},
{5, 200},
{2, 500},
{1, 1000}
};
int sor =6;
void setup() {
Serial.begin(115200);
// Init LCD
lcd.init();
lcd.backlight();
lcd_default();
// Init PR Interupt
pinMode(PIN_ULTRASONIC_ECHO, INPUT);
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
}
void loop() {
// Ha a mérés kész
if (measurementReady){
noInterrupts();
measurementReady = false;
unsigned long timeDelta = us_end - us_start;
interrupts();
lcd_time_write(timeDelta);
//Serial.println(timeDelta);
//Serial.print(millio);
//Serial.print(" sec 1/");
//Serial.println(time);
}
// 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);
}
}
// 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();
}
if (UP_BUTTON_STATE == LOW) {
// PRESSED
if (sor > 0) {
sor-=1;}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("1/");
lcd.print(ShutterTimeArray[sor][0]);
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
if (sor < rows-1 ) {
sor+=1;}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("1/");
lcd.print(ShutterTimeArray[sor][0]);
UP_BUTTON_START = millis();
DOWN_BUTTON_START = millis();
}
}
} //loop END
void isr_us(void){
if(digitalRead(PIN_ULTRASONIC_ECHO) == LOW){
us_start = micros();
}
else{
us_end = micros();
measurementReady = true;
}
}
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(5, 1);
lcd.print("TESTER 2024");
}
void lcd_time_write(float timeDelta){
int millio = (timeDelta / 1000000 );
timeDelta = timeDelta - (millio * 1000000) ;
float time = 1000 / float (timeDelta /1000);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Time: ");
lcd.print(millio);
lcd.print("+1/");
lcd.print(time);
}