многоканальный регулятор

Tessoushen
Offline
Зарегистрирован: 25.05.2017

Делаю 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;
}
}
  
  }

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Tessoushen пишет:
Полагаю проблема в коде, может у кого-то есть идеи?

Идея простая . Надо начинать сначало. Составлять ТЗ,делать новое описание, и т.д. Тогда новая программа станет лучше старой. Некоторые программы я переписывал десять раз, и каждая следующая выходила на новый уровень работы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Tessoushen пишет:

может у кого-то есть идеи?

Какие могут быть идеи, если у Вас код секретный? В том кусочке, что Вы выложили используются какие-то переменные, описания которых не видно. Вы предлагаете сообществу угадывать какие у них типы? Не знаю как кто, а я угадвать не буду - это Ваша проблема. а не моя, так будьте добры выложить нормальный код.

А для того, чтобы он был покороче, прекратите эстетствовать и пишите нормально. Например, у Вас много раз повторяется конструкция вида:

if(Output[5] > now - windowStartTime[5])
    digitalWrite(RelayPin5,LOW);
else
    digitalWrite(RelayPin5,HIGH);

И зачем такое извращение? Чтобы увеличить объём кода и всех запутать? Вам построчно платят? Всё это пишется вот так:

digitalWrite(RelayPin5, Output[5] <= now - windowStartTime[5]);

Ко станет короче, Вы его хоть понимать будете.

Tessoushen
Offline
Зарегистрирован: 25.05.2017

Понятия не имею что такое эстетствовать. Пишу по примерам из библиотек. Конструкция, что вы предложили, действительно проще, но никак не понятнее новичку. Спасибо за совет. Проблема была в этом кусочке, пришлось вернуться к предыдущему рабочему варианту. А это и была попытка уменьшить количество кода, обьеденив 8 регуляторов в массив, но почему-то не удалось.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Tessoushen пишет:

действительно проще, но никак не понятнее новичку. 

А если хотите понятнее, то надо отделить формирование предиката от его проверки и кроме того, использовато не безликие RelayPin6, а названия, отражающие суть процессов в устройсте.

Вот смотрите (я не знаю, что по сути Вашей задачи это означает, поэтому взял "пожарную тему" просто для примера).

#define FireSystem RelayPin6

const bool flameDetectedOnCheckPoin6 = Output[6] > now - windowStartTime[6]
digitalWrite(FireSystem, flameDetectedOnCheckPoin6);