hi everybody
this is my first script in C++/Arduino.
it suposes to be a semaphor simulator, where on keypad 4x4 one of 32 signals is selected (first series directly by single press, than second one, by double or long click). Semaphor consists of 5 LED plus addtional RGB led. Keypad is read by only one cable (using bynch of resistors). Serial prints might be used to display signal code on 4 disgit 7 segment display, or LED display
Generally it is working - do the intented steps. However....
- more often than it working fine it ceased, and it is not responsive, or sometimes it takes a good while and several presses.
- sometimes signals are not displayed correctly - like being mismatched
- it responds ok to long press, however a double click give only momentary switch, and comes back to first series same position (like 10a and 10 straight after)
-measurements and pinReading are correct - i got them on seperate script, and responses were without any delay. on problems occuring i double checked them, and still yhe same.
i would be gratefull for aby hint how to improve, or what to change, or any indication where i am doing a mistakes. comments in native language were removed. have a nice day
int measurement[16] = { 272, 214, 145, 61, 260, 199, 128, 41, 247, 184, 110, 21, 235, 169, 92, 0 };
char* sigKODSemaphor[] = { "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9", "S10", "S11", "S12", "S13", " ", " ", "Sz", "Sp1", "Sp2", "Sp3", "Sp4", " ", " ", " ", " ", " ", "S10a", "S11a", "S12a", "S13a", " ", " ", "Sz", '\0' };
int sigNUMSemaphor[] = { 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 0, 0, 120, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 0, 0, 220 };
int green = 7, yell1 = 6, red = 5, yell2 = 4, white = 3;
int rLEDPin = 9, gLEDPin = 10, bLEDPin = 11;
bool ledBlinkState = 0;
const int pinReading = A2;
bool buttonState = 0, marker = 0;
const int timeDelay = 1500, timeReaction = 2000, timeHold = 750;
int maintain = 1023, delayTime = 1000;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(green, OUTPUT);
pinMode(yell1, OUTPUT);
pinMode(red, OUTPUT);
pinMode(yell2, OUTPUT);
pinMode(white, OUTPUT);
pinMode(rLEDPin, OUTPUT);
pinMode(gLEDPin, OUTPUT);
pinMode(bLEDPin, OUTPUT);
}
void loop() {
//put your main code here, to run repeatedly:
bool additionalSignals = 0;
int i = 0;
int feed = analogRead(pinReading);
if (!(abs(feed - 1023) < 5) && (isButtonDoubleOrLongPressed(pinReading, timeDelay, timeReaction, timeHold) == 1)) additionalSignals = 1;
while (i < 16) {
if (abs(feed - measurement[i]) < 5) {
maintain = feed;
marker = additionalSignals;
if (additionalSignals == 1) Serial.println(sigKODSemaphor[i + 16]);
else Serial.println(sigKODSemaphor[i]);
while (analogRead(pinReading) < 1000) {
delay(100);
break;
}
}
i++;
}
switch (semaphorSignal(maintain, marker)) {
case 101:
digitalWrite(green, LOW);
digitalWrite(yell1, LOW);
digitalWrite(red, HIGH);
digitalWrite(yell2, LOW);
digitalWrite(white, LOW);
setLedRGBColor(0, 0, 0);
break;
case 102:
digitalWrite(green, HIGH);
digitalWrite(yell1, LOW);
digitalWrite(red, LOW);
digitalWrite(yell2, LOW);
digitalWrite(white, LOW);
setLedRGBColor(0, 0, 0);
break;
case 103:
blink(green);
digitalWrite(yell1, LOW);
digitalWrite(red, LOW);
digitalWrite(yell2, LOW);
digitalWrite(white, LOW);
setLedRGBColor(0, 0, 0);
break;
case 104:
digitalWrite(green, LOW);
blink(yell1);
digitalWrite(red, LOW);
digitalWrite(yell2, LOW);
digitalWrite(white, LOW);
setLedRGBColor(0, 0, 0);
break;
case 105:
digitalWrite(green, LOW);
digitalWrite(yell1, HIGH);
digitalWrite(red, LOW);
digitalWrite(yell2, LOW);
digitalWrite(white, LOW);
setLedRGBColor(0, 0, 0);
break;
case 106:
digitalWrite(green, HIGH);
digitalWrite(yell1, LOW);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(0, 255, 0);
break;
case 107:
blink(green);
digitalWrite(yell1, LOW);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(0, 255, 0);
break;
case 108:
digitalWrite(green, LOW);
blink(yell1);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(0, 255, 0);
break;
case 109:
digitalWrite(green, LOW);
digitalWrite(yell1, HIGH);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(0, 255, 0);
break;
case 110:
digitalWrite(green, HIGH);
digitalWrite(yell1, LOW);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(0, 0, 0);
break;
case 210:
digitalWrite(green, HIGH);
digitalWrite(yell1, LOW);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(255, 255, 0);
break;
case 111:
blink(green);
digitalWrite(yell1, LOW);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(0, 0, 0);
break;
case 211:
blink(green);
digitalWrite(yell1, LOW);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(255, 255, 0);
break;
case 112:
digitalWrite(green, LOW);
blink(yell1);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(0, 0, 0);
break;
case 212:
digitalWrite(green, LOW);
blink(yell1);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(255, 255, 0);
break;
case 113:
digitalWrite(green, LOW);
digitalWrite(yell1, HIGH);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(0, 0, 0);
break;
case 213:
digitalWrite(green, LOW);
digitalWrite(yell1, HIGH);
digitalWrite(red, LOW);
digitalWrite(yell2, HIGH);
digitalWrite(white, LOW);
setLedRGBColor(255, 255, 0);
break;
case 120:
digitalWrite(green, LOW);
digitalWrite(yell1, LOW);
digitalWrite(red, HIGH);
digitalWrite(yell2, LOW);
blink(white);
break;
case 0:
digitalWrite(green, LOW);
digitalWrite(yell1, LOW);
digitalWrite(red, LOW);
digitalWrite(yell2, LOW);
digitalWrite(white, LOW);
setLedRGBColor(0, 0, 0);
break;
default:
break;
}
}
bool isButtonDoubleOrLongPressed(int keyPadPin, int delayTime, int reactTime, int timeHold) {
int feed_1, feed_2;
unsigned long currentPressTime, midPressTime;
if (!(abs(analogRead(keyPadPin) - 1023) < 5) && buttonState == 0) {
buttonState = 1;
feed_1 = analogRead(keyPadPin);
currentPressTime = millis();
while (analogRead(keyPadPin) < 1000) delay(100);
buttonState = !buttonState;
midPressTime = millis();
if (millis() - currentPressTime > timeHold) {
return 1;
buttonState = 0;
}
} else {
buttonState = 0;
return 0;
}
while (millis() - midPressTime < delayTime) {
if (!(abs(analogRead(keyPadPin) - 1023) < 5) && buttonState == 0) {
feed_2 = analogRead(keyPadPin);
if ((abs(feed_1 - feed_2) < 5) && (abs(millis() - currentPressTime) < reactTime)) {
return 1;
}
}
}
return 0;
buttonState = 0;
}
int semaphorSignal(int reading, bool signalAdditional) {
int i;
i = 0;
while (i < 16) {
if (abs(reading - measurement[i]) < 5) {
if (signalAdditional == 1) return (sigNUMSemaphor[i + 16]);
else return (sigNUMSemaphor[i]);
while (analogRead(pinReading) < 1000) {
delay(100);
break;
}
}
i++;
}
return 0;
}
void blink(int ledPin) {
static unsigned long previousBlinkTime = 0;
unsigned long currentBlinkTime = millis();
if (currentBlinkTime - previousBlinkTime > 1000) {
previousBlinkTime = currentBlinkTime;
if (ledBlinkState == 0) ledBlinkState = 1;
else ledBlinkState = 0;
digitalWrite(ledPin, ledBlinkState);
}
}
void setLedRGBColor(int red, int green, int blue) {
#ifdef COMMON_ANODE
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
#endif
analogWrite(rLEDPin, red);
analogWrite(gLEDPin, green);
analogWrite(bLEDPin, blue);
}

