228 lines
4.8 KiB
C++
228 lines
4.8 KiB
C++
/*
|
|
* UNO Monitor Receiver (4-bit LCD Version)
|
|
* kidacro@archamedis.net
|
|
*
|
|
* Waits for input over serial connection and displays on LCD
|
|
*
|
|
* Input Schema:
|
|
* Start char is: '#'
|
|
* End char is: '@'
|
|
* 2nd char denotes which line number to use
|
|
*
|
|
* Example:
|
|
* Line 1: #1Archamedis Status@
|
|
* Line 2: #299% free / etc.@
|
|
*
|
|
*/
|
|
|
|
// include the library code:
|
|
#include <LiquidCrystal.h>
|
|
|
|
// LCD Pinout:
|
|
// LCD RS pin to digital pin 12
|
|
// LCD Enable pin to digital pin 11
|
|
// LCD D4 pin to digital pin 5
|
|
// LCD D5 pin to digital pin 4
|
|
// LCD D6 pin to digital pin 3
|
|
// LCD D7 pin to digital pin 2
|
|
// LCD R/W pin to ground
|
|
// LCD VSS pin to ground
|
|
// LCD VCC pin to 5V
|
|
// 10K resistor:
|
|
// ends to +5V and ground
|
|
// wiper to LCD VO pin (pin 3)
|
|
|
|
// Variable Init
|
|
// LCD vars
|
|
// initialize the library by associating any needed LCD interface pin
|
|
// with the arduino pin number it is connected to
|
|
const int LCDRS = 12, LCDEN = 11, LCDD4 = 5, LCDD5 = 4, LCDD6 = 3, LCDD7 = 2;
|
|
int LCDLength = 16;
|
|
LiquidCrystal LCD(LCDRS, LCDEN, LCDD4, LCDD5, LCDD6, LCDD7);
|
|
|
|
// Serial vars
|
|
const byte numChars = 32;
|
|
char receivedChars[numChars]; // an array to store the received data
|
|
boolean newData = false;
|
|
|
|
// Debugging (serial console must be connected)
|
|
bool DEBUG = 1;
|
|
|
|
void LcdL1(boolean wipe = false) {
|
|
delay(10);
|
|
LCD.setCursor(0, 0); // Define the cursor position as the 1st position of the 1st line
|
|
|
|
if(wipe) {
|
|
LcdWrite(" "); // 16 spaces for a blank line
|
|
LCD.setCursor(0, 0);
|
|
}
|
|
|
|
delay(10);
|
|
}
|
|
|
|
void LcdL2(boolean wipe = false) {
|
|
delay(10);
|
|
LCD.setCursor(0, 1); // Define the cursor position as the 1st position of the 2nd line
|
|
|
|
if(wipe) {
|
|
LcdWrite(" "); // 16 spaces for a blank line
|
|
LCD.setCursor(0, 1);
|
|
}
|
|
|
|
delay(10);
|
|
}
|
|
|
|
void LcdCls(void) {
|
|
delay(10);
|
|
LCD.clear(); // The screen is empty
|
|
LcdL1(); // the cursor position is zeroed
|
|
delay(10);
|
|
}
|
|
|
|
void LcdSetup(void) {
|
|
// set up the LCD's number of columns and rows:
|
|
LCD.begin(LCDLength, 2);
|
|
|
|
// Print a "waiting" message to the LCD.
|
|
LcdL1();
|
|
LCD.print("Starting Up...");
|
|
LcdL2();
|
|
LCD.print("Waiting for data");
|
|
}
|
|
|
|
/* returns starting position of text
|
|
void LcdCenter(int mylen) {
|
|
int mypos = 0;
|
|
|
|
return mypos;
|
|
}*/
|
|
|
|
void LcdWrite(String mymessage) {
|
|
int i = 0;
|
|
unsigned int mylen = mymessage.length();
|
|
|
|
// trunicate string to lcd line length
|
|
if(mylen > LCDLength) {
|
|
mylen = LCDLength;
|
|
}
|
|
|
|
// Debug input and length
|
|
if(DEBUG) {
|
|
Serial.println("\n\nString: ");
|
|
Serial.println(mymessage);
|
|
Serial.println(mymessage.length());
|
|
}
|
|
|
|
// Output string
|
|
//LCD.print(mymessage);
|
|
|
|
// Output character by character
|
|
for(i=0; i < mylen; i++) {
|
|
char c = mymessage[i];
|
|
if(c != '\b') {
|
|
delay(10);
|
|
LCD.print(c);
|
|
delay(10);
|
|
}
|
|
}
|
|
}
|
|
|
|
void LcdWriteExample() {
|
|
LcdCls();
|
|
|
|
LcdL1();
|
|
LcdWrite("Archamedis Stats");
|
|
|
|
delay(20);
|
|
|
|
LcdL1(true);
|
|
LcdWrite("4.3ghz 89% 68C");
|
|
|
|
delay(20);
|
|
|
|
LcdL2();
|
|
LcdWrite("Ryzen 9 5950x");
|
|
}
|
|
|
|
void recvWithStartEndMarkers() {
|
|
static boolean recvInProgress = false;
|
|
static byte ndx = 0;
|
|
char startMarker = '#';
|
|
char endMarker = '@';
|
|
char rc;
|
|
|
|
while (Serial.available() > 0 && newData == false) {
|
|
rc = Serial.read();
|
|
|
|
if(recvInProgress == true) {
|
|
if(rc != endMarker) {
|
|
receivedChars[ndx] = rc;
|
|
ndx++;
|
|
if (ndx >= numChars) {
|
|
ndx = numChars - 1;
|
|
}
|
|
}
|
|
else {
|
|
receivedChars[ndx] = '\0'; // terminate the string
|
|
recvInProgress = false;
|
|
ndx = 0;
|
|
newData = true;
|
|
}
|
|
}
|
|
|
|
else if(rc == startMarker) {
|
|
recvInProgress = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
void showNewData() {
|
|
if(newData == true) {
|
|
if(DEBUG) {
|
|
Serial.print("This just in ... ");
|
|
Serial.println(receivedChars);
|
|
}
|
|
|
|
// Print on line 1 or 2
|
|
// dev: fucking c and its fixed arrays
|
|
// we have to define 1st character (line number) as BS and when printing, search for that BS character to skip printing that 1 character, grrr
|
|
if(receivedChars[0] == '1') {
|
|
LcdL1(true);
|
|
receivedChars[0] = '\b';
|
|
LcdWrite(receivedChars);
|
|
}
|
|
else if(receivedChars[0] == '2') {
|
|
LcdL2(true);
|
|
receivedChars[0] = '\b';
|
|
LcdWrite(receivedChars);
|
|
}
|
|
|
|
newData = false;
|
|
}
|
|
}
|
|
|
|
void setup (void) {
|
|
// Init LCD panel
|
|
LcdSetup();
|
|
|
|
// Init Debugging output
|
|
if(DEBUG) {
|
|
Serial.begin(9600);
|
|
while (!Serial) {
|
|
; // wait for serial port to connect. Needed for native USB port only
|
|
}
|
|
}
|
|
|
|
// Init normal operation
|
|
else {
|
|
Serial.begin(9600);
|
|
}
|
|
|
|
}
|
|
|
|
// main()
|
|
void loop (void) {
|
|
// process input
|
|
recvWithStartEndMarkers();
|
|
showNewData();
|
|
} |