// library of lcd screen
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// value switch input and relay output
int Switch_Low = 12, Switch_High = 11, Switch_Reset = 5; // swtich input
int Relay_1 = 7, Relay_2 = 6; // relay output
int Reset_State = 0, Reset_Value = 0; // state and value of reset switch
// value of rotary encoder
int Switch_Rotary = 10, CLK = 8, DT = 9; // pin of rotary encoder
int Counter_Low = 50, Counter_High = 150; // counter clock signal
int currentStateCLK; // save state data clock signal
int lastStateCLK; // save last state data clock signal
unsigned long lastButtonPress = 0; // save last state data button rotary encoder
float valuePVL = 0, pvL = 5, valuePVH = 0, pvH = 15; // value for save data set
// value of transmitter
int transmitter = 0;
float voltage = 0, ampere = 0;
void setup() {
// set bit rate
Serial.begin(9600);
// set I/O pin mode
pinMode(Switch_Low, INPUT); // switch low set
pinMode(Switch_High, INPUT); // switch high set
pinMode(Switch_Rotary, INPUT); // switch rotary
pinMode(CLK, INPUT); // clock signal
pinMode(DT, INPUT); // rotage signal
pinMode(Relay_1, OUTPUT); // output relay 1
pinMode(Relay_2, OUTPUT); // output relay 2
// set function interupt
interupt();
// set rotary encoder
lastStateCLK = digitalRead(CLK); // get last state clock signal
// set lcd screen
lcd.init(); //can use lcd.begin();
lcd.backlight(); // on-off background
lcd.setCursor(0,0); lcd.print("PV:");
lcd.setCursor(12, 0); lcd.print("(mA)");
lcd.setCursor(0,1); lcd.print("L:");
lcd.setCursor(9,1); lcd.print("H:");
}
void loop() {
// condition of press and hold switch low set
if (digitalRead(Switch_Low) == LOW && digitalRead(Switch_High) == HIGH) {
currentStateCLK = digitalRead(CLK);
if (currentStateCLK != lastStateCLK && currentStateCLK == 1){
if (digitalRead(DT) != currentStateCLK) {
Counter_Low ++;
valuePVL = Counter_Low * 0.1;
}
else if(digitalRead(DT) == currentStateCLK){
Counter_Low --;
valuePVL = Counter_Low * 0.1;
}
if (valuePVL <= 0) {
Counter_Low = 0;
pvL = 0;
}
else if (valuePVL >= 0 && valuePVL <= 20) {
pvL = valuePVL;
}
else if (valuePVL >= 20) {
Counter_Low = 200;
pvL = 20;
}
lcd.setCursor(4,0); lcd.print(ampere,1);
lcd.print(" ");
lcd.setCursor(3,1); lcd.print(pvL,1);
lcd.print(" ");
}
lastStateCLK = currentStateCLK;
}
// condition of press and hold switch high set
else if (digitalRead(Switch_Low) == HIGH && digitalRead(Switch_High) == LOW) {
currentStateCLK = digitalRead(CLK);
if (currentStateCLK != lastStateCLK && currentStateCLK == 1){
if (digitalRead(DT) != currentStateCLK) {
Counter_High ++;
valuePVH = Counter_High * 0.1;
}
else if(digitalRead(DT) == currentStateCLK){
Counter_High --;
valuePVH = Counter_High * 0.1;
}
if (valuePVH <= 0) {
Counter_High = 0;
pvH = 0;
}
else if (valuePVH >= 0 && valuePVH <= 20) {
pvH = valuePVH;
}
else if (valuePVH >= 20) {
Counter_High = 200;
pvH = 20;
}
lcd.setCursor(4,0); lcd.print(ampere,1);
lcd.print(" ");
lcd.setCursor(12,1); lcd.print(pvH,1);
lcd.print(" ");
}
lastStateCLK = currentStateCLK;
}
// condition of another
else {
lcd.setCursor(4,0); lcd.print(ampere,1);
lcd.print(" ");
lcd.setCursor(3,1); lcd.print(pvL,1);
lcd.print(" ");
lcd.setCursor(12,1); lcd.print(pvH,1);
lcd.print(" ");
}
// call alarm function
alarm();
}
// function interupt
ISR(TIMER1_COMPA_vect) { // interupt service rutine
TCNT1 = 0;
transmitter = analogRead(A3); // read data of transmitter
voltage = (transmitter*5.0)/1024.0; // convert analogread(0-1023) to voltage
ampere = voltage*4; // convert voltage to ampere
}
void interupt() {
cli(); // clear all interupt
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= B00000100;
TIMSK1 |= B00000010;
OCR1A = 6250; // set timer of interval 100 ms = 6250
sei(); // enable all timer for interupt
}
// function alarm
void alarm() {
Reset_State = digitalRead(Switch_Reset); // get data reset switch
// condition when no alarm
if(Reset_State == HIGH && Reset_Value == 0) {
// condition when ampere < pvL
if (ampere < pvL) {
digitalWrite(Relay_1, LOW);
digitalWrite(Relay_2, HIGH);
Reset_Value = 1; // value is 1 for not swap alarm
}
// condition when ampere < pvH
else if (ampere < pvH) {
digitalWrite(Relay_1, HIGH);
digitalWrite(Relay_2, HIGH);
}
// condition when ampere > pvH
else if (ampere > pvH) {
digitalWrite(Relay_1, HIGH);
digitalWrite(Relay_2, LOW);
Reset_Value = 1; // value is 1 for not swap alarm
}
}
// condition when alarm
else if (Reset_State == LOW && Reset_Value == 1) {
// condition when ampere < pvL
if (ampere < pvL) {
digitalWrite(Relay_1, LOW);
digitalWrite(Relay_2, HIGH);
}
// condition when ampere < pvH
else if (ampere < pvH) {
digitalWrite(Relay_1, HIGH);
digitalWrite(Relay_2, HIGH);
}
// condition when ampere > pvH
else if (ampere > pvH) {
digitalWrite(Relay_1, HIGH);
digitalWrite(Relay_2, LOW);
}
Reset_Value = 0; // value is 0 for reset alarm
}
}