Блок управления нагрузкой

Собачкин
Offline
Зарегистрирован: 26.10.2015
Ребята, нужна небольшая помощь в написании прошивки для блока управления отоплением. Будут включаться обогреватели в разных помещениях через симисторы. На али заказана Pro Mini и разведена плата под нее.
 
При нажатии PIN13 Включаем PIN5,6
При повторном нажатии PIN13, выключаем PIN5,6 и включаем Pin3 с DELAY, все кнопки кроме PIN 13 не реагируют на нажатия
При нажатии PIN10 Включаем PIN7
При повторном нажатии PIN10, выключаем PIN7
При нажатии PIN11 Включаем PIN8
При повторном нажатии PIN11, выключаем PIN8
При нажатии PIN12 Включаем PIN9
При повторном нажатии PIN12, выключаем PIN9
 
Какими функциями это можно реализовать? Что-то ничего не приходит в голову кроме if..else. Може у кого-то есть рабочий пример который можно переделать? 
Заранее спасибо!
Собачкин
Offline
Зарегистрирован: 26.10.2015

Набросал из примеров код, скажите, будет работать? Плата приедет примерно через 2 недели, хотелось бы к тому времени иметь рабочий код. Теперь главное, как заставить контроллер реагировать только на PIN13, при выключеных PIN5,6

Грубо говоря включать эту "систему" только одной кнопкой, надеюсь обьяснил понятно :)

Как  вставлять код под спойлер?

/* 
    При нажатии PIN13 Включаем PIN5,6 (int=POW1;)
    При повторном нажатии PIN13, выключаем PIN5,6 и включаем Pin3 с DELAY, все кнопки кроме PIN 13 не реагируют на нажатия
    При нажатии PIN10 Включаем PIN7 (int=POW2;)
    При повторном нажатии PIN10, выключаем PIN7
    При нажатии PIN11 Включаем PIN8 (int=POW3;)
    При повторном нажатии PIN11, выключаем PIN8
    При нажатии PIN12 Включаем PIN9 (int=POW4;)
    При повторном нажатии PIN12, выключаем PIN9

*/


int POW1 = 0;
int POW2 = 0;
int POW3 = 0;
int POW4 = 0;
int LED = 3;           // вывод 3
int brightness = 0;    // начальная яркость светодиода
int fadeAmount = 5;    // величина изменения яркости светодиода

void setup()
{
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  pinMode(10, INPUT);
  pinMode(11, INPUT);
  pinMode(12, INPUT);
  pinMode(13, INPUT);

  digitalWrite(5, 0);
  digitalWrite(6, 0);
  digitalWrite(7, 0);
  digitalWrite(8, 0);
  digitalWrite(9, 0);
}

void loop()
{
  if (digitalRead(13) == HIGH && POW1 == 0) //если кнопка нажата
    // и перемення POW1 равна 0 , то ...
  {

    digitalWrite(5, !digitalRead(5));
    digitalWrite(6, !digitalRead(5));
    POW1 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%
    // устанавливаем яркость у светодиода у вывода 10
    analogWrite(LED, brightness);

    // изменяем яркость в цикле, прибавляя заданную величину
    brightness = brightness + fadeAmount;

    // меняем порядок затухания на обратный при достижении минимальной или максимальной яркости
    if (brightness == 0 || brightness == 255) {
      fadeAmount = -fadeAmount ;
    }
    // делаем небольшую паузу для лучшего эффекта
    delay(30);
  }

  if (digitalRead(13) == LOW && POW1 == 1) //если кнопка НЕ нажата
    //и переменная POW равна - 1 ,то ...
  {

    POW1 = 0; //обнуляем переменную POW1
  }


  if (digitalRead(10) == HIGH && POW1 == 0) //если кнопка нажата
    // и перемення POW2 равна 0 , то ...
  {

    digitalWrite(7, !digitalRead(7));
    POW2 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%

  }

  if (digitalRead(10) == LOW && POW2 == 1) //если кнопка НЕ нажата
    //и переменная POW2 равна - 1 ,то ...
  {

    POW2 = 0; //обнуляем переменную POW2
  }


  if (digitalRead(11) == HIGH && POW3 == 0) //если кнопка нажата
    // и перемення POW3 равна 0 , то ...
  {

    digitalWrite(8, !digitalRead(8));
    POW3 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%

  }

  if (digitalRead(11) == LOW && POW3 == 1) //если кнопка НЕ нажата
    //и переменная POW32 равна - 1 ,то ...
  {

    POW3 = 0; //обнуляем переменную POW3
  }

  if (digitalRead(12) == HIGH && POW4 == 0) //если кнопка нажата
    // и перемення POW3 равна 0 , то ...
  {

    digitalWrite(8, !digitalRead(8));
    POW4 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%

  }

  if (digitalRead(12) == LOW && POW4 == 1) //если кнопка НЕ нажата
    //и переменная POW4 равна - 1 ,то ...
  {

    POW4 = 0; //обнуляем переменную POW4
  }

}




 

vk007
Offline
Зарегистрирован: 16.06.2015

Собачкин пишет:

Как  вставлять код под спойлер?

Вставка-редактирование кода / Дополнительно / Свернуть

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

В 76й строчке (if (digitalRead(10) == HIGH && POW1 == 0) POW1 -сменить  POW2 и еще, проверки данного условия (При повторном нажатии PIN13, выключаем PIN5,6 и включаем Pin3 с DELAY, все кнопки кроме PIN 13 не реагируют на нажатия) я не вижу. У Вас все кнопки, не зависимо от состояния PIN5,6 - будут работать хотя Вы пишете что при PIN5,6 LOW они не должны реагировать. Так что если я правильно Вас понял введите дополнительную проверку.

Собачкин
Offline
Зарегистрирован: 26.10.2015

Вот именно в этом самая большая загвоздка. Условно говоря я пришел на работу, включил прибор и дальше могу контроллировать остальные конматы.
Проверка должна выглядеть как "если пин5,6 == 0, то все остальные пины выключены" но как заставить ардуино игнорировать кнопки до достижения равенства pin5,6 == 1 ?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Вот так работает - проверил в протеусе

/* 
    При нажатии PIN13 Включаем PIN5,6 (int=POW1;)
    При повторном нажатии PIN13, выключаем PIN5,6 и включаем Pin3 с DELAY, все кнопки кроме PIN 13 не реагируют на нажатия
    При нажатии PIN10 Включаем PIN7 (int=POW2;)
    При повторном нажатии PIN10, выключаем PIN7
    При нажатии PIN11 Включаем PIN8 (int=POW3;)
    При повторном нажатии PIN11, выключаем PIN8
    При нажатии PIN12 Включаем PIN9 (int=POW4;)
    При повторном нажатии PIN12, выключаем PIN9

*/


int POW1 = 0;
int POW2 = 0;
int POW3 = 0;
int POW4 = 0;
int LED = 3;           // вывод 3
int brightness = 0;    // начальная яркость светодиода
int fadeAmount = 5;    // величина изменения яркости светодиода
bool flag1 = 0; // Добавляем переменную которая мняет состояние вместе PIN5,6 
void setup()
{
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  pinMode(10, INPUT);
  pinMode(11, INPUT);
  pinMode(12, INPUT);
  pinMode(13, INPUT);

  digitalWrite(5, 0);
  digitalWrite(6, 0);
  digitalWrite(7, 0);
  digitalWrite(8, 0);
  digitalWrite(9, 0);
}

void loop()
{
  if (digitalRead(13) == HIGH && POW1 == 0) //если кнопка нажата
    // и перемення POW1 равна 0 , то ...
  {

    digitalWrite(5, !digitalRead(5));
    digitalWrite(6, !digitalRead(6));
    POW1 = 1;
     //это нужно для того что бы с каждым нажатием кнопки
     //происходило только одно действие
     // плюс защита от "дребезга"  100%
     // устанавливаем яркость у светодиода у вывода 10
    if (digitalRead(5))flag1 = 1; // вот здесь она меняет состояние
    else flag1 =0;
    analogWrite(LED, brightness);

    // изменяем яркость в цикле, прибавляя заданную величину
    brightness = brightness + fadeAmount;

    // меняем порядок затухания на обратный при достижении минимальной или максимальной яркости
    if (brightness == 0 || brightness == 255) {
      fadeAmount = -fadeAmount ;
    }
    // делаем небольшую паузу для лучшего эффекта
    delay(30);
  }

  if (digitalRead(13) == LOW && POW1 == 1) //если кнопка НЕ нажата
    //и переменная POW равна - 1 ,то ...
  {

    POW1 = 0; //обнуляем переменную POW1
  }


  if (digitalRead(10) == HIGH && POW2 == 0 && flag1 ==1) //если кнопка нажата
    // и перемення POW2 равна 0 , то ...
  {

    digitalWrite(7, !digitalRead(7));
    POW2 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%

  }

  if (digitalRead(10) == LOW && POW2 == 1) //если кнопка НЕ нажата
    //и переменная POW2 равна - 1 ,то ...
  {

    POW2 = 0; //обнуляем переменную POW2
  }


  if (digitalRead(11) == HIGH && POW3 == 0 && flag1 ==1) //если кнопка нажата
    // и перемення POW3 равна 0 , то ...
  {

    digitalWrite(8, !digitalRead(8));
    POW3 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%

  }

  if (digitalRead(11) == LOW && POW3 == 1) //если кнопка НЕ нажата
    //и переменная POW32 равна - 1 ,то ...
  {

    POW3 = 0; //обнуляем переменную POW3
  }

  if (digitalRead(12) == HIGH && POW4 == 0 && flag1 ==1) //если кнопка нажата
    // и перемення POW3 равна 0 , то ...
  {

    digitalWrite(8, !digitalRead(8));
    POW4 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%

  }

  if (digitalRead(12) == LOW && POW4 == 1) //если кнопка НЕ нажата
    //и переменная POW4 равна - 1 ,то ...
  {

    POW4 = 0; //обнуляем переменную POW4
  }

}

Когда будете собирать ставте подтягивающее сопротивление на все кнопки

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Там возникает еще одна проблема а может так и задумано? Если пин5-высокий то мы можем другими кнопками включить\выключать нагрузку на других пинах а когда мы кн13 отключили пин5, а на других пинах остался высокий потенциал, то он так и останется пока не активируем кнопки. Так что смотрите, если так задумано то нормально если нет надо исправлять.

Собачкин
Offline
Зарегистрирован: 26.10.2015

Спасибо за доработаный код. 

Нет, так быть не должно, если состояние пин5 изменилось на 0, то все остальные пины тоже дожды быть сброшены в 0.

Значит переменная flag должна отключать и все остальные пины, все верно?

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

Кстати, не могли бы скинуть файл протеуса на мыло?

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Да правильно а поповоду файла, там нечего скидывать, 1проц, 4 кнопки, 5 диодов

Собачкин
Offline
Зарегистрирован: 26.10.2015

Подправил мелкие ошибки.

Собрал схему в протеусе, но работает не совсем так как я хочу. Когда "включаю" прибор нажаием на PIN13, на PIN5 появляеться 1, а на PIN6 - 0, хотя там тоже должна быть единица. Хоть убей не пойму почему, завтра попробую пошаманить еще.

Спасибо за помощь и наставления ;-)

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Проверил в протеусе еще раз, все работает пин5 и пин6 вкл\вык. Вы сделали минусовую подтяжку  к пинам (10,11,12,13) через сопротивление как я писал?

Без этой подтяжки работать будет не правильно. А вообще надо переписать программу и кнопки замыкать на минус, тогда подтяжку можно сделать програмно.