#include <Arduino.h>
#include <U8x8lib.h>
// megszakítás
#define PIN_SENSOR_ECHO (2)
#define PIN_SENSOR_TRIGGER (7)
// gombok
#define DOWN_BUTTON (10)
#define UP_BUTTON (11)
#define POWER_BUTTON (12)
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();
// LEDek
#define DO_LED (3)
// Mérés
void isr_us(void);
unsigned long us_start;
unsigned long us_end;
bool measurementReady = false;
bool us_start_state = false;
bool us_end_state = false;
unsigned long timeDelta;
bool TEST_State = false;
// OLED u8x8
//U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ A5, /* data=*/ A4, /* reset=*/ U8X8_PIN_NONE);
U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ 22, /* data=*/ 21, /* reset=*/ U8X8_PIN_NONE);
void oled_time_write(float);
void oled_default(void);
char buff[7];
// Serial
void serial_default(void);
//**************************************************************************************************
void setup() {
Serial.begin(9600);
// Init PR Interupt
pinMode(PIN_SENSOR_ECHO, INPUT_PULLUP);
pinMode(PIN_SENSOR_TRIGGER, OUTPUT);
attachInterrupt(digitalPinToInterrupt(PIN_SENSOR_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
// Init LED
pinMode(DO_LED, OUTPUT);
// Wokwi-photoresistor-sensor ON
digitalWrite(PIN_SENSOR_TRIGGER, HIGH);
// Oled and Serial default
u8x8.begin();
oled_default();
serial_default();
u8x8.refreshDisplay();
}
//**************************************************************************************************
void loop() {
// Ha a mérés kész
if (measurementReady and TEST_State == false){
noInterrupts();
measurementReady = false;
timeDelta = (us_end - us_start) /100;
interrupts();
if (timeDelta != 0) {
oled_time_write(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
TEST_State = false;
measurementReady = false;
POWER_BUTTON_START = millis();
int triggerState = !digitalRead(PIN_SENSOR_TRIGGER);
digitalWrite(PIN_SENSOR_TRIGGER, triggerState);
oled_default();
u8x8.setFont(u8x8_font_8x13B_1x2_f);
u8x8.setCursor(0, 4);
u8x8.print("READY: ");
if (triggerState) {
u8x8.print("ON");
serial_default();
}
else {
u8x8.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();
TEST_State = !TEST_State;
measurementReady = false;
oled_default();
if (TEST_State == false) {
serial_default();
}
}
if (UP_BUTTON_STATE == LOW) {
// PRESSED
UP_BUTTON_START = millis();
}
}
if (TEST_State == true){
int AO = 1024 - analogRead(7);
u8x8.setFont(u8x8_font_8x13B_1x2_f);
u8x8.setCursor(0, 3);
u8x8.print("LIGHTE : ");
u8x8.print(AO);
u8x8.print(" ");
u8x8.setCursor(0, 5);
for ( int i = 0; i <= 13; i++){
if (i <= AO/74) {
u8x8.print("#");
}
else {
u8x8.print(" ");
}
}
}
} //LOOP end
//**************************************************************************************************
void isr_us(void){
bool ECHO = digitalRead(PIN_SENSOR_ECHO);
digitalWrite(DO_LED, !ECHO);
if (measurementReady == false) {
if (ECHO == LOW and us_start_state == false){
us_start = micros();
us_start_state = true;
us_end_state = false;
digitalWrite(DO_LED, HIGH);
} else if (ECHO == HIGH and us_end_state == false){
measurementReady = true;
us_end = micros();
us_end_state = true;
us_start_state = false;
}
}
}
//**************************************************************************************************
void oled_time_write(float timeDelta){
int ezer = 0;
float time =0.000;
//Átszámítás
if (timeDelta > 10000) {
ezer = (timeDelta / 10000 );
timeDelta = timeDelta - (ezer * 10000) ;
time = 1 / float (timeDelta /10000);
}
else if (timeDelta > 1000){
time = 1 / float (timeDelta /10000);
}
else if (timeDelta >= 10){
time = 10000 * (1 / timeDelta);
}
float t = (ezer* 10000 + timeDelta) /10;
// Kiírás oledre
u8x8.setFont(u8x8_font_8x13B_1x2_f);
u8x8.setCursor(0, 3);
u8x8.print("Time: ");
u8x8.setCursor(5, 3);
u8x8.print(t,1);
u8x8.print(" ms");
u8x8.setCursor(0, 6);
u8x8.print("Expo: ");
u8x8.setCursor(5, 6);
if (ezer >0) {
u8x8.print(ezer);
u8x8.print("+1/");
}
else {
u8x8.print("1/");
}
u8x8.print(time, 1);
u8x8.println(" s");
//kiírás serila monitorra
Serial.print("\t");
Serial.print(t, 1);
Serial.print("\t");
Serial.print("\t");
Serial.print(ezer);
Serial.print("\t");
Serial.println(time);
}
//**************************************************************************************************
void oled_default(void){
u8x8.setFont(u8x8_font_pressstart2p_f);
u8x8.clear();
u8x8.drawString(0,0,"Shutter SPEED");
u8x8.refreshDisplay();
}
//**************************************************************************************************
void serial_default(){
Serial.print("Time: ");
Serial.print("\t");
Serial.print("ms");
Serial.print("\t");
Serial.print("Time: " );
Serial.print("\t");
Serial.print("sec" );
Serial.print("\t");
Serial.println("+1/sec");
}