ARDUINO ПОМОГИТЕ!!! Господа проинспектируйте скетч кто может, помогите добить...третью ночь не сплю...

malec

★★★★✩✩✩
5 Фев 2019
631
211
Суть такова , захотел РС дисплей, собрал заработало. Захотел WS2812 в место RGB диодов... кое как получилось(доволен, сам допёр почти), а вот не задача, есть энкодер с ним круче, а как вместо кнопок его вписать никак не допетрю ( староват я наверно?)
На одном и том-же заканчиваю какой-бы библиотекой не пользовался, как только с энкодером долеплюсь, ИДЭ на дисплей ругаться начинает, а я к дисплею вообще не приставал)))
первый мод работает без энкодера , а второй с энкодером не компелируется, ниже фото , библиотеки которые пытался использовать.
 

Вложения

Последнее редактирование:

SergeySAS

★✩✩✩✩✩✩
20 Дек 2018
42
10
Москва
sustavov.org
Вот такой код точно пашет: (тут энкодер подключен к 2 3 4 пинам) а по SPI индикатор через сдвиговый регистр 595
C++:
#include <GyverEncoder.h>
#include <SPI.h>

#define CLK 2
#define DT 3
#define SW 4

Encoder enc1(CLK, DT, SW, 1);


uint8_t disp[10] = {0x77, 0x14, 0xB3, 0xB6, 0xD4, 0xE6, 0xE7, 0x34, 0xF7, 0xF6};

int CurVal=0;
uint8_t comma=0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  pinMode(8,OUTPUT);
  digitalWrite(8, HIGH);

  SPI.begin();
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  delay(2000);

  //обнулить экран
  digitalWrite(8, LOW);
  SPI.transfer(0xFF);
  digitalWrite(8, HIGH);
  delay(500);
}

void loop() {

enc1.tick();

if (enc1.isRight()) CurVal--;
if (enc1.isLeft()) CurVal++;

if (enc1.isFastL()) CurVal++;
if (enc1.isFastR()) CurVal--;

if (enc1.isPress())
{
  if (comma) comma=0;
  else comma = 8;
}

if (CurVal < 0) CurVal=0;
if (CurVal > 9) CurVal=9;

digitalWrite(8, LOW);
SPI.transfer(disp[CurVal] + comma);
digitalWrite(8, HIGH);

}
 

SergeySAS

★✩✩✩✩✩✩
20 Дек 2018
42
10
Москва
sustavov.org
Для разных библиотек должен быть разный код. Должна быть определена переменная именно класса из используемой библиотеки. Прикрепи код для нее и я посмотрю.
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
Спасибо за совет, только мозгов не хватает...КАК((( его влепить в первый скетч (пытался)... да и про какой сдвиговый регистр идёт речь? только ардуино и минимум обвязки.
Для разных библиотек должен быть разный код. Должна быть определена переменная именно класса из используемой библиотеки. Прикрепи код для нее и я посмотрю.
uint8_t disp[10] = {0x77, 0x14, 0xB3, 0xB6, 0xD4, 0xE6, 0xE7, 0x34, 0xF7, 0xF6};
тут даже дисплея моего нет LiquidCrystal_I2C lcd (0x3f, 20, 4);-драйвер
 

Вложения

Последнее редактирование:

malec

★★★★✩✩✩
5 Фев 2019
631
211
блин надо всего две кнопки убрать , а энкодер подключить((((( нихрена не догоняю... почему так сложно?
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
ВСЕМ здрасте!!! проблема не ушла ЛЯДУ не дам почему... как только я прилепляю энкодер в место кнопок , начинаем "ЛАЯТЬ" на логотип, парсинг и Т,Д,
lcd.init();
lcd.backlight();
lcd.clear(); // очистить дисплей
show_logo(); // показать логотип ___________ вот эта строка КРАСНАЯ

Timer1.pwm(FAN_PIN, 400); // включить вентиляторы на 40%
delay(2000); // на 2 секунды
lcd.clear(); // очистить дисплей
PCdata[8] = speedMAX;
PCdata[9] = speedMIN;
PCdata[10] = tempMAX;
PCdata[11] = tempMIN;
}
// 8-maxFAN, 9-minFAN, 10-maxTEMP, 11-minTEMP, 12-mnlFAN

// ------------------------------ ОСНОВНОЙ ЦИКЛ -------------------------------
void loop() {
//------------------— Зажигаем диоды
for (int i = 0; i < NUM_LEDS; i++ ) { // задаем попорядку цвет диодам
/* —------------------Цвет ленты от температуры--------------------

Мы берем диапазон цветов от 0 до 255 и берем диапазон своих температур процессора или чего хотим,
ну например возмем максимальный разброс от 20 до 85 градусов (85-20=65)
и пропорционально делим 255/65=3,9 - вот он наш коофицент. Что бы не парить контроллер запятыми округлим его до 4х.
Из-за того что номер цвета растет в "неправильном" для нас порядке (от красного к синему)нам надо просто инвертировать значение,
что бы оно росло от синего к красному как и наша температура
Например при 27С градусах получим 27*4=108 далее мы инвертируем это значение (255 -108 =147 - значение цвета) и получим синий цвет - холодно
а при 60С градусах - 60*4=240 инвертируем(255-240=15 ) и получаем почти красный цвет - горячо
*/
byte temp_gen =4; // Коофицент умножения, Чтобы получить цвет от 0 до 255, температуру надо умножить на коофицент.
leds = CHSV(250-mainTemp*temp_gen, 200, 255); // Инвертируем значение температуры и задаем цвет диодов в зависимости от температуры
}

FastLED.show();
delay(5);
parsing(); // парсим строки с компьютера
updatePlot(); // обновляем массив данных графика
getTemperature(); // получить значения с датчиков температуры
dutyCalculate(); // посчитать скважность для вентиляторов
Timer1.pwm(FAN_PIN, duty * 10); // управлять вентиляторами
// LEDcontrol(); // управлять цветом ленты
// buttonsTick(); // опрос кнопок и смена режимов
updateDisplay(); // обновить показания на дисплее
timeoutTick(); // проверка таймаута
if (!restoreConnectToPC) // если связь была потеряна, но восстановилась
if (ERROR_UPTIME) uptime_timer = millis(); // сбросить uptime, если разрешено
}
// ------------------------------ ОСНОВНОЙ ЦИКЛ -------------------------------
{
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) { // выход В в полож. сост., значит вращение по часовой стрелке
if (display_mode++);
reDraw_flag = 1;
if (display_mode > 7) display_mode = 0;
}
else { // выход В в 0 сост., значит вращение против часовой стрелки
if display_mode--;
reDraw_flag = 1;
if (display_mode < 0) display_mode = 7;
}

}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла

loopTime = currentTime;
}
//void buttonsTick() {
// btn1_sig = !digitalRead(BTN1);
// btn2_sig = !digitalRead(BTN2);
// if (btn1_sig && !btn1_flag) }
// if (!btn1_sig && btn1_flag) {
// btn1_flag = 0;
// }
// if (btn2_sig && !btn2_flag) {
// display_mode--;
// reDraw_flag = 1;
// if (display_mode < 0) display_mode = 7;
// btn2_flag = 1;
// }
// if (!btn2_sig && btn2_flag) {
// btn2_flag = 0;
// }
//}
ОШИБКА:-
exit status 1
'show_logo' was not declared in this scope
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
энкодер на тех-же пинах что и кнопки... заливаю скетч с кнопками - работает)))) коряво, ну я думаю здесь не надо пояснять -почему? прописываю энкодер абсолютно любой библиотеки... и без, сразу лаит на логотип
 

SergeySAS

★✩✩✩✩✩✩
20 Дек 2018
42
10
Москва
sustavov.org
В приведенном куске кода реально вызов show_logo() есть, а реализации нет. он и пишет прямым текстом, что нет такой функции - не знает, что делать...

Пойдем из далека. В Си все построено на функциях (классы это все потом пришло). И так в классическом Си есть:
1. Определение функции
2. Реализация функции
3. Вызов функции
Если вызов идет после реализации по тексту, то первый (определение) можно опустить. В IDE не обязательно. Но реализация обязательна везде.
Т.е. если писать Func(); то эта самая Func должна быть где-то реализована.
Должно быть что-то аля
void Func()
{
}
Реализация может быть в твоем коде, или в любом .h файле

И по поводу библиотек. В библиотеке определен класс. И Переменную этого класса нужно использовать в своем коде.
Просто написать include не значит использовать библиотеку.
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
СпС
В приведенном куске кода реально вызов show_logo() есть, а реализации нет. он и пишет прямым текстом, что нет такой функции - не знает, что делать...

Пойдем из далека. В Си все построено на функциях (классы это все потом пришло). И так в классическом Си есть:
1. Определение функции
2. Реализация функции
3. Вызов функции
Если вызов идет после реализации по тексту, то первый (определение) можно опустить. В IDE не обязательно. Но реализация обязательна везде.
Т.е. если писать Func(); то эта самая Func должна быть где-то реализована.
Должно быть что-то аля
void Func()
{
}
Реализация может быть в твоем коде, или в любом .h файле

И по поводу библиотек. В библиотеке определен класс. И Переменную этого класса нужно использовать в своем коде.
Просто написать include не значит использовать библиотеку.
Вернёмся на землю))) СПС за консультацию... программирование в СИ или что там еще, для меня всё равно что попытка сесть на солнце.... я настолько далёк ( в недалёком, для меня 1988г. закончилась попытка впихнуть в меня образование, в дальнейшем всё образование я получал от окружающих меня в, то время людей.....спасибо предкам и каким-то там "ГЕНАМ"))) что интеллектом не обделили) т.е. я пытаюсь понять что и куда я могу впихнуть (по русски, методом "ТЫКА" там где тыкать без "СТРАХА" можно, и получается), спасибо Гайверу и подобным ему людям делящимися своими познаниями - мира сего...ща пойду опять уроки с Гайвером делать))) Если я правильно тебя понял мне надо найти где эта функция выполняется и переставить эту задачу , т.е. что-то где-то переместить в другое место кода... т.к. она в коде где-то есть я ничего не вырезал( максимум заслешил)
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
по функциям что-то, где-то( я в фазанке на монтажника РЭА и КИП учился...что-то на исполнителей похоже))), а может это информатика была?))) про библиотеки я понял... здесь я пытался без библиотек (думал заметиш) просто методом сравнения и вызов функции...
Просто не допёр почему в пред идущем коде всё компелируется и работает, после замены кнопок нет...ведь функции энкодера записаны в том-же месте кода где была кнопка...(((, даже пины те-же))))
 
Последнее редактирование:

malec

★★★★✩✩✩
5 Фев 2019
631
211
вот весь код
/*
Блок электроники для крутого моддинга вашего ПК, возможности:
- Вывод основных параметров железа на внешний 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 = 99, tempMIN = 20, tempMAX = 80;
#define DRIVER_VERSION 0 // 0 - маркировка драйвера кончается на 4АТ, 1 - на 4Т
#define COLOR_ALGORITM 0 // 0 или 1 - разные алгоритмы изменения цвета (строка 222)
#define ERROR_DUTY 90 // скорость вентиляторов при потере связи
#define ERROR_BACKLIGHT 1 // 0 - гасить подсветку при потере сигнала, 1 - не гасить
#define ERROR_UPTIME 1 // 1 - сбрасывать uptime при потере связи, 0 - нет
#define ERROR_TEMP 1 // 1 - показывать температуру при потере связи. 0 - нет
// ------------------------ НАСТРОЙКИ ----------------------------

// ----------------------- ПИНЫ ---------------------------
#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 // датчик температуры
// ----------------------- ПИНЫ ---------------------------

// -------------------- БИБЛИОТЕКИ ---------------------
#include <OneWire.h> // библиотека протокола датчиков
#include <DallasTemperature.h> // библиотека датчика
#include <string.h> // библиотека расширенной работы со строками
#include <Wire.h> // библиотека для соединения
#include <LiquidCrystal_I2C.h> // библтотека дислея
#include <TimerOne.h> // библиотека таймера
// -------------------- БИБЛИОТЕКИ ---------------------
//-------------------Добавляем FastLED

#define NUM_LEDS 32 //колво светодиодов в ленте
#include "FastLED.h" //подключаем библиотеку
#define PIN 2 // переменная пин куда подключена лента
CRGB leds[NUM_LEDS];

// -------- АВТОВЫБОР ОПРЕДЕЛЕНИЯ ДИСПЛЕЯ-------------
// Если кончается на 4Т - это 0х27. Если на 4АТ - 0х3f
//#if (DRIVER_VERSION)
//LiquidCrystal_I2C lcd(0x27, 20, 4);
//#else
LiquidCrystal_I2C lcd(0x3f, 20, 4);
//#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[82]; // массив входных значений (СИМВОЛЫ)
int PCdata[20]; // массив численных значений показаний с компьютера
byte PLOTmem[6][16]; // массив для хранения данных для построения графика (16 значений для 6 параметров)
byte blocks, halfs;
byte index = 0;
int display_mode = 6;
String string_convert;
unsigned long timeout, blink_timer,uptime_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 long mins, hrs;
byte temp1, temp2;
boolean btn1_sig, btn2_sig, btn1_flag, btn2_flag, btn3_flag, btn3_sig, timeOutLCDClear = 0, restoreConnectToPC=0;

// Названия для легенды графиков
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
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12; // pin 12
const int pin_B = 11; // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

void setup() {
Serial.begin(9600);
//--------------— Включаем ленту
FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness(30); //начальная яркость
Timer1.initialize(40); // поставить частоту ШИМ 25 кГц (40 микросекунд)
// pinMode(BTN1, INPUT_PULLUP);
// pinMode(BTN2, INPUT_PULLUP);
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
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(); // показать логотип

Timer1.pwm(FAN_PIN, 400); // включить вентиляторы на 40%
delay(2000); // на 2 секунды
lcd.clear(); // очистить дисплей
PCdata[8] = speedMAX;
PCdata[9] = speedMIN;
PCdata[10] = tempMAX;
PCdata[11] = tempMIN;
}
// 8-maxFAN, 9-minFAN, 10-maxTEMP, 11-minTEMP, 12-mnlFAN
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
// ------------------------------ ОСНОВНОЙ ЦИКЛ -------------------------------
void loop() {
//------------------— Зажигаем диоды
for (int i = 0; i < NUM_LEDS; i++ ) { // задаем попорядку цвет диодам
/* —------------------Цвет ленты от температуры--------------------

Мы берем диапазон цветов от 0 до 255 и берем диапазон своих температур процессора или чего хотим,
ну например возмем максимальный разброс от 20 до 85 градусов (85-20=65)
и пропорционально делим 255/65=3,9 - вот он наш коофицент. Что бы не парить контроллер запятыми округлим его до 4х.
Из-за того что номер цвета растет в "неправильном" для нас порядке (от красного к синему)нам надо просто инвертировать значение,
что бы оно росло от синего к красному как и наша температура
Например при 27С градусах получим 27*4=108 далее мы инвертируем это значение (255 -108 =147 - значение цвета) и получим синий цвет - холодно
а при 60С градусах - 60*4=240 инвертируем(255-240=15 ) и получаем почти красный цвет - горячо
*/
byte temp_gen =4; // Коофицент умножения, Чтобы получить цвет от 0 до 255, температуру надо умножить на коофицент.
leds = CHSV(250-mainTemp*temp_gen, 200, 255); // Инвертируем значение температуры и задаем цвет диодов в зависимости от температуры
}

FastLED.show();
delay(5);
parsing(); // парсим строки с компьютера
updatePlot(); // обновляем массив данных графика
getTemperature(); // получить значения с датчиков температуры
dutyCalculate(); // посчитать скважность для вентиляторов
Timer1.pwm(FAN_PIN, duty * 10); // управлять вентиляторами
// LEDcontrol(); // управлять цветом ленты
// buttonsTick(); // опрос кнопок и смена режимов
updateDisplay(); // обновить показания на дисплее
timeoutTick(); // проверка таймаута
if (!restoreConnectToPC) // если связь была потеряна, но восстановилась
if (ERROR_UPTIME) uptime_timer = millis(); // сбросить uptime, если разрешено
}
// ------------------------------ ОСНОВНОЙ ЦИКЛ -------------------------------
{
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) { // выход В в полож. сост., значит вращение по часовой стрелке
if (display_mode++);
reDraw_flag = 1;
if (display_mode > 7) display_mode = 0;
}
else { // выход В в 0 сост., значит вращение против часовой стрелки
if display_mode--;
reDraw_flag = 1;
if (display_mode < 0) display_mode = 7;
}

}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла

loopTime = currentTime;
}
//void buttonsTick() {
// btn1_sig = !digitalRead(BTN1);
// btn2_sig = !digitalRead(BTN2);
// if (btn1_sig && !btn1_flag) }
// if (!btn1_sig && btn1_flag) {
// btn1_flag = 0;
// }
// if (btn2_sig && !btn2_flag) {
// display_mode--;
// reDraw_flag = 1;
// if (display_mode < 0) display_mode = 7;
// 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 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;
}
timeout = millis();
timeOut_flag = 1;
restoreConnectToPC = 1;
lcd.backlight();
}
}

void updatePlot() {
if ((millis() - plot_timer) > (PCdata[17] * 1000)) {
for (int i = 0; i < 6; i++) { // для каждой строки параметров
for (int j = 0; j < 15; j++) { // каждый столбец параметров (кроме последнего)
PLOTmem[j] = PLOTmem[j + 1]; // сдвинуть весь массив на шаг ВЛЕВО
}
}
for (int i = 0; i < 6; i++) {
// запомнить общее число полосок графика в ПОСЛЕДНИЙ элемент массива
PLOTmem[15] = ceil(PCdata[plotLines] / 3);
}
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_1();
break;
case 7: draw_labels_2();
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_1();
break;
case 7: draw_stats_2();
break;
case 50: debug();
break;
}
updateDisplay_flag = 0;
}
if(timeOutLCDClear)
{reDraw_flag = 1;}
}
void draw_stats_1() {
timeOutLCDClear = 0;
lcd.setCursor(4, 0); lcd.print(PCdata[0]); lcd.write(223);
lcd.setCursor(17, 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(17, 1); lcd.print(PCdata[5]);
if (PCdata[5] < 10) perc = "% ";
else if (PCdata[5] < 100) perc = "%";
else perc = ""; lcd.print(perc);
lcd.setCursor(17, 2); lcd.print(PCdata[7]);
if (PCdata[7] < 10) perc = "% ";
else if (PCdata[7] < 100) perc = "%";
else perc = ""; lcd.print(perc);
lcd.setCursor(17, 3); 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 < 4; i++) {
byte line = ceil(PCdata[lines] / 10);
lcd.setCursor(7, i);
if (line == 0) lcd.printByte(1)
else lcd.printByte(4);
for (int n = 1; n < 9; n++) {
if (n < line) lcd.printByte(4);
if (n >= line) lcd.printByte(2);
}
if (line == 10) lcd.printByte(4)
else lcd.printByte(3);
}
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
}
void draw_stats_2() {
lcd.setCursor(16, 0); lcd.print(duty);
if ((duty) < 10) perc = "% ";
else if ((duty) < 100) perc = "%";
else perc = ""; lcd.print(perc);

lcd.setCursor(6, 1); lcd.print(temp1); lcd.write(223);
lcd.setCursor(16, 1); lcd.print(temp2); lcd.write(223);
lcd.setCursor(4, 2); lcd.print(PCdata[2]); lcd.write(223);
lcd.setCursor(16, 2); lcd.print(PCdata[3]); lcd.write(223);

lcd.setCursor(9, 3);
sec = (long)(millis() - uptime_timer) / 1000;
hrs = (float)floor((sec / 3600));
mins = (float)floor(sec - (hrs * 3600)) / 60;
sec = sec - (hrs * 3600 + mins * 60);
if (hrs < 10) lcd.print(0);
lcd.print(hrs);
lcd.print(":");
if (mins < 10) lcd.print(0);
lcd.print(mins);
lcd.print(":");
if (sec < 10) lcd.print(0);
lcd.print(sec);

byte line = ceil(duty / 10);
lcd.setCursor(6, 0);
if (line == 0) lcd.printByte(1)
else lcd.printByte(4);
for (int n = 1; n < 9; n++) {
if (n < line) lcd.printByte(4);
if (n >= line) lcd.printByte(2);
}
if (line == 10) lcd.printByte(4)
else lcd.printByte(3);
}
void draw_labels_1() {
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:");
lcd.setCursor(0, 2);
lcd.print("GPUmem:");
lcd.setCursor(0, 3);
lcd.print("RAMuse:");
}
void draw_labels_2() {
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("TMP1:");
lcd.setCursor(10, 1);
lcd.print("TMP2:");
lcd.setCursor(0, 2);
lcd.print("MOM:");
lcd.setCursor(9, 2);
lcd.print("HDDmax:");
lcd.setCursor(0, 3);
lcd.print("UPTIME:");
}
void draw_legend() {
byte data = PCdata[plotLines[display_mode]];
lcd.setCursor(16, 2); 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();

for (byte i = 0; i < 16; i++) { // каждый столбец параметров
blocks = floor(PLOTmem[display_mode] / 8); // найти количество целых блоков
halfs = PLOTmem[display_mode] - blocks * 8; // найти число оставшихся полосок
for (byte n = 0; n < 4; n++) {
if (n < blocks) {
lcd.setCursor(i, (3 - n));
lcd.printByte(0);
}
if (n >= blocks) {
if (n != 3) {
lcd.setCursor(i, (3 - n));
if (halfs > 0) lcd.printByte(halfs);
for (byte k = n + 1; k < 4; k++) {
lcd.setCursor(i, (3 - k));
lcd.print(" ");
}
break;
}
}
}
}
}

void draw_plot_symb() {
lcd.createChar(0, row8);
lcd.createChar(1, row1);
lcd.createChar(2, row2);
lcd.createChar(3, row3);
lcd.createChar(4, row4);
lcd.createChar(5, row5);
lcd.createChar(6, row6);
lcd.createChar(7, row7);
lcd.setCursor(16, 0);
lcd.print(plotNames0[display_mode]);
lcd.setCursor(16, 1);
lcd.print(plotNames1[display_mode]);
}
void timeoutTick() {
if ((millis() - timeout > 5000))
{ lcd.clear(); }
while (Serial.available() < 1){
if ((millis() - timeout > 5000) && timeOut_flag) {
getTemperature();
index = 0;
updateTemp_flag = 1;
getTemperature();
if(restoreConnectToPC)
{
reDraw_flag=1;
restoreConnectToPC=0;
if (reDraw_flag) {
lcd.clear();
reDraw_flag = 0;}
}
if(ERROR_TEMP)
{
lcd.setCursor(0, 0);
lcd.print("TMP1:");
lcd.setCursor(10, 0);
lcd.print("TMP2:");
lcd.setCursor(5, 0); lcd.print(temp1); lcd.write(223);
lcd.setCursor(15, 0); lcd.print(temp2); lcd.write(223);
}
lcd.setCursor(5, 1);
lcd.print("CONNECTION");
lcd.setCursor(7, 2);
lcd.print("FAILED");
reDraw_flag = 0;
updateDisplay_flag = 1;
timeOutLCDClear = 1;
if(timeOutLCDClear)
{reDraw_flag = 1;}
if (!ERROR_BACKLIGHT) lcd.noBacklight();
}}
}
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(2, 1);
lcd.printByte(0);
lcd.printByte(1);
lcd.printByte(2);
lcd.setCursor(2, 2);
lcd.printByte(3);
lcd.printByte(4);
lcd.printByte(5);
lcd.setCursor(6, 1);
lcd.print("AlexGyver&k");
lcd.setCursor(6, 2);
lcd.print("Technologies");
}
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(" ");
}
}
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
а это все ошибки:-
D:\всякое\загрузки\арду\pc_displeyMODS1-3\pc_displeyMODS1-3.ino: In function 'void setup()':

pc_displeyMODS1-3:183:14: error: 'show_logo' was not declared in this scope

D:\всякое\загрузки\арду\pc_displeyMODS1-3\pc_displeyMODS1-3.ino: In function 'void loop()':

pc_displeyMODS1-3:207:11: error: 'parsing' was not declared in this scope

pc_displeyMODS1-3:208:14: error: 'updatePlot' was not declared in this scope

pc_displeyMODS1-3:209:18: error: 'getTemperature' was not declared in this scope

pc_displeyMODS1-3:210:17: error: 'dutyCalculate' was not declared in this scope

pc_displeyMODS1-3:214:17: error: 'updateDisplay' was not declared in this scope

pc_displeyMODS1-3:215:15: error: 'timeoutTick' was not declared in this scope

D:\всякое\загрузки\арду\pc_displeyMODS1-3\pc_displeyMODS1-3.ino: At global scope:

pc_displeyMODS1-3:220:3: error: expected unqualified-id before '{' token

Несколько библиотек найдено для "FastLED.h"
Используется: C:\Users\Users\Documents\Arduino\libraries\FastLED
Не используется: C:\Program Files (x86)\Arduino\libraries\FastLED-stm32patch
Не используется: C:\Program Files (x86)\Arduino\libraries\FastLED-master
Не используется: C:\Program Files (x86)\Arduino\libraries\FastLED
exit status 1
'show_logo' was not declared in this scope
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
может энкодер в другом месте писать надо, ведь с кнопкой всё работает.... слишком много всего вылазит
 

SergeySAS

★✩✩✩✩✩✩
20 Дек 2018
42
10
Москва
sustavov.org
слишком много всего - сломал структуру.

Закоментировал функцию обработки кнопки и брякнул на его место непонятный код.


Имеется ввиду строки с 219 по 240 - они должны быть в функции аналоге buttonsTick
Например назови encoderTick() - добавь до 219 строки void encoderTick()
Дальше в самой функции убрано все что было с кнопкой и написана явная ересь.
например 231 строка:
if display_mode--;
Ее не только IDE не понимает, но и я.

И после того как добавишь вызов функции нужно вставить в loop()
примерно в 201 строке.

PS. И я ничего не делал - только энкодер включил это сильно )
У меня знакомый на автомобиле тоже сказал, что ничего не делал, только масло долил - понять не могли.
Потом выяснилось что он не долил, а залил 2 канистры :)) Еле потом избавились от авто )
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
спасибо за науку , Понимаю ехидничество))) сам над молодыми электриками так глумлюсь, но помогаю....
короч. хотел вывести в сериал посмотреть что там....сделал так... взял за основу гайвера с прерыванием, просто пример работает и влепил-
void EncTick(){
enc1.tick(); // отработка
if (enc1.isRight()) Serial.println("Right"); // если был поворот
if (enc1.isLeft()) Serial.println("Left");

if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
if (enc1.isLeftH()) Serial.println("Left holded");
}
кнопка не подключенна в мониторе чисто
 
Последнее редактирование:

malec

★★★★✩✩✩
5 Фев 2019
631
211
attachInterrupt(0, isr, CHANGE); // прерывание на 2 пине! CLK у энка
вставил в 150 строку
void isr() {
enc1.tick(); // отработка в прерывании
в 176 до void loop()
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
а ошибки вылазили потому как за скобками не смотрел))) безграмотный))) и " структуру сломал" как Вы заметили...
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
блин с лентой-же получилось, почему энкодер такая КАКА????
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
слишком много всего - сломал структуру.

Закоментировал функцию обработки кнопки и брякнул на его место непонятный код.


Имеется ввиду строки с 219 по 240 - они должны быть в функции аналоге buttonsTick
Например назови encoderTick() - добавь до 219 строки void encoderTick()
Дальше в самой функции убрано все что было с кнопкой и написана явная ересь.
например 231 строка:
if display_mode--;
Ее не только IDE не понимает, но и я.

И после того как добавишь вызов функции нужно вставить в loop()
примерно в 201 строке.

PS. И я ничего не делал - только энкодер включил это сильно )
У меня знакомый на автомобиле тоже сказал, что ничего не делал, только масло долил - понять не могли.
Потом выяснилось что он не долил, а залил 2 канистры :)) Еле потом избавились от авто )
если я правильно тебя понял--
void EncoderTick(){
enc1.tick();
if (enc1.isRight()){
display_mode++;// если был поворот направо, увеличиваем на 1
reDraw_flag = 1;
}
if (enc1.isRight()){
display_mode--;// если был поворот направо, уменьшаем на 1
reDraw_flag = 1;
if (enc1.isTurn());
}
}
"Я НЕ ВОЛШЕБНИК, Я ТОЛЬКО УЧУСЬ" )))
 

malec

★★★★✩✩✩
5 Фев 2019
631
211
Господа... почти решил... также, вырезал графики, добавил экран с загрузкой памяти в Мб от соратника max75025 ... пока почти не чистил, но есть чем похвастать)))). Спасибо всем за внимание!!!!
видос https://drive.google.com/open?id=1zhqBcVD5_B-OsFJbwGjWRzp23G4GogKi
 

Вложения

Последнее редактирование: