Реле не запускается из функции цикла. Переменная "громкость" не обновляется после того, как кодировщик переведен в значение?
Я считываю значение с кодировщика "регулятор громкости", и у меня есть функция 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(" ");
}
}
}
@voltaty, 👍1
Обсуждение1 ответ
Я полагаю, что проблема в том, что вы устанавливаете высокие пины кодера с помощью digitalWrite()
. Эти контакты должны быть настроены в качестве входных данных, чтобы прерывания работали правильно. Это будет обработано библиотекой кодировщика при вызове r.begin(true)
. На самом деле, true
в этом вызове сообщает библиотеке, чтобы она включила для вас съемку.
Удаление этих строк должно решить вашу проблему.
- Как использовать SPI на Arduino?
- Библиотека DHT.h не импортируется
- Светодиоды: разница между общим анодом и общим катодом
- Как повторить кусок кода
- Почему эта программа на C++ не может прочитать Serial.write() моего arduino?
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Отображение двоичных данных на светодиодах
- Корпус кнопки и переключателя
Где вы вызываете "fn_on ()" в своем коде? И знаете ли вы, что у вас есть две переменные под названием “сумма”: одна как "const int" в вашей глобальной области видимости и одна как " int "в функции" fn_on ()"?, @StarCat
ваш код довольно запутан ... пожалуйста, исправьте отступ, чтобы код было легче читать и легче понимать, @jsotola
Я изменил часть логики Хорошо, я пытаюсь прочитать значение с помощью поворотного энкодера, значение, которое я читаю, - "объем (циклы)". Я хочу набрать кодировщик на номер, установить его с помощью кнопки и запустить реле N циклов. Я использую "для цикла" для запуска моего реле, как только нажата кнопка и когда громкость больше единицы, @voltaty
Отображается ли на ЖК - дисплее правильная громкость? Что вы получите, если напечатаете том серийно? Вся эта история с ретрансляцией не имеет значения, пока эта часть не будет работать правильно, @chrisl