#1 2018-02-06 20:34:14

depecher
Участник
Зарегистрирован: 2018-02-01
Сообщений: 5

Включение/выключение нагрузки по таймеру

Здраствуйте, ребята.
Помогите разрабратся как написать код рабочий код. Делаю устройство включения нагрузки по таймеру. Устройство имеет lcd дисплей, 4 кнопки - 2 повышают/понижают период включения нагрузки, 2 повышают/понижают время работы нагрузки и собственно саму нагрузку.
С вводом параметров и последующим их выводом на дисплей разобрался, но как заставить устройство работать по этим введеным параметрам никак не могу понять. Вот набросок скетча, при включении процедуры включения нагрузки просто виснут кнопки и ничего не работает. Прошу не судить строго, программирование контроллеров, да и вообще программирование как таковое только начал изучать. Кто-то может сказать - купи розетку с таймером и не мучайся - отвечу - согласен, уже купил несколько )), но чтоб удоволетворить свое самолюбие и для работы над последующими устройствами хотелось бы решить задачу до конца)
Начал подумывать, возможно переделать схему на работу не по периодам, а по таймеру реальных часов, примеров скетчей по таким схемам вроди как побольше, чтобы разобратся.

Код
"
//Include the LCD library and initialize:
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);


//Pin Connections
const int TimeOfWorkUP_Butt =11;
const int TimeOfWorkDOWN_Butt   =10;
const int PeriodEveryUP_Butt =9;
const int PeriodEveryDOWN_Butt   =8;
const int Nasos =13;


//Variables for debouncing
boolean lastDownWorkButton = LOW;
boolean currentDownWorkButton = LOW;
boolean lastUpWorkButton = LOW;
boolean currentUpWorkButton = LOW;
boolean lastDownPeriodButton = LOW;
boolean currentDownPeriodButton = LOW;
boolean lastUpPeriodButton = LOW;
boolean currentUpPeriodButton = LOW;
int worktime = 10;    //Время работы нагрузки в процедуре
int periodevery = 12;  //Период между запусками работы нагрузки в процедуре
int worktimereal; // Время работы нагрузки
int periodeveryreal; // Период между запусками работы нагрузки

/*// Процедура работы насоса
void water()
{
  digitalWrite(Nasos, HIGH); // start work
  delay(worktimereal);
  digitalWrite(Nasos, LOW); // stop work
  delay(periodeveryreal); 
}*/
void setup()
{
  pinMode(Nasos, OUTPUT);
  digitalWrite(Nasos, LOW);

  //Set up the LCD's number of columns and rows
  lcd.begin(16, 2);

  //Make custom characters
  lcd.createChar(0, degree);
  lcd.createChar(1, fan_off);
  lcd.createChar(2, fan_on);

  //Print a static message to the LCD
  lcd.setCursor(0,0);
  lcd.print("Workevery:");
  lcd.setCursor(14,0);
  lcd.print("hr");
  lcd.setCursor(0,1);
  lcd.print("Worktime:");
  lcd.setCursor(13,1);
  lcd.print("min");
}

//A debouncing function that can be used by multiple buttons
boolean debounce(boolean last, int pin)
{
  boolean current = digitalRead(pin);
  if (last != current)
  {
    delay(5);
    current = digitalRead(pin);
  }
  return current;
}

void loop()
{
 
  //Debounce both buttons
  currentDownWorkButton = debounce(lastDownWorkButton, TimeOfWorkDOWN_Butt);
  currentUpWorkButton  = debounce(lastUpWorkButton, TimeOfWorkUP_Butt);
  currentDownPeriodButton = debounce(lastDownPeriodButton, PeriodEveryDOWN_Butt);
  currentUpPeriodButton = debounce(lastUpPeriodButton, PeriodEveryUP_Butt);

    //Понижения значения периода работы
  periodevery = constrain(periodevery, 1, 24);
  if (lastDownPeriodButton== LOW && currentDownPeriodButton == HIGH)
  {
    periodevery--;
  }
  //Повыщение значения периода работы
  else if (lastUpPeriodButton== LOW && currentUpPeriodButton  == HIGH)
  {
    periodevery++;
  }
  //Print start time
  lcd.setCursor(11,0);
  lcd.print(periodevery);
  lcd.print(" ");
  lastDownPeriodButton = currentDownPeriodButton;
  lastUpPeriodButton = currentUpPeriodButton;

  //Понижение значения времени работы нагрузки
  worktime = constrain(worktime, 1, 60);
  if (lastDownWorkButton== LOW && currentDownWorkButton == HIGH)
  {
    worktime--;
  }
  //Повышение значения времени работы нагрузки
  else if (lastUpWorkButton== LOW && currentUpWorkButton  == HIGH)
  {
    worktime++;
  }
  //Print work time
  lcd.setCursor(10,1);
  lcd.print(worktime);
  lcd.print(" ");
  lastDownWorkButton = currentDownWorkButton;
  lastUpWorkButton = currentUpWorkButton;

  //Рабочий процесс
/* worktimereal = worktime*1000*100;
  periodeveryreal = periodevery*1000*60;*/

/* water ();*/
 
}
"

Редактировался depecher (2018-02-06 20:35:37)

#2 2018-02-06 20:55:39

vvr
Участник
Зарегистрирован: 2015-04-12
Сообщений: 427

Re: Включение/выключение нагрузки по таймеру

без обид, но ваш вопрос это всё равно что " научите меня программировать".
на форумах этому не научат, для этого есть книжки, интернет.
здесь только могут что то подсказать или посоветовать.

#3 2018-02-06 21:02:30

Arduino Junior
Участник
Зарегистрирован: 2018-02-06
Сообщений: 12

Re: Включение/выключение нагрузки по таймеру

могу посоветовать использовать библиотеку Bounce2.h для устранения дребезжания

Bounce modeDebouncer = Bounce();

//setup
modeDebouncer.attach(modeButtonPin);
modeDebouncer.interval(5);

//loop
modeDebouncer.update();
int modeButtonState = modeDebouncer.read();

#4 2018-02-06 21:04:23

Arduino Junior
Участник
Зарегистрирован: 2018-02-06
Сообщений: 12

Re: Включение/выключение нагрузки по таймеру

и еще один совет, постарайся разбить программу на процедуры , будет легче вносить изменения да и вообщем легче понимать код

#5 2018-02-06 21:32:37

depecher
Участник
Зарегистрирован: 2018-02-01
Сообщений: 5

Re: Включение/выключение нагрузки по таймеру

vvr пишет:

без обид, но ваш вопрос это всё равно что " научите меня программировать".
на форумах этому не научат, для этого есть книжки, интернет.
здесь только могут что то подсказать или посоветовать.

Без обид, абсолютно согласен, так и учу по книжке Jeremy Blum'а, по видеоурокам всяких самоделкиных и еще больше по примерам готовых проэктов. В интернете видел готовый проэкт, его логика мне понятна https://m.geektimes.ru/post/258348/, но мне хотелось чтобы управление было на кнопках и с дисплеем. Запуск работы по датчику тоже делал, там как-то проблем не было, а тут почему-то все виснет(

#6 2018-02-06 22:44:55

vvr
Участник
Зарегистрирован: 2015-04-12
Сообщений: 427

Re: Включение/выключение нагрузки по таймеру

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

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела