во втором случае переменной blockState присваивается значение, в первом нет,
707 тебя поправил, но для конкретно твоего кода это было ошибочно, проблема,
ты влетел в цикл for длящийся 3 секунды, но надо проверять, а не изменилось ли значение на пине разрешения, поэтому 1. надо считать в переменную значение разрешения 2. если запрещено выполняем процедуру стоп, если разрешено крутим цикл
Я понимаю, что в первом случае происходит сравнивание
если уровень blockState - true и не равно BLOCK false.
Во втором blockState принимает значение false когда BLOCK - false. (не уверен в правильности понимания)
По идее обе конструкции должны работать. Но первый случай при кратковременном сигнале часто остается при ШИМ25%. Последующий сигнал отключает ШИМ в ноль, следующая подача сигнала запускает. Так не всегда, но часто.
И в чем косяк не могу понять
в этом конкретном случае как раз наоборот, посмотри его первый пост, я и срачик небольшой хотел как раз на эту тему устроить )))
PS по классике надо сначала:
У меня вопрос не в правильности в целом, а почему утверждаемое как не правильное
if (blockState = !digitalRead(BLOCK) && blockFlag)
работает отменно. Ровно так же вопрос почему конструкция
if (blockState != digitalRead(BLOCK) && blockFlag)
работает но с периодическими косяками, причем косяк только один, схема не виснет, просто при коротком сигнале на входе она остается на ШИМ25 до последующего сигнала. Повторюсь, не виснет, чисто программный глюк, то есть то нет. Вот его природа как раз интересна, остальное уже лирика по отношению к не понятому)
blockState = !digitalRead(BLOCK) && blockFlag;
if (blockState == true)
А теперь посмотри на логику алгоритма - может такой вариант подходит лучше, чем
Кстати, очень зря ты не ставишь скобок. Скажи, ты что имел в виду, это: if ( (blockState != digitalRead(BLOCK)) && blockFlag)
или это: if ( blockState != (digitalRead(BLOCK) && blockFlag) )
код на отрицании отрицания…
к примеру был в цикле поступил сигнал стоп ты это увидел, но не зафиксировал, строка 30, выскочил, далее строка 35 - дернул муфту на полную, а в строке 38, фиксируешь сигнал обратный сигналу стоп, делаешь стоп, и возвращаешься к началу лупа, если вывести blockState в монитор порта то при отсутствии сигнала разрешения у тебя переменная будет всё время изменяться с 0 на 1 ( это когда типа правильно работает)
а когда неправильно попадаешь на дребезг кнопки
PS на case весь цикл укладывается в сотню-другую микросекунд, опрос идёт постоянно, то-есть код неблокирующий и, легко читаемый
Добрый вечер! Дабы просто тупо не пользоваться вашим вариантом кода с использованием “case” в своей версии с “if” убрал цикл так как с циклом не получилось выкинуть delay. Подружить for и millis не вышло, мудрил мудрил выходит шляпа. Теперь уже основной код уже попробую переписать без “if” с использованием “case” . Ели будут вопросы обращусь
#define PWR 10
#define BLOCK 2
#define TIME 1500
uint32_t blockTime = 0;
unsigned long range; // (шаг времени между уровнями изменения скважности ШИМ) = 60 мс, строка 27
bool blockState = false;
bool pwrState = false;
bool blockFlag = false;
int flag = false; // флаг уровня сигнала
int i = 120; // начальная скважность ШИМ 50%
void setup() {
pinMode(PWR, OUTPUT);
pinMode(BLOCK, INPUT);
Serial.begin(9600);
}
void loop() {
blockState = digitalRead(BLOCK);
if (blockState && flag == false) { // проверка уровня флага
if (blockState && !blockFlag) {
blockFlag = true;
analogWrite(PWR, 120);
blockTime = millis();
}
if (blockState && blockFlag && millis() - blockTime >= TIME) {
if (i < 255 && millis() - range >= 60) {
i++;
analogWrite(PWR, i);
Serial.println(i);
range = millis();
}
}
if (!blockState && blockFlag) {
i = 0;
}
}
if (blockState = !digitalRead(BLOCK) && blockFlag) {
blockFlag = false; // При отсутсвии сигнала блокирования изменяем уровень флага
i = 120;
analogWrite(PWR, 0); // ШИМ 0% при изменении уровня флага
}
}
Строку 38 оставил как есть, всё таки все варианты правильного написания приводят к глюку, или я туплю или лыжи). Работает и ладно)
да я сам CASE за 6 лет знакомства с ардуино впервые применил, просто эта задача под эту функцию вписывалась идеально…но можно и через if…ты позанимайся, если не получится и будет время покажу как…
Добрый вечер, возник вопрос. вставил данный код в основной код и получил проблему. В основном коде есть графическая часть, выполнена для олед дисплея 0.96, шина i2c библиотека OLED_I2C. Столкнулся с тем, что команда myOLED.update(); “копирования буфера на экран” занимает относительно порядочно времени и получается, что в коде примененный таймер
отвечающий за скорость прироста ШИМ бестолков ибо пока в лупе код пробежит один круг из за команды myOLED.update(); все временные отрезки растягиваются очень. Грубо говоря если при на глаз прикинуть, то как раз примерно на 50-60 мс растягивается каждый проход в лупе. По итогу из за этого скорость прироста ШИМ вполне устраивает и без данной конструкции if (i < 255 && millis() - range >= 60) {
Вопрос чисто теоретический, чтоб нивелировать данную проблему: