Здравствуйте.
Вопрос по коду.
Задача: что бы всегда показывались значения с датчика температуры(и само по себе это работает), а по удержанию энкодера вызывалось меню(и по следующему удержанию, гасло и возвращалось к показаниям датчика.
Обе части по отдельности работают, но разбить их ни case ни if не получается..
В данном случае(почему-то) начинает ругаться на
'printGUI' was not declared in this scope
Вопрос по коду.
Задача: что бы всегда показывались значения с датчика температуры(и само по себе это работает), а по удержанию энкодера вызывалось меню(и по следующему удержанию, гасло и возвращалось к показаниям датчика.
Обе части по отдельности работают, но разбить их ни case ни if не получается..
В данном случае(почему-то) начинает ругаться на
'printGUI' was not declared in this scope
C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <DHT_U.h>
#include "GyverEncoder.h"
#define DHTPIN 2 //Пин датчика
#define DHTTYPE DHT11 //Тип датчика
#define CLK 8 //Пин CLK энкодера
#define DT 9 //Пин DT энкодера
#define SW 10 //Пин SW энкодера
#define LINES 2 // количество строк дисплея
#define SETTINGS_AMOUNT 2 // количество настроек
#define FAST_STEP 5 // скорость изменения при быстром повороте
Encoder enc(CLK, DT, SW); //устанавливаем энкодер
LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей
DHT dht(DHTPIN, DHT11);
int vals[SETTINGS_AMOUNT]; // массив параметров
int8_t arrowPos = 0;
bool controlState = 0; // клик
// названия параметров
const char name1[] PROGMEM = "Hum ";
const char name2[] PROGMEM = "Temp";
// объявляем таблицу ссылок
const char* const names[] PROGMEM = {
name1, name2,
};
void setup()
{
dht.begin();
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
enc.setType(TYPE2);
enc.setFastTimeout(100);
printGUI();
}
void loop()
{
enc.tick();
switch (isHold)
case 1:
{
// смена контроля
enc.tick();
if (enc.isClick()) {
controlState = !controlState;
printGUI();
}
if (enc.isTurn()) {
int increment = 0; // локальная переменная направления
// получаем направление
if (!controlState) {
if (enc.isRight()) increment = 1;
if (enc.isLeft()) increment = -1;
arrowPos += increment; // двигаем курсор
arrowPos = constrain(arrowPos, 0, SETTINGS_AMOUNT - 1); // ограничиваем
}
increment = 0; // обнуляем инкремент
if ((controlState && enc.isRight()) || enc.isRightH()) increment = 1;
if ((controlState && enc.isLeft()) || enc.isLeftH()) increment = -1;
if (controlState && enc.isFastR()) increment = FAST_STEP;
if (controlState && enc.isFastL()) increment = -FAST_STEP;
vals[arrowPos] += increment; // меняем параметры
printGUI();
}
}
void printGUI() {
static int8_t screenPos = 0; // номер "экрана"
static int8_t lastScreen = 0; // предыдущий номер "экрана"
screenPos = arrowPos / LINES; // ищем номер экрана (0..3 - 0, 4..7 - 1)
if (lastScreen != screenPos) lcd.clear(); // если экран сменился - очищаем
lastScreen = screenPos;
for (byte i = 0; i < LINES; i++) { // для всех строк
lcd.setCursor(0, i); // курсор в начало
// если курсор находится на выбранной строке
smartArrow(arrowPos == LINES * screenPos + i); // рисуем стрелку или пробел
// если пункты меню закончились, покидаем цикл for
if (LINES * screenPos + i == SETTINGS_AMOUNT) break;
// выводим имя и значение пункта меню
printFromPGM(&names[LINES * screenPos + i]);
lcd.print(F(": "));
lcd.print(vals[LINES * screenPos + i]);
lcd.print(F(" ")); // пробелы для очистки
}
}
// очень хитрая функция для печати из PROGMEM
void printFromPGM(int charMap) {
uint16_t ptr = pgm_read_word(charMap); // получаем адрес из таблицы ссылок
while (pgm_read_byte(ptr) != NULL) { // всю строку до нулевого символа
lcd.print(char(pgm_read_byte(ptr))); // выводим в монитор или куда нам надо
ptr++; // следующий символ
}
}
void smartArrow(bool state) { // рисует стрелку, галку или пробел
lcd.write(state ? (controlState ? 62 : 126) : 32);
}
case 0:
{
float h = dht.readHumidity(); //Измеряем влажность
float t = dht.readTemperature(); //Измеряем температуру
lcd.init();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Hum : ");
lcd.print(h);
lcd.print(" %"); * /
}
}