Реле не запускается из функции цикла. Переменная "громкость" не обновляется после того, как кодировщик переведен в значение?

Я считываю значение с кодировщика "регулятор громкости", и у меня есть функция void fn_on, если у меня есть значение sum int равное нулю, и я считаю, пока оно не достигнет установленного значения громкости. Я попытался опубликовать в serial, но мой счетчик сумм не работает. Я хочу, чтобы мое реле запускало "громкость" несколько раз, пока сумма > громкость в моей функции "fn_on", я считаю, что неправильно сохраняю или обновляю свой том. Спасибо, что нашли время просмотреть это.

#include <LiquidCrystal_I2C.h>
#include <Rotary.h>
#include <LCD_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

/* Поворотный Энкодер - Пример Опроса

Схема:
  вывод кодера A к выводу Arduino 2
  вывод кодера B к выводу Arduino 3
  контакт заземления энкодера к заземлению (GND)
*/
#define PINA 2 
#define PINB 3 
#define RelayPin 8 

const char PUSHB = 5;
bool pressed = false;
long volume = 0; // это может не указывать значение объема

Rotary r = Rotary(2, 3);

void setup()
{
    Serial.begin(115200); // настройка режимов вывода
    pinMode(PUSHB, INPUT);
    r.begin(true);
    lcd.init();
    lcd.backlight();
    lcd.setCursor(0, 3);
    lcd.print(volume);
    digitalWrite(PINA, HIGH); // включить подтягивания
    digitalWrite(PINB, HIGH);
    // digitalWrite (PUSHB, HIGH); 
    pinMode(RelayPin, OUTPUT); // Релейный вывод ini
}

void loop()
{
    bool currentState = digitalRead(PUSHB);

    if (currentState == pressed)
    {
        Serial.println("Pressed");

        while (digitalRead(PUSHB) == pressed)
        {
            // ничего не делать
        }
    }

    unsigned char result = r.process();

    if (result)
    {
        // Serial.println(result == DIR_CW ? "Right" : "Left"); 
        if (result == DIR_CCW)
        {
            volume = volume - 1000; // измените ++ на количество 1000
            Serial.println(volume);
            lcd.setCursor(0, 3);
            lcd.print(volume);
            lcd.print("                                ");

            int sum = 0;
            for (sum = 1; sum < volume; sum++ && currentState = true)
            {
                lcd.setCursor(0, 2);
                lcd.print(sum);
                digitalWrite(RelayPin, LOW); // выполнить тест
                delay(3000);
                digitalWrite(RelayPin, HIGH); // выполнить тест
                delay(3000);
                digitalWrite(RelayPin, LOW); // выполнить тест
                delay(3000);
            }
        }
        else
        {
            volume = volume + 1000; // измените volume++ на кратность 1000
            // инициализировать меню отображения в 1-ю строку
            lcd.setCursor(0, 3);
            lcd.print(volume);
            lcd.print("                                 ");
        }
    }
}

, 👍1

Обсуждение

Где вы вызываете "fn_on ()" в своем коде? И знаете ли вы, что у вас есть две переменные под названием “сумма”: одна как "const int" в вашей глобальной области видимости и одна как " int "в функции" fn_on ()"?, @StarCat

ваш код довольно запутан ... пожалуйста, исправьте отступ, чтобы код было легче читать и легче понимать, @jsotola

Я изменил часть логики Хорошо, я пытаюсь прочитать значение с помощью поворотного энкодера, значение, которое я читаю, - "объем (циклы)". Я хочу набрать кодировщик на номер, установить его с помощью кнопки и запустить реле N циклов. Я использую "для цикла" для запуска моего реле, как только нажата кнопка и когда громкость больше единицы, @voltaty

Отображается ли на ЖК - дисплее правильная громкость? Что вы получите, если напечатаете том серийно? Вся эта история с ретрансляцией не имеет значения, пока эта часть не будет работать правильно, @chrisl


1 ответ


2

Я полагаю, что проблема в том, что вы устанавливаете высокие пины кодера с помощью digitalWrite(). Эти контакты должны быть настроены в качестве входных данных, чтобы прерывания работали правильно. Это будет обработано библиотекой кодировщика при вызове r.begin(true). На самом деле, true в этом вызове сообщает библиотеке, чтобы она включила для вас съемку.

Удаление этих строк должно решить вашу проблему.

,