#1 2016-08-14 14:02:03

qwone
Участник
Зарегистрирован: 2016-07-25
Сообщений: 127

разработка Меню на LCD1602 и экодере.

Знаю что есть такие. Просто пишу свой код.

/*  Схема подключения
 I2C LCD1602          GND -> GND 
                      +5V -> +5V
                      SDA -> A4(SDA)
                      SCL -> A5(SCL)

 *  Ардуино энкодер   CLK -> A2   CLK_Pin   0 нажата 1 нет
                      DT  -> A1   DT_Pin    0 нажата 1 нет
                      SW  -> A0   SW_Pin    0 нажата 1 нет
                      GND -> GND
                      +5V -> +5V                      
*/
// ============= Переменные  ====================================
// системные переменые
uint8_t mode_viev                 ; // 0 режим показа / 1 режим редактирования 
uint8_t stat_blink_mode_viev      ; // мигалка mode_viev 
uint8_t screen_number             ; // номер текущего демонстрируемого окна
const int number_of_screen = 9    ; // количество окон
uint8_t SW_data                   ; // результат функции SW_botton()
uint8_t Encoder_data              ; // результат функции Encoder()

uint8_t screen_number_inc(){
 if (screen_number < (number_of_screen-1)) screen_number++;
}
uint8_t screen_number_dec(){
 if (screen_number > 0) screen_number--;
}

// технологические переменые
uint8_t        Var_V1     = 50   ; // Переменная 1
const uint8_t  Var_V1_min = 0    ; // Переменная 1 min
const uint8_t  Var_V1_max = 100  ; // Переменная 1 maх
void Var_V1_inc(){
  if (Var_V1 < Var_V1_max) Var_V1++;
};
void Var_V1_dec(){
  if (Var_V1 > Var_V1_min) Var_V1--;
};

uint8_t Var_V2     = 50  ; // Переменная 2
const uint8_t Var_V2_min = 0    ; // Переменная 2 min
const uint8_t Var_V2_max = 100  ; // Переменная 2 maх
void Var_V2_inc(){
  if (Var_V2 < Var_V2_max) Var_V2++;
};
void Var_V2_dec(){
  if (Var_V2 > Var_V2_min) Var_V2--;
};

uint8_t Var_V3     = 50  ; // Переменная 3
uint8_t Var_V3_min = 0    ; // Переменная 3 min
uint8_t Var_V3_max = 100  ; // Переменная 3 maх
void Var_V3_inc(){
  if (Var_V3 < Var_V3_max) Var_V3++;
};
void Var_V3_dec(){
  if (Var_V3 > Var_V3_min) Var_V3--;
};
void Edit_Encoder_inc(){  // режим редактирования, энкодер в +
    switch (screen_number) {
      case 0:Var_V1_inc();break;    // инкремент переменой на экране 0 
      case 1:Var_V2_inc();break;    // инкремент переменой на экране 1
      case 2:Var_V3_inc();break;    // инкремент переменой на экране 2
      case 3:;break;  // инкремент переменой на экране 3
      case 4:;break;  // инкремент переменой на экране 4
      case 5:;break;  // инкремент переменой на экране 5
      case 6:;break;  // инкремент переменой на экране 6
      case 7:;break;  // инкремент переменой на экране 7
      case 8:Dev3_com();break;  // инкремент переменой на экране 8
    }
 }
 void Edit_Encoder_dec(){ // режим редактирования, энкодер в -
     switch (screen_number) {
      case 0:Var_V1_dec() ;break;  // декремент переменой на экране 0
      case 1:Var_V2_dec() ;break;  // декремент переменой на экране 1
      case 2:Var_V3_dec() ;break;  // декремент переменой на экране 2
      case 3:;break;  // декремент переменой на экране 3
      case 4:;break;  // декремент переменой на экране 4
      case 5:;break;  // декремент переменой на экране 5
      case 6:;break;  // декремент переменой на экране 6
      case 7:;break;  // декремент переменой на экране 7
      case 8:Dev3_com();break;  // декремент переменой на экране 8
 }
}
// ============= Устройство 1 =====================================
const int Dev1_Pin = 3 ;    //  вывод устройствa 1
void Dev1_ini(){            //  инициализация устройствa 1
}  
// ============= Устройство 2 =====================================
const int Dev2_Pin = 4 ;    //  вывод устройствa 2
void Dev2_ini(){            //  инициализация устройствa 2
}  
// ============= Устройство 3 =====================================
const int Dev3_Pin = 13;    //  нога устройствa 3
uint8_t   Dev3_stat ;   // состояние светодиода
void      Dev3_ini(){            //  инициализация устройствa 3
  pinMode(Dev3_Pin, OUTPUT);
  Dev3_stat =0;
  digitalWrite(Dev3_Pin, Dev3_stat);  
} 
void Dev3_com(){            //  исполнение команды  устройством 3
    Dev3_stat = !Dev3_stat;
  digitalWrite(Dev3_Pin, Dev3_stat); 
} 

// ============= Подключение LCD1602 по I2C =====================
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

void LCD_ini(){            //  инициализация дисплея
  mode_viev = 0          ; // установить режим редактирования
  stat_blink_mode_viev=0 ;
  screen_number  = 0     ; // показать экран 0
  lcd.init()             ;                     
  lcd.backlight()        ; // Включаем подсветку дисплея
}
void Stat_viev()     {     // показать на экране режим и номер окна
  lcd.setCursor(15, 0) ;  
  if (stat_blink_mode_viev&&mode_viev) lcd.print("E");   // показ значка обычный режим
                                  else lcd.print(" ");   // показ значка  режим редактирования  
  lcd.setCursor(15, 1) ;
  lcd.print(screen_number)  ;
}
  // ================ Экран 0 =======================================
void Screen0_viev()   {     // показать экран  0
  lcd.clear();
  lcd.print("V1 ") ;
  lcd.print(Var_V1) ;
}
// ================ Экран 1 =================================
void Screen1_viev()   {    // показать  экран  1
  lcd.clear();
  lcd.print("V2 ") ;
  lcd.print(Var_V2) ;
}
// ================ Экран 2 ===================================
void Screen2_viev()   {   // показать экран  2
  lcd.clear()   ;
  lcd.print("V3 ") ;
  lcd.print(Var_V3) ;
}
// ================ Экран 3 ====================================
void Screen3_viev()   {   // показать экран  3
  lcd.clear();
  lcd.print("*** ");
}
// ================ Экран 3 ====================================
void Screen4_viev()  {   // показать экран  4
  lcd.clear();
  lcd.print("*** ");
}

// ============= Экран 5 ======================================
void Screen5_viev()  {   // показать экран  5
  lcd.clear();
  lcd.print("*** ");
}

// =============== Экран 6 =====================================
void Screen6_viev()   {   // показать экран  6
  lcd.clear();
  lcd.print("*** ");
}

// ================== Экран 7 ====================================
void Screen7_viev()   {    //  показать  экран  7
  lcd.clear();
  lcd.print("*** ");
}
// ====================== Экран 8 ==================================
void Screen8_viev()   {   // показать экран  8
  lcd.clear(); 
  lcd.print("VD13 ");
  lcd.print(Dev3_stat);
}
void Viev(){
  switch (screen_number) {
      case 0:Screen0_viev();break; // показать экран устройствa 0
      case 1:Screen1_viev();break;  // показать экран устройствa 1
      case 2:Screen2_viev();break;  // показать экран устройствa 2
      case 3:Screen3_viev();break;  // показать экран устройствa 3
      case 4:Screen4_viev();break;  // показать экран устройствa 4
      case 5:Screen5_viev();break;  // показать экран устройствa 5
      case 6:Screen6_viev();break;  // показать экран устройствa 6
      case 7:Screen7_viev();break;  // показать экран устройствa 7
      case 8:Screen8_viev();break;  // показать экран устройствa 8
  }
  stat_blink_mode_viev = !stat_blink_mode_viev ;
  Stat_viev();
}
// ========== обработчик энкодера ===========================
const int CLK_Pin=A2  ;            // вывод CLK кнопки 0 нажата 1 нет
const int DT_Pin=A1   ;            // вывод DT  кнопки 0 нажата 1 нет
const int SW_Pin=A0   ;            // вывод кнопки 0 нажата 1 нет

uint8_t statCLK,statCLK_old ;      // переменные: состояние CLK вывода сейчас и раньше
uint32_t last_millis ;             // переменные: последний  millis

void Encoder_ini()         {       //  инициализация энкодера и кпопки в нем
  pinMode(SW_Pin, INPUT_PULLUP)  ; // вывод на ввод с подтягивающим резистром 
  pinMode(CLK_Pin, INPUT);
  pinMode(DT_Pin, INPUT); 
  statCLK_old = digitalRead(CLK_Pin); 
  last_millis = millis();
}
uint8_t Encoder(){
  statCLK = digitalRead(CLK_Pin);  
  if ((statCLK == 0)&&(statCLK_old ==1 )){ //  счет по фронту
     statCLK_old=statCLK;
     return (digitalRead(DT_Pin)+1);
    };
  statCLK_old=statCLK; 
  return 0;
}
uint8_t SW_botton(){
  if (digitalRead(SW_Pin)) {   // кнопка не нажата     
     last_millis = millis();
     return 0;
   }
   delay(30);
   while (digitalRead(SW_Pin) == 0);
   delay(30);
   if (last_millis+65 > millis()){ // ложное срабатывание
     last_millis = millis();
     return 0;
   }
   if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек
     last_millis = millis();
     return 1;
   }
   last_millis = millis(); // длинное нажатие больше 0.30 сек
   return 2;
}
// ========== функция выполнение без остановки программы ==================
uint8_t non_stop_program(uint16_t span) {
  static uint32_t future = 0;
  if (millis()<future) return 0;
  future += span;
  return 1;
}
// ======================= главная часть программы ========================
void setup() 
{  
  Serial.begin(9600)   ;   // Запускаем последовательный порт
  Encoder_ini()        ;   //  инициализация энкодера и кпопки в нем
  LCD_ini()            ;   //  инициализация дисплея
}
void loop()   {
 if (non_stop_program(500)) Viev() ;  // обновлять показание на экране раз 0.5 сек
   SW_data      = SW_botton() ;
   Encoder_data = Encoder() ;
   if  ((mode_viev == 0)&&(Encoder_data == 1))  screen_number_inc() ;
   if  ((mode_viev == 0)&&(Encoder_data == 2))  screen_number_dec(); 
   if  ((mode_viev == 1)&&(Encoder_data == 1))  Edit_Encoder_inc() ;
   if  ((mode_viev == 1)&&(Encoder_data == 2))  Edit_Encoder_dec();                                            
   if  (SW_data == 1)    mode_viev = ! mode_viev;
   if  (SW_data == 2) { mode_viev  = 0 ;
                        screen_number = 0; }
 }

#2 2017-12-30 16:55:24

boris102
Участник
Зарегистрирован: 2017-12-30
Сообщений: 2

Re: разработка Меню на LCD1602 и экодере.

Добрый день не поможете с созданием меню для шилда на PIC16F722A чипе с 4 кнопками
https://www.olimex.com/Products/Duino/Shields/SHIELD-LCD16x2/resources/Olimexino-328 LCD16x2.zip библиотека
http://mail.olimex.com/Products/Duino/Shields/SHIELD-LCD16x2/ сайт производителя и описание
ваш пример немного переделал . но кнопки ни знаю как активировать

#3 2017-12-30 16:59:08

boris102
Участник
Зарегистрирован: 2017-12-30
Сообщений: 2

Re: разработка Меню на LCD1602 и экодере.

а общий проект пытаюсь сделать погодозависимое управление 2х котлов в каскаде (котлы не модуляционные)

#4 2017-12-30 23:14:48

Nefreemen
Участник
Из Киев
Зарегистрирован: 2015-12-19
Сообщений: 665

Re: разработка Меню на LCD1602 и экодере.

boris102 пишет:

а общий проект пытаюсь сделать погодозависимое управление 2х котлов в каскаде (котлы не модуляционные)

Скромный вопрос, а зачем? Вам нужен микроклимат в доме или погода в доме lol ?  Раньше во многих импортных газовых котлах (не помню какого поколения) был вход под "погодный" датчик. Теперь такого входа я не видел. Наверное производители поняли глупость затеи  smile .

#5 2017-12-31 08:49:30

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 427

Re: разработка Меню на LCD1602 и экодере.

boris102 пишет:

Добрый день не поможете с созданием меню для шилда на PIC16F722A чипе с 4 кнопками
https://www.olimex.com/Products/Duino/Shields/SHIELD-LCD16x2/resources/Olimexino-328 LCD16x2.zip библиотека
http://mail.olimex.com/Products/Duino/Shields/SHIELD-LCD16x2/ сайт производителя и описание
ваш пример немного переделал . но кнопки ни знаю как активировать

Интересно как Вы "немного переделали", если у Вас ни HTPICC, ни XC8 не поддерживают С++? О millis() и прочих Ардуно фан-с я молчу.))

#6 2018-01-30 18:24:25

Семен
Гость

Re: разработка Меню на LCD1602 и экодере.

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

#7 2018-01-30 19:31:40

renoshnik
Участник
Зарегистрирован: 2017-04-03
Сообщений: 267

Re: разработка Меню на LCD1602 и экодере.

Семен пишет:

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

http://forum.arduino.ua/viewtopic.php?id=1069

#8 2018-01-30 22:14:32

Проходил мимо
Гость

Re: разработка Меню на LCD1602 и экодере.

Nefreemen пишет:
boris102 пишет:

а общий проект пытаюсь сделать погодозависимое управление 2х котлов в каскаде (котлы не модуляционные)

Скромный вопрос, а зачем? Вам нужен микроклимат в доме или погода в доме lol ?  Раньше во многих импортных газовых котлах (не помню какого поколения) был вход под "погодный" датчик. Теперь такого входа я не видел. Наверное производители поняли глупость затеи  smile .

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

#9 2018-01-30 23:15:30

Lic Control
Участник
Зарегистрирован: 2016-01-23
Сообщений: 71

Re: разработка Меню на LCD1602 и экодере.

Вячеслав Азаров пишет:
Проходил мимо пишет:

Действующий ДБН запрещается проектировать в новом строительстве котлы без этой функции.
Вот так...

А можно поподробнее що це за норма така? Газовий котел, с терморегулятром, можно сделать вообще без электроники. Я думаю, что и пеллетный тоже. Какую роль играет обязятельный внешний термометр в регулировании температуры и государственном порядке?

Да это так.
ДБН В.2.5-67:2013 ОПАЛЕННЯ, ВЕНТИЛЯЦІЯ ТА КОНДИЦІОНУВАННЯ
Вот этот пункт:

6.1.10.Приєднання системи водяного опалення (у тому числі фонової та чергової) будівлі (квартири при індивідуальному опаленні) будь-якого класу енергоефективності слід здійснювати з автоматичним регулюванням теплового потоку, залежним від погодних умов, якщо таке регулювання не передбачене у джерелі. При централізованому теплопостачанні згідно з ДБН В.2.5-39 кожен індивідуальний тепловий пункт (ІТП) повинен мати автоматичне регулювання теплового потоку, залежне від погодних умов.
У будівлі зі змінним тепловим режимом необхідно забезпечувати залежне від погодних умов автоматичне регулювання теплового потоку системи опалення з додатковим його коригуванням за усередненою температурою внутрішнього повітря або за температурою повітря у характерному за призначенням будівлі приміщенні, що має найбільші питомі тепловтрати. Рекомендується застосовувати коригування за другим способом.

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

#10 2018-01-31 00:16:11

Nefreemen
Участник
Из Киев
Зарегистрирован: 2015-12-19
Сообщений: 665

Re: разработка Меню на LCD1602 и экодере.

Вячеслав Азаров пишет:
Проходил мимо пишет:

Действующий ДБН запрещается проектировать в новом строительстве котлы без этой функции.
Вот так...

А можно поподробнее що це за норма така? Газовий котел, с терморегулятром, можно сделать вообще без электроники. Я думаю, что и пеллетный тоже. Какую роль играет обязятельный внешний термометр в регулировании температуры и государственном порядке?

Он "немножко" ввел в заблуждение (посмотрел ДБН по поводу газоснабжения, такого требования не нашел). Нельзя проектировать КОТЕЛЬНИ но не котлы. Не буду говорить за все газовые котлы, но котлы среднего ценового диапазона (с дорогими и навороченными дела не имел sad ) с "погодным" входом не попадались. В старых (еще с пневматикой) были входы smile . Поэтому наверное надо считать котел стоимостью от 15тис до 20тис "ненормальным" big_smile .
       А по большему счету зачем он? Он что оптимизирует КПД системы отопления от погоды? Ничего он подобного не сделает, а вот деньги из кармана точно "с оптимизирует". Если кто то сможет, объясните мне, я пойму (целый год в институте изучал тепловую физику smile и многое помню smile ).

#11 2018-01-31 11:26:33

Nefreemen
Участник
Из Киев
Зарегистрирован: 2015-12-19
Сообщений: 665

Re: разработка Меню на LCD1602 и экодере.

Lic Control пишет:
Вячеслав Азаров пишет:
Проходил мимо пишет:

Действующий ДБН запрещается проектировать в новом строительстве котлы без этой функции.
Вот так...

А можно поподробнее що це за норма така? Газовий котел, с терморегулятром, можно сделать вообще без электроники. Я думаю, что и пеллетный тоже. Какую роль играет обязятельный внешний термометр в регулировании температуры и государственном порядке?

Да это так.
ДБН В.2.5-67:2013 ОПАЛЕННЯ, ВЕНТИЛЯЦІЯ ТА КОНДИЦІОНУВАННЯ
Вот этот пункт:

6.1.10.Приєднання системи водяного опалення (у тому числі фонової та чергової) будівлі (квартири при індивідуальному опаленні) будь-якого класу енергоефективності слід здійснювати з автоматичним регулюванням теплового потоку, залежним від погодних умов, якщо таке регулювання не передбачене у джерелі. При централізованому теплопостачанні згідно з ДБН В.2.5-39 кожен індивідуальний тепловий пункт (ІТП) повинен мати автоматичне регулювання теплового потоку, залежне від погодних умов.
У будівлі зі змінним тепловим режимом необхідно забезпечувати залежне від погодних умов автоматичне регулювання теплового потоку системи опалення з додатковим його коригуванням за усередненою температурою внутрішнього повітря або за температурою повітря у характерному за призначенням будівлі приміщенні, що має найбільші питомі тепловтрати. Рекомендується застосовувати коригування за другим способом.

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

Интересно. Оказывается я не в том разделе искал. Но это детали. Но если внимательно прочесть то речь идет о автоматическом регулировании теплового потока и тут есть довольно интересные детали.  Можно было бы понять что все это относится в большей степени к котельням, потому что действительно для регулирования ее мощности нет обратной связи по температуре внутри квартир (потребителей). Но вот фраза "... будівлі (квартири при інд.опаленні) можно расценить двояко либо это многоквартирные дома или все таки и частные дома. Почему так попробую объяснить. Там где я работал (банк) преимущественно были русскоязычные работники, которые опять же в большей степени очень плохо владели украинским языком. Понимать то понимали а вот что то написать sad , были такие казусы что все ложились на пол, ржач полный, как вам например такое описание залогового имущества "...туалет на вісім окулярів". Почему так получалось? Банально, автоматический перевод big_smile. По моему здесь аналогичная ситуация "будівля" это обобщенный термин (под нее попадает и наружный "...туалет на вісім окулярів" lol ). Что имели ввиду "афтары" под этим термином известно только им. В частом доме (или квартире) с индивидуальным котлом (газовым) наличие погодного датчика (если есть внутренний термодатчик) не даст абсолютно ни какого эффекта. Вывод банальный, что очень часто люди пишущие какие то документы настолько далеки от темы что волосы шевелятся на лысой голове  smile .

#12 2018-01-31 14:04:42

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,396

Re: разработка Меню на LCD1602 и экодере.

"забезпечуючи наближену до лінійної залежність теплового потоку від рівня керуючого сигналу." 
можно я тут поржу? )   седельный кран врядли кто ставит. небось батерфляй понатыкивали.
или тут имели в виду линейную коррекцию графика  от температуры?     
что там дальше написано?

и насколько "наближену до..."  big_smile

#13 2018-01-31 17:09:22

Nefreemen
Участник
Из Киев
Зарегистрирован: 2015-12-19
Сообщений: 665

Re: разработка Меню на LCD1602 и экодере.

Чем больше раз перечитываю тем больше хочется сказать "шедеврально" и как в известном ролике "сказочные д...бы".

#14 2018-01-31 18:26:15

qwone
Участник
Зарегистрирован: 2016-07-25
Сообщений: 127

Re: разработка Меню на LCD1602 и экодере.

Нормальное явление. То что написано на мове, читать не обязательно. Так как там смысла нет. Потому что на ней пишут те кто или мовой не владеет и/или темой. Плохо то что документооборот идет на ней.

#15 2018-01-31 19:44:32

Lic Control
Участник
Зарегистрирован: 2016-01-23
Сообщений: 71

Re: разработка Меню на LCD1602 и экодере.

Вред приносишь ты, если хвалишь, но еще больше вреда — если порицаешь то, в чем сам мало смыслишь.
Леонардо да Винчи

#16 2018-01-31 22:10:20

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,396

Re: разработка Меню на LCD1602 и экодере.

qwone пишет:

Нормальное явление. То что написано на мове, читать не обязательно. Так как там смысла нет. Потому что на ней пишут те кто или мовой не владеет и/или темой. Плохо то что документооборот идет на ней.

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

да есть недочеты, приличный метролог мигом заметит "косяки"
с другой стороны Вы хоть один ГОСТ написали? )

"Плохо то что документооборот идет на ней." - обсолютно с вами согласен.
даеш документацию на немецком! - на самом логичном языке )

Редактировался NoName (2018-01-31 22:18:27)

#17 2018-02-01 07:03:15

qwone
Участник
Зарегистрирован: 2016-07-25
Сообщений: 127

Re: разработка Меню на LCD1602 и экодере.

NoName пишет:

да есть недочеты, приличный метролог мигом заметит "косяки"
с другой стороны Вы хоть один ГОСТ написали? )

Напьешься будешь https://www.youtube.com/watch?v=rZsQfssZxMs
Посадят писать - будешь писать. На любом предприятии есть всякие инструкции служебные записки -- внутрений документооборот. И ГОСТЫ пишут не только литераторы , а скорее совсем не литераторы. Так что не надо меня написанием ГОСТов пугать. И так регулярно подобную "литературу" приходится читать и расписываться в ознакомлении. Слава богу, что на русском.

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

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

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