-
Notifications
You must be signed in to change notification settings - Fork 0
/
mercurio.ino
95 lines (87 loc) · 2.75 KB
/
mercurio.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <LiquidCrystal.h>
#define POTENTIOMETER A0
#define BUTTON A1
#define MAXREADING 1023
#define MINBUTTON 700 // Button must be pressed quite well.
#define LCDCHARS 16 // Chars on the LCD
// Setup LCD.
LiquidCrystal lcd(11, 12, 2, 3, 4, 5);
// Stores potentiometer readings.
int potentiometerVal = 0;
// List of values for the potentiometer
// Added the whitespace to clear the LCD. Yes this could be done better.
char* destinationList[] = {
"Test",
"Staging",
"Production"
};
int destinationSize = sizeof(destinationList)/sizeof(int);
int segmentStep = destinationSize / MAXREADING;
String destination = "";
String lastDestination = "";
// Button value reading.
int buttonVal = 0;
// Debouncing variables.
long lastDebounceTime = 0;
long debounceDelay = 500;
boolean isBlocked = false;
void setup() {
// Start talking to the serial.
Serial.begin(9600);
// Set up the LCD's number of columns and rows.
lcd.begin(LCDCHARS, 2);
lcd.print("mercurio target:");
}
void loop() {
if ((millis() - lastDebounceTime) > debounceDelay) {
// Unblock it once the debounceDelay time has passed.
isBlocked = false;
}
// Read the potentiometer input.
potentiometerVal = analogRead(POTENTIOMETER);
buttonVal = analogRead(BUTTON);
destination = getDestination(potentiometerVal);
// Only update the LCD when the destination has changed.
if ( destination != lastDestination){
printDestination(destination);
} else {
lastDestination = destination;
}
if (buttonVal > MINBUTTON && destination != "" && isBlocked == false) {
// Actions to perform once a valid button press has been received.
// The only value the serial expects is the destination.
Serial.println("target=" + destination);
// Capture when was the last time the button was pressed and block it.
lastDebounceTime = millis();
isBlocked = true;
}
}
// Prints the target in the LCD.
void printDestination(String destination) {
String fancyDestination = destination;
int missingChars;
// Fill in the rest of the display blocks with whitespace.
missingChars = LCDCHARS - fancyDestination.length();
if (missingChars > 0) {
for (int i=0 ; i < missingChars; i++ ) {
fancyDestination += " ";
}
}
// Write output in the second line.
lcd.setCursor(0, 1);
// Show potentiometer reading in the LCD. Inmediate feedback from the target.
lcd.print(fancyDestination);
}
// Determines the destination from the potentiometer reading.
String getDestination(int reading) {
int i = 0;
String destination;
i = (reading * destinationSize) / MAXREADING;
// When the potentiometer is at its MAXREADING value would return
// a index not in the list.
if (i == destinationSize) {
i--;
}
destination = String(destinationList[i]);
return destination;
}