#include <LiquidCrystal_I2C.h>
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
LiquidCrystal_I2C lcd(0x27,16,2);
unsigned long BUZZER_START;
unsigned long BUZZER_DELAY = 200; //delay in millis disconected from the LED control
boolean BUZZER = false;
unsigned long TIMER_VALUE = 0;
int BUTTON_NEW = 0;
int BUTTON_OLD = 0;
int SWITCH_STATE = 0;
int LCD_REFRESH = 0;
int NEXT_PROGRAM_NEW = 0;
int NEXT_PROGRAM_OLD = 0;
int PREV_PROGRAM_NEW = 0;
int PREV_PROGRAM_OLD = 0;
float STROKE_LENGHT = 0;
float STROKE_SPEED = 0;
float STROKE_TIME = 0;
int NUMBER_OF_LEDS = 0;
unsigned long DELAY = 0;
int LED_COUNTER = 0;
int DIRECTION = 0;
int LED_POSITION = 0;
int POSITION_VALUE = 0;
int TURN_DIRECTION = 0;
int NUMBER_OF_POSITIONS = 0;
void ON_OFF (){
BUTTON_NEW = digitalRead(4);
if(!((BUTTON_NEW == BUTTON_OLD))){
delay(100);
}
BUTTON_NEW = digitalRead(4);
if((!((BUTTON_NEW == BUTTON_OLD))) && (BUTTON_NEW == 1)){
if(SWITCH_STATE == 0){
SWITCH_STATE = 1;
}else{
SWITCH_STATE = 0;
}
LCD_REFRESH = 0;
}
BUTTON_OLD = BUTTON_NEW;
}
void LENGHT_SELECTOR (){
NEXT_PROGRAM_NEW = digitalRead(3);
if(!((NEXT_PROGRAM_NEW == NEXT_PROGRAM_OLD))){
delay(100);
NEXT_PROGRAM_NEW = digitalRead(3);
if((!((NEXT_PROGRAM_NEW == NEXT_PROGRAM_OLD))) && (NEXT_PROGRAM_NEW == 1)){
STROKE_LENGHT = (STROKE_LENGHT + 10);
if(STROKE_LENGHT == 90){
STROKE_LENGHT = 0;
}
LCD_REFRESH = 0;
SWITCH_STATE = 0;
}
}
NEXT_PROGRAM_OLD = NEXT_PROGRAM_NEW;
}
void SPEED_SELECTOR (){
PREV_PROGRAM_NEW = digitalRead(2);
if(!((PREV_PROGRAM_NEW == PREV_PROGRAM_OLD))){
delay(100);
PREV_PROGRAM_NEW = digitalRead(2);
if((!((PREV_PROGRAM_NEW == PREV_PROGRAM_OLD))) && (PREV_PROGRAM_NEW == 1)){
STROKE_SPEED = (STROKE_SPEED + 10);
if(STROKE_SPEED == 110){
STROKE_SPEED = 0;
}
LCD_REFRESH = 0;
SWITCH_STATE = 0;
}
}
PREV_PROGRAM_OLD = PREV_PROGRAM_NEW;
}
void LCD_CONTROL (){
if((SWITCH_STATE == 1) && (LCD_REFRESH == 0)){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(String("CM:") + String(STROKE_LENGHT));
lcd.setCursor(13,0);
lcd.print(String("ON"));
lcd.setCursor(0,1);
lcd.print(String("CM/S:") + String(STROKE_SPEED));
LCD_REFRESH = 1;
}
if((SWITCH_STATE == 0) && (LCD_REFRESH == 0)){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(String("CM:") + String(STROKE_LENGHT));
lcd.setCursor(13,0);
lcd.print(String("OFF"));
lcd.setCursor(0,1);
lcd.print(String("CM/S:") + String(STROKE_SPEED));
LCD_REFRESH = 1;
}
}
void LED_RING_CONTROL (){
if(SWITCH_STATE == 1){
if((DIRECTION == 0) && (millis() > TIMER_VALUE + DELAY)){
digitalWrite(byte(LED_COUNTER),boolean(0));
LED_COUNTER = (LED_COUNTER + 1);
digitalWrite(byte(LED_COUNTER),boolean(1));
TIMER_VALUE = millis();
if(LED_COUNTER == (NUMBER_OF_LEDS + 4)){
digitalWrite(13, HIGH);
BUZZER = true;
BUZZER_START = millis();
DIRECTION = 1;
}
}
if((DIRECTION == 1) && (millis() > TIMER_VALUE + DELAY)){
digitalWrite(byte(LED_COUNTER),boolean(0));
LED_COUNTER = ((LED_COUNTER - 1));
digitalWrite(byte(LED_COUNTER),boolean(1));
TIMER_VALUE = millis();
if(LED_COUNTER == 5){
digitalWrite(13, HIGH);
BUZZER = true;
BUZZER_START = millis();
DIRECTION = 0;
}
}
}else{
digitalWrite(byte(LED_COUNTER),boolean(0));
LED_COUNTER = 5;
DIRECTION = 0;
}
}
void BUZZER_SWITCH_OFF ()
{
if(BUZZER && millis() > BUZZER_START + BUZZER_DELAY){
BUZZER = false;
digitalWrite(13,LOW);
}
}
void setup() {
lcd.init();
//lcd.begin(20,4);
lcd.backlight();
pinMode(1,INPUT);
pinMode(3,INPUT);
pinMode(2,INPUT);
pinMode(4,INPUT);
pinMode(byte(5),OUTPUT);
pinMode(byte(6),OUTPUT);
pinMode(byte(7),OUTPUT);
pinMode(byte(8),OUTPUT);
pinMode(byte(9),OUTPUT);
pinMode(byte(10),OUTPUT);
pinMode(byte(11),OUTPUT);
pinMode(byte(12),OUTPUT);
pinMode(byte(13),OUTPUT);
Serial.begin (9600);
}
void loop() {
ON_OFF();
SPEED_SELECTOR();
LENGHT_SELECTOR();
STROKE_TIME = (STROKE_LENGHT / STROKE_SPEED) * 1000; //stroke time in milis FOR EXAMPLE 80CM / 10CM/S = 8 SECONDS*1000= 8000 MILIS TO COMPLETE A STROKE
NUMBER_OF_LEDS = (STROKE_LENGHT / 10) + 1; //for example lenght=80 then number of LEDs will be 9 to create also the position 0
NUMBER_OF_POSITIONS = NUMBER_OF_LEDS;
DELAY = STROKE_TIME / (STROKE_LENGHT / 10); //FOR A STROKE TIME OF 8000/(80/10)=8000/8= 1000 milis delay or 1 second
// transfer math to the LCD control function
Serial.println(DELAY);
LED_RING_CONTROL();
LCD_CONTROL();
BUZZER_SWITCH_OFF();
}