You are on page 1of 5

#include <Wire.

h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

int pin_Var1 = A0;


int pin_Var2 = A3;
int pin_LDR = A1;
int pin_Led = 7;
int pin_Btn = 9;

int val_Var1, val_Var2, val_LDR = 0;


double sum;
unsigned long set_time, time_left, time_now, time1_now;
int wait_time = 1500;
float freq;

int btnPushCounter = 0;
int btnState = 0;
int lastBtnState = 0;
int btnLongPres = 0;

int count = 0;
bool led_stt, last_led_stt;

int number_Screen = 0;

void setup() {
Serial.begin(115200);

pinMode(pin_Var1, INPUT);
pinMode(pin_Var2, INPUT);
pinMode(pin_LDR, INPUT);
pinMode(pin_Btn, INPUT);
pinMode(pin_Led, OUTPUT);

lcd.init();
lcd.clear();
lcd.backlight();
lcdString(1,1, "Optical frequency");
lcdString(2,2, "counting device");
delay(2000);
lcd.clear();

lcdString(5,0, "Brightness");
lcdString(3,1,"calculation...");
autp_measure();
lcdString(7,2, "Ready!");
delay(2000);
lcd.clear();

void loop() {
// put your main code here, to run repeatedly:

buttonState();
switch(number_Screen)
{
case 1:
main_Screen();
break;
case 2:
result_Screen();
break;
default:
setting_Screen();
count = 0;
break;
}
lastBtnState = btnState;
}
void setting_Screen()
{
lcdString(7,0, "SETTING");
lcdString(0,1, "Set time :");
lcdString(0,2, "Set value:");
lcdString(0,3, "LDR value:");
val_LDR = analogRead(pin_LDR);

if ( btnPushCounter == 0)
set_time = 60;
if ( btnPushCounter == 1)
set_time = 120;
if ( btnPushCounter == 2)
set_time = 240;
if ( btnPushCounter == 3)
set_time = 300;

time_left = set_time;

lcdValue(11,1, set_time);
lcdString(14,1, "s");
lcdValue(11,2, val_Var1);
lcdValue(11,3, val_LDR);

lcdString(15,3, "Run");
lcdString(18,3, ">>");

}
void main_Screen()
{
lcdString(5,0, "COUNTING...");
lcdString(0,1, "Time left :");
lcdString(0,2, "Count value:");
lcdString(0,3, "<<");
lcdString(3,3, "Setup");

if ( (unsigned long) (millis() - time_now) > 975 )


{
if (time_left > 0)
time_left = time_left - 1;
lcdValue(13,1, time_left);
time_now = millis();
}
val_LDR = analogRead(pin_LDR);
if (val_LDR > val_Var1)
{
digitalWrite(pin_Led, HIGH);
led_stt = true;
}
else
{
digitalWrite(pin_Led, LOW);
led_stt = false;
}
if ( led_stt != last_led_stt)
{
if (led_stt == true)
count++;

}
last_led_stt = led_stt;

if ( time_left > 0)
lcdValue(13,2, count);

if (time_left == 0)
{
number_Screen = 2;
lcd.clear();
}

}
void result_Screen()
{
lcdString(7,0, "RESULT");
lcdString(0,1, "Time Count: ");
lcdString(0,2, "Num of count: ");
lcdString(0,3, "Freq: ");

freq = (count/(set_time/60));

lcdValue(12,1, set_time);
lcdString(15,1, "s");

lcdValue(14,2, count );

lcdValue(6,3, freq);
lcdString(9,3, "time/min");
lcdString(18,3, ">>");
}

void buttonState()
{
btnState = digitalRead(pin_Btn);
if (btnState != lastBtnState)
{
time1_now = millis();
if (btnState == LOW)
{
btnPushCounter++;

}
}
if ( (unsigned long) (millis() - time1_now) > wait_time)
{
btnLongPres = btnState;
time1_now = millis();
}

if (btnLongPres == 1)
{
number_Screen++;
lcd.clear();
btnLongPres = 0;
if (number_Screen > 1)
number_Screen = 0;
}
if (number_Screen > 2)
number_Screen = 0;

if (btnPushCounter > 3)
btnPushCounter = 0;
}
void autp_measure()
{
for (int i = 0; i < 200; i++)
{
val_LDR = analogRead(pin_LDR);
sum = sum + val_LDR;
val_Var1 = sum/200 + 20;
lcdValue(0,3, val_Var1);
}

}
void lcdString( int _colum, int _row, String _string)
{
lcd.setCursor(_colum, _row);
lcd.print(_string);
}

void lcdValue( int _colum, int _row, int _value)


{
lcd.setCursor(_colum, _row);
lcd.print(_value);
if ( _value < 1000)
{
lcd.setCursor(_colum, _row);
lcd.print(_value);
lcd.setCursor(_colum + 3, _row);
lcd.print(" ");
}
if ( _value < 100 )
{
lcd.setCursor(_colum, _row);
lcd.print(_value);
lcd.setCursor(_colum + 2, _row);
lcd.print(" ");
}
if ( _value < 10 )
{
lcd.setCursor(_colum, _row);
lcd.print(_value);
lcd.setCursor(_colum + 1, _row);
lcd.print(" ");
}

You might also like