Я собираюсь использовать пульт в замен клавиатуры для упрвления устройством, только пульт еще не доставили. Думаю сегодня каждый сможет бросить "монетку" в копилку опыта.
Я собираюсь использовать пульт в замен клавиатуры для упрвления устройством, только пульт еще не доставили. Думаю сегодня каждый сможет бросить "монетку" в копилку опыта.
Удачи!
Вот у нас почти смежные задачи. Надо просто протестировать другой пульт. Благо у меня их целый кулек. Переписать коды в "#define" и вперед! ))))
Насчет монетки: я-то точно бросил. Как я уже говорил: мое появление на этом ресурсе означает что я взялся за Си первый раз. Собрался-таки наконец )))
Я просто по памяти притулил сюда (String key), но я тут читал что "String" это объект, а "string" - массив символов. А мне надо было просто получить что-то на экране в символьном виде, а в любимом "PL\1" String() это функция преобразования любого типа данных в симольный.
И я вот думаю - а не напутал ли я тут с этими типами?
String это конечно объект, и если его возможности е нужны то лучше использовать массив символов string. String занимает больше места в памяти чем string.
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.
#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".
Скетч в следующем посте, а то не влазит...
#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();"
Есть какие-нибудь идеи?
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 — Увеличить редактируемое значение / Уменьшить редактируемое значение
а кнопки Право и Лево работают - str_menu меняется?
Нет же, не работают эти кнопки! Работают только вверх и вниз и "btnSelect"!
Можно выставить только секунды и вернуться в режим отображения. Навигация по пунктам меню не работает.
А как отследить str_menu? Вывести его где-то? Да и кнопки отследить не мешало бы.... Сейчас придумаю.... Только я долго буду думать )))) В каком месте программы мне вывести нажатую кнопку?
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;
}
Удалось перескочить на минуты и часы. Но если их порегулировал немного, "str_menu" опять сваливается на секунды... Похоже что проблема в порциях кода с пульта и еще эта комманда "конца" мешается...
Даже удалось день недели поменять, но это я случайно попал на него, потому что на экранном меню никак нельзя узнать на какой позиции ты сейчас находишься...
Спасибо, попробую. Только "курсор" в понимании IDE - это целый мигающий кубик, а я думал что это такая тонкая полоска на нижнем ряду точек под кубиком. Наверно при 4-х битном подключении такой курсор недоступен.
Так. "if (!edit_mode)" - это я не понимаю что за условие. Помоему тут проще отслеживать так:
про пульт. очищать код кнопки сразу после обработки нажатия. и не реагировать на новые коды пока переменная кнопки не обнулена. так будет игнорить дребезг и левые коды наверно тоже.
Курсор ведет себя очень странно: пока жмёшь кнопку вправо он бежит вправо. Как только бросил - сам возвращается обратно. Причем пошагово, то есть значения переменной убавляются на 1 за каждый какой-то цикл.
если позиция курсора хранится в переменной, то ее уменьшает кокая то строка - факт. нужно смотреть там. я пока у себя меню наладил каждый фрагмент кода проверял сбрасывая переменные в сериал.
если позиция курсора хранится в переменной, то ее уменьшает кокая то строка - факт. нужно смотреть там. я пока у себя меню наладил каждый фрагмент кода проверял сбрасывая переменные в сериал.
Удачи.
Победил я-таки эти часики. Хотя счтаю что помогло чистое везение. Судите сами.
Курсор постоянно стремится вправо потому что переменная "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":
Рад. что все разрешилось, но не понятно для меня почему ноль не подходил. На досуге, погуглю этот вопрос обязательно.
Скорее всего это какие-то особенности ипользования библиотеки "IRremote.h". Потому что я не думаю что бы автор выкладывал неотлаженный скетч, а у него кнопки-то аналоговые!
Возможно, потому как я и сам этот код переделывал под свои нужды. В последствии осталась только эта функция обслуживания клавиатуры. И у меня не было такой проблемы, но бывает кнопки ложно срабатывают.
Выкладываю финальную и полностью работоспособную, с точки зрения управления, версию этого скетча. Однако же я там еще не расковырял дальше. Например не отследил что бы элементы корректировки не выходили за допустимые значения. Но это те участки программы, которые я не трогал и все претензии к автору.
На досуге поковыряю еще, но уже чисто в развивающих целях.
Отдельная и огромная благодарность 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();
}
Я собираюсь использовать пульт в замен клавиатуры для упрвления устройством, только пульт еще не доставили. Думаю сегодня каждый сможет бросить "монетку" в копилку опыта.
Удачи!
Я собираюсь использовать пульт в замен клавиатуры для упрвления устройством, только пульт еще не доставили. Думаю сегодня каждый сможет бросить "монетку" в копилку опыта.
Удачи!
Вот у нас почти смежные задачи. Надо просто протестировать другой пульт. Благо у меня их целый кулек. Переписать коды в "#define" и вперед! ))))
Насчет монетки: я-то точно бросил. Как я уже говорил: мое появление на этом ресурсе означает что я взялся за Си первый раз. Собрался-таки наконец )))
Я и сам за Си взялся пару месяцев назад, но выручает книга по С++ купленная 2001 году в прок. :)
Я и сам за Си взялся пару месяцев назад, но выручает книга по С++ купленная 2001 году в прок. :)
Так все равно я остал на 2 месяца ))))
А вот меня смущает тип переменной в параметре:
Я просто по памяти притулил сюда (String key), но я тут читал что "String" это объект, а "string" - массив символов. А мне надо было просто получить что-то на экране в символьном виде, а в любимом "PL\1" String() это функция преобразования любого типа данных в симольный.
И я вот думаю - а не напутал ли я тут с этими типами?
String это конечно объект, и если его возможности е нужны то лучше использовать массив символов string. String занимает больше места в памяти чем string.
String это конечно объект, и если его возможности е нужны то лучше использовать массив символов string. String занимает больше места в памяти чем string.
Это понятно. Но я интересовался немного не этим. Меня беспокоило то, что я так не по назначению использую непонятную мне "директиву", результат применения которой для меня остаётся "за кадром".
Другими словами - как мне в функцию передать символьную строку и как это может выглядеть с точки зрения синтаксиса языка Си?
-----------------------------
"string" не прошло:
Вот тут проявляется загадочность Ардуинки. Тип string есть, а слов таких не знает.
Определять его нужно как массив типа char [ ]
Вот тут подробно описанно.
http://arduino.ru/Reference/String
Вот тут проявляется загадочность Ардуинки. Тип string есть, а слов таких не знает.
Определять его нужно как массив типа char [ ]
Вот тут подробно описанно.
http://arduino.ru/Reference/String
Вместо:
вот так прокатило только:
Ну и размер кода уменьшился почти на 1kb.
один, наверно, мало будет, нужно не менее 8 (7 длина самого длинного слова+1 для финального символа)
Так, ну ладно.
А вот есть такие часики:
Они работают, всё нормально, но у меня нет таких кнопок! Я решил приделать к ним управление с пульта, но у меня не получается задержаться на кнопке "btnSELECT".
Скетч в следующем посте, а то не влазит...
Вот мой вариант:
Судя из описания, сначала отслеживается только кнопка "btnSELECT" для перевода программы в режим корреткировки времени. Но как только я ее нажимаю, дисплей начинает мигать с частотой "delay(500)" между обоими режимами. Я не могу никак понять где мне ставить "irrecv.resume();"
Есть какие-нибудь идеи?
один, наверно, мало будет, нужно не менее 8 (7 длина самого длинного слова+1 для финального символа)
Я так понял что что "key[1]" означает номер элемента массива, а не его длину. Всё работет кстати и так. Все названия отображаются корректно...
irrecv.resume(); следует поместить на 184 строчку.
только нужно сначала код нажатой кнопки сохранить в переменной.
irrecv.resume(); следует поместить на 184 строчку.
Я сделал ПОЧТИ так:
Единственное что я добавил - это сохранил результат считывания в переменной 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 — Увеличить редактируемое значение / Уменьшить редактируемое значение
Нет. работают только вышеуказанные кнопки. Либо я с кодами напутал либо где-то в программе что-то уже напортачил.
Вот текущий скетч:
а кнопки Право и Лево работают - str_menu меняется?
а кнопки Право и Лево работают - str_menu меняется?
Нет же, не работают эти кнопки! Работают только вверх и вниз и "btnSelect"!
Можно выставить только секунды и вернуться в режим отображения. Навигация по пунктам меню не работает.
А как отследить str_menu? Вывести его где-то? Да и кнопки отследить не мешало бы.... Сейчас придумаю.... Только я долго буду думать )))) В каком месте программы мне вывести нажатую кнопку?
Надо в терминал выводить. На дисплее уже места нет. Сейчас посмотрим что оно там "нажимает"....
Можно выводить в ком порт на комп.
Можно выводить в ком порт на комп.
Кнопки нажимаются все как положено.
Меню работает, но меняются все равно только секунды:
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
str_menu следует отследить т.к. именно от этой переменной зависит режим меню
str_menu следует отследить т.к. именно от этой переменной зависит режим меню
Переменная "str_menu" меняется, но как-то странно: при нажатии только на кнопку "Вправо", значение может хаотично меняться от 0 до 3. даже при значиении 3 все равно регулируются только секунды. Может я не там проверку поставил?
Удалось перескочить на минуты и часы. Но если их порегулировал немного, "str_menu" опять сваливается на секунды... Похоже что проблема в порциях кода с пульта и еще эта комманда "конца" мешается...
Даже удалось день недели поменять, но это я случайно попал на него, потому что на экранном меню никак нельзя узнать на какой позиции ты сейчас находишься...
может посветить курсором позицию, я у себя в меню делал именно так.
может посветить курсором позицию, я у себя в меню делал именно так.
Подсветить можно. Только как убрать эти порции посылок с пульта.... Сейчас подумаю как курсор туда приделать...
А где можно посмотреть формать комманд "lcd.noCursor" и "lcd.Cursor" В примерах только "Хэлло Мир"....
Спасибо, попробую. Только "курсор" в понимании IDE - это целый мигающий кубик, а я думал что это такая тонкая полоска на нижнем ряду точек под кубиком. Наверно при 4-х битном подключении такой курсор недоступен.
Так. "if (!edit_mode)" - это я не понимаю что за условие. Помоему тут проще отслеживать так:
if (str_menu==0) {
lcd.setCursor(14, 1)
lcd.cursor()
{
или что-то вроде этого...
про пульт. очищать код кнопки сразу после обработки нажатия. и не реагировать на новые коды пока переменная кнопки не обнулена. так будет игнорить дребезг и левые коды наверно тоже.
доступен. у меня 4-х битка на поливалке. так там подчеркивание в качестве курсора
доступен. у меня 4-х битка на поливалке. так там подчеркивание в качестве курсора
У меня - кубик. Может я что неправильно написал, но... :
А вот если убрать "
lcd.blink();
" - тогда подчеркивание, но не мигающее. Тоже устраивает, если под двоеточием поместить.сейчас посмотрел - оказывается когда мигает то мигает именно кубик, но и курсор в виде подчеркивания видно.
сейчас посмотрел - оказывается когда мигает то мигает именно кубик, но и курсор в виде подчеркивания видно.
Мне пора - завтра будет интересный день, удачи в поисках.
Курсор ведет себя очень странно: пока жмёшь кнопку вправо он бежит вправо. Как только бросил - сам возвращается обратно. Причем пошагово, то есть значения переменной убавляются на 1 за каждый какой-то цикл.
Мне пора - завтра будет интересный день, удачи в поисках.
Да, спокойной ночи и спасибо!
если позиция курсора хранится в переменной, то ее уменьшает кокая то строка - факт. нужно смотреть там. я пока у себя меню наладил каждый фрагмент кода проверял сбрасывая переменные в сериал.
Удачи.
если позиция курсора хранится в переменной, то ее уменьшает кокая то строка - факт. нужно смотреть там. я пока у себя меню наладил каждый фрагмент кода проверял сбрасывая переменные в сериал.
Удачи.
Победил я-таки эти часики. Хотя счтаю что помогло чистое везение. Судите сами.
Курсор постоянно стремится вправо потому что переменная "str_menu" постоянно декрементируется. Исходя из текста программы, это происходит только в одном месте:
Ну я решил не гадать на кофейной гуще и вставил в скобки по этому "case" мигание 13-ым пином:
Как ни странно, но светодиод замигал! Я уже и начальное значение переменной "str_menu" изменил с "0" на "3", но куроср преспокойно поскакал вправо! Непонятно...
Потом я решил обратить внимание на константу "btnRIGHT" и подумал что все равно "#define" все до единого отфанарные и сдвинул все значения на еденицу, что бы убрать ноль с "btnRIGHT":
Курсор бегать перестал, "case" перестал реагировать на обнуленную "btnRIGHT" и вообще все стали очень счастливы!
Монетка в копилочку опыта: "switch-case" не любит (или слишком любит!) нулевых значений в списке. Ну или что-то типа того.
Рад. что все разрешилось, но не понятно для меня почему ноль не подходил. На досуге, погуглю этот вопрос обязательно.
Рад. что все разрешилось, но не понятно для меня почему ноль не подходил. На досуге, погуглю этот вопрос обязательно.
Возможно, потому как я и сам этот код переделывал под свои нужды. В последствии осталась только эта функция обслуживания клавиатуры. И у меня не было такой проблемы, но бывает кнопки ложно срабатывают.
Выкладываю финальную и полностью работоспособную, с точки зрения управления, версию этого скетча. Однако же я там еще не расковырял дальше. Например не отследил что бы элементы корректировки не выходили за допустимые значения. Но это те участки программы, которые я не трогал и все претензии к автору.
На досуге поковыряю еще, но уже чисто в развивающих целях.
Отдельная и огромная благодарность DonVorlon , без которого я так далеко бы не продвинулся!
Так же выражаю благодарность всем, кто не прошел мимо и высказался в плане критики и помощи советом. Особенно душевно отозвался kisoft !!!
Спасибо и тебе, дружище!