#include <EEPROM.h>
bool lock = 0;
const int8_t segPin[7] = {3, 4, 5, 6, 7, 8, 9};
const int8_t digPin[3] = {10, 11,12};
const int8_t btnPin[7] = {3, 4, 7, 5, 6, 8, 9};
const int8_t output[4] = {A0, A2, A1, A3};
bool buttonPressed, segOn, digOn, pass = false;
const byte segCode[15] = {
0xC0, // "0"
0b01111001, // "1"
0b00100100, // "2"
0b00110000, // "3"
0b00011001, // "4"
0b00010010, // "5"
0b00000010, // "6"
0b01111000, // "7"
0b00000000, // "8"
0b00010000, // "9"
0b00001100, // "P"
0b00000110, // "E"
0b00111111, // "12" "-"
0b01111111, // "13" "off"
0b01000001, // "13" "U"
};
byte disCode[3] = {64, 64, 127};
int8_t _B = -1;
int8_t _cd[4] = {0};
int8_t che[4] = {0};
int8_t apass[4] = {2,4,7,3};
int8_t capass[4] = {0};
int8_t spass[4] = {0};
int8_t cspass[4] = {0};
bool isEqual = true;
const byte ledCode[] = {
0b01111111, // "0" "off"
0b01111100, //"A" 3"1" "PRER" Wating 2,6
0b01111101, //"B" 4"2" "RUN"
0b01111011, //"C" 5"3" "SHOR" "cycle"
0b01100111, //"D" 6"4" "Over loed"
0b01011101, //"F" 8 "5" "FALL" "Material" DN 0,1
0b00111101, //"G"9 "6" "SUCT" "Auto Loader" UP 4,5
0b00111111, // "0" "off"
0b01111111, //
};
enum Loop { NONE, RUN, SETUP, RESET, ALARM, ADMIN, WRITE,};
byte code, led;
Loop current = NONE;
int8_t counter = 0;
int8_t pp, ll, oo, ada, adb = 0;
byte para[8] = {2, 15, 30, 3, 30, 20, 30, 3,};
byte paramax[8] = {5, 30, 50, 5, 50, 30, 60, 5};
byte paramin[8] = {1, 5, 5, 0, 5, 5, 5, 0};
#define wrong 2
#define SPEAKER 13
#define upsen A5
#define downsen A4
void setCode (byte one, byte ten, byte led)
{
if (led < 0 || led > 8)led = 0;
disCode[0] = segCode[one];
disCode[1] = segCode[ten];
disCode[2] = ledCode[led];
}
bool _F, aada = false;
unsigned long lastPressedTime = 200;
int8_t btnRead, btn = -1;
int8_t checkbtn()
{
for (byte i = 0; i < 7; i++) {
digitalWrite(btnPin[i], segOn);
pinMode(btnPin[i], INPUT_PULLUP);
delayMicroseconds(1);
if (digitalRead(btnPin[i]) == LOW && millis() - lastPressedTime >= 200) {
pinMode(btnPin[i], OUTPUT);
digitalWrite(btnPin[i], !segOn);
btnRead = btnPin[i];
lastPressedTime = millis();
return btnRead;
}
delayMicroseconds(1);
pinMode(btnPin[i], OUTPUT);
digitalWrite(btnPin[i], !segOn);
}
return -1;
}
void refresh()
{ bool _q = 0;
for (int8_t d = 0; d < sizeof(digPin); d++) {
if (d == 2 && disCode[2] == 127)break;
digitalWrite(digPin[d], digOn); //0 Low
//
for (int8_t s = 0; s < sizeof(segPin); s++) {
_q = ((disCode[d] >> s) & 0x01) == 0x01;
if ((s == 1 || s == 2 || s == 3) && d == 2 && !_q && (millis() % 800 < 400))_q = !_q;
digitalWrite(segPin[s], _q ? !segOn : segOn);
}
delay(4);
digitalWrite(digPin[d], !digOn); // বর্তমান digit OFF
for ( int8_t i = 0; i < sizeof(segPin); i++) digitalWrite(segPin[i], !segOn);
delay(3);
}
if (checkbtn() != -1) btn = btnRead;
if ((btn == 3 || btn == 4 || btn == 7) && buttonPressed == false)asm volatile ("jmp 0");
}
void over()
{
if (!buttonPressed) {
asm volatile ("jmp 0");
while (1);
}
}
void countdown(int8_t signal)
{
int8_t out;
led = (signal == 0 || signal == 1) ? 5 : (signal == 4 || signal == 5) ? 6 : (signal == 2 || signal == 6) ? 1 : 2;
out = (signal == 0) ? 0 : (signal == 1) ? 1 : (signal == 4) ? 2 : (signal == 5) ? 3 : -1;
setCode(10, signal, led);
int8_t c1 = para[signal] ;
static byte prevSeconds = (millis() - 1000) / 1000; // মিলিসেকেন্ড ব্যবহার করে সেকেন্ডের পরিবর্তন নোট করুন
while (c1 >= -1) {
refresh();
byte currentSeconds = (millis() - 1000) / 1000;
if (currentSeconds != prevSeconds) {
prevSeconds = currentSeconds;
if (c1 > 0 && out != -1) digitalWrite(output[out], HIGH);
else if (c1 >=0 && out != -1) digitalWrite(output[out], LOW);
setCode(c1 / 10, c1 % 10, led);
c1--;
}
}
}
void readEEPROM()
{
//parameters read form EEPROM
for (byte i = 0; i < 8; i++)
{
if (para[i] != EEPROM.read(i + 1)) para[i] = (EEPROM.read(i + 1) < 0 || EEPROM.read(i + 1) > 100 ) ? para[i] : EEPROM.read(i + 1);
if (paramax[i] != EEPROM.read(i + 10))paramax[i] = (EEPROM.read(i + 10) < 0 || EEPROM.read(i + 10) > 100 ) ? paramax[i] : EEPROM.read(i + 10);
}
for (byte gh = 0; gh < 4; gh++)
{
if (spass[gh] != EEPROM.read(gh + 20))
{
if (EEPROM.read(gh + 20) < 0 || EEPROM.read(gh + 20) > 10 ) {
for (int8_t s_ = 0; s_ < 4; s_++) {
spass[s_] = 0;
}
}
else {
spass[gh] = EEPROM.read(gh + 20);
}
}
if (apass[gh] != EEPROM.read(gh + 30)) {
if (EEPROM.read(gh + 30) < 0 || EEPROM.read(gh + 30) > 10 ) {
for (int8_t t_ = 0; t_ < 4; t_++)apass[t_] = apass[t_];
}
else {
apass[gh] = EEPROM.read(gh + 30);
}
}
}
//setting password read form EEPROM
}
void setup() {
pinMode(wrong, INPUT_PULLUP);
pinMode(upsen, INPUT_PULLUP);
pinMode(downsen, INPUT_PULLUP);
pinMode(SPEAKER, OUTPUT);
digitalWrite(SPEAKER, LOW);
for (int8_t d = 0; d < sizeof(output); d++) {
pinMode(output[d], OUTPUT);
digitalWrite(output[d], HIGH);
}
for (int8_t d = 0; d < sizeof(digPin); d++) {
pinMode(digPin[d], OUTPUT);
digitalWrite(digPin[d], !digOn);
}
for (int8_t s = 0; s < sizeof(segPin); s++) {
pinMode(segPin[s], OUTPUT);
digitalWrite(segPin[s], !segOn);
}
readEEPROM();
attachInterrupt(digitalPinToInterrupt(wrong), over, FALLING);
}
void loop()
{
if (checkbtn() != -1)btn = btnRead;
if (digitalRead(wrong) == LOW || btn == 3 || btn == 4 || btn == 7)buttonPressed = true, current = ALARM, code = (btn == 3 ? 4 : btn == 4 ? 5 : btn == 7 ? 6 : 3), led = 4, btn = -1,_F=1;
switch (current) {
case NONE:
// readEEPROM();
// ক্লিয়ার সেটিং পাসওয়ার্ড
for (int8_t i = 0; i < 4; i++) cspass[i] = 0;
// /////////
digitalWrite(SPEAKER, LOW);
_B = -1;
// if (para[0] != EEPROM.read(0))EEPROM.update(0, para[0]);
if (btn == 9 || btn == 6) current = (btn == 9) ? SETUP : RUN, btn = -1, pp = 0;
setCode(0, 0, 0);
break;
case RUN:
if (btn == 6)current = NONE, btn = -1;
if (digitalRead(downsen) == LOW)
{ for (int8_t i = 0; i < 3; i++) countdown(i);
if (digitalRead(downsen) == LOW) {
counter++;
}
else {
counter = 0;
}
if (counter >= para[3]) current = ALARM, code = 1, led = 3;
}
else if (digitalRead(upsen) == LOW)
{
countdown(4);
countdown(5);
countdown(6);
if (digitalRead(upsen) == LOW) {
counter++;
} else {
counter = 0;
}
if (counter >= para[7]) current = ALARM, code = 2, led = 3; // 1 mean marital short
}
setCode(0, 0, 2);
break;
case SETUP:
isEqual = true;
for (int8_t i = 0; i < 4; i++) {
if (cspass[i] != spass[i] ) {
isEqual = false;
}
}
if (isEqual) {
//ক্লিয়ার এডমিন প্যানেল পাসওয়ার্ড
for (int i = 0; i < 4; i++) capass[i] = -1;
if (btn == 9)current = NONE, btn = -1;
if (btn == 6)oo = para[pp], ll = paramax[pp], current = (pp == 8 ? ADMIN : WRITE), btn = -1, _B = 9, ada = 0, aada = 0;
pp = (btn == 8) ? (pp == 8 ? (btn = -1, 0) : (btn = -1, pp + 1)) : (btn == 5) ? (pp == 0 ? (btn = -1, 8) : (btn = -1, pp - 1)) : pp;
setCode(10, pp, 0);
}
else {
passcode();
}
break ;
case RESET :
break;
case ADMIN:
isEqual = true;
for (int8_t i = 0; i < 4; i++) {
if (capass[i] != apass[i]) {
isEqual = false;
}
}
if (isEqual) {
// পজিশন 0 , Set "setting password"
if (ada == 0 && aada)
{ //// Set setting password process ///
passcode();
}
else if (ada == 1 && aada) {
passcode();
}
else if (ada == 2 && aada)
{
///// Set parameters limited /////
if (btn == 9)aada = false, btn = -1, pp = 8;
if (btn == 6)oo = paramax[pp], ll = 99, current = WRITE, btn = -1, _B = 0;
pp = (btn == 8) ? (pp == 7 ? (btn = -1, 0) : (btn = -1, pp + 1)) : (btn == 5) ? (pp == 0 ? (btn = -1, 7) : (btn = -1, pp - 1)) : pp;
setCode(10, pp, 0);
}
else if (ada == 3 && aada)
{ for (int8_t i = 0; i < 40; i++) {
EEPROM.update(i, -1);
}
over();
}
else {
//after unlock Admin panel running
lock = 0;
if (btn == 9)current = SETUP, btn = -1;
if (btn == 6)aada = true, btn = -1, pp = 0;
ada = (btn == 8) ? (ada == 3 ? (btn = -1, 0) : (btn = -1, ada + 1)) : (btn == 5) ? (ada == 0 ? (btn = -1, 3) : (btn = -1, ada - 1)) : ada;
setCode(14, ada, 0);
}
//////// unlock process /////////
}
else {
passcode();
}
break;
case WRITE:
/////////////////////////////////////////////////////Seve //////
_F = millis() % 800 < 400;
_B = (btn == 9) ? (aada ? (current = ADMIN, EEPROM.update(pp + 10, oo), paramax[pp] = oo, btn = -1) : (current = SETUP, EEPROM.update(pp + 1, oo), para[pp] = oo, btn = -1)) : (btn == 6) ? (btn = -1, _B = _B + 1) : _B;
oo = (btn == 8) ? (oo >= ll ? (btn = -1, ll) : (btn = -1, (_B == 1 ? (oo / 10 >= (ll / 10) - 1 ? ll : oo + 10) : oo + 1)) ) : (btn == 5) ? (oo <= paramin[pp] ? (btn = -1, paramin[pp]) : (btn = -1, ((_B == 1) ? (oo < 10 + paramin[pp] ? paramin[pp] : oo - 10) : oo - 1))) : oo;
setCode((_F ? oo / 10 : (_B == 0 ? oo / 10 : 13)), (_F ? oo % 10 : (_B == 1 ? oo % 10 : 13)), 0);
_B = (_B > 1 || _B < 0) ? 0 : _B;
break;
case ALARM:
if (btn == 6)current = NONE, btn = -1, buttonPressed = false;
if (led==4){ while(_F){_F = millis() % 5000 < 400;digitalWrite(13, 1);digitalWrite(12, 0);digitalWrite(7, 0);}}
digitalWrite(SPEAKER, 1);
setCode(11, code, led);
break;
}
refresh();
}
void passcode()
{ //১
_F = millis() % 500 < 200;
if (_B < 4) {
_B = (btn == 9) ? (_B == -1 ? (current = ((current == SETUP) ? NONE : ((aada == 1) ? ADMIN : SETUP)), _B = -1, aada = 0, btn = -1) : (btn = -1, _B - 1)) : (btn == 6) ? (_B == 4 ? (btn = -1) : (btn = -1, _B + 1)) : _B;
_cd[_B] = (btn == 8) ? (_cd[_B] >= 9 ? (btn = -1, 0) : (btn = -1, _cd[_B] + 1)) : (btn == 5) ? (_cd[_B] <= 0 ? (btn = -1, 9) : (btn = -1, _cd[_B] - 1)) : _cd[_B];
}
_B = (_B > 4 || _B < 0) ? -1 : _B;
if (_B == 0) {
setCode(_F ? 12 : 12, _F ? _cd[0] : 13, 0);
}
else if (_B == 1) {
setCode(_F ? _cd[1] : 13, _F ? _cd[0] : _cd[0], 0);
}
else if (_B == 2) {
setCode(_F ? 12 : 12, _F ? _cd[2] : 13, 0);
}
else if (_B == 3) {
setCode(_F ? _cd[3] : 13, _F ? _cd[2] : _cd[2], 0);
}
else if (_B == 4)
{ //৪
if (current == SETUP)
{ // check setup password
isEqual = 1 ;
for (int8_t i = 0; i < 4; i++) {
if (_cd[i] != apass[i])isEqual = false;
} if (isEqual)
{ for (int8_t i = 0; i < 4; i++) cspass[i] = apass[i] ;
current = ADMIN;
_B = -1;
return;
}
isEqual = 1 ;
for (int8_t i = 0; i < 4; i++) {
if (_cd[i] != (i == 0 ? 2 : (i == 1 ? 4 : (i == 2 ? 7 : 3))))
isEqual = false;
}
if (isEqual)
{ for (int8_t i = 0; i < 4; i++) _cd[i] = spass[i] ;
}
isEqual = 1 ;
for (int8_t i = 0; i < 4; i++) {
if (_cd[i] != spass[i])isEqual = false;
}
if (isEqual)
{
_B = -1;
for (int8_t i = 0; i < 4; i++) cspass[i] = _cd[i], _cd[i] = 0;
}
else {
if (_F && ++counter > 50) _B = -1, counter = 0;
setCode(_F ? 11 : 13, _F ? 11 : 13, 0);
}
} //setup end
else if (current == ADMIN)
{ //admin
if (aada)
{ //Set New Password
if (lock)
{ //check New password
isEqual = true;
for (int8_t i = 0; i < 4; i ++) {
if (che[i] != _cd[i]) isEqual = false;
}
if (isEqual)
{ // if confirm
setCode(_F ? 0 : 13, _F ? 0 : 13, 0);
if (_F && ++counter > 50)
{ _B = -1, counter = 0, aada = 0, lock = 0;
for (int i = 0; i < 4; i++) {
if (ada) {
capass[i] = che[i], EEPROM.update(i + 30, che[i]), apass[i] = che[i];
}
else {
cspass[i] = che[i], EEPROM.update(i + 20, che[i]), spass[i] = che[i];
}
}
}
}
else
{ //if not confirm
setCode(_F ? 11 : 13, _F ? 11 : 13, 0);
if (_F && ++counter > 50) {
counter = 0, _B = -1, lock = 0;
for (int8_t i = 0; i < 4; i++) che[i] = 0, _cd[i] = 0;
}
}
} // CHECK PASSWORD END
else
{ //store setting Password
for (int8_t i = 0; i < 4; i++)che[i] = _cd[i], _cd[i] = 0, lock = true, _B = -1;
}
}// Set Password End
else
{ //else Administration
isEqual = true;
for (int8_t i = 0; i < 4; i++) {
if (_cd[i] != (i == 0 ? 2 : (i == 1 ? 4 : (i == 2 ? 7 : 3))))isEqual = 0 ;
}
if (isEqual)
{ for (int8_t i = 0; i < 4; i++) capass[i] = apass[i];
}
isEqual = true;
for (int8_t i = 0; i < 4; i++) {
if (_cd[i] != apass[i])isEqual = false;
}
if (isEqual)
{ _B = -1;
for (int8_t i = 0; i < 4; i++) capass[i] = _cd[i];
}
else {
if (_F && ++counter > 50) _B = -1, counter = 0;
setCode(_F ? 11 : 13, _F ? 11 : 13, 0);
}
} //else
}//admin
} //৪
else
{
_B = -1;
counter = 0;
for (int8_t i = 0; i < 4; i++) _cd[i] = 0;
setCode(_F ? 12 : 13, _F ? 12 : 13, 0);
}
} //১