ARDUINO Вопрос по меню и энкодеру.

Trample

✩✩✩✩✩✩✩
5 Окт 2020
1
0
Здравствуйте.
Вопрос по коду.

Задача: что бы всегда показывались значения с датчика температуры(и само по себе это работает), а по удержанию энкодера вызывалось меню(и по следующему удержанию, гасло и возвращалось к показаниям датчика.
Обе части по отдельности работают, но разбить их ни 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(" %"); * /
  }
}
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Или в 80той строчки поставить }
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Тяжёлый случай. Определять функции внутри функции нельзя, switch/case не правильно использован, isHold неопределенный, мусор ещё какой-то остался от комментов.

Мой тебе совет, освой сначала основы с канал Заметки Ардуинщика.