#include <LiquidCrystal.h>
int ThermistorPin = 0;
int Vo;
float R1 = 10000;
float logR2, R2, T;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// define custom characters/arrays - every character is 5x8 "pixels"
byte gauge_empty[8] = {B11111, B00000, B00000, B00000, B00000, B00000, B00000, B11111};
byte gauge_fill_1[8] = {B11111, B10000, B10000, B10000, B10000, B10000, B10000, B11111};
byte gauge_fill_2[8] = {B11111, B11000, B11000, B11000, B11000, B11000, B11000, B11111};
byte gauge_fill_3[8] = {B11111, B11100, B11100, B11100, B11100, B11100, B11100, B11111};
byte gauge_fill_4[8] = {B11111, B11110, B11110, B11110, B11110, B11110, B11110, B11111};
byte gauge_fill_5[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111};
byte gauge_left[8] = {B11111, B10000, B10000, B10000, B10000, B10000, B10000, B11111};
byte gauge_right[8] = {B11110, B00010, B00011, B00001, B00001, B00011, B00010, B11110};
byte gauge_mask_left[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111};
byte gauge_mask_right[8] = {B11110, B11110, B11111, B11111, B11111, B11111, B11110, B11110};
byte warning_icon[8] = {B00100, B00100, B01110, B01010, B11011, B11111, B11011, B11111};
byte gauge_left_dynamic[8];
byte gauge_right_dynamic[8];
int cpu_gauge = 0;
char buffer[16];
int move_offset = 0;
const int gauge_size_chars = 16;
char gauge_string[gauge_size_chars + 1];
int parsed_int_from_serial;
void setup ()
{
//lcd.init();
//lcd.backlight();
lcd.createChar(7, gauge_empty);
lcd.createChar(1, gauge_fill_1);
lcd.createChar(2, gauge_fill_2);
lcd.createChar(3, gauge_fill_3);
lcd.createChar(4, gauge_fill_4);
lcd.createChar(0, warning_icon);
Serial.begin(9600);
Serial.println("Serial Initialized");
Serial.println("Send any value to change the gauge");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Initialized");
}
void loop ()
{
float units_per_pixel = (gauge_size_chars * 5.0) / 100.0;
int value_in_pixels = round(cpu_gauge * units_per_pixel);
int tip_position = 0;
if (value_in_pixels < 5) {
tip_position = 1;
}
else if (value_in_pixels > gauge_size_chars * 5.0 - 5) {
tip_position = 3;
}
else {
tip_position = 2;
}
move_offset = 4 - ((value_in_pixels - 1) % 5);
for (int i = 0; i < 8; i++) {
if (tip_position == 1) {
gauge_left_dynamic[i] = (gauge_fill_5[i] << move_offset) | gauge_left[i];
}
else {
gauge_left_dynamic[i] = gauge_fill_5[i];
}
gauge_left_dynamic[i] = gauge_left_dynamic[i] & gauge_mask_left[i];
}
for (int i = 0; i < 8; i++) {
if (tip_position == 3) {
gauge_right_dynamic[i] = (gauge_fill_5[i] << move_offset) | gauge_right[i];
}
else {
gauge_right_dynamic[i] = gauge_right[i];
}
gauge_right_dynamic[i] = gauge_right_dynamic[i] & gauge_mask_right[i];
}
lcd.createChar(5, gauge_left_dynamic);
lcd.createChar(6, gauge_right_dynamic);
for (int i = 0; i < gauge_size_chars; i++) {
if (i == 0) {
gauge_string[i] = byte(5);
}
else if (i == gauge_size_chars - 1) {
gauge_string[i] = byte(6);
}
else {
if (value_in_pixels <= i * 5) {
gauge_string[i] = byte(7);
}
else if (value_in_pixels > i * 5 && value_in_pixels < (i + 1) * 5) {
gauge_string[i] = byte(5 - move_offset);
}
else {
gauge_string[i] = byte(255);
}
}
}
Vo = analogRead(ThermistorPin);
R2 = R1 * (1023.0 / (float)Vo - 1.0);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
T = T - 273.15;
T = (T * 9.0)/ 5.0 + 32.0;
lcd.print("Temp = ");
lcd.print(T);
lcd.print(" F");
delay(500);
// gauge drawing
lcd.setCursor(0, 0);
sprintf(buffer, "Battery:%3d%% ", cpu_gauge);
lcd.print(buffer);
lcd.write(byte(0));
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(gauge_string);
lcd.clear();
if (Serial.available() > 0) {
parsed_int_from_serial = Serial.parseInt();
if (parsed_int_from_serial != 0) {
cpu_gauge = parsed_int_from_serial;
Serial.print("Gauge value: ");
Serial.println(parsed_int_from_serial);
}
}
}