коструктивно, это я и хотел услышать, исправил
Я ненастоящемусталевару еще полгода назад говорил, заглавный признак говнокода - однобуквенные глобальные переменные. Увидел - код дальше можно даже не смотреть.
Этта еще с Фортрана пошло, переменные с именами, начинающимися с I - N были целыми по-умолчанию.
моё подсознание программированием не травмировано, для меня 15 вагон это не тот, который перед 16, а тот который после 14
Да, было время.
Мне там ещё оченно арифметический if
нравился. Один сразу три goto
заменял. У стуктурастов обмороки случались, приходилось нашатырём “отнюхивать”
покусились на святое, нашатырь, его в сок для сбраживания добавляют, чтобы вино привкус убитых дрожжей не имело
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;
}
...
Ждём ТСа, что скажет
PS я планировал использовать - blockTime - зачем плодить сущности
Другая переменная - чтобы понятно было, а не для экономии.
Да и компилятор, вроде, не будет лишнюю память резервировать, если переменные по-очереди используются, теряя свои значения. Это у человека в голове их две, а у компилятора всё иначе.
и даже наоборот, код подрос аж на 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 в исходное
}
}
27 строка присутствует
blockTime = millis();
Упс, этот работает, предыдущая версия нет
там была ошибка, время начала засекать же надо, код не проверялся совсем
Понимаешь в чем суть моих изменений и значительного улучшения от садмана?
Оказывается интернет то есть то нету, сообщение не все прочитал вначале) Ваш код более приятен и интуативно понятен. Благодарю, изучаю. Плюч вес меньше, что как раз нужно. Итоговый код итак больше 95 процетов стал(.
case 0: {//выполняется, когда blockState равно 0
analogWrite(PWR, 25);
flagMode = 1;
blockTime = millis();
break;
}
Не понятно по строке 2. Если сигнала нет то ШИМ 25%?
я исправил ремарки, теперь улучшай итоговый код
Спрошу. Два варианта написания строки 38
if (blockState != digitalRead(BLOCK) && blockFlag) { // версия как правильно написание !=
if (blockState = !digitalRead(BLOCK) && blockFlag) { // версия как неправильно написание =!
В случае “неправильно” код работает отлично, в случае “правильно” нет. Косяк проявляется в том, что если подавать сигнал с частотой 3-5 раз в секунду, то примерно в 3-х случаев из 7 выход ШИМ не отключается и остается на уровне 25 процентов. Если следом снова подать сигнал то ШИМ отключается. Если необходимо видео скажите
Объясните плиз)
во втором случае переменной blockState присваивается значение, в первом нет,
707 тебя поправил, но для конкретно твоего кода это было ошибочно, проблема,
ты влетел в цикл for длящийся 3 секунды, но надо проверять, а не изменилось ли значение на пине разрешения, поэтому 1. надо считать в переменную значение разрешения 2. если запрещено выполняем процедуру стоп, если разрешено крутим цикл
Может быть нужно писать так?
if (blockState != (digitalRead(BLOCK) && blockFlag)) { // версия как правильно написание !=
В этом случае все так же периодически виснет. Даже частоту подачи сигнала не нужно, хвататет кратковременного сигнала, чтоб система осталась на ШИМ 25. Последующий кратковременный сигнал выключает ШИМ