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

коструктивно, это я и хотел услышать, исправил

Я ненастоящемусталевару еще полгода назад говорил, заглавный признак говнокода - однобуквенные глобальные переменные. Увидел - код дальше можно даже не смотреть.

1 лайк

Этта еще с Фортрана пошло, переменные с именами, начинающимися с I - N были целыми по-умолчанию. :slight_smile:

1 лайк

моё подсознание программированием не травмировано, для меня 15 вагон это не тот, который перед 16, а тот который после 14 :grinning:

1 лайк

Да, было время.

Мне там ещё оченно арифметический if нравился. Один сразу три goto заменял. У стуктурастов обмороки случались, приходилось нашатырём “отнюхивать” :slight_smile:

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

const uint32_t stageStepDuration = 15;
...

uint32_t stageStartTime;

...

      case 1: {  //выполняется когда   blockState равно 1
          if (millis() - blockTime < TIME) { break; }

          flagMode = 2;
          stageStartTime = millis();
          break;
        }

      case 2: {
          if (millis() - stageStartTime < stageStepDuration) { break; }
          
          stageStartTime = millis();
          analogWrite(PWR, s_pwm);
          s_pwm++;

          // delay(15); 

          if (s_pwm == 255)  { flagMode = 3; }

          break;
      }
...
1 лайк

Ждём ТСа, что скажет
PS я планировал использовать - blockTime - зачем плодить сущности

Другая переменная - чтобы понятно было, а не для экономии.
Да и компилятор, вроде, не будет лишнюю память резервировать, если переменные по-очереди используются, теряя свои значения. Это у человека в голове их две, а у компилятора всё иначе.

1 лайк

и даже наоборот, код подрос аж на 26 байт…(если одну переменную для хранения времени используем)
Где логика, нету…
отставить, ошибка была
самый оптимальный код:

#define PWR 10
#define BLOCK 2
#define TIME 1500

const uint32_t stageStepDuration = 15;
uint32_t blockTime = 0;
uint8_t blockState = 0;
static uint8_t s_pwm = 25;
uint8_t flagMode = 0;  // режим
// 0 - включить синхронизацию
// 1 - задержка на синхронизацию
// 2 - задержка на включение
// 3 - включить
// 4 - работа

void setup() {
  pinMode(PWR, OUTPUT);
  pinMode(BLOCK, INPUT);
}
void loop() {
  blockState = digitalRead(BLOCK);
  if (blockState) {
    switch (flagMode) {
      case 0: {//выполняется, когда flagMode равно 0
        analogWrite(PWR, 25);
        flagMode = 1;
        blockTime = millis();
        break;
        }
      case 1: { //выполняется когда   flagMode равно 1
          if (millis() - blockTime < TIME) {
            break;
          }
          flagMode = 2;
          blockTime = millis();
          break;
        }
      case 2: {
          if (millis() - blockTime < stageStepDuration) {
            break;
          }
          blockTime = millis();
          analogWrite(PWR, s_pwm);
          s_pwm++;
          if (s_pwm == 255)  flagMode = 3;
          break;
        }
      case 3:{
        analogWrite(PWR, 255);
        flagMode = 4;
        break;
      }
      case 4:{
        break;
      }
    }
  } else {
    analogWrite(PWR, 0);
    flagMode = 0;
    s_pwm = 25; // вернуть значение PWM в исходное
  }
}
1 лайк

27 строка присутствует

blockTime = millis();

Упс, этот работает, предыдущая версия нет

1 лайк

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

Оказывается интернет то есть то нету, сообщение не все прочитал вначале) Ваш код более приятен и интуативно понятен. Благодарю, изучаю. Плюч вес меньше, что как раз нужно. Итоговый код итак больше 95 процетов стал(.

case 0: {//выполняется, когда blockState равно 0
        analogWrite(PWR, 25);
        flagMode = 1;
        blockTime = millis();
        break;
        }

Не понятно по строке 2. Если сигнала нет то ШИМ 25%?

я исправил ремарки, теперь улучшай итоговый код

1 лайк

Спрошу. Два варианта написания строки 38

if (blockState != digitalRead(BLOCK) && blockFlag) { // версия как правильно  написание !=
if (blockState = !digitalRead(BLOCK) && blockFlag) { // версия как неправильно написание =!

В случае “неправильно” код работает отлично, в случае “правильно” нет. Косяк проявляется в том, что если подавать сигнал с частотой 3-5 раз в секунду, то примерно в 3-х случаев из 7 выход ШИМ не отключается и остается на уровне 25 процентов. Если следом снова подать сигнал то ШИМ отключается. Если необходимо видео скажите
Объясните плиз)

1 лайк

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

Может быть нужно писать так?

if (blockState != (digitalRead(BLOCK) && blockFlag)) { // версия как правильно  написание !=

В этом случае все так же периодически виснет. Даже частоту подачи сигнала не нужно, хвататет кратковременного сигнала, чтоб система осталась на ШИМ 25. Последующий кратковременный сигнал выключает ШИМ