многоканальный регулятор
- Войдите на сайт для отправки комментариев
Пт, 26/05/2017 - 00:09
Делаю 8-канальный регулятор нагрева. Пока что температура и все параметры пид регулирования одинаковы, но после каких-то манипуляций с кодом реле 1 стало работать все-время, а реле 7 и 8 срабатывают через раз. При подаче питания все реле срабатывают. Загрузил предыдущие скетчи, один за другим, все-равно работают не так как надо, хотя раньше работали четко, поменял блок реле на другой - та же проблема, с теми же пинами.
Полагаю проблема в коде, может у кого-то есть идеи?
void PIDfunction(void) { sensNum=1; for (sensNum=1;sensNum<9;sensNum++) { Serial.println(sensNum); PID pid = *allPIDS[sensNum]; switch (sensNum) { case 1: Input[sensNum] = tempC1; break; case 2: Input[sensNum] = tempC2; break; case 3: Input[sensNum] = tempC3; break; case 4: Input[sensNum] = tempC4; break; case 5: Input[sensNum] = tempC5; break; case 6: Input[sensNum] = tempC6; break; case 7: Input[sensNum] = tempC7; break; case 8: Input[sensNum] = tempC8; break; } allPIDS[sensNum]->Compute(); unsigned long now = millis(); if(now - windowStartTime[sensNum]>WindowSize) { //time to shift the Relay Window windowStartTime[sensNum] += WindowSize; } switch (sensNum) { case 1: if(Output[1] > now - windowStartTime[1]) digitalWrite(RelayPin1,LOW); else digitalWrite(RelayPin1,HIGH); break; case 2: if(Output[2] > now - windowStartTime[2]) digitalWrite(RelayPin2,LOW); else digitalWrite(RelayPin2,HIGH); break; case 3: if(Output[3] > now - windowStartTime[3]) digitalWrite(RelayPin3,LOW); else digitalWrite(RelayPin3,HIGH); break; case 4: if(Output[4] > now - windowStartTime[4]) digitalWrite(RelayPin4,LOW); else digitalWrite(RelayPin4,HIGH); break; case 5: if(Output[5] > now - windowStartTime[5]) digitalWrite(RelayPin5,LOW); else digitalWrite(RelayPin5,HIGH); break; case 6: if(Output[6] > now - windowStartTime[6]) digitalWrite(RelayPin6,LOW); else digitalWrite(RelayPin6,HIGH); break; case 7: if(Output[7] > now - windowStartTime[7]) digitalWrite(RelayPin7,LOW); else digitalWrite(RelayPin7,HIGH); break; case 8: if(Output[8] > now - windowStartTime[8]) digitalWrite(RelayPin8,LOW); else digitalWrite(RelayPin8,HIGH); break; } } }
Идея простая . Надо начинать сначало. Составлять ТЗ,делать новое описание, и т.д. Тогда новая программа станет лучше старой. Некоторые программы я переписывал десять раз, и каждая следующая выходила на новый уровень работы.
может у кого-то есть идеи?
Какие могут быть идеи, если у Вас код секретный? В том кусочке, что Вы выложили используются какие-то переменные, описания которых не видно. Вы предлагаете сообществу угадывать какие у них типы? Не знаю как кто, а я угадвать не буду - это Ваша проблема. а не моя, так будьте добры выложить нормальный код.
А для того, чтобы он был покороче, прекратите эстетствовать и пишите нормально. Например, у Вас много раз повторяется конструкция вида:
И зачем такое извращение? Чтобы увеличить объём кода и всех запутать? Вам построчно платят? Всё это пишется вот так:
Ко станет короче, Вы его хоть понимать будете.
Понятия не имею что такое эстетствовать. Пишу по примерам из библиотек. Конструкция, что вы предложили, действительно проще, но никак не понятнее новичку. Спасибо за совет. Проблема была в этом кусочке, пришлось вернуться к предыдущему рабочему варианту. А это и была попытка уменьшить количество кода, обьеденив 8 регуляторов в массив, но почему-то не удалось.
действительно проще, но никак не понятнее новичку.
А если хотите понятнее, то надо отделить формирование предиката от его проверки и кроме того, использовато не безликие RelayPin6, а названия, отражающие суть процессов в устройсте.
Вот смотрите (я не знаю, что по сути Вашей задачи это означает, поэтому взял "пожарную тему" просто для примера).