#include <TimerOne.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4); // 0x3F is the i2c address and 20 x 4 is the size of the lcd
const int FREQ = 50; // Frequency
int A = 180; //Firing Angle 0 < A < 359
long D = 1000000*(A)/360/FREQ; //Firing Angl in microsecs (+30 moires)
long degrees_60 = 100000060/360/FREQ; //60 degrees in microsecs
long degrees_30 = 100000030/360/FREQ;
long degrees_150 = 1000000150/360/FREQ;
long degrees_330 = 1000000330/360/FREQ;
long degrees_90 = 100000090/360/FREQ;
long degrees_270 = 1000000270/360/FREQ;
long degrees_210 = 1000000*210/360/FREQ;
long previousMicros = 0;
long previousMicros2 = 0;
long previousMicros3 = 0;
int k = 0;
void (*fpointer)();
void check_k();
void reset();
void check_A();
void above();
void under_30();
void between_30_90();
void between_90_150();
void setup()
{
//setting each thyristor to a output port
pinMode(2, INPUT_PULLUP);
pinMode(3,OUTPUT); //thyristor 1
pinMode(4,OUTPUT); //thyristor 2
pinMode(5,OUTPUT); //thyristor 3
pinMode(6,OUTPUT); //thyristor 4
pinMode(7,OUTPUT); //thyristor 5
pinMode(8,OUTPUT); //thyristor 6
pinMode(14,INPUT); //button
pinMode(15,INPUT); //button
pinMode(17,INPUT); //button
//setup pwm chop signal
Timer1.initialize(1000000/20000); // 20.000hz
Timer1.pwm(9, 200); // setup pwm on pin 9, 50% duty cycle
//hardware interrupt for reseting time after each period
attachInterrupt(0, reset, RISING); //input signal from ppl pin 2
//start lcd and print a=
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.setCursor(4,0);
lcd.print("Firing Angle");
lcd.setCursor(4,1);
lcd.print("A = ");
lcd.setCursor(8,1);
lcd.print(A);
// check A and set the pointer to the right function
check_A();
}
void loop() // na dokimasw diafores me to an valw while mesa sto loop kai meta vazw button kai lcd
{ while(1){
// check if a button is pressed
if(digitalRead(14) == HIGH || digitalRead(15) == HIGH || digitalRead(17) == HIGH){
if (digitalRead(14) == HIGH && (millis() - previousMicros2)> 500) {
A=A+5;
previousMicros2 = millis();
}
else if (digitalRead(15) == HIGH && (millis() - previousMicros2)> 500) {
A=A-5;
previousMicros2 = millis();
}
else if (digitalRead(17) == HIGH && (millis() - previousMicros2)> 500) {
A=180;
previousMicros2 = millis();
}
if (A>180) A=180;
if (A<0) A=0;
D = 1000000*(A)/360/FREQ;
check_A();
lcd.setCursor(8,1);
lcd.print(A);
lcd.print(" ");
}
fpointer();
//Serial.println(micros() - previousMicros3);
//previousMicros3 = micros();
}
}
void check_A()
{
if(A<=30){
under_30();
fpointer = &under_30;
}
if(A>30 && A<=90){
between_30_90();
fpointer = &between_30_90;
}
if(A>90 && A<150){
between_90_150();
fpointer = &between_90_150;
}
if(A>=150){
above();
fpointer = &above;
}
}