476 lines
14 KiB
C++
476 lines
14 KiB
C++
#include <LiquidCrystal.h>
|
|
|
|
// 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();
|
|
}
|
|
}
|