#include // LCD pins definition #define rs 7 #define en 6 #define d4 5 #define d5 4 #define d6 3 #define d7 2 LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // Encoder pins definition #define CLK 11 #define DT 10 #define SW 8 // Menu buttons #define UP_BTN_PIN 12 #define DOWN_BTN_PIN 13 // Discharge button pin definition #define DISCH_PIN 18 // Output pin definition #define OUT_PIN_1 9 #define OUT_PIN_3 21 // Variables //Encoder variables int currentStateCLK; int lastStateCLK; String currentDir =""; unsigned long lastButtonPress = 0; unsigned long lastButtonPressUP = 0; unsigned long lastButtonPressDOWN = 0; //Discharge button variables unsigned long DICHARGElastButtonPress = 0; int DICHARGEbtnState; //Menu buttons variables bool button_UP_pressed=false; bool button_DOWN_pressed=false; bool button_UP_status=false; bool button_DOWN_status=false; int x, x_check; //Menu variables bool Case_0_status=false; bool Case_1_status=false; bool Case_2_status=false; int menu_status=0; bool menu_status_CHANGE=false; float voltage_level=0; float voltage_step=1; //Battery status variables int battery_status=-1, battery_status_update=-1, battery_level=0, battery_status_counter=1000; int Mode=5; // For testing mode initilize Mode to 5, for regular operation leave it uninitialized int puls_freq=11; //frequency in kHz for pulses in testing mode void setup() { // LCD initialization lcd.begin(20, 4); lcd.clear(); lcd.setCursor(7, 1); lcd.print("O-ESD"); lcd.setCursor(6, 2); lcd.print("WELCOME"); delay(3000); lcd.clear(); lcd.setCursor(1, 0); lcd.print("Battery: "); lcd.setCursor(0, 1); lcd.print(">Discharge: Contact"); lcd.setCursor(1, 2); if (Mode==5) { lcd.print("Frequency: 11 kHz"); } else { lcd.print("Voltage: 0"); } lcd.setCursor(1, 3); lcd.print("Mode: Single"); // Encoder initialization pinMode(CLK,INPUT); pinMode(DT,INPUT); //pinMode(SW, INPUT_PULLUP); pinMode(SW, INPUT); lastStateCLK = digitalRead(CLK); // Output pin initialization digitalWrite(OUT_PIN_1, LOW); pinMode(OUT_PIN_1, OUTPUT); digitalWrite(OUT_PIN_3, LOW); pinMode(OUT_PIN_3, OUTPUT); pinMode(UP_BTN_PIN, INPUT); pinMode(DOWN_BTN_PIN, INPUT); Serial.begin(9600); } void loop() { while(battery_status_counter>1000){ check_battery_status(); print_battery_status(); battery_status_counter=0; } battery_status_counter++; if (menu_status_CHANGE) { switch (menu_status) { case 0: lcd.setCursor(0, 2); lcd.print(" "); lcd.setCursor(0, 3); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(">"); break; case 1: lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 3); lcd.print(" "); lcd.setCursor(0, 2); lcd.print(">"); break; case 2: lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 2); lcd.print(" "); lcd.setCursor(0, 3); lcd.print(">"); break; } menu_status_CHANGE=false; } handle_menu_buttons(); handle_encoder(); if (Mode!=5){ if (!Case_0_status && !Case_2_status) Mode=1; // Contact discharge, Single if (!Case_0_status && Case_2_status) Mode=2; // Contact discharge, Repetition if (Case_0_status && !Case_2_status) Mode=3; // Air discharge, Single if (Case_0_status && Case_2_status) Mode=4; // Air discharge, Repetition } handle_discharge_button(); } void print_battery_status(){ if (battery_status!=battery_status_update || DICHARGEbtnState == HIGH) { switch (battery_status_update){ case 0: lcd.setCursor(9, 0); lcd.print(" "); lcd.setCursor(12, 0); lcd.print("Low"); break; case 1: lcd.setCursor(9, 0); lcd.print(" "); lcd.setCursor(19, 0); lcd.print(char(255)); break; case 2: lcd.setCursor(9, 0); lcd.print(" "); lcd.setCursor(18, 0); lcd.print(char(255));lcd.print(char(255)); break; case 3: lcd.setCursor(9, 0); lcd.print(" "); lcd.setCursor(17, 0); lcd.print(char(255));lcd.print(char(255));lcd.print(char(255)); break; case 4: lcd.setCursor(9, 0); lcd.print(" "); lcd.setCursor(16, 0); lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255)); break; case 5: lcd.setCursor(9, 0); lcd.print(" "); lcd.setCursor(15, 0); lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255)); break; case 6: lcd.setCursor(9, 0); lcd.print(" "); lcd.setCursor(14, 0); lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255)); break; case 7: lcd.setCursor(9, 0); lcd.print(" "); lcd.setCursor(13, 0); lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255)); break; case 8: lcd.setCursor(9, 0); lcd.print(" "); lcd.setCursor(12, 0); lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255));lcd.print(char(255)); break; case 9: lcd.setCursor(9, 0); lcd.print(" "); lcd.setCursor(12, 0);lcd.print("Problem"); break; } battery_status=battery_status_update; } } void check_battery_status(){ battery_level=analogRead(7); if (battery_level <= 696) {battery_status_update=0;} else {if (696 < battery_level && battery_level <= 716) battery_status_update=1; else {if (716 < battery_level && battery_level <= 736) battery_status_update=2; else {if (736 < battery_level && battery_level <= 756) battery_status_update=3; else {if (756 < battery_level && battery_level <= 776) battery_status_update=4; else {if (776 < battery_level && battery_level <= 796) battery_status_update=5; else {if (796 < battery_level && battery_level <= 816) battery_status_update=6; else {if (816 < battery_level && battery_level <= 836) battery_status_update=7; else {if (836 < battery_level && battery_level <= 856) battery_status_update=8; else {battery_status_update=9;} } } } } } } } } } void handle_menu_buttons(){ // Handle buttons int btnStateUP = digitalRead(UP_BTN_PIN); int btnStateDOWN = digitalRead(DOWN_BTN_PIN); if (btnStateUP == HIGH) { if (millis() - lastButtonPressUP > 50) { Serial.print("UP pressed.\n"); if (menu_status>0){ menu_status=menu_status-1; menu_status_CHANGE=true; } } lastButtonPressUP = millis(); } if (btnStateDOWN == HIGH) { if (millis() - lastButtonPressDOWN > 50) { Serial.print("DOWN pressed.\n"); if (menu_status<2){ menu_status=menu_status+1; menu_status_CHANGE=true; } } lastButtonPressDOWN = millis(); } delay(1); } void handle_encoder(){ //if (menu_status==1){ if(true){ currentStateCLK = digitalRead(CLK); //if (currentStateCLK != lastStateCLK && currentStateCLK == 1){ // currentStateCLK ??? if (currentStateCLK != lastStateCLK ){ if (digitalRead(DT) != currentStateCLK) { Serial.print("ENODER -.\n"); if (Mode==5) { puls_freq=puls_freq-1; lcd.setCursor(12, 2); lcd.print(" "); lcd.setCursor(12, 2); lcd.print(puls_freq,1); lcd.print(" kHz"); } else { if (Case_1_status) { voltage_level=voltage_level-0.3; } else { voltage_level=voltage_level-1; } currentDir ="CCW"; lcd.setCursor(12, 2); lcd.print(" "); lcd.setCursor(12, 2); lcd.print(voltage_level,1); lcd.print(" kV"); } } else { Serial.print("ENODER +.\n"); if (Mode==5) { puls_freq=puls_freq+1; lcd.setCursor(12, 2); lcd.print(" "); lcd.setCursor(12, 2); lcd.print(puls_freq,1); lcd.print(" kHz"); } else { if (Case_1_status) { voltage_level=voltage_level+0.3; } else { voltage_level=voltage_level+1; } currentDir ="CW"; lcd.setCursor(12, 2); lcd.print(" "); lcd.setCursor(12, 2); lcd.print(voltage_level,1); lcd.print(" kV"); } } } lastStateCLK = currentStateCLK; } int btnState = digitalRead(SW); if (btnState == HIGH) { if (millis() - lastButtonPress > 50) { Serial.print("ENCODER pressed.\n"); switch (menu_status){ case 0: if (Case_0_status) { lcd.setCursor(12, 1); lcd.print(" "); lcd.setCursor(12, 1); lcd.print("Contact"); Case_0_status=false; } else { lcd.setCursor(12, 1); lcd.print(" "); lcd.setCursor(12, 1); lcd.print("Air"); Case_0_status=true; } break; case 1: if (Case_1_status){ Case_1_status=false; } else{ Case_1_status=true; } break; case 2: if (Case_2_status) { lcd.setCursor(12, 3); lcd.print(" "); lcd.setCursor(12, 3); lcd.print("Single"); Case_2_status=false; } else { lcd.setCursor(12, 3); lcd.print(" "); lcd.setCursor(12, 3); lcd.print("Pulse"); Case_2_status=true; } break; } } lastButtonPress = millis(); } } void handle_discharge_button(){ DICHARGEbtnState = digitalRead(DISCH_PIN); if (DICHARGEbtnState == HIGH) { if (millis() - DICHARGElastButtonPress > 50) { switch (Mode){ case 1: // Contact discharge, Single lcd.clear(); lcd.setCursor(3,1); lcd.print("CONTACT SINGLE"); lcd.setCursor(5,2); lcd.print("DISCHARGE"); digitalWrite(OUT_PIN_1, HIGH); delay(5000); //waits 5s digitalWrite(OUT_PIN_1, LOW); lcd.clear(); lcd.setCursor(0, 1); lcd.print(">Discharge: Contact"); lcd.setCursor(1, 2); lcd.print("Voltage: "); lcd.setCursor(12, 2); lcd.print(voltage_level,1); lcd.print(" kV"); lcd.setCursor(1, 3); lcd.print("Mode: Single"); break; case 2: // Contact discharge, Repetition lcd.clear(); lcd.setCursor(1,1); lcd.print("CONTACT REPETITION"); lcd.setCursor(5,2); lcd.print("DISCHARGE"); for (int counter=0; counter<20; counter++){ digitalWrite(OUT_PIN_1, HIGH); delay(500); //waits 0.5s digitalWrite(OUT_PIN_1, LOW); delay(500); //waits 0.5s lcd.setCursor(9,3); lcd.print(counter); } lcd.clear(); lcd.setCursor(0, 1); lcd.print(">Discharge: Contact"); lcd.setCursor(1, 2); lcd.print("Voltage: "); lcd.setCursor(12, 2); lcd.print(voltage_level,1); lcd.print(" kV"); lcd.setCursor(1, 3); lcd.print("Mode: Pulse"); break; case 3: // Air discharge, Single lcd.clear(); lcd.setCursor(5,1); lcd.print("AIR SINGLE"); lcd.setCursor(5,2); lcd.print("DISCHARGE"); digitalWrite(OUT_PIN_1, HIGH); delay(5000); //waits 5s digitalWrite(OUT_PIN_1, LOW); lcd.clear(); lcd.setCursor(0, 1); lcd.print(">Discharge: Air"); lcd.setCursor(1, 2); lcd.print("Voltage: "); lcd.setCursor(12, 2); lcd.print(voltage_level,1); lcd.print(" kV"); lcd.setCursor(1, 3); lcd.print("Mode: Single"); break; case 4: // Air discharge, Repetition lcd.clear(); lcd.setCursor(3,1); lcd.print("AIR REPETITION"); lcd.setCursor(5,2); lcd.print("DISCHARGE"); for (int counter=0; counter<20; counter++){ digitalWrite(OUT_PIN_1, HIGH); delay(500); //waits 0.5s digitalWrite(OUT_PIN_1, LOW); delay(500); //waits 0.5s lcd.setCursor(9,3); lcd.print(counter); } lcd.clear(); lcd.setCursor(0, 1); lcd.print(">Discharge: Air"); lcd.setCursor(1, 2); lcd.print("Voltage: "); lcd.setCursor(12, 2); lcd.print(voltage_level,1); lcd.print(" kV"); lcd.setCursor(1, 3); lcd.print("Mode: Pulse"); break; case 5: // Testing lcd.clear(); lcd.setCursor(6,1); lcd.print("TESTING"); lcd.setCursor(5,2); lcd.print("DISCHARGE"); int us_delay=1000/(2*puls_freq); for (int counter=0; counter<20000; counter++){ digitalWrite(OUT_PIN_1, HIGH); delayMicroseconds(us_delay); digitalWrite(OUT_PIN_1, LOW); delayMicroseconds(us_delay); } digitalWrite(OUT_PIN_3, HIGH); delay(100); digitalWrite(OUT_PIN_3, LOW); lcd.clear(); lcd.setCursor(1, 1); lcd.print("Discharge: Contact"); lcd.setCursor(0, 2); lcd.print(">Frequency: "); lcd.setCursor(12, 2); lcd.print(puls_freq,1); lcd.print(" kHz"); lcd.setCursor(1, 3); lcd.print("Mode: Single"); break; } } DICHARGElastButtonPress = millis(); lcd.setCursor(1, 0); lcd.print("Battery: "); print_battery_status(); } }