Проблемы с библиотекой "IRremote.h"

DonVorlon
Offline
Зарегистрирован: 24.03.2016

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

Удачи!

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

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

Удачи!

Вот у нас почти смежные задачи. Надо просто протестировать другой пульт. Благо у меня их целый кулек. Переписать коды в "#define" и вперед! ))))

Насчет монетки: я-то точно бросил. Как я уже говорил: мое появление на этом ресурсе означает что я взялся за Си первый раз. Собрался-таки наконец )))

DonVorlon
Offline
Зарегистрирован: 24.03.2016

Я и сам за Си взялся пару месяцев назад, но выручает книга по С++ купленная 2001 году в прок. :)

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

Я и сам за Си взялся пару месяцев назад, но выручает книга по С++ купленная 2001 году в прок. :)

Так все равно я остал на 2 месяца ))))

А вот меня смущает тип переменной в параметре:

void key_dsp (String key)     // Отображаем символьное представление нажатой на пульте кнопки
{
  lcd.setCursor (5, 0);
  lcd.print ("          ");
  lcd.setCursor (5, 0);
  lcd.print (key);

}

 

Я просто по памяти притулил сюда (String key), но я тут читал что "String" это объект, а "string" - массив символов. А мне надо было просто получить что-то на экране в символьном виде, а в любимом "PL\1" String() это функция преобразования любого типа данных в симольный.

И я вот думаю - а не напутал ли я тут с этими типами?

DonVorlon
Offline
Зарегистрирован: 24.03.2016

String это конечно объект, и если его возможности е нужны то лучше использовать массив символов string. String занимает больше места в памяти чем string.

 
Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

String это конечно объект, и если его возможности е нужны то лучше использовать массив символов string. String занимает больше места в памяти чем string.

Это понятно. Но я интересовался немного не этим. Меня беспокоило то, что я так не по назначению использую непонятную мне "директиву", результат применения которой для меня остаётся "за кадром".

Другими словами - как мне в функцию передать символьную строку и как это может выглядеть с точки зрения синтаксиса языка Си?

-----------------------------

"string" не прошло:

Arduino: 1.6.8 Hourly Build 2016/02/19 10:33 (Windows 8), Плата:"Arduino/Genuino Uno"

IR_Move_Bar_Optimized:103: error: variable or field 'key_dsp' declared void

 void key_dsp (string key)     // Отображаем символьное представление нажатой на пульте кнопки

              ^

IR_Move_Bar_Optimized:103: error: 'string' was not declared in this scope

IR_Move_Bar_Optimized:103: error: variable or field 'key_dsp' declared void

 void key_dsp (string key)     // Отображаем символьное представление нажатой на пульте кнопки

               ^

IR_Move_Bar_Optimized:103: error: 'string' was not declared in this scope

C:\Users\Admin\Documents\Arduino\IR_Move_Bar_Optimized\IR_Move_Bar_Optimized.ino: In function 'void key_a()':

IR_Move_Bar_Optimized:127: error: 'key_dsp' was not declared in this scope

             key_dsp("VolUp");             // отобразить на дисплее симольное представление полученого кода кнопки

                            ^

IR_Move_Bar_Optimized:138: error: 'key_dsp' was not declared in this scope

              key_dsp("VolDown");

                               ^

IR_Move_Bar_Optimized:149: error: 'key_dsp' was not declared in this scope

       key_dsp("Up");

                   ^

exit status 1
variable or field 'key_dsp' declared void

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

 

DonVorlon
Offline
Зарегистрирован: 24.03.2016

Вот тут проявляется загадочность Ардуинки. Тип string есть, а слов таких не знает.

Определять его нужно как массив типа char [ ]

Вот тут подробно описанно. 

http://arduino.ru/Reference/String

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

Вот тут проявляется загадочность Ардуинки. Тип string есть, а слов таких не знает.

Определять его нужно как массив типа char [ ]

Вот тут подробно описанно. 

http://arduino.ru/Reference/String

 

Вместо:

void key_dsp (String key)

вот так прокатило только:

void key_dsp (char key[1])    

 

Ну и размер кода уменьшился почти на 1kb.

DonVorlon
Offline
Зарегистрирован: 24.03.2016

один, наверно, мало будет, нужно не менее 8 (7 длина самого длинного слова+1 для финального символа)

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Так, ну ладно.

А вот есть такие часики:

#include <LiquidCrystal.h>
 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
 
unsigned long millist = 0;
int hour = 0;
int minute = 0;
int second = 0;
int day_ard = 1;
boolean menu_b = false;
 
void setup()
{
  lcd.begin(16, 2);
 lcd.setCursor(0,0); 
}
 
void loop()
{
  menu();
 lcd.setCursor(0, 0);
 
  String day_name = day();
  lcd.print(day_name);
 
  String day_inf = info_day();
  if(day_inf.length() + day_name.length() >= 15)
 {
    lcd.setCursor(3, 0);
    lcd.print(".     ");
  }
 lcd.print("     ");
 lcd.setCursor(16 - day_inf.length(), 0);
  lcd.print(day_inf);
 
 
 lcd.setCursor(0, 1);
  inc_time();
 lcd.print("Time:   ");
  lcd.print(time());
 
  delay(200);
}
 
void inc_time()
{
 if(millis() < millist) millist = millis() + 200;
 int plus = (millis() - millist) / 1000;
 millist += plus * 1000;
 
 second += plus;
 
 time_control();
}
 
void time_control()
{
 if(second >= 60) {
    second -= 60;
   minute++;
 
   if(minute >= 60) {
      minute -= 60;
     hour++;
 
     if(hour >= 24) {
        hour -= 24;
       day_ard++;
 
        if(day_ard > 7) day_ard -= 7;
      }
   }
 } 
}
 
String time()
{
  String result = "";
 if(hour < 10) result += '0';
 result += String(hour) + ':';
 if(minute < 10) result += '0';
 result += String(minute) + ':';
 if(second < 10) result += '0';
 result += String(second);
 
 return result;
}
 
String day()
{
 String result;
 
  switch(day_ard)
 {
    case 1:
     result = "Monday";
      break;
    case 2:
     result = "Tuesday";
     break;
    case 3:
     result = "Wednesday";
     break;
    case 4:
     result = "Thursday";
      break;
    case 5:
     result = "Friday";
      break;
    case 6:
     result = "Saturday";
      break;
    case 7:
     result = "Sunday";
      break;
  }
 
 return result;
}
 
String info_day()
{
  String result;
 
  if(hour >= 5 && hour < 12) {
   result = "morning";
 } else if(hour >= 12 && hour < 13) {
   result = "noon";
  } else if(hour >= 13 && hour < 18) {
   result = "afternoon";
 } else if(hour >= 18 && hour < 22) {
   result = "evening";
 } else if(hour >= 22 && hour < 24) {
   result = "night";
 } else if(hour == 0) {
   result = "midnight";
  } else if(hour >= 1 && hour < 5) {
   result = "late night";
  }
 
 return result;
}
 
int read_LCD_buttons()
{
 int adc_key_in = analogRead(0);
 if (adc_key_in > 1000) return btnNONE;
 if (adc_key_in < 50)   return btnRIGHT; 
 if (adc_key_in < 250)  return btnUP;
 if (adc_key_in < 450)  return btnDOWN;
 if (adc_key_in < 650)  return btnLEFT;
 if (adc_key_in < 850)  return btnSELECT; 
 
  return btnNONE;
}
 
boolean settings()
{
  static int str_menu = 0; // 3 = day, 2 = hour, 1 =  minute, 0 = second
  int lcd_key = read_LCD_buttons();
 
 lcd.setCursor(0, 0);
  lcd.setCursor(0, 1);
  lcd.print(day());
 lcd.setCursor(3, 1);
  lcd.print(".    ");
 lcd.print(time());
 
  while(menu_b && lcd_key == btnNONE) {
    lcd_key = read_LCD_buttons();
 }
 
 switch (lcd_key)
  {
    case btnRIGHT:
    {
      if(str_menu > 0) str_menu--;
     break;
    }
   case btnLEFT:
   {
      if(str_menu < 3) str_menu++;
     break;
    }
   case btnUP:
   {
      switch(str_menu)
      {
        case 0: second++; break;
        case 1: minute++; break;
        case 2: hour++; break;
        case 3: day_ard++; break;
     }
 
     break;
    }
   case btnDOWN:
   {
      switch(str_menu)
      {
        case 0: second--; break;
        case 1: minute--; break;
        case 2: hour--; break;
        case 3: day_ard--; break;
     }
 
     break;
    }
   case btnSELECT:
   {
      menu_b = !menu_b;
 
     if(menu_b) {
       lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("SETTINGS  ");
        settings();
     } else {
       delay(200);
       return false;
     }
 
     break;
    }
 }
 
 time_control();
 
 delay(200);
 return true;
}
 
void menu()
{
  if(!menu_b) {
    if(read_LCD_buttons() == btnSELECT) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("SETTINGS  ");
      menu_b = !menu_b;
     delay(200);
   } else {
     return;
   }
 }
 
 while(settings());
  millist = millis();
}

 

Они работают, всё нормально, но у меня нет таких кнопок! Я решил приделать к ним управление с пульта, но у меня не получается задержаться на кнопке "btnSELECT".
Скетч в следующем посте, а то не влазит...

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Вот мой вариант:

#include <LiquidCrystal.h>
#include "IRremote.h"

#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

IRrecv irrecv(8);
decode_results results;

LiquidCrystal lcd (7, 6, 5, 4, 3, 2);
unsigned long millist = 0;
int hour = 0;
int minute = 0;
int second = 0;
int day_ard = 1;
boolean menu_b = false;

void setup()
{
  pinMode(9, OUTPUT);  //  ЗАДЕЙСТВОВАТЬ 9-фй ПИН как ВЫХОДНОЙ ШИМ
  analogWrite(9, 10);  // УСТАНОВИТЬ КОНТРАСТ на 9-ом пине в 10
//  pinMode(13, OUTPUT);
//  digitalWrite(13, LOW);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  
  irrecv.enableIRIn();
 // irrecv.resume();
  
}


void loop()
{
  menu();
  lcd.setCursor(0, 0);

  String day_name = day();
  lcd.print(day_name);

  String day_inf = info_day();
  if (day_inf.length() + day_name.length() >= 15)
  {
    lcd.setCursor(3, 0);
    lcd.print(".     ");
  }
  lcd.print("     ");
  lcd.setCursor(16 - day_inf.length(), 0);
  lcd.print(day_inf);


  lcd.setCursor(0, 1);
  inc_time();
  lcd.print("Time:   ");
  lcd.print(time());
  
  delay(200);
  
}




void inc_time()
{
  if (millis() < millist) millist = millis() + 200;
  int plus = (millis() - millist) / 1000;
  millist += plus * 1000;

  second += plus;

  time_control();
}




void time_control()
{
  if (second >= 60) {
    second -= 60;
    minute++;

    if (minute >= 60) {
      minute -= 60;
      hour++;

      if (hour >= 24) {
        hour -= 24;
        day_ard++;

        if (day_ard > 7) day_ard -= 7;
      }
    }
  }
}


String time()
{
  String result = "";
  if (hour < 10) result += '0';
  result += String(hour) + ':';
  if (minute < 10) result += '0';
  result += String(minute) + ':';
  if (second < 10) result += '0';
  result += String(second);

  return result;
}



String day()
{
  String result;

  switch (day_ard)
  {
    case 1:
      result = "Monday";
      break;
    case 2:
      result = "Tuesday";
      break;
    case 3:
      result = "Wednesday";
      break;
    case 4:
      result = "Thursday";
      break;
    case 5:
      result = "Friday";
      break;
    case 6:
      result = "Saturday";
      break;
    case 7:
      result = "Sunday";
      break;
  }

  return result;
}



String info_day()
{
  String result;

  if (hour >= 5 && hour < 12) {
    result = "morning";
  } else if (hour >= 12 && hour < 13) {
    result = "noon";
  } else if (hour >= 13 && hour < 18) {
    result = "afternoon";
  } else if (hour >= 18 && hour < 22) {
    result = "evening";
  } else if (hour >= 22 && hour < 24) {
    result = "night";
  } else if (hour == 0) {
    result = "midnight";
  } else if (hour >= 1 && hour < 5) {
    result = "late night";
  }

  return result;
}




int read_LCD_buttons()
 {
//  int adc_key_in = results.value;
  if (irrecv.decode(&results))
    {
 
 
// lcd.setCursor (6,1);
// lcd.write (results.value);
 
      if (results.value == 0)       return btnNONE;
      if (results.value == 5665)    return btnRIGHT; 
      if (results.value == 26145)   return btnUP;
      if (results.value == 9761)    return btnDOWN;
      if (results.value == 22049)   return btnLEFT;
      if (results.value == 17441)   return btnSELECT;
          return btnNONE;
       
    }

}

 
  boolean settings()
  {
    static int str_menu = 0; // 3 = day, 2 = hour, 1 =  minute, 0 = second
    int lcd_key = read_LCD_buttons();
     
    lcd.setCursor(0, 0);
    lcd.setCursor(0, 1);
    lcd.print(day());
    lcd.setCursor(3, 1);
    lcd.print(".    ");
    lcd.print(time());

    while (menu_b && lcd_key == btnNONE) {
      lcd_key = read_LCD_buttons();
      
    }

    switch (lcd_key)
    {
      case btnRIGHT:
        {
          if (str_menu > 0) str_menu--;
          break;
        }
      case btnLEFT:
        {
          if (str_menu < 3) str_menu++;
          break;
        }
      case btnUP:
        {
          switch (str_menu)
          {
            case 0: second++; break;
            case 1: minute++; break;
            case 2: hour++; break;
            case 3: day_ard++; break;
          }

          break;
        }
      case btnDOWN:
        {
          switch (str_menu)
          {
            case 0: second--; break;
            case 1: minute--; break;
            case 2: hour--; break;
            case 3: day_ard--; break;
          }

          break;
        }
      case btnSELECT:
        {
          menu_b = !menu_b;

          if (menu_b) {
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("SETTINGS  ");
            settings();
          } else {
            delay(200);
            return false;
          }

          break;
          
        }
         
    }

    time_control();

    delay(200);
    return true;
  }


//


  void menu()
  {
    if (!menu_b) {
      if (read_LCD_buttons() == btnSELECT) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("SETTINGS  ");
        menu_b = !menu_b;
        delay(200);
      } else {
        
        return;
        
      }
      
    }

    while (settings());
    millist = millis();
    irrecv.resume();
  }

 

Судя из описания, сначала отслеживается только кнопка "btnSELECT" для перевода программы в режим корреткировки времени. Но как только я ее нажимаю, дисплей начинает мигать с частотой "delay(500)" между обоими режимами. Я не могу никак понять где мне ставить "irrecv.resume();"
Есть какие-нибудь идеи?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

один, наверно, мало будет, нужно не менее 8 (7 длина самого длинного слова+1 для финального символа)

Я так понял что что "key[1]" означает номер элемента массива, а не его длину. Всё работет кстати и так. Все названия отображаются корректно...

DonVorlon
Offline
Зарегистрирован: 24.03.2016

irrecv.resume(); следует поместить на 184 строчку. 

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

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

irrecv.resume(); следует поместить на 184 строчку. 

Я сделал ПОЧТИ так:

int read_LCD_buttons()
 {
  
  if (irrecv.decode(&results))
    {
    int adc_key_in = results.value;
    irrecv.resume();
 
// lcd.setCursor (6,1);
// lcd.write (results.value);
 
      if (adc_key_in == 0)       return btnNONE;
      if (adc_key_in == 5665)    return btnRIGHT; 
      if (adc_key_in == 26145)   return btnUP;
      if (adc_key_in == 9761)    return btnDOWN;
      if (adc_key_in == 22049)   return btnLEFT;
      if (adc_key_in == 17441)   return btnSELECT;
          return btnNONE;
       
    }

}

 

Единственное что я добавил - это сохранил результат считывания в переменной int adc_key_in = results.value; Это ведь не сильно повлияет? В общем - в меню заходит, но регулирует только секунды почему-то. Больше ни на какие кнопки не реагирует. Тоесть работают только события: "btnUP" и "btnDOWN"

----------------------------------

Вот описание работы:

Простые часы с использованием 1602 LCD Keypad Shield и Arduino. На экране показывается время (часы, минуты и секунды) , день недели и дополнительная информация (показывает morning, noon, afternoon, evening, night, midnight, late night в зависимости от времени) в правом верхнем углу. Также время можно настроить, вот значения кнопок для настройки:
SELECT — Войти в настройки / Сохранить и выйти из настроек
LEFT, RIGHT — Переместить указатель редактирования (если редактируются секунды и нажать на LEFT, то будут редактироваться минуты и т.д.)
UP, DOWN — Увеличить редактируемое значение / Уменьшить редактируемое значение

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

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

Вот текущий скетч:

#include <LiquidCrystal.h>
#include "IRremote.h"

#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

IRrecv irrecv(8);
decode_results results;

LiquidCrystal lcd (7, 6, 5, 4, 3, 2);
unsigned long millist = 0;
int hour = 0;
int minute = 0;
int second = 0;
int day_ard = 1;
boolean menu_b = false;

void setup()
{
  pinMode(9, OUTPUT);  //  ЗАДЕЙСТВОВАТЬ 9-фй ПИН как ВЫХОДНОЙ ШИМ
  analogWrite(9, 10);  // УСТАНОВИТЬ КОНТРАСТ на 9-ом пине в 10
//  pinMode(13, OUTPUT);
//  digitalWrite(13, LOW);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  
  irrecv.enableIRIn();
 // irrecv.resume();
  
}


void loop()
{
  menu();
  lcd.setCursor(0, 0);

  String day_name = day();
  lcd.print(day_name);

  String day_inf = info_day();
  if (day_inf.length() + day_name.length() >= 15)
  {
    lcd.setCursor(3, 0);
    lcd.print(".     ");
  }
  lcd.print("     ");
  lcd.setCursor(16 - day_inf.length(), 0);
  lcd.print(day_inf);


  lcd.setCursor(0, 1);
  inc_time();
  lcd.print("Time:   ");
  lcd.print(time());
  
  delay(200);
  
}




void inc_time()
{
  if (millis() < millist) millist = millis() + 200;
  int plus = (millis() - millist) / 1000;
  millist += plus * 1000;

  second += plus;

  time_control();
}




void time_control()
{
  if (second >= 60) {
    second -= 60;
    minute++;

    if (minute >= 60) {
      minute -= 60;
      hour++;

      if (hour >= 24) {
        hour -= 24;
        day_ard++;

        if (day_ard > 7) day_ard -= 7;
      }
    }
  }
}


String time()
{
  String result = "";
  if (hour < 10) result += '0';
  result += String(hour) + ':';
  if (minute < 10) result += '0';
  result += String(minute) + ':';
  if (second < 10) result += '0';
  result += String(second);

  return result;
}



String day()
{
  String result;

  switch (day_ard)
  {
    case 1:
      result = "Monday";
      break;
    case 2:
      result = "Tuesday";
      break;
    case 3:
      result = "Wednesday";
      break;
    case 4:
      result = "Thursday";
      break;
    case 5:
      result = "Friday";
      break;
    case 6:
      result = "Saturday";
      break;
    case 7:
      result = "Sunday";
      break;
  }

  return result;
}



String info_day()
{
  String result;

  if (hour >= 5 && hour < 12) {
    result = "morning";
  } else if (hour >= 12 && hour < 13) {
    result = "noon";
  } else if (hour >= 13 && hour < 18) {
    result = "afternoon";
  } else if (hour >= 18 && hour < 22) {
    result = "evening";
  } else if (hour >= 22 && hour < 24) {
    result = "night";
  } else if (hour == 0) {
    result = "midnight";
  } else if (hour >= 1 && hour < 5) {
    result = "late night";
  }

  return result;
}




int read_LCD_buttons()
 {
  
  if (irrecv.decode(&results))
    {
    int adc_key_in = results.value;
    irrecv.resume();
 
// lcd.setCursor (6,1);
// lcd.write (results.value);
 
      if (adc_key_in == 0)       return btnNONE;
      if (adc_key_in == 5665)    return btnRIGHT; 
      if (adc_key_in == 26145)   return btnUP;
      if (adc_key_in == 9761)    return btnDOWN;
      if (adc_key_in == 22049)   return btnLEFT;
      if (adc_key_in == 17441)   return btnSELECT;
          return btnNONE;
       
    }

}

 
  boolean settings()
  {
    static int str_menu = 0; // 3 = day, 2 = hour, 1 =  minute, 0 = second
    int lcd_key = read_LCD_buttons();
     
    lcd.setCursor(0, 0);
    lcd.setCursor(0, 1);
    lcd.print(day());
    lcd.setCursor(3, 1);
    lcd.print(".    ");
    lcd.print(time());

    while (menu_b && lcd_key == btnNONE) {
      lcd_key = read_LCD_buttons();
      
    }

    switch (lcd_key)
    {
      case btnRIGHT:
        {
          if (str_menu > 0) str_menu--;
          break;
        }
      case btnLEFT:
        {
          if (str_menu < 3) str_menu++;
          break;
        }
      case btnUP:
        {
          switch (str_menu)
          {
            case 0: second++; break;
            case 1: minute++; break;
            case 2: hour++; break;
            case 3: day_ard++; break;
          }

          break;
        }
      case btnDOWN:
        {
          switch (str_menu)
          {
            case 0: second--; break;
            case 1: minute--; break;
            case 2: hour--; break;
            case 3: day_ard--; break;
          }

          break;
        }
      case btnSELECT:
        {
          menu_b = !menu_b;

          if (menu_b) {
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("SETTINGS  ");
            settings();
          } else {
            delay(200);
            return false;
          }

          break;
          
        }
         
    }

    time_control();

    delay(200);
    return true;
  }


//


  void menu()
  {
    if (!menu_b) {
      if (read_LCD_buttons() == btnSELECT) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("SETTINGS  ");
        menu_b = !menu_b;
        delay(200);
      } else {
       
        return;
        
      }
       
    }

    while (settings());
    millist = millis();
    
  }

 

DonVorlon
Offline
Зарегистрирован: 24.03.2016

а кнопки Право и Лево работают - str_menu меняется?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

а кнопки Право и Лево работают - str_menu меняется?

Нет же, не работают эти кнопки! Работают только вверх и вниз и "btnSelect"!

Можно выставить только секунды и вернуться в режим отображения. Навигация по пунктам меню не работает.

А как отследить str_menu? Вывести его где-то? Да и кнопки отследить не мешало бы.... Сейчас придумаю.... Только я долго буду думать )))) В каком месте программы мне вывести нажатую кнопку?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Надо в терминал выводить. На дисплее уже места нет. Сейчас посмотрим что оно там "нажимает"....

DonVorlon
Offline
Зарегистрирован: 24.03.2016

Можно выводить в ком порт на комп. 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

Можно выводить в ком порт на комп. 

Кнопки нажимаются все как положено.

int read_LCD_buttons()
 {
  
  if (irrecv.decode(&results))
    {
      
 
    int adc_key_in = results.value;
    irrecv.resume();
 Serial.print("key: ");
 Serial.print(adc_key_in);
 Serial.println(" ");
 
      if (adc_key_in == 0)       return btnNONE;
      if (adc_key_in == 5665)    return btnRIGHT; 
      if (adc_key_in == 26145)   return btnUP;
      if (adc_key_in == 9761)    return btnDOWN;
      if (adc_key_in == 22049)   return btnLEFT;
      if (adc_key_in == 17441)   return btnSELECT;
          return btnNONE;
       
    }

}

Меню работает, но меняются все равно только секунды:
erial Begin
key: 17441
key: 20769
str_menu: 0
key: 22049
key: 22049
key: 22049
key: 22049
key: 20769
str_menu: 2
key: 26145
key: 26145
key: 26145
key: 26145
key: 26145
key: 26145
key: 20769
str_menu: 0
key: 22049
key: 22049
key: 20769
str_menu: 2
key: 22049
key: 22049
key: 22049
key: 22049
key: 22049
key: 22049
key: 20769
str_menu: 3
key: 26145
key: 26145
key: 26145
key: 26145

DonVorlon
Offline
Зарегистрирован: 24.03.2016

str_menu  следует отследить т.к. именно от этой переменной зависит  режим меню

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

str_menu  следует отследить т.к. именно от этой переменной зависит  режим меню

Переменная "str_menu" меняется, но как-то странно: при нажатии только на кнопку "Вправо", значение может хаотично меняться от 0 до 3. даже при значиении 3 все равно регулируются только секунды. Может я не там проверку поставил?

 while (menu_b && lcd_key == btnNONE) {
      lcd_key = read_LCD_buttons();
 Serial.print("str_menu: ");
 Serial.print(str_menu);
 Serial.println(" ");      
    }

    switch (lcd_key)
    {
      case btnRIGHT:
        {
          if (str_menu > 0) str_menu--;
          break;
        }

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Удалось перескочить на минуты и часы. Но если их порегулировал немного, "str_menu" опять сваливается на секунды... Похоже что проблема в порциях кода с пульта и еще эта комманда "конца" мешается...

Даже удалось день недели поменять, но это я случайно попал на него, потому что на экранном меню никак нельзя узнать на какой позиции ты сейчас находишься...

DonVorlon
Offline
Зарегистрирован: 24.03.2016

может посветить курсором позицию, я у себя в меню делал именно так.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

может посветить курсором позицию, я у себя в меню делал именно так.

Подсветить можно. Только как убрать эти порции посылок с пульта.... Сейчас подумаю как курсор туда приделать...

А где можно посмотреть формать комманд "lcd.noCursor" и "lcd.Cursor" В примерах только "Хэлло Мир"....

DonVorlon
Offline
Зарегистрирован: 24.03.2016
    if (!edit_mode) {
      lcd.noCursor();
      lcd.noBlink();
    }
    else {
      lcd.cursor();
      lcd.blink();
    }
 
только позицию курсора нужно контролировать.
Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

    if (!edit_mode) {
      lcd.noCursor();
      lcd.noBlink();
    }
    else {
      lcd.cursor();
      lcd.blink();
    }
 
только позицию курсора нужно контролировать.

Спасибо, попробую. Только "курсор" в понимании IDE - это целый мигающий кубик, а я думал что это такая тонкая полоска на нижнем ряду точек под кубиком. Наверно при 4-х битном подключении такой курсор недоступен.

Так. "if (!edit_mode)" - это я не понимаю что за условие. Помоему тут проще отслеживать так:

if (str_menu==0) {

lcd.setCursor(14, 1)

lcd.cursor()

{

или что-то вроде этого...

DonVorlon
Offline
Зарегистрирован: 24.03.2016

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

DonVorlon
Offline
Зарегистрирован: 24.03.2016

доступен. у меня 4-х битка на поливалке. так там подчеркивание в качестве курсора

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

доступен. у меня 4-х битка на поливалке. так там подчеркивание в качестве курсора

У меня - кубик. Может я что неправильно написал, но... :

if (str_menu==0)
{
lcd.setCursor(14, 1);
lcd.cursor();
lcd.blink();
}

А вот если убрать "lcd.blink();" - тогда подчеркивание, но не мигающее. Тоже устраивает, если под двоеточием поместить.

DonVorlon
Offline
Зарегистрирован: 24.03.2016

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

DonVorlon
Offline
Зарегистрирован: 24.03.2016

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

DonVorlon
Offline
Зарегистрирован: 24.03.2016

Мне пора - завтра будет интересный день, удачи в поисках.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

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

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

Мне пора - завтра будет интересный день, удачи в поисках.

Да, спокойной ночи и спасибо!

DonVorlon
Offline
Зарегистрирован: 24.03.2016

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

Удачи.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

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

Удачи.

Победил я-таки эти часики. Хотя счтаю что помогло чистое везение. Судите сами.

Курсор постоянно стремится вправо потому что переменная "str_menu" постоянно декрементируется. Исходя из текста программы, это происходит только в одном месте:



case btnRIGHT:
      {
        if (str_menu > 0) str_menu--;
        break;
      }

Ну я решил не гадать на кофейной гуще и вставил в скобки по этому "case"  мигание 13-ым пином:



case btnRIGHT:
      {
        if (str_menu > 0) str_menu--;

        digitalWrite(13, 1);
        delay(200);
        digitalWrite(13, 0);

        break;
      }

Как ни странно, но светодиод замигал! Я уже и начальное значение переменной "str_menu"  изменил с "0" на "3", но куроср преспокойно поскакал вправо! Непонятно... 

Потом я решил обратить внимание на константу "btnRIGHT" и подумал что все равно "#define" все до единого  отфанарные  и  сдвинул все значения на еденицу, что бы убрать ноль с "btnRIGHT":



#define btnRIGHT  1
#define btnUP     2
#define btnDOWN   3
#define btnLEFT   4
#define btnSELECT 5
#define btnNONE   6

Курсор бегать перестал, "case" перестал реагировать на обнуленную "btnRIGHT" и вообще все стали очень счастливы!

Монетка в копилочку опыта: "switch-case" не любит (или слишком любит!) нулевых значений в списке. Ну или что-то типа того.

DonVorlon
Offline
Зарегистрирован: 24.03.2016

Рад. что все разрешилось, но не понятно для меня почему ноль не подходил. На досуге, погуглю этот вопрос обязательно.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DonVorlon пишет:

Рад. что все разрешилось, но не понятно для меня почему ноль не подходил. На досуге, погуглю этот вопрос обязательно.

Скорее всего это какие-то особенности ипользования библиотеки "IRremote.h". Потому что я не думаю что бы автор выкладывал неотлаженный скетч, а у него кнопки-то аналоговые!

DonVorlon
Offline
Зарегистрирован: 24.03.2016

Возможно, потому как я и сам этот код переделывал под свои нужды. В последствии осталась только эта функция обслуживания клавиатуры. И у меня не было такой проблемы, но бывает кнопки ложно срабатывают.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Выкладываю финальную и полностью работоспособную, с точки зрения управления, версию этого скетча. Однако же я там еще не расковырял дальше. Например не отследил что бы элементы корректировки не выходили  за допустимые значения. Но это те участки программы, которые я не трогал и все претензии к автору. 

На досуге поковыряю еще, но уже чисто в развивающих целях.

Отдельная и огромная благодарность DonVorlon , без которого я так далеко бы не продвинулся!

Так же выражаю благодарность всем, кто не прошел мимо и высказался в плане критики и помощи советом. Особенно душевно отозвался kisoft !!!

Спасибо и тебе, дружище!

#include <LiquidCrystal.h>
#include "IRremote.h"

#define btnRIGHT  1
#define btnUP     2
#define btnDOWN   3
#define btnLEFT   4
#define btnSELECT 5
#define btnNONE   6

IRrecv irrecv(8);
decode_results results;

LiquidCrystal lcd (7, 6, 5, 4, 3, 2);
unsigned long millist = 0;
int hour = 0;
int minute = 0;
int second = 0;
int day_ard = 1;
boolean menu_b = false;

void setup()
{
  pinMode(9, OUTPUT);  //  ЗАДЕЙСТВОВАТЬ 9-фй ПИН как ВЫХОДНОЙ ШИМ
  analogWrite(9, 10);  // УСТАНОВИТЬ КОНТРАСТ на 9-ом пине в 10
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);

 //  Serial.begin(9600); // Выставляем скорость COM порта
 //  Serial.println("Serial Begin");

  irrecv.enableIRIn();
  // irrecv.resume();

}


void loop()
{
  menu();
  lcd.setCursor(0, 0);

  String day_name = day();
  lcd.print(day_name);

  String day_inf = info_day();
  if (day_inf.length() + day_name.length() >= 15)
  {
    lcd.setCursor(3, 0);
    lcd.print(".     ");
  }
  lcd.print("     ");
  lcd.setCursor(16 - day_inf.length(), 0);
  lcd.print(day_inf);


  lcd.setCursor(0, 1);
  inc_time();
  lcd.print("Time:   ");
  lcd.print(time());

  delay(200);

}




void inc_time()
{
  if (millis() < millist) millist = millis() + 200;
  int plus = (millis() - millist) / 1000;
  millist += plus * 1000;

  second += plus;

  time_control();
}




void time_control()
{
  if (second >= 60) {
    second -= 60;
    minute++;

    if (minute >= 60) {
      minute -= 60;
      hour++;

      if (hour >= 24) {
        hour -= 24;
        day_ard++;

        if (day_ard > 7) day_ard -= 7;
      }
    }
  }
}


String time()
{
  String result = "";
  if (hour < 10) result += '0';
  result += String(hour) + ':';
  if (minute < 10) result += '0';
  result += String(minute) + ':';
  if (second < 10) result += '0';
  result += String(second);

  return result;
}



String day()
{
  String result;

  switch (day_ard)
  {
    case 1:
      result = "Monday";
      break;
    case 2:
      result = "Tuesday";
      break;
    case 3:
      result = "Wednesday";
      break;
    case 4:
      result = "Thursday";
      break;
    case 5:
      result = "Friday";
      break;
    case 6:
      result = "Saturday";
      break;
    case 7:
      result = "Sunday";
      break;
  }

  return result;
}



String info_day()
{
  String result;

  if (hour >= 5 && hour < 12) {
    result = "morning";
  } else if (hour >= 12 && hour < 13) {
    result = "noon";
  } else if (hour >= 13 && hour < 18) {
    result = "afternoon";
  } else if (hour >= 18 && hour < 22) {
    result = "evening";
  } else if (hour >= 22 && hour < 24) {
    result = "night";
  } else if (hour == 0) {
    result = "midnight";
  } else if (hour >= 1 && hour < 5) {
    result = "late night";
  }

  return result;
}




int read_LCD_buttons()
{

  if (irrecv.decode(&results))
  {


    int adc_key_in = results.value;
    irrecv.resume();
    // Serial.print("key: ");
    //Serial.print(adc_key_in);
    // Serial.println(" ");

    if (adc_key_in == 0)       return btnNONE;
    if (adc_key_in == 5665)    return btnRIGHT;
    if (adc_key_in == 26145)   return btnUP;
    if (adc_key_in == 9761)    return btnDOWN;
    if (adc_key_in == 22049)   return btnLEFT;
    if (adc_key_in == 17441)   return btnSELECT;

/*  if (adc_key_in == 0)       return btnNONE;
    if (adc_key_in == 12495)    return btnRIGHT;
    if (adc_key_in == -28561)   return btnUP;
    if (adc_key_in == -30601)    return btnDOWN;
    if (adc_key_in == 28815)   return btnLEFT;
    if (adc_key_in == -20401)   return btnSELECT; 
*/
    return btnNONE;

  }

}


boolean settings()
{
  static int str_menu = 0; // 3 = day, 2 = hour, 1 =  minute, 0 = second
  int lcd_key = read_LCD_buttons();
  
  lcd.setCursor(0, 0);
  lcd.setCursor(0, 1);
  lcd.print(day());
  lcd.setCursor(3, 1);
  lcd.print(".    ");
  lcd.print(time());

   while (menu_b && lcd_key == btnNONE) {
  
    lcd_key = read_LCD_buttons();
  //   Serial.print("str_menu: ");
  //   Serial.print(str_menu);
  //   Serial.println(" ");
  }
  if (str_menu == 0)
  {
    lcd.setCursor(14, 1);
    lcd.cursor();
  }
  if (str_menu == 1)
  {
    lcd.setCursor(11, 1);
    lcd.cursor();
  }
  if (str_menu == 2)
  {
    lcd.setCursor(8, 1);
    lcd.cursor();
  }
  if (str_menu == 3)
  {
    lcd.setCursor(0, 1);
    lcd.cursor();
  }
  switch (lcd_key)
  {
    case btnRIGHT:
      {
        if (str_menu > 0) str_menu--;
        break;
      }
    case btnLEFT:
      {
        if (str_menu < 3) str_menu++;
        break;
      }  
    case btnUP:
      {
        switch (str_menu)
        {
          case 0: second++; break;
          case 1: minute++; break;
          case 2: hour++; break;
          case 3: day_ard++; break;
        }

        break;
      }
    case btnDOWN:
      {
        switch (str_menu)
        {
          case 0: second--; break;
          case 1: minute--; break;
          case 2: hour--; break;
          case 3: day_ard--; break;
        }

        break;
      }
    case btnSELECT:
      {
        menu_b = !menu_b;

        if (menu_b) {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("SETTINGS  ");
          settings();
        } else {
          delay(200);
          return false;
        }

        break;

      }

  }

  time_control();

  delay(200);
  return true;
}


//


void menu()
{
  if (!menu_b) {
    if (read_LCD_buttons() == btnSELECT) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("SETTINGS  ");
      menu_b = !menu_b;
      delay(200);
    } else {

      return;

    }

  }

  while (settings());
  millist = millis();

}