Управление котлом mega 2560, ramps 1.4 и экраном от 3D принтера.

maxvalin
Offline
Зарегистрирован: 22.02.2016

Здравствуйте уважаемые учасники! Имеется вот такой набор. грубо говоря от 3D принтера. Хочу (точнее попытаюсь) изваять из него управление подачей топлива для котла.

На данный момент активно изучаю программирование и полностью понимаю что данное задание не мой уровень. Но хотя бы хотелось получить пинки в правильную сторону. А именно: Где почитать о меню на данном типе экрана и энкодере (hТТp://robozona.ru/3d_printer/electric-3d-printer/controller-3d-printer.html). Распиновку знаю, что где висеть должно уже собрал во едино.

2датчика либо далас либо родные от принтера (они проще и надежней)

один движек постоянного тока дя вращения лопостей турбины-нагнетателя

один ШД  для вращения заслонки подачи топлива.

и выход на симистор для включения насоса системы

еще пищалка стандартная(на экране есть)- будет как сигнализация перегрева.

система - имею ввиду систему отопления- трубы с водой.

показания на экране:

показания Т в системе , рядом показания Т улицы (улицу просто показывает)

надпись "турбина" с значением от 0-254

надпись "подача" с указанием шагов от 0 тоисть я должен закрыть вентиль и нажать set и показания шагов станут 0. А потом они будут запоминаться при выключениии( это желательно конечно если сильно сложно то можно и без этого) буду просто при каждом включении (а это не особо часто) отводить в ноль до пропуска шагов и обнулять. Также шаги можно будет менять энкодером и блютузом через android.

Ну и управление насосом системы зависит от показаний температуры системы, но то уже потом, думаю и так через чур много всего сразу.

maxvalin
Offline
Зарегистрирован: 22.02.2016

Почитал форум, дико не прав! Извините! Для начала нужно самому разобраться и сделать а уже потом задавать вопросы

maxvalin
Offline
Зарегистрирован: 22.02.2016

теперь надесь есть право уже спросить о чем нить..

начал делать собственное меню, естественно по образу и подобию рожденного здесь на форуме. Затеял ввесь геморой наверное больше ради изучения чем создания управления котлом. Но все же есть цель таки сделать его и подключить. После долгих учений- мучений с ноля (пару суток). В принципе сделал то что написал себе же на бумажке. Хочу решать все вопросы поэтапно, по этому вопрос на данный момент только о том как перепрыгивать между тремя  переменными для их редактирования с помощью энкодера и одной кнопки. Сейчас попробовал только редактировать одну переменную, выходит конечно, но это так для пробы(естественно так быть не должно). Пожалуйста не обращайте внимание особо на все остальное, это только наброски. Меню хочу сделать без древа, все на одном экране, перепрыгнул допустим кнопкой отредактировал энкодером и оно на лету запомнилось и выполнилось.


[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]
MacSim
Offline
Зарегистрирован: 28.11.2012

.

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

что, все так плохо?

Возможно надо задействовать масив из трех переменных и в обработку экодера добавлять их через "И" .. забился в угол.. нужен пинок!

maxvalin
Offline
Зарегистрирован: 22.02.2016

Ну что не так то? Точка что означает?

Dorrin
Offline
Зарегистрирован: 06.12.2014

ping

maxvalin
Offline
Зарегистрирован: 22.02.2016

Dorrin пишет:

ping

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

Напомни пожалуйста!

Dorrin
Offline
Зарегистрирован: 06.12.2014

[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]

 

Dorrin
Offline
Зарегистрирован: 06.12.2014

[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]