Skip to content

Instantly share code, notes, and snippets.

@aklyk
Last active December 7, 2017 14:12
Show Gist options
  • Save aklyk/4cd21b52dfaf0733ca592ae692024588 to your computer and use it in GitHub Desktop.
Save aklyk/4cd21b52dfaf0733ca592ae692024588 to your computer and use it in GitHub Desktop.
/*
Модифицировано под дисплей 1602 klykov.net vk.com/ms262 instagram.com/klykovnet
Блок электроники для крутого моддинга вашего ПК, возможности:
- Вывод основных параметров железа на внешний LCD дисплей
- Температура: CPU, GPU, материнская плата, самый горячий HDD
- Уровень загрузки: CPU, GPU, RAM, видеопамять
- Графики изменения вышеперечисленных параметров по времени
- Температура с внешних датчиков (DS18B20)
- Текущий уровень скорости внешних вентиляторов
- Управление большим количеством 12 вольтовых 2, 3, 4 проводных вентиляторов
- Автоматическое управление скоростью пропорционально температуре
- Ручное управление скоростью из интерфейса программы
- Управление RGB светодиодной лентой
- Управление цветом пропорционально температуре (синий - зелёный - жёлтый - красный)
- Ручное управление цветом из интерфейса программы
Программа HardwareMonitorPlus https://github.com/AlexGyver/PCdisplay
- Запустить OpenHardwareMonitor.exe
- Options/Serial/Run - запуск соединения с Ардуиной
- Options/Serial/Config - настройка параметров работы
- PORT address - адрес порта, куда подключена Ардуина
- TEMP source - источник показаний температуры (процессор, видеокарта, максимум проц+видео, датчик 1, датчик 2)
- FAN min, FAN max - минимальные и максимальные обороты вентиляторов, в %
- TEMP min, TEMP max - минимальная и максимальная температура, в градусах Цельсия
- Manual FAN - ручное управление скоростью вентилятора в %
- Manual COLOR - ручное управление цветом ленты
- LED brightness - управление яркостью ленты
- CHART interval - интервал обновления графиков
Что идёт в порт: 0-CPU temp, 1-GPU temp, 2-mother temp, 3-max HDD temp, 4-CPU load, 5-GPU load, 6-RAM use, 7-GPU memory use,
8-maxFAN, 9-minFAN, 10-maxTEMP, 11-minTEMP, 12-manualFAN, 13-manualCOLOR, 14-fanCtrl, 15-colorCtrl, 16-brightCtrl, 17-LOGinterval, 18-tempSource
*/
// ------------------------ НАСТРОЙКИ ----------------------------
// настройки пределов скорости и температуры по умолчанию (на случай отсутствия связи)
byte speedMIN = 10, speedMAX = 90, tempMIN = 30, tempMAX = 70;
#define DRIVER_VERSION 1 // 0 - маркировка драйвера кончается на 4АТ, 1 - на 4Т
#define COLOR_ALGORITM 0 // 0 или 1 - разные алгоритмы изменения цвета (строка 222)
#define ERROR_DUTY 90 // скорость вентиляторов при потере связи
// ------------------------ НАСТРОЙКИ ----------------------------
// ----------------------- ПИНЫ ---------------------------
#define FAN_PIN 9 // на мосфет вентиляторов
#define R_PIN 5 // на мосфет ленты, красный
#define G_PIN 3 // на мосфет ленты, зелёный
#define B_PIN 6 // на мосфет ленты, синий
#define BTN1 A3 // первая кнопка
#define BTN2 A2 // вторая кнопка
#define SENSOR_PIN 14 // датчик температуры
int RECV_PIN = 11; // пульт
// ----------------------- ПИНЫ ---------------------------
// -------------------- БИБЛИОТЕКИ ---------------------
#include <OneWire.h> // библиотека протокола датчиков
#include <DallasTemperature.h> // библиотека датчика
#include <string.h> // библиотека расширенной работы со строками
#include <Wire.h> // библиотека для соединения
#include <LiquidCrystal_I2C.h> // библтотека дислея
//#include <TimerOne.h> // библиотека таймера
#include <IRremote.h> // библиотека пульта
#include <TimeLib.h>
// -------------------- БИБЛИОТЕКИ ---------------------
// -------- АВТОВЫБОР ОПРЕДЕЛЕНИЯ ДИСПЛЕЯ-------------
// Если кончается на 4Т - это 0х27. Если на 4АТ - 0х3f
#if (DRIVER_VERSION)
LiquidCrystal_I2C lcd(0x27, 16, 2);
#else
LiquidCrystal_I2C lcd(0x3f, 16, 2);
#endif
// -------- АВТОВЫБОР ОПРЕДЕЛЕНИЯ ДИСПЛЕЯ-------------
#define printByte(args) write(args);
#define TEMPERATURE_PRECISION 9
// настройка даьчтков
OneWire oneWire(SENSOR_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1, Thermometer2;
// стартовый логотип
byte logo0[8] = {0b00011, 0b00110, 0b01110, 0b11111, 0b11011, 0b11001, 0b00000, 0b00000};
byte logo1[8] = {0b10000, 0b00001, 0b00001, 0b00001, 0b00000, 0b10001, 0b11011, 0b11111};
byte logo2[8] = {0b11100, 0b11000, 0b10001, 0b11011, 0b11111, 0b11100, 0b00000, 0b00000};
byte logo3[8] = {0b00000, 0b00001, 0b00011, 0b00111, 0b01101, 0b00111, 0b00010, 0b00000};
byte logo4[8] = {0b11111, 0b11111, 0b11011, 0b10001, 0b00000, 0b00000, 0b00000, 0b00000};
byte logo5[8] = {0b00000, 0b10000, 0b11000, 0b11100, 0b11110, 0b11100, 0b01000, 0b00000};
// значок градуса!!!! lcd.write(223);
byte degree[8] = {0b11100, 0b10100, 0b11100, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};
// правый край полосы загрузки
byte right_empty[8] = {0b11111, 0b00001, 0b00001, 0b00001, 0b00001, 0b00001, 0b00001, 0b11111};
// левый край полосы загрузки
byte left_empty[8] = {0b11111, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b11111};
// центр полосы загрузки
byte center_empty[8] = {0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111};
// блоки для построения графиков
byte row8[8] = {0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte row7[8] = {0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte row6[8] = {0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte row5[8] = {0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte row4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111};
byte row3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111};
byte row2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte row1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111};
char inData[108]; // массив входных значений (СИМВОЛЫ)
int PCdata[26]; // массив численных значений показаний с компьютера
byte PLOTmem[6][16]; // массив для хранения данных для построения графика (16 значений для 6 параметров)
byte blocks, halfs;
byte index = 0;
int display_mode = 6;
String string_convert;
unsigned long timeout, blink_timer, plot_timer;
boolean lightState, reDraw_flag = 1, updateDisplay_flag, updateTemp_flag, timeOut_flag = 1;
int duty, LEDcolor;
int k, b, R, G, B, Rf, Gf, Bf;
byte mainTemp;
byte lines[] = {4, 5, 7, 6};
byte plotLines[] = {0, 1, 4, 5, 6, 7}; // 0-CPU temp, 1-GPU temp, 2-CPU load, 3-GPU load, 4-RAM load, 5-GPU memory
String perc;
unsigned long sec;
unsigned int mins, hrs;
byte temp1, temp2;
boolean btn1_sig, btn2_sig, btn1_flag, btn2_flag;
decode_results results; //для пульта
IRrecv irrecv(RECV_PIN); //для пульта
tmElements_t tm;
// Названия для легенды графиков
const char plot_0[] = "CPU";
const char plot_1[] = "GPU";
const char plot_2[] = "RAM";
const char plot_3[] = "temp";
const char plot_4[] = "load";
const char plot_5[] = "mem";
// названия ниже должны совпадать с массивами сверху и идти по порядку!
static const char *plotNames0[] = {
plot_0, plot_1, plot_0, plot_1, plot_2, plot_1
};
static const char *plotNames1[] = {
plot_3, plot_3, plot_4, plot_4, plot_4, plot_5
};
// 0-CPU temp, 1-GPU temp, 2-CPU load, 3-GPU load, 4-RAM load, 5-GPU memory
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // включить пульт
//Timer1.initialize(40); // поставить частоту ШИМ 25 кГц (40 микросекунд)
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
digitalWrite(R_PIN, 0);
digitalWrite(G_PIN, 0);
digitalWrite(B_PIN, 0);
pinMode(BTN1, INPUT_PULLUP);
pinMode(BTN2, INPUT_PULLUP);
sensors.begin();
sensors.getAddress(Thermometer1, 0);
sensors.getAddress(Thermometer2, 1);
sensors.setResolution(Thermometer1, TEMPERATURE_PRECISION);
sensors.setResolution(Thermometer2, TEMPERATURE_PRECISION);
// инициализация дисплея
lcd.init();
lcd.backlight();
lcd.clear(); // очистить дисплей
show_logo(); // показать логотип
delay(2000);
lcd.clear(); // очистить дисплей
show_logo2(); // показать логотип
//Timer1.pwm(FAN_PIN, 400); // включить вентиляторы на 40%
delay(2000); // на 2 секунды
lcd.clear(); // очистить дисплей
PCdata[8] = speedMAX;
PCdata[9] = speedMIN;
PCdata[10] = tempMAX;
PCdata[11] = tempMIN;
setTime(1); // устанавливаем начальное время
}
// 8-maxFAN, 9-minFAN, 10-maxTEMP, 11-minTEMP, 12-mnlFAN
// ------------------------------ ОСНОВНОЙ ЦИКЛ -------------------------------
void loop() {
parsing(); // парсим строки с компьютера
updatePlot(); // обновляем массив данных графика
getTemperature(); // получить значения с датчиков температуры
dutyCalculate(); // посчитать скважность для вентиляторов
//Timer1.pwm(FAN_PIN, duty * 10); // управлять вентиляторами
LEDcontrol(); // управлять цветом ленты
buttonsTick(); // опрос кнопок и смена режимов
irTick(); // опрос пульта и смена режимов
updateDisplay(); // обновить показания на дисплее
timeoutTick(); // проверка таймаута
}
// ------------------------------ ОСНОВНОЙ ЦИКЛ -------------------------------
void irTick() {
if (irrecv.decode(&results)) {
switch (results.value) {
case 16736925: display_mode++;
reDraw_flag = 1;
if (display_mode > 9) display_mode = 0;
break;
case 16754775: display_mode--;
reDraw_flag = 1;
if (display_mode < 0) display_mode = 9;
break;
};
irrecv.resume();
}
}
void buttonsTick() {
btn1_sig = !digitalRead(BTN1);
btn2_sig = !digitalRead(BTN2);
if (btn1_sig && !btn1_flag) {
display_mode++;
reDraw_flag = 1;
if (display_mode > 9) display_mode = 0;
btn1_flag = 1;
}
if (!btn1_sig && btn1_flag) {
btn1_flag = 0;
}
if (btn2_sig && !btn2_flag) {
display_mode--;
reDraw_flag = 1;
if (display_mode < 0) display_mode = 9;
btn2_flag = 1;
}
if (!btn2_sig && btn2_flag) {
btn2_flag = 0;
}
}
void getTemperature() {
if (updateTemp_flag) {
sensors.requestTemperatures();
temp1 = sensors.getTempC(Thermometer1);
temp2 = sensors.getTempC(Thermometer2);
updateTemp_flag = 0;
}
}
void LEDcontrol() {
b = PCdata[16];
if (PCdata[13] == 1) // если стоит галочка Manual Color
LEDcolor = PCdata[15]; // цвет равен установленному ползунком
else { // если нет
LEDcolor = map(mainTemp, PCdata[11], PCdata[10], 0, 1000);
LEDcolor = constrain(LEDcolor, 0, 1000);
}
if (COLOR_ALGORITM) {
// алгоритм цвета 1
// синий убавляется, зелёный прибавляется
// зелёный убавляется, красный прибавляется
if (LEDcolor <= 500) {
k = map(LEDcolor, 0, 500, 0, 255);
R = 0;
G = k;
B = 255 - k;
}
if (LEDcolor > 500) {
k = map(LEDcolor, 500, 1000, 0, 255);
R = k;
G = 255 - k;
B = 0;
}
} else {
// алгоритм цвета 2
// синий максимум, плавно прибавляется зелёный
// зелёный максимум, плавно убавляется синий
// зелёный максимум, плавно прибавляется красный
// красный максимум, плавно убавляется зелёный
if (LEDcolor <= 250) {
k = map(LEDcolor, 0, 250, 0, 255);
R = 0;
G = k;
B = 255;
}
if (LEDcolor > 250 && LEDcolor <= 500) {
k = map(LEDcolor, 250, 500, 0, 255);
R = 0;
G = 255;
B = 255 - k;
}
if (LEDcolor > 500 && LEDcolor <= 750) {
k = map(LEDcolor, 500, 750, 0, 255);
R = k;
G = 255;
B = 0;
}
if (LEDcolor > 750 && LEDcolor <= 1000) {
k = map(LEDcolor, 750, 1000, 0, 255);
R = 255;
G = 255 - k;
B = 0;
}
}
Rf = (b * R / 100);
Gf = (b * G / 100);
Bf = (b * B / 100);
analogWrite(R_PIN, Rf);
analogWrite(G_PIN, Gf);
analogWrite(B_PIN, Bf);
}
void dutyCalculate() {
if (PCdata[12] == 1) // если стоит галочка ManualFAN
duty = PCdata[14]; // скважность равна установленной ползунком
else { // если нет
switch (PCdata[18]) {
case 0: mainTemp = PCdata[0]; // взять опорную температуру как CPU
break;
case 1: mainTemp = PCdata[1]; // взять опорную температуру как GPU
break;
case 2: mainTemp = max(PCdata[0], PCdata[1]); // взять опорную температуру как максимум CPU и GPU
break;
case 3: mainTemp = temp1;
break;
case 4: mainTemp = temp2;
break;
}
duty = map(mainTemp, PCdata[11], PCdata[10], PCdata[9], PCdata[8]);
duty = constrain(duty, PCdata[9], PCdata[8]);
}
if (!timeOut_flag) duty = ERROR_DUTY; // если пропало соединение, поставить вентиляторы на ERROR_DUTY
}
void parsing() {
while (Serial.available() > 0) {
char aChar = Serial.read();
if (aChar != 'E') {
inData[index] = aChar;
index++;
inData[index] = '\0';
} else
{
char *p = inData;
char *str;
index = 0;
String value = "";
while ((str = strtok_r(p, ";", &p)) != NULL) {
string_convert = str;
PCdata[index] = string_convert.toInt();
index++;
}
index = 0;
updateDisplay_flag = 1;
updateTemp_flag = 1;
tm.Second = PCdata[21];
tm.Hour = PCdata[19];
tm.Minute = PCdata[20];
tm.Day = PCdata[22];
tm.Month = PCdata[23];
tm.Year = PCdata[24] - 1970;
setTime(makeTime(tm));
}
timeout = millis();
timeOut_flag = 1;
}
}
void updatePlot() {
if ((millis() - plot_timer) > (PCdata[17] * 1000)) {
for (int i = 0; i < 6; i++) { // для каждой строки параметров
for (int j = 0; j < 15; j++) { // каждый столбец параметров (кроме последнего)
PLOTmem[i][j] = PLOTmem[i][j + 1]; // сдвинуть весь массив на шаг ВЛЕВО
}
}
for (int i = 0; i < 6; i++) {
// запомнить общее число полосок графика в ПОСЛЕДНИЙ элемент массива
PLOTmem[i][15] = PCdata[plotLines[i]];
}
plot_timer = millis();
}
}
void updateDisplay() {
if (updateDisplay_flag) {
if (reDraw_flag) {
lcd.clear();
switch (display_mode) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5: draw_plot_symb();
break;
case 6: draw_labels_11();
break;
case 7: draw_labels_12();
break;
case 8: draw_labels_21();
break;
case 9: draw_labels_22();
break;
}
reDraw_flag = 0;
}
switch (display_mode) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5: draw_plot();
break;
case 6: draw_stats_11();
break;
case 7: draw_stats_12();
break;
case 8: draw_stats_21();
break;
case 9: draw_stats_22();
break;
case 50: debug();
break;
}
updateDisplay_flag = 0;
}
}
void draw_stats_11() {
lcd.setCursor(4, 0); lcd.print(PCdata[0]); lcd.write(223);
lcd.setCursor(13, 0); lcd.print(PCdata[4]);
if (PCdata[4] < 10) perc = "% ";
else if (PCdata[4] < 100) perc = "%";
else perc = ""; lcd.print(perc);
lcd.setCursor(4, 1); lcd.print(PCdata[1]); lcd.write(223);
lcd.setCursor(13, 1); lcd.print(PCdata[5]);
if (PCdata[5] < 10) perc = "% ";
else if (PCdata[5] < 100) perc = "%";
else perc = ""; lcd.print(perc);
for (int i = 0; i < 2; i++) {
byte line = ceil(PCdata[lines[i]] / 16);
lcd.setCursor(7, i);
if (line == 0) lcd.printByte(1)
else lcd.printByte(4);
for (int n = 1; n < 5; n++) {
if (n < line) lcd.printByte(4);
if (n >= line) lcd.printByte(2);
}
if (line == 6) lcd.printByte(4)
else lcd.printByte(3);
}
}
void draw_stats_12() {
lcd.setCursor(13, 0); lcd.print(PCdata[7]);
if (PCdata[7] < 10) perc = "% ";
else if (PCdata[7] < 100) perc = "%";
else perc = ""; lcd.print(perc);
lcd.setCursor(13, 1); lcd.print(PCdata[6]);
if (PCdata[6] < 10) perc = "% ";
else if (PCdata[6] < 100) perc = "%";
else perc = ""; lcd.print(perc);
for (int i = 0; i < 2; i++) {
byte line = ceil(PCdata[lines[i + 2]] / 16);
lcd.setCursor(7, i);
if (line == 0) lcd.printByte(1)
else lcd.printByte(4);
for (int n = 1; n < 5; n++) {
if (n < line) lcd.printByte(4);
if (n >= line) lcd.printByte(2);
}
if (line == 6) lcd.printByte(4)
else lcd.printByte(3);
}
}
void draw_stats_21() {
lcd.setCursor(13, 0); lcd.print(duty);
if ((duty) < 10) perc = "% ";
else if ((duty) < 100) perc = "%";
else perc = ""; lcd.print(perc);
lcd.setCursor(3, 1); lcd.print(temp1); lcd.write(223);
lcd.setCursor(11, 1); lcd.print(temp2); lcd.write(223);
byte line = ceil(duty / 16);
lcd.setCursor(6, 0);
if (line == 0) lcd.printByte(1)
else lcd.printByte(4);
for (int n = 1; n < 5; n++) {
if (n < line) lcd.printByte(4);
if (n >= line) lcd.printByte(2);
}
if (line == 6) lcd.printByte(4)
else lcd.printByte(3);
}
void draw_stats_22() {
lcd.setCursor(2, 0); lcd.print(PCdata[2]); lcd.write(223);
lcd.setCursor(10, 0); lcd.print(PCdata[3]); lcd.write(223);
char lcd_time[10];
snprintf(lcd_time, sizeof(lcd_time), "%02d:%02d",PCdata[19],PCdata[20]);
char lcd_date[12];
snprintf(lcd_date, sizeof(lcd_date), "%02d/%02d/%04d",PCdata[22],PCdata[23],PCdata[24]);
lcd.setCursor(0, 1);
lcd.print(lcd_time);
lcd.setCursor(6, 1);
lcd.print(lcd_date);
}
void draw_labels_11() {
lcd.createChar(0, degree);
lcd.createChar(1, left_empty);
lcd.createChar(2, center_empty);
lcd.createChar(3, right_empty);
lcd.createChar(4, row8);
lcd.setCursor(0, 0);
lcd.print("CPU:");
lcd.setCursor(0, 1);
lcd.print("GPU:");
}
void draw_labels_12() {
lcd.createChar(0, degree);
lcd.createChar(1, left_empty);
lcd.createChar(2, center_empty);
lcd.createChar(3, right_empty);
lcd.createChar(4, row8);
lcd.setCursor(0, 0);
lcd.print("GPUmem:");
lcd.setCursor(0, 1);
lcd.print("RAMuse:");
}
void draw_labels_21() {
lcd.createChar(0, degree);
lcd.createChar(1, left_empty);
lcd.createChar(2, center_empty);
lcd.createChar(3, right_empty);
lcd.createChar(4, row8);
lcd.setCursor(0, 0);
lcd.print("FANsp:");
lcd.setCursor(0, 1);
lcd.print("T1: ");
lcd.setCursor(8, 1);
lcd.print("T2:");
}
void draw_labels_22() {
lcd.createChar(0, degree);
lcd.createChar(1, left_empty);
lcd.createChar(2, center_empty);
lcd.createChar(3, right_empty);
lcd.createChar(4, row8);
lcd.setCursor(0, 0);
lcd.print("M:");
lcd.setCursor(7, 0);
lcd.print("HM:");
}
void draw_legend() {
byte data = PCdata[plotLines[display_mode]];
lcd.setCursor(10, 0); lcd.print(data);
if (display_mode > 1) {
if (data < 10) perc = "% ";
else if (data < 100) perc = "%";
else {
perc = "";
}
lcd.print(perc);
} else {
if (data < 10) {
lcd.write(223);
lcd.print(" ");
} else if (data < 100) {
lcd.write(223); lcd.print(" ");
} else {
lcd.write(223);
}
}
}
void draw_plot() {
draw_legend();
lcd.setCursor(0, 1);
for (int i = 0; i < 16; i++) {
lcd.printByte(constrain(map(PLOTmem[display_mode][i], 0, 100, 0, 7), 0, 7));
}
}
void draw_plot_symb() {
lcd.createChar(0, row1);
lcd.createChar(1, row2);
lcd.createChar(2, row3);
lcd.createChar(3, row4);
lcd.createChar(4, row5);
lcd.createChar(5, row6);
lcd.createChar(6, row7);
lcd.createChar(7, row8);
lcd.setCursor(0, 0);
lcd.print(plotNames0[display_mode]);
lcd.setCursor(3, 0);
lcd.print(plotNames1[display_mode]);
lcd.print(": ");
}
void timeoutTick() {
if (millis() - timeout > 5000) {
if (timeOut_flag == 1) {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("DISCONNECTED");
timeOut_flag = 0;
reDraw_flag = 1;
}
char lcd_time_i[10];
snprintf(lcd_time_i, sizeof(lcd_time_i), "%02d:%02d",hour(),minute());
char lcd_date_i[12];
snprintf(lcd_date_i, sizeof(lcd_date_i), "%02d/%02d/%04d",day(),month(),year());
lcd.setCursor(0, 1);
lcd.print(lcd_time_i);
lcd.setCursor(6, 1);
lcd.print(lcd_date_i);
}
}
void show_logo() {
lcd.createChar(0, logo0);
lcd.createChar(1, logo1);
lcd.createChar(2, logo2);
lcd.createChar(3, logo3);
lcd.createChar(4, logo4);
lcd.createChar(5, logo5);
lcd.setCursor(0, 0);
lcd.printByte(0);
lcd.printByte(1);
lcd.printByte(2);
lcd.setCursor(0, 1);
lcd.printByte(3);
lcd.printByte(4);
lcd.printByte(5);
lcd.setCursor(4, 0);
lcd.print("AlexGyver");
lcd.setCursor(4, 1);
lcd.print("Technologies");
}
void show_logo2() {
lcd.setCursor(1, 0);
lcd.print("modified by");
lcd.setCursor(5, 1);
lcd.print("klykov.net");
}
void debug() {
lcd.clear();
lcd.setCursor(0, 0);
for (int j = 0; j < 5; j++) {
lcd.print(PCdata[j]); lcd.print(" ");
}
lcd.setCursor(0, 1);
for (int j = 6; j < 10; j++) {
lcd.print(PCdata[j]); lcd.print(" ");
}
lcd.setCursor(0, 2);
for (int j = 10; j < 15; j++) {
lcd.print(PCdata[j]); lcd.print(" ");
}
lcd.setCursor(0, 3);
for (int j = 15; j < 18; j++) {
lcd.print(PCdata[j]); lcd.print(" ");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment