#include <EEPROM.h>
int lock = 0;
const int8_t segPin[7] = {3, 4, 5, 6, 7, 8, 9};
const int8_t digPin[3] = {10, 11, 12};
int8_t disCode[3] = {64, 64, 127};
const int8_t btnPin[7] = {3, 4, 7, 5, 6, 8, 9};
const int8_t output[4] = {A0, A1, A2, A3};
bool buttonPressed, segOn, digOn, pass = false;
const uint8_t segCode[15] = {
0b01000000, // "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"
};
int _B = -1;
int _cd[4] = {0};
int che[4] = {0};
int apass[4] = {0};
int capass[4] = {0};
int spass[4] = {0};
int cspass[4] = {0};
bool isEqual = true;
const uint8_t ledCode[] = {
0b01111111, // "0" "off"
0b01111100, //"A" "1" "PRER" Wating 2,6
0b01111101, //"B" "2" "RUN"
0b01111011, //"C" "3" "SHOR" "cycle"
0b01110111, //"D" "4" "Over loed"
0b01011101, //"F" "5" "FALL" "Material" DN 0,1
0b00111101, //"G" "6" "SUCT" "Auto Loader" UP 4,5
0b00111111, // "0" "off"
0b01111111, //
};
enum Loop { NONE, RUN, SETUP, SAVEPARA, ALARM, ADMIN, SAVELIMIT,};
int code, led;
Loop current = NONE;
int8_t counter = 0;
int8_t pp, ll, oo, ada, adb = 0;
const int8_t original[8] = {2, 15, 30, 3, 20, 15, 30, 3};
int8_t para[8] = {0};
const int8_t limit[8] = {10, 50, 99, 5, 60, 60, 99, 5};
#define wrong 2
#define SPEAKER 13
#define upsen A5
#define downsen A4
void setCode (int8_t one, int8_t ten, int8_t led)
{
if (led < 0 || led > 8)led = 0;
disCode[0] = segCode[one];
disCode[1] = segCode[ten];
disCode[2] = ledCode[led];
}
unsigned long _last_tone_time;
uint8_t _tone_index;
bool _playing, _F, aada = false;
#define TONE_TIME 150 /* ms on timer */
#define TONE_SPACING 25 /* ms off timer*/
static const uint16_t TONES[] = {750, 900,};
const uint16_t NUM_TONES = sizeof(TONES) / sizeof(TONES[0]);
void play() {
if (!_playing || _last_tone_time + TONE_TIME + TONE_SPACING < millis()) {
tone(SPEAKER, TONES[_tone_index], TONE_TIME);
_tone_index = (_tone_index + 1) % NUM_TONES;
_last_tone_time = millis();
}
_playing = true;
}
void stop() {
noTone(SPEAKER);
_tone_index = 0;
_playing = false;
}
unsigned long lastPressedTime = 200;
int8_t btnRead, btn = -1;
int checkbtn() {
for (int i = 0; i < 7; i++) {
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;
int _qdata = 0;
for (int8_t d = 0; d < sizeof(digPin); d++) {
if (d == 2 && disCode[2] == 127)break;
digitalWrite(digPin[d], digOn);
for (int8_t s = 0; s < sizeof(segPin); s++) {
_qdata = disCode[d];
_q = ((_qdata >> s) & 0x01) == 0x01 ;
if ((s == 1 || s == 2 || s == 3) && d == 2 && !_q) {
if (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(1);
if (checkbtn() != -1) btn = btnRead;
delay(1);
for ( int8_t i = 0; i < sizeof(segPin); i++) digitalWrite(segPin[i], !segOn);
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)
{
int 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);
unsigned long p = millis() / 1000;
int c = para[signal] ;
while (c >= -1) {
refresh();
unsigned long t = millis() / 1000;
if (t - p >= 1)
{ p = t;
if (c > 0 && out != -1) {
digitalWrite(output[out], LOW);
}
else {
digitalWrite(output[out], HIGH);
}
setCode(c / 10, c % 10, led);
c--;
}
}
}
void setup() {
pinMode(wrong, INPUT_PULLUP);
pinMode(upsen, INPUT_PULLUP);
pinMode(downsen, INPUT_PULLUP);
pinMode(SPEAKER, OUTPUT);
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);
}
for (int i = 0; i < 8; i++) {
if (para[i] != EEPROM.read(i))para[i] = EEPROM.read(i);
}
EEPROM.update(5, 1);
Serial.begin(9600);
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;
for (int i = 0; i < 8; i++) {
if (para[i] < 0 || para[i] > limit[i])para[i] = original[i];
}
switch (current) {
case NONE:
// ক্লিয়ার সেটিং পাসওয়ার্ড
for (int i = 0; i < 4; i++) cspass[i] = 0;
// /////////
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)
{ countdown(0);
countdown(1);
countdown(2);
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 (int i = 0; i < 4; i++) {
if (cspass[i] != spass[i]) {
isEqual = false;
}
}
if (isEqual) {
//ক্লিয়ার এডমিন প্যানেল পাসওয়ার্ড
for (int i = 0; i < 4; i++) capass[i] = 0;
if (btn == 9)current = NONE, btn = -1;
if (btn == 6)oo = para[pp], ll = limit[pp], current = (pp == 8 ? ADMIN : SAVEPARA ), btn = -1, _B = -1, 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 SAVEPARA :
if (btn == 9)current = SETUP, btn = -1;
oo = (btn == 8) ? (oo >= ll ? (btn = -1, 0) : (btn = -1, oo + 1)) : (btn == 5) ? (oo <= 0 ? (btn = -1, ll) : (btn = -1, oo - 1)) : oo;
if (btn == 6) para[pp] = oo, current = SETUP, btn = -1;
setCode(oo / 10, oo % 10, 9);
break;
case ADMIN:
isEqual = true;
for (int 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)
{
///// Set parameters limited /////
if (btn == 9)aada = false, btn = -1, pp = 8;
if (btn == 6)oo = limit[pp], ll = limit[pp], current = SAVELIMIT, btn = -1, _B = -1;
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 {
//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 == 1 ? (btn = -1, 0) : (btn = -1, ada + 1)) : (btn == 5) ? (ada == 0 ? (btn = -1, 1) : (btn = -1, ada - 1)) : ada;
setCode(14, ada, 0);
}
//////// unlock process /////////
}
else {
passcode();
}
break;
case SAVELIMIT:
_B = (btn == 9) ? (_B == -1 ? (current = ADMIN, btn = -1) : (btn = -1, _B - 1)) : (btn == 6) ? (_B == 2 ? (btn = -1, current = ADMIN) : (btn = -1, _B + 1)) : _B;
oo = (btn == 8) ? (oo >=ll ? (btn = -1, 0) : (btn = -1, ((_B ==1) ?((oo>=ll-10)?(ll-oo):oo+10): oo+1 ))) : (btn == 5) ? (oo <= 0 ? (btn = -1, ll) : (btn = -1, ((_B == 1&&oo>9) ? oo - 10 : oo - 1))) : oo;
_F = millis() % 800 < 400;
setCode((_F ? oo / 10 : (_B==0?oo/10:13)), (_F ? oo % 10 : (_B==1?oo%10:13)), 0);
// _B = _B > 1 ? -1 : _B;
/*
_B = (btn == 9) ? (_B == -1 ? (current = ADMIN, btn = -1) : (btn = -1, _B - 1)) : (btn == 6) ? (_B == 2 ? (btn = -1, current = ADMIN) : (btn = -1, _B + 1)) : _B;
oo = (btn == 8) ? (oo >= ll ? (btn = -1, 0) : (btn = -1, ((_B == 1 && oo > 9) ? oo + 10 : oo + 1))) : (btn == 5) ? (oo <= 0 ? (btn = -1, ll) : (btn = -1, ((_B == 1) ? oo - 10 : oo - 1))) : oo;
_F = millis() % 800 < 400;
if (_B == 0) setCode(_F ? oo / 10 : oo / 10, _F ? oo % 10 : 13, 0);
else if (_B == 1) setCode(_F ? oo / 10 : 13, _F ? oo % 10 : oo % 10, 0);
else _B = -1, setCode(_F ? oo / 10 : 13, _F ? oo % 10 : 13, 0);
*/
break;
case ALARM:
if (btn == 6)current = NONE, btn = -1, buttonPressed = false, stop();
play();
setCode(11, code, led);
break;
}
refresh();
}
void passcode()
{ //১
_F = (millis() % 800 < 400) ? 1 : 0;
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];
}
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)
{ //setup
isEqual = true;
for (int i = 0; i < 4; i++) {
if (_cd[i] != spass[i])isEqual = false;
}
if (isEqual) {
_B = -1;
for (int i = 0; i < 4; i++) cspass[i] = _cd[i];
}
else {
if (_F && ++counter > 50) _B = -1, counter = 0;
setCode(_F ? 11 : 13, _F ? 11 : 13, 0);
}
} //setup
else if (current == ADMIN)
{ //admin
if (ada == 0 && aada)
{ //ada
if (lock)
{ //৯
isEqual = true;
for (int i = 0; i < 4; i++) {
if (che[i] != _cd[i]) isEqual = false;
}
if (isEqual)
{
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++)spass[i] = che[i], che[i] = 0;
return;
}
}
else { //else ২
setCode(_F ? 11 : 13, _F ? 11 : 13, 0);
if (_F && ++counter > 50) {
_B = -1, counter = 0;
for (int i = 0; i < 4; i++) che[i] = 0, _cd[i] = 0, _B = -1, lock = 0;
}
} //else ২
}
///
else {
for (int i = 0; i < 4; i++) {
che[i] = _cd[i];
lock = true;
_B = -1;
}
}
} //ada
else
{ //else
isEqual = true;
for (int i = 0; i < 4; i++) {
if (_cd[i] != apass[i])isEqual = false;
}
if (isEqual)
{ _B = -1;
for (int 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 (int i = 0; i < 4; i++) _cd[i] = 0;
setCode(_F ? 12 : 13, _F ? 12 : 13, 0);
}
} //১