Ви не увійшли.
Здраствуйте, ребята.
Помогите разрабратся как написать код рабочий код. Делаю устройство включения нагрузки по таймеру. Устройство имеет 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)
Неактивний
без обид, но ваш вопрос это всё равно что " научите меня программировать".
на форумах этому не научат, для этого есть книжки, интернет.
здесь только могут что то подсказать или посоветовать.
Неактивний
могу посоветовать использовать библиотеку Bounce2.h для устранения дребезжания
Bounce modeDebouncer = Bounce();
//setup
modeDebouncer.attach(modeButtonPin);
modeDebouncer.interval(5);
//loop
modeDebouncer.update();
int modeButtonState = modeDebouncer.read();
Неактивний
и еще один совет, постарайся разбить программу на процедуры , будет легче вносить изменения да и вообщем легче понимать код
Неактивний
без обид, но ваш вопрос это всё равно что " научите меня программировать".
на форумах этому не научат, для этого есть книжки, интернет.
здесь только могут что то подсказать или посоветовать.
Без обид, абсолютно согласен, так и учу по книжке Jeremy Blum'а, по видеоурокам всяких самоделкиных и еще больше по примерам готовых проэктов. В интернете видел готовый проэкт, его логика мне понятна https://m.geektimes.ru/post/258348/, но мне хотелось чтобы управление было на кнопках и с дисплеем. Запуск работы по датчику тоже делал, там как-то проблем не было, а тут почему-то все виснет(
Неактивний
вам в 4 посте дали дельный совет - разбейте работу на части.
научились работать правильно и уверенно с кнопками - идём к дисплею.
поигрались с дисплеем, научились выводить - можно соединить кнопки с дисплеем.
научились кнопками менюшки менять и выводить всякую всячину - пошли к датчикам.
сразу гамузом никто не пишет.
Неактивний