#include <Arduino.h>
#include <U8g2lib.h>
//#include <SPI.h>
//#include <Wire.h>
//#include <Adafruit_ADS1X15.h>
//#include <Adafruit_MCP4728.h>
//#include <Adafruit_MCP23X17.h>
#define ENCODER_CLK_PIN 2
#define ENCODER_DT_PIN 3
#define BUTTON_SW_PIN 4 //ENTER
#define BUTTON_LEFT_PIN 5
#define BUTTON_RIGHT_PIN 6
#define BUTTON_SET_PIN 7
#define LED_SET_PIN 34
#define LED_LOCK_PIN 35
#define BUTTON_ESC_PIN 8
#define LED_ESC_PIN 32
#define LED_ERROR_PIN 33
#define BUTTON_FUNC_PIN 24
#define LED_HOME_PIN 30
#define LED_FUNC_PIN 31
#define BUTTON_ON_OFF_PIN 25
#define LED_ON_PIN 27
#define LED_OFF_PIN 26
#define EXP_INT_PIN 18
U8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2(U8G2_R3, /* reset=*/ U8X8_PIN_NONE);
//U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ PA5, /* data=*/ PA7, /* CS=*/ PB0, /* reset=*/ U8X8_PIN_NONE);
//U8G2_ST7920_128X64_F_HW_SPI u8g2(U8G2_R0, /* CS=*/ PB0, /* reset=*/ U8X8_PIN_NONE);
//Adafruit_MCP4728 DACC;
//Adafruit_ADS1115 ADCC;
//Adafruit_MCP23X17 EXP1;
//Adafruit_MCP23X17 EXP2;
float rnd;
float U_Set = 0.000;
float U_MAX = 40.000;
float I_Set = 0.000;
float I_MAX = 4.000;
float P_Set = 0.00;
float P_MAX = 160.00;
float X_Set;
float X_MAX;
float U_Out = 0;
float I_Out = 0;
float P_Out = 0;
const int ledPin = 13;
byte LE = 10;
byte H_Set = 0;
byte H_Out = 58;
long count_Encoder;
unsigned long count_expander;
bool clicked_B_X;
bool clicked_BUTTON_Enter;
bool Enter;
bool clicked_BUTTON_LEFT;
bool Left;
bool clicked_BUTTON_RIGHT;
bool Right;
bool clicked_BUTTON_ESC;
bool Esc;
bool LED_ESC;
bool LED_ALARM;
bool LED_WARNING;
bool clicked_BUTTON_FUNC;
bool Func;
bool Menu;
bool LED_MENU;
bool LED_FUNC;
bool clicked_BUTTON_ON_OFF;
bool flag_ON_OFF;
bool ON_OFF;
bool LED_ON_OFF;
bool clicked_BUTTON_SET;
bool Setup;
bool LED_LOCK;
bool LED_SET;
//func
bool Lock;
bool one_Hz;
bool RISING_Hz;
byte status_Set; // вибір налаштування (напруга, струм, потужність)
bool flag_Set;
byte status_U_Set; // розряд числа наруги (1 - наймолодший розряд 0.001, 5 - найстарший розряд 10,000)
byte status_I_Set; // розряд числа струму (1 - наймолодший розряд 0.001, 5 - найстарший розряд 10,000)
byte status_X_Set;
byte status_P_Set; // розряд числа потудності (1 - наймолодший розряд 0.01, 5 - найстарший розряд 100,000)
bool const_P_Set_UI; // чи вибрана константа напруга чи струм
byte status_P_Set_UI;// яка константа вибрано
bool error_const_P_Set_UI; // константа рівна нулю
long count_Set;
bool flag_U1_Set;
bool flag_U2_Set;
bool flag_U3_Set;
bool flag_U4_Set;
bool flag_U5_Set;
bool flag_I1_Set;
bool flag_I2_Set;
bool flag_I3_Set;
bool flag_I4_Set;
bool flag_I5_Set;
bool flag_P_UI_Set;
bool flag_P1_Set;
bool flag_P2_Set;
bool flag_P3_Set;
bool flag_P4_Set;
bool flag_P5_Set;
bool flag_X1_Set;
bool flag_X2_Set;
bool flag_X3_Set;
bool flag_X4_Set;
bool flag_X5_Set;
bool flag_X6_Set;
bool flag_X7_Set;
int PASSWORD_A[] = {1, 1, 1, 1};
int PASSWORD_LOCK[] = {0, 0, 0, 0};
byte status_PASSWORD;
bool flag_PASSWORD_OK;
bool flag_PASSWORD_1;
bool flag_PASSWORD_2;
bool flag_PASSWORD_3;
bool flag_PASSWORD_4;
int select_memory;
int error;
bool ALARM;
bool WARINING;
byte page;
byte page_1;
byte alar_war;
#define lock_width 9
#define lock_height 9
static unsigned char lock_bits[] = {
0xc7, 0x01, 0x93, 0x01, 0xbb, 0x01,
0x01, 0x01, 0x01, 0x01, 0x11, 0x01,
0x11, 0x01, 0x01, 0x01, 0x01, 0x01
};
float memory_U[16];
float memory_I[16];
int incomingByte;
void setup() {
Serial.begin(9600);
while (!Serial) {
delay(100); // wait for native usb
}
u8g2.begin();
/*if (!ADCC.begin(0x48)) {
//Serial.println("Failed to find ADS1115");
//error = 105;
}
if (!DACC.begin(0x60)) {
//Serial.println("Failed to find MCP4728");
//error = 106;
}
if (!EXP1.begin_I2C(0x20)) {
//Serial.println("Failed to find MCP_EXP1");
//error = 107;
}
if (!EXP2.begin_I2C(0x21)) {
//Serial.println("Failed to find MCP_EXP2");
//error = 108;
}*/
pinMode(ENCODER_CLK_PIN, INPUT);
pinMode(ENCODER_DT_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK_PIN), readEncoder, FALLING);
//attachInterrupt(digitalPinToInterrupt(EXP_INT_PIN), expander, RISING);
pinMode(BUTTON_SW_PIN, INPUT_PULLUP); //ENTER
pinMode(BUTTON_LEFT_PIN, INPUT_PULLUP);
pinMode(BUTTON_RIGHT_PIN, INPUT_PULLUP);
pinMode(BUTTON_ESC_PIN, INPUT_PULLUP);
pinMode(LED_ESC_PIN, OUTPUT);
pinMode(LED_ERROR_PIN, OUTPUT);
pinMode(BUTTON_FUNC_PIN, INPUT_PULLUP);
pinMode(LED_HOME_PIN, OUTPUT);
pinMode(LED_FUNC_PIN, OUTPUT);
pinMode(BUTTON_ON_OFF_PIN, INPUT_PULLUP);
pinMode(LED_ON_PIN, OUTPUT);
pinMode(LED_OFF_PIN, OUTPUT);
pinMode(BUTTON_SET_PIN, INPUT_PULLUP);
pinMode(LED_SET_PIN, OUTPUT);
pinMode(LED_LOCK_PIN, OUTPUT);
pinMode(ledPin, OUTPUT);
byte i;
for (i = 0; i < 16; i = i + 1) {
rnd = random(10000);
memory_U[i] = rnd / 1000;
memory_I[i] = memory_U[i];
}
delay(500);
}
void readEncoder () {
bool dtValue = digitalRead(ENCODER_DT_PIN);
if (dtValue == 1) {
count_Encoder--; // Clockwise
}
if (dtValue == 0) {
count_Encoder++; // Counterclockwise
}
}
void expander () {
count_expander++;
}
void loop() {
//Serial.println(count_expander);
button_Enter ();
button_Left ();
button_Right ();
button_Esc ();
button_ON_OFF ();
button_Func_Menu ();
button_Set ();
calculations ();
static uint32_t tmr1;
if (millis() - tmr1 >= 100) {
tmr1 = millis();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_profont15_tr);
//u8g2.setFont(u8g2_font_frigidaire_mr);
//u8g2.setFont(u8g2_font_crox1h_tr);
switch (page) {
case 1: //main
switch (page_1) {
case 1:
main_page_Set();
break;
case 2: //P_Set
P_Set_UI_page();
break;
case 3: //unlocking
unlocking_page();
break;
}
main_page_Out();
alarm_warning();
break;
case 2:
Func_page();
break;
case 3:
Menu_page();
break;
/*case 4:
break;
case 5:
break;
case 6:
break;*/
default:
u8g2.drawButtonUTF8(5, 20, U8G2_BTN_INV, u8g2.getDisplayWidth() - 5 * 2, 5, 2, "LOADING" );
}
if (alar_war > 0) {
alarm_warning ();
}
// ... write something to the buffer
u8g2.sendBuffer();
}
static uint32_t tmr2;
if (millis() - tmr2 >= 500) {
tmr2 = millis();
rnd = random(1000);
if (U_Out > U_Set) {
U_Out = U_Out - rnd / 1000;
} else {
U_Out = U_Out + rnd / 1000;
}
if (U_Out < 0) {
U_Out = 0;
}
I_Out = U_Out / 10;
P_Out = I_Out * U_Out;
}
RISING_Hz = 0;
static uint32_t tmr_1Hz;
if (millis() - tmr_1Hz >= 1000) {
tmr_1Hz = millis();
one_Hz = !one_Hz;
RISING_Hz = 1;
}
if (page == 0 && one_Hz == 1) {
page = 1;
page_1 = 1;
}
}