Помогите осуществить проект с 3-мя таймерами.

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

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

w-вебасто. n-насос. p-печка

 

t

start

w

t

knopka

n

t+2

knopka+1min

p

t+5

Knopka+7min

 

1.      При включении Arduino pro mini включается канал w, на время t(min).

2.      Спустя 1 минуту(knopka+1min) запускается канал n, и работает он ещё 2 минуты, после окончания сигнала w (t+2).

3.      Спустя 7 минуту(knopka+7min), после запуска канала w, запускается канал p, и работает он ещё 5 минуты, после окончания сигнала w (t+5).

4.      После выполнения данных условий, сигналы просто исчезают из всех портов.

 

 

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

1На что вы надеетесь. Кто-то нарисует код, код заработает и все будет жвачка. Ну вы же взрослые люди.

2) Есть код- это скетч. Есть контент это то что скетч делает. Вроде они должны быть одинаковы. Ведь придумали люди такую вещь как алгоритм. Но бывают и разочарования.  Если вам программу писать через совпадение кода и контента, то это через delay() в несколько строк. А если код и контент не совпадают, то здесь идет millis().

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

И то и то за деньги.

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

Я знаю азы С#. Под Arduino надо с или с++. Да еще и портами как-то управлять надо. я в этом не селен(((

Если я не ошибаюсь то, задуманое можно вместить в 20-30 строк кода. Несколько циклов и проверок. Тут же не громоздкий проект. 

strarbit
Offline
Зарегистрирован: 12.06.2016

управление портами

pinMode(хPin, OUTPUT);      // настройка пина в качестве выхода
digitalWrite(xPin, LOW);    // низкий - выключить
digitalWrite(xdPin, HIGH);  // высокий - включить

функция millis() - отсчет интервала

sadman41
Онлайн
Зарегистрирован: 19.10.2016

А пойдет сюда и delay. Тогда можно школьника заставить написать за беляш.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

taha17 пишет:

Я знаю азы С#. Под Arduino надо с или с++. Да еще и портами как-то управлять надо. я в этом не селен(((

Если я не ошибаюсь то, задуманое можно вместить в 20-30 строк кода. Несколько циклов и проверок. Тут же не громоздкий проект. 

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

Лёня Голубков, сдаётся мне, что ты таки халявщик :)

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

DIYMan пишет:

taha17 пишет:

Я знаю азы С#. Под Arduino надо с или с++. Да еще и портами как-то управлять надо. я в этом не селен(((

Если я не ошибаюсь то, задуманое можно вместить в 20-30 строк кода. Несколько циклов и проверок. Тут же не громоздкий проект. 

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

Лёня Голубков, сдаётся мне, что ты таки халявщик :)

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

b707
Offline
Зарегистрирован: 26.05.2017

taha17 пишет:

Не, меня Саня зовут. Понимаешь, есть желание изучить Arduino, и изучение будет. Но дел в том, что в наличии ща только ардуина про мини. И заливать туда код не чем(( надо дергать чела у которого программатор есть, не удобно будет перед ним.. если вдруг косяки будут.

И что дальше? дергать чела с программатором неудобно, а просить написать код - удобно? И, кстати, косяки будут обязательно. Не бывает кода без косяков...

Если ты знаешь любой диалект Си - не важно С. С++, С# - то для начального освоения другого диалекта тебе нужно потратить пару часов. Купи вторую ардуину(например Нано за 200р) и начни изучение сразу.

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

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

b707 пишет:

taha17 пишет:

Не, меня Саня зовут. Понимаешь, есть желание изучить Arduino, и изучение будет. Но дел в том, что в наличии ща только ардуина про мини. И заливать туда код не чем(( надо дергать чела у которого программатор есть, не удобно будет перед ним.. если вдруг косяки будут.

И что дальше? дергать чела с программатором неудобно, а просить написать код - удобно? И, кстати, косяки будут обязательно. Не бывает кода без косяков...

Если ты знаешь любой диалект Си - не важно С. С++, С# - то для начального освоения другого диалекта тебе нужно потратить пару часов. Купи вторую ардуину(например Нано за 200р) и начни изучение сразу.

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

Закидали меня вчера нехорошими комментами ))) ну и ладно )) надо когда то начинать, и этот день сегодня ))) вот мой первый код под Arduino. Прошу указать на ошибки.

  
  int wpin=7; //w
  int npin=8; //n
  int ppin=9; //p

void setup() {
  Serial.begin (9600);  
  pinMode(wpin, OUTPUT); 
  pinMode(npin, OUTPUT); 
  pinMode(ppin, OUTPUT);
  

}

void loop() {

 // digitalWrite(xPin, LOW);    // низкий - выключить
 // digitalWrite(xdPin, HIGH);  // высокий - включить

  long a= 900000; //15min
  long b= 420000; //7min
  long c= 300000; //5min
  long d= 90000; //2min
  long e= 60000; //1min
   // digitalWrite(wpin, LOW);
  // digitalWrite(npin, LOW);
  // digitalWrite(ppin, LOW);
    
    for (long j=0; j <= a+b; j+1000)
    {
      if (j<=a)
      {
      digitalWrite(wpin, HIGH);// старт W
      delay(1000);
      }
      if ((j>=e) && (j<=a+d) ) // старт N 
      {
      digitalWrite(npin, HIGH);
      delay(1000);
      }
      if (j>=c) // старт P 
      {
      digitalWrite(ppin, HIGH);
      delay(1000);
      }
      
      
   }


}

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

весь код - ошибка.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

taha17 пишет:

Я знаю азы С#. Под Arduino надо с или с++. Да еще и портами как-то управлять надо. я в этом не селен(((

слушай, ну как так получается, что я не знаю ни одного языка и в управлении портами(какими, блин, портами? ху из бин "п'ортъ"?) не рублю, но я в этом селен(с)? [ху из бин мист'ер "селен", йопта?]

#28 О_О

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

Клапауций 112 пишет:

taha17 пишет:

Я знаю азы С#. Под Arduino надо с или с++. Да еще и портами как-то управлять надо. я в этом не селен(((

слушай, ну как так получается, что я не знаю ни одного языка и в управлении портами(какими, блин, портами? ху из бин "п'ортъ"?) не рублю, но я в этом селен(с)? [ху из бин мист'ер "селен", йопта?]

#28 О_О

В верху товарищ, подсказал как управлять портами. Если я правильно его понял  

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

taha17 пишет:

В верху товарищ, подсказал как управлять портами. Если я правильно его понял  

ок. спроси у товарища вверху, ху из бин "селен"?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Напишите словами в левый столбик:

включить 1

подождать

выключить 1

включить 2

подождать

и т.п. 

В правый аналоги команд из языка Ардуино.

b707
Offline
Зарегистрирован: 26.05.2017

taha17 пишет:

Закидали меня вчера нехорошими комментами ))) ну и ладно )) надо когда то начинать, и этот день сегодня ))) вот мой первый код под Arduino. Прошу указать на ошибки.

 

Молодец!

А теперь напиши простыми словами, чего ты хотел добиться в цикле for (строка 22). Судя по всему. переменные a-d - это задержки в мс. Но с чего ты их сравниваешь с j в цикле - я не понял

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

sadman41 пишет:

В правый аналоги команд из языка Ардуино.

он не знает изика Дуино - только Си

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

b707 пишет:

taha17 пишет:

Закидали меня вчера нехорошими комментами ))) ну и ладно )) надо когда то начинать, и этот день сегодня ))) вот мой первый код под Arduino. Прошу указать на ошибки.

 

Молодец!

А теперь напиши простыми словами, чего ты хотел добиться в цикле for (строка 22). Судя по всему. переменные a-d - это задержки в мс. Но с чего ты их сравниваешь с j в цикле - я не понял

Догреватель(w) работает 15 мин(переменная a), но после его печка(p) работает еще 7 минут (переменная b). Исходя из этого весь цикл у меня длинною a+b. Переменную j завел что бы цикл сделать возростающим. Можно было сделать и a+b;a+b>=0;(a+b)-1000, но начал путаться с условиями.

b707
Offline
Зарегистрирован: 26.05.2017

taha17 пишет:

Догреватель(w) работает 15 мин(переменная a), но после его печка(p) работает еще 7 минут (переменная b). Исходя из этого весь цикл у меня длинною a+b. Переменную j завел что бы цикл сделать возростающим. Можно было сделать и a+b;a+b>=0;(a+b)-1000, но начал путаться с условиями.

я не об этом. С чего ты взял. что переменная j у тебя равна времени в миллисекундах?

добавлю - чтобы не изобретать велосипед, посмотри описание функции millis()

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

sadman41 пишет:

Напишите словами в левый столбик:

включить 1

подождать

выключить 1

включить 2

подождать

и т.п. 

В правый аналоги команд из языка Ардуино.

Вот как должно все выглядеть на графике:

всё время a+b.

w стартует срузу и длина управляющего сигнала = a (15 min)  if (j<=a)

n стартует спустя одну минуту, после старта w. Но он длинее w, на 2 минуты((j>=e) && (j<=a+d) )

P стартует спустя пять минуту, после старта w. Но он длинее w, на 7 минуты(j>=c )

 

w -----------------------------------

n    ------------------------------------

p           ----------------------------------------

-------------------------------------------------- (a+b)

 

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

b707 пишет:

taha17 пишет:

Догреватель(w) работает 15 мин(переменная a), но после его печка(p) работает еще 7 минут (переменная b). Исходя из этого весь цикл у меня длинною a+b. Переменную j завел что бы цикл сделать возростающим. Можно было сделать и a+b;a+b>=0;(a+b)-1000, но начал путаться с условиями.

я не об этом. С чего ты взял. что переменная j у тебя равна времени в миллисекундах?

добавлю - чтобы не изобретать велосипед, посмотри описание функции millis()

Ну если весь цикл равен (a+b)=900+420=1320 сек. Я цикл уменьшаю на 1000 т.е на 1с. делаю проверки. где все норм появляется синал на порту с задержкой в 1 сек.

Ща буду смотреть функцию millis().

sadman41
Онлайн
Зарегистрирован: 19.10.2016

taha17 пишет:

Вот как должно все выглядеть на графике:

всё время a+b.

w стартует срузу и длина управляющего сигнала = a (15 min)  if (j<=a)

n стартует спустя одну минуту, после старта w. Но он длинее w, на 2 минуты((j>=e) && (j<=a+d) )

P стартует спустя пять минуту, после старта w. Но он длинее w, на 7 минуты(j>=c )

Я даже не знаю, что с вами делать. Вот так для вас логика прослеживается?

pinW -> HIGH
delay(1m)
pinT -> HIGH
delay(4m)
pinP -> HIGH
delay(15m - 4m - 1m)
pinW -> LOW
...

 

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

sadman41 пишет:

taha17 пишет:

Вот как должно все выглядеть на графике:

всё время a+b.

w стартует срузу и длина управляющего сигнала = a (15 min)  if (j<=a)

n стартует спустя одну минуту, после старта w. Но он длинее w, на 2 минуты((j>=e) && (j<=a+d) )

P стартует спустя пять минуту, после старта w. Но он длинее w, на 7 минуты(j>=c )

Я даже не знаю, что с вами делать. Вот так для вас логика прослеживается?

pinW -> HIGH
delay(1m)
pinT -> HIGH
delay(4m)
pinP -> HIGH
delay(15m - 4m - 1m)
pinW -> LOW
...

 

Теперь понял. Колличество строк кода будет наверное зашкаливать ))

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

b707 пишет:

taha17 пишет:

Догреватель(w) работает 15 мин(переменная a), но после его печка(p) работает еще 7 минут (переменная b). Исходя из этого весь цикл у меня длинною a+b. Переменную j завел что бы цикл сделать возростающим. Можно было сделать и a+b;a+b>=0;(a+b)-1000, но начал путаться с условиями.

я не об этом. С чего ты взял. что переменная j у тебя равна времени в миллисекундах?

добавлю - чтобы не изобретать велосипед, посмотри описание функции millis()

Вот так ???


      if (millis()<=a)
      {
      digitalWrite(wpin, HIGH);// старт W
      }
      if ((millis()>=e) && (millis()<=a+d) ) // старт и работа N 
      {
      digitalWrite(npin, HIGH);
      }
      if ((millis()>=c )&& (millis()<=a+b) ) // старт и работа P 
      {
      digitalWrite(ppin, HIGH);
      }
nik182
Offline
Зарегистрирован: 04.05.2015

А не проще машину состояний сделать? Все действия последовательны. Типа этого на три шага, но можно расширять. Главное расписать все состояния и времена. Тогда сделав что то идём к следующему шагу.  

 

int stp;
long tm;
void setup() {
  
 stp=0;
 tm=millis();
}
void loop() {
 
  switch (stp) {
 case 0: 
    // код для выполнения 1
    if ((millis()-tm) >1000L) stp=1;
    break;
 case 1:
    // код для выполнения 2
    if ((millis()-tm) >2000L) stp=2;
    break;
 case 2:
    // код для выполнения 3;
    stp=3; // - ничего не делать или stp=0 начать сначала.
    break;
}
}

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Предлагаю линейную задачу с тремя вкл/выкл решить через классы и колбэки!

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Предлагаю линейную задачу с тремя вкл/выкл решить через классы и колбэки!

Лучше RTOS :)

 

 

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

sadman41 пишет:

Предлагаю линейную задачу с тремя вкл/выкл решить через классы и колбэки!

На сколько я помню класс -это пользовательский тип данных. Если сказать еще проще, то это собрание обектов. Которые являются экземплярами этого класса. Переменные-это поля класса. Методы-функции. Тут один метод, зачем все усложнять. 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

sadman41 пишет:

Предлагаю линейную задачу с тремя вкл/выкл решить через классы и колбэки!

а, вечером в кабак с девками и цыганами на тройке!

nik182
Offline
Зарегистрирован: 04.05.2015

Как то так, но с вашими минутами я не разобрался. 

int stp,n=3,p=4,w=5;
unsigned long tm;
void setup() {
 pinMode(n, OUTPUT);
 pinMode(p, OUTPUT);
 pinMode(w, OUTPUT); 
 stp=0;
}

void loop() {
 
 switch (stp) {
 case 0: digitalWrite(w, HIGH); tm=millis(); stp=1;   break;
 case 1: if ((millis()-tm) >1000L){digitalWrite(n, HIGH); stp=2;};  break;
 case 2: if ((millis()-tm) >5000L){digitalWrite(p, HIGH); stp=3;};  break;
 case 3: if ((millis()-tm) >15000L){digitalWrite(w, LOW); stp=4;};  break;
 case 4: if ((millis()-tm) >18000L){digitalWrite(n, LOW); stp=5;}; break;
 case 5: if ((millis()-tm) >22000L){digitalWrite(p, LOW); stp=6;}; break;
 default:;
}
}

 

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

nik182 пишет:

Как то так, но с вашими минутами я не разобрался. 

int stp,n=3,p=4,w=5;
unsigned long tm;
void setup() {
 pinMode(n, OUTPUT);
 pinMode(p, OUTPUT);
 pinMode(w, OUTPUT); 
 stp=0;
}

void loop() {
 
 switch (stp) {
 case 0: digitalWrite(w, HIGH); tm=millis(); stp=1;   break;
 case 1: if ((millis()-tm) >1000L){digitalWrite(n, HIGH); stp=2;};  break;
 case 2: if ((millis()-tm) >5000L){digitalWrite(p, HIGH); stp=3;};  break;
 case 3: if ((millis()-tm) >15000L){digitalWrite(w, LOW); stp=4;};  break;
 case 4: if ((millis()-tm) >18000L){digitalWrite(n, LOW); stp=5;}; break;
 case 5: if ((millis()-tm) >22000L){digitalWrite(p, LOW); stp=6;}; break;
 default:;
}
}

 

Спасибо сударь, суть ясна))) можно подправить условия и использовать )))