Управление котлом mega 2560, ramps 1.4 и экраном от 3D принтера.
- Войдите на сайт для отправки комментариев
Здравствуйте уважаемые учасники! Имеется вот такой набор. грубо говоря от 3D принтера. Хочу (точнее попытаюсь) изваять из него управление подачей топлива для котла.
На данный момент активно изучаю программирование и полностью понимаю что данное задание не мой уровень. Но хотя бы хотелось получить пинки в правильную сторону. А именно: Где почитать о меню на данном типе экрана и энкодере (hТТp://robozona.ru/3d_printer/electric-3d-printer/controller-3d-printer.html). Распиновку знаю, что где висеть должно уже собрал во едино.
2датчика либо далас либо родные от принтера (они проще и надежней)
один движек постоянного тока дя вращения лопостей турбины-нагнетателя
один ШД для вращения заслонки подачи топлива.
и выход на симистор для включения насоса системы
еще пищалка стандартная(на экране есть)- будет как сигнализация перегрева.
система - имею ввиду систему отопления- трубы с водой.
показания на экране:
показания Т в системе , рядом показания Т улицы (улицу просто показывает)
надпись "турбина" с значением от 0-254
надпись "подача" с указанием шагов от 0 тоисть я должен закрыть вентиль и нажать set и показания шагов станут 0. А потом они будут запоминаться при выключениии( это желательно конечно если сильно сложно то можно и без этого) буду просто при каждом включении (а это не особо часто) отводить в ноль до пропуска шагов и обнулять. Также шаги можно будет менять энкодером и блютузом через android.
Ну и управление насосом системы зависит от показаний температуры системы, но то уже потом, думаю и так через чур много всего сразу.
Почитал форум, дико не прав! Извините! Для начала нужно самому разобраться и сделать а уже потом задавать вопросы
теперь надесь есть право уже спросить о чем нить..
начал делать собственное меню, естественно по образу и подобию рожденного здесь на форуме. Затеял ввесь геморой наверное больше ради изучения чем создания управления котлом. Но все же есть цель таки сделать его и подключить. После долгих учений- мучений с ноля (пару суток). В принципе сделал то что написал себе же на бумажке. Хочу решать все вопросы поэтапно, по этому вопрос на данный момент только о том как перепрыгивать между тремя переменными для их редактирования с помощью энкодера и одной кнопки. Сейчас попробовал только редактировать одну переменную, выходит конечно, но это так для пробы(естественно так быть не должно). Пожалуйста не обращайте внимание особо на все остальное, это только наброски. Меню хочу сделать без древа, все на одном экране, перепрыгнул допустим кнопкой отредактировал энкодером и оно на лету запомнилось и выполнилось.
[code] #include <EEPROM.h> #define ENCODER_DO_NOT_USE_INTERRUPTS // без прерываний. #include <Encoder.h> #include <AccelStepper.h>// библиотека шаговиков // здесь экран #include <LiquidCrystal.h> //Библиотека LCD LiquidCrystal lcd(16, 17, 23, 25, 27, 29); // переменные byte vozduh = 0; //переменная для турбины (0-255) int podazh = 0; // переменная для шагов вентиля подачи масла boolean alarm = 0; // переменная для включения аварии int t_kotel = 0; // переменная для температуры котла int t_ulica = 0; // переменная для температуры улицы long old_pos = 0; // старая позиция для энкодера //объявление входов-выходов Encoder Enc_1(31, 33); //кнопки энкодера #define MOTOR_STEP_PIN 54 #define MOTOR_DIR_PIN 55 #define MOTOR_ENABLE_PIN 38 int sign = 37; //бузер аварии, динамик (100 гц нормально пищит) int nasos = 10; // выход на твердотелое реле управление насосом int turbin = 9; //турбина подключена к 9 пину. int enter = 41; // кнопка входа void setup() { //Настройка пинов pinMode(enter, INPUT); pinMode(sign, OUTPUT); pinMode(nasos, OUTPUT); pinMode(turbin, OUTPUT);// выход на турбину, движек 12 вольт //Настройка дисплея //Установка количества столбцов и строк дисплея lcd.begin(20, 4); // Вывод приветствия при включении питания если нужно lcd.setCursor(6, 1); lcd.print("BUYANKA"); delay (2000);//Задержка приветствия lcd.clear(); } void loop() { //Вывод меню //Описание строк меню { lcd.setCursor(0, 0); //ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ВОДЫ НА ВЫХОДЕ КОТЛА lcd.print("KOTEL="); lcd.print(t_kotel); lcd.setCursor(10, 0); //отображение температуры улицы lcd.print("ULICA="); lcd.print(t_ulica); lcd.setCursor(0, 1); // турбина lcd.print("TURBINA="); lcd.print(vozduh); lcd.setCursor(0, 2); //подача масла lcd.print("PODAZHA="); lcd.print(podazh); if (alarm == 1) { lcd.setCursor(0, 3); // сигнализация lcd.print("SIGNAL=DA"); } else if (alarm == 0) { lcd.setCursor(0, 3); // сигнализация lcd.print("SIGNAL=NET"); } } // отрабатывание кнопки { // отрабатывание вращения энкодера, пока что только для сигнализации //или для чего угодно но только одной переменной long new_pos; new_pos = Enc_1.read()/4; if (new_pos != old_pos) { if (new_pos > old_pos) { alarm = 1; // увеличиваем значение lcd.clear(); } if (new_pos < old_pos) { alarm = 0; // уменьшаем значение lcd.clear(); } old_pos = new_pos; } } } [/code].
что, все так плохо?
Возможно надо задействовать масив из трех переменных и в обработку экодера добавлять их через "И" .. забился в угол.. нужен пинок!
Ну что не так то? Точка что означает?
ping
ping
не смог привязать переменные для прокручивания между ними, сначала понял но в первый вечер некогда было, а сейчас начал делать и уже вылетело с головы...
Напомни пожалуйста!
[code] #include <EEPROM.h> #define ENCODER_DO_NOT_USE_INTERRUPTS // без прерываний. #include <Encoder.h> #include <AccelStepper.h>// библиотека шаговиков // здесь экран #include <LiquidCrystal.h> //Библиотека LCD LiquidCrystal lcd(16, 17, 23, 25, 27, 29); // переменные byte vozduh = 0; //переменная для турбины (0-255) int podazh = 0; // переменная для шагов вентиля подачи масла boolean alarm = 0; // переменная для включения аварии int t_kotel = 0; // переменная для температуры котла int t_ulica = 0; // переменная для температуры улицы long old_pos = 0; // старая позиция для энкодера //объявление входов-выходов Encoder Enc_1(31, 33); //кнопки энкодера #define MOTOR_STEP_PIN 54 #define MOTOR_DIR_PIN 55 #define MOTOR_ENABLE_PIN 38 int sign = 37; //бузер аварии, динамик (100 гц нормально пищит) int nasos = 10; // выход на твердотелое реле управление насосом int turbin = 9; //турбина подключена к 9 пину. int enter = 41; // кнопка входа int enterEnk=42;!!!!!!!!!!!!!!!!! переменная второй кнопки int count=0;!!!!!!!!!! переменная номера строчек меню void setup() { //Настройка пинов pinMode(enter, INPUT); pinMode(sign, OUTPUT); pinMode(nasos, OUTPUT); pinMode(turbin, OUTPUT);// выход на турбину, движек 12 вольт //Настройка дисплея //Установка количества столбцов и строк дисплея lcd.begin(20, 4); // Вывод приветствия при включении питания если нужно lcd.setCursor(6, 1); lcd.print("BUYANKA"); delay (2000);//Задержка приветствия lcd.clear(); } void loop() { !!!!!!!!!!!!!!!!! обработка нажатия кнопок int down=digitalRead(43); !!!!!!!чтение кнопки вниз int up=digitalRead(42);!!!!!!!!! чтение кнопки кнопки вверх !!!!!!!!! if(count==0) { if(up&&alarm!=1) { alarm=1; } if(down&&alarm==1) { alarm=0; } !!!!!!!!! } if(count==1) { if(up&&podаcha<MAXIMUM) { podacha++; } if(down&&podacha>MINIMUM) { padacha--; } } !!!!!!!!!!!!!!!!1 if(count==2) если выбрана переменная 2 { if(up&&vozduh<255) если нажата кнопка вверх и переменная меньше 255 { vozduh++; увеличиваем переменную } if(down&&vozduh>0) если нажата кнопка вниз и переменная больше 0 { vozduh--; уменьшаем переменную } } !!!!!!!!!!!!!!!!!! //Вывод меню //Описание строк меню { lcd.setCursor(0, 0); //ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ВОДЫ НА ВЫХОДЕ КОТЛА lcd.print("KOTEL="); lcd.print(t_kotel); lcd.setCursor(10, 0); //отображение температуры улицы lcd.print("ULICA="); lcd.print(t_ulica); lcd.setCursor(0, 1); // турбина lcd.print("TURBINA="); lcd.print(vozduh); lcd.setCursor(0, 2); //подача масла lcd.print("PODAZHA="); lcd.print(podazh); if (alarm == 1) { lcd.setCursor(0, 3); // сигнализация lcd.print("SIGNAL=DA"); } else if (alarm == 0) { lcd.setCursor(0, 3); // сигнализация lcd.print("SIGNAL=NET"); } } // отрабатывание кнопки { // отрабатывание вращения энкодера, пока что только для сигнализации //или для чего угодно но только одной переменной long new_pos; new_pos = Enc_1.read()/4; if (new_pos != old_pos) { if (new_pos > old_pos) { count++; if(count==3) {count=0} alarm = 1; // увеличиваем значение lcd.clear(); } if (new_pos < old_pos) { cout--; if(count==-1) {count=2} alarm = 0; // уменьшаем значение lcd.clear(); } old_pos = new_pos; } } } [/code][code] #include <EEPROM.h> #define ENCODER_DO_NOT_USE_INTERRUPTS // без прерываний. #include <Encoder.h> #include <AccelStepper.h>// библиотека шаговиков // здесь экран #include <LiquidCrystal.h> //Библиотека LCD LiquidCrystal lcd(16, 17, 23, 25, 27, 29); // переменные byte vozduh = 0; //переменная для турбины (0-255) int podazh = 0; // переменная для шагов вентиля подачи масла boolean alarm = 0; // переменная для включения аварии int t_kotel = 0; // переменная для температуры котла int t_ulica = 0; // переменная для температуры улицы long old_pos = 0; // старая позиция для энкодера //объявление входов-выходов Encoder Enc_1(31, 33); //кнопки энкодера #define MOTOR_STEP_PIN 54 #define MOTOR_DIR_PIN 55 #define MOTOR_ENABLE_PIN 38 int sign = 37; //бузер аварии, динамик (100 гц нормально пищит) int nasos = 10; // выход на твердотелое реле управление насосом int turbin = 9; //турбина подключена к 9 пину. int enter = 41; // кнопка входа int enterEnk=42;!!!!!!!!!!!!!!!!! переменная второй кнопки int count=0;!!!!!!!!!! переменная номера строчек меню void setup() { //Настройка пинов pinMode(enter, INPUT); pinMode(sign, OUTPUT); pinMode(nasos, OUTPUT); pinMode(turbin, OUTPUT);// выход на турбину, движек 12 вольт //Настройка дисплея //Установка количества столбцов и строк дисплея lcd.begin(20, 4); // Вывод приветствия при включении питания если нужно lcd.setCursor(6, 1); lcd.print("BUYANKA"); delay (2000);//Задержка приветствия lcd.clear(); } void loop() { !!!!!!!!!!!!!!!!! обработка нажатия кнопок int down=digitalRead(43); !!!!!!!чтение кнопки вниз int up=digitalRead(42);!!!!!!!!! чтение кнопки кнопки вверх !!!!!!!!! if(count==0) { if(up&&alarm!=1) { alarm=1; } if(down&&alarm==1) { alarm=0; } !!!!!!!!! } if(count==1) { if(up&&podаcha<MAXIMUM) { podacha++; } if(down&&podacha>MINIMUM) { padacha--; } } !!!!!!!!!!!!!!!!1 if(count==2) если выбрана переменная 2 { if(up&&vozduh<255) если нажата кнопка вверх и переменная меньше 255 { vozduh++; увеличиваем переменную } if(down&&vozduh>0) если нажата кнопка вниз и переменная больше 0 { vozduh--; уменьшаем переменную } } !!!!!!!!!!!!!!!!!! //Вывод меню //Описание строк меню { lcd.setCursor(0, 0); //ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ВОДЫ НА ВЫХОДЕ КОТЛА lcd.print("KOTEL="); lcd.print(t_kotel); lcd.setCursor(10, 0); //отображение температуры улицы lcd.print("ULICA="); lcd.print(t_ulica); lcd.setCursor(0, 1); // турбина lcd.print("TURBINA="); lcd.print(vozduh); lcd.setCursor(0, 2); //подача масла lcd.print("PODAZHA="); lcd.print(podazh); if (alarm == 1) { lcd.setCursor(0, 3); // сигнализация lcd.print("SIGNAL=DA"); } else if (alarm == 0) { lcd.setCursor(0, 3); // сигнализация lcd.print("SIGNAL=NET"); } } // отрабатывание кнопки { // отрабатывание вращения энкодера, пока что только для сигнализации //или для чего угодно но только одной переменной long new_pos; new_pos = Enc_1.read()/4; if (new_pos != old_pos) { if (new_pos > old_pos) { count++; if(count==3) {count=0} alarm = 1; // увеличиваем значение lcd.clear(); } if (new_pos < old_pos) { cout--; if(count==-1) {count=2} alarm = 0; // уменьшаем значение lcd.clear(); } old_pos = new_pos; } } } [/code]