Выполнение части скетча

во втором случае переменной blockState присваивается значение, в первом нет,
707 тебя поправил, но для конкретно твоего кода это было ошибочно, проблема,
ты влетел в цикл for длящийся 3 секунды, но надо проверять, а не изменилось ли значение на пине разрешения, поэтому 1. надо считать в переменную значение разрешения 2. если запрещено выполняем процедуру стоп, если разрешено крутим цикл

Я понимаю, что в первом случае происходит сравнивание
если уровень blockState - true и не равно BLOCK false.
Во втором blockState принимает значение false когда BLOCK - false. (не уверен в правильности понимания)
По идее обе конструкции должны работать. Но первый случай при кратковременном сигнале часто остается при ШИМ25%. Последующий сигнал отключает ШИМ в ноль, следующая подача сигнала запускает. Так не всегда, но часто.
И в чем косяк не могу понять

Нет, вторая конструкция ошибочна по определению. Вместо

if (blockState = !digitalRead(BLOCK) && blockFlag)

должно быть

if (blockState == !digitalRead(BLOCK) && blockFlag)

Это частая ошибка новичков - вместо оператора сравнения ставить оператор присваивания.

в этом конкретном случае как раз наоборот, посмотри его первый пост, я и срачик небольшой хотел как раз на эту тему устроить )))
PS по классике надо сначала:

blockState = digitalRead(BLOCK);
if(blockState == ...)

У меня вопрос не в правильности в целом, а почему утверждаемое как не правильное

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) )

патамушта во втором случае ты фиксируешь в переменной нажатие кнопки а в первом - нет, так устроит?
Приведи код полностью чтобы говорить предметно

Мда, про скобки соглашусь, мое упущение, надо не забывать уточняться ими. Даже не думал про них как о инструменте в строке

if (blockState != digitalRead(BLOCK) && blockFlag)

имел ввиду это

if ( (blockState != digitalRead(BLOCK)) && blockFlag)
#define PWR 10
#define BLOCK 2
#define TIME 1500
uint32_t blockTime = 0;
bool blockState = false;
bool pwrState = false;
bool blockFlag = false;
int flag = false;  // флаг уровня сигнала

void setup() {
  pinMode(PWR, OUTPUT);
  pinMode(BLOCK, INPUT);
}
void loop() {
  blockState = digitalRead(BLOCK);

  if (blockState && flag == false) {  // проверка  уровня флага
    if (blockState && !blockFlag) {
      blockFlag = true;
      analogWrite(PWR, 25);
      blockTime = millis();
    }
    if (blockState && blockFlag && millis() - blockTime >= TIME) {
      for (int i = 25; i <= 255; i++) {
        analogWrite(PWR, i);
        delay(15);
        if (i == 255) {
          flag = true;  // установка текущего состояния флага
        }
        if (blockState != digitalRead(BLOCK))
          break;
      }
    }
  }
  if (blockState && flag) {  // ШИМ 100% при неизменности уровня флага
    analogWrite(PWR, 255);
  }
  if (blockState = !digitalRead(BLOCK) && blockFlag) {  // РАБОТАЮЩАЯ СТРОКА
  //if (blockState != digitalRead(BLOCK) && blockFlag) {    // НЕ РАБОТАЮЩАЯ СТРОКА
    blockFlag = false;  // При отсутсвии сигнала блокирования изменяем уровень флага
    flag = false;
    analogWrite(PWR, 0);  // ШИМ 0% при изменении уровня флага
  }
}

Вот по строке 38 у меня есть - были вопросы
b707 объяснил

вопрос снят.
закомментированная строка 39 почему то работает то нет, вот это интересно.

И еще вопрос, как ПРАВИЛЬНО читать данную строку, а то написал её и скорей всего и не понимаю что написал)

blockState = !digitalRead(BLOCK) &&  blockFlag;

я воспринимаю это как:
blockState принимает значение не digitalRead(BLOCK), т.е. сферический конь в вакууме , т.е. =0 и при blockFlag = 1

ЗЫ Благодарю парни за потраченное время и объяснения)

код на отрицании отрицания…
к примеру был в цикле поступил сигнал стоп ты это увидел, но не зафиксировал, строка 30, выскочил, далее строка 35 - дернул муфту на полную, а в строке 38, фиксируешь сигнал обратный сигналу стоп, делаешь стоп, и возвращаешься к началу лупа, если вывести blockState в монитор порта то при отсутствии сигнала разрешения у тебя переменная будет всё время изменяться с 0 на 1 ( это когда типа правильно работает)
а когда неправильно попадаешь на дребезг кнопки

PS на case весь цикл укладывается в сотню-другую микросекунд, опрос идёт постоянно, то-есть код неблокирующий и, легко читаемый

Парни спасибо за разъяснения!

ну раз никто не поправил, значит мыслил логично :grinning:

Добрый вечер! Дабы просто тупо не пользоваться вашим вариантом кода с использованием “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…ты позанимайся, если не получится и будет время покажу как…

Или никто не понял (что при логичном мышлении тоже встречается).

или просто никому не было дела

а это признаки стагнации

Даже ТС пофиг на вариант со свичом. С какого перепуга остальным-то в это вникать?

там другое, ТС хочет разобраться в чём накосячил и можно ли сделать с использованием его кода…отвечаем - можно :grinning:

Добрый вечер, возник вопрос. вставил данный код в основной код и получил проблему. В основном коде есть графическая часть, выполнена для олед дисплея 0.96, шина i2c библиотека OLED_I2C. Столкнулся с тем, что команда myOLED.update(); “копирования буфера на экран” занимает относительно порядочно времени и получается, что в коде примененный таймер

отвечающий за скорость прироста ШИМ бестолков ибо пока в лупе код пробежит один круг из за команды myOLED.update(); все временные отрезки растягиваются очень. Грубо говоря если при на глаз прикинуть, то как раз примерно на 50-60 мс растягивается каждый проход в лупе. По итогу из за этого скорость прироста ШИМ вполне устраивает и без данной конструкции
if (i < 255 && millis() - range >= 60) {

Вопрос чисто теоретический, чтоб нивелировать данную проблему:

  1. надо было использовать SPI
  2. ни чего с этим не поделать
  3. другую библиотеку

Парни, всех с наступающим Новым Годом!

Проблемы нет, выходит. Об чем тогда вопрос?