arduino
- Rokky
- Наездник
- Сообщений: 422
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, суть проблемы такова, например:
есть температура -10, для отрисовки этого числа, необходимо буфер из 3 символов, и на экране соответственно перерисовывается место где эти 3 символа должны быть выведены (под каждую цифру на экране рисуется свой прямоугольник). Осознайте этот момент в голове.
Далее.., когда у вас температура стала 10 например, соответственно у вас уже только 2 символа, и соответственно на экране перерисуется только место где эти 2 символа должны быть, а где был третий символ из предыдущего вывода, оно не перерисуется, и как итог, (если тут не ошибаюсь) цифра 0 останется.
т.е на 1ом шаге рисуется: -10
на втором шаге рисуется: 100 (и последний 0 остается от предыдущего числа)
В голову сходу пришло такое решение: выделяете буфер char[10], например, туда записываете выше значение, а все остальное свободное место в буфере заполняете пробелами
Может быть есть еще варианты, но надо гуглить.. сча нету времени
есть температура -10, для отрисовки этого числа, необходимо буфер из 3 символов, и на экране соответственно перерисовывается место где эти 3 символа должны быть выведены (под каждую цифру на экране рисуется свой прямоугольник). Осознайте этот момент в голове.
Далее.., когда у вас температура стала 10 например, соответственно у вас уже только 2 символа, и соответственно на экране перерисуется только место где эти 2 символа должны быть, а где был третий символ из предыдущего вывода, оно не перерисуется, и как итог, (если тут не ошибаюсь) цифра 0 останется.
т.е на 1ом шаге рисуется: -10
на втором шаге рисуется: 100 (и последний 0 остается от предыдущего числа)
В голову сходу пришло такое решение: выделяете буфер char[10], например, туда записываете выше значение, а все остальное свободное место в буфере заполняете пробелами
Может быть есть еще варианты, но надо гуглить.. сча нету времени
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Rokky
- Наездник
- Сообщений: 422
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, вот так вам примерно надо, надеюсь не перемудрил:
и вызов метода:
Вот пример того что будет в буфере, то что в ковычка:
Код: Выбрать все
//добавляем проблемы в конец строки, пока будет достигнут максмальный ее размер
// char *buff - буфер куда будет выведено число, с точностью до 2х знаков
// int buffSize - размер буфера
//float value - значение для вывода в буфер
void floatToChar(char *buff, int buffSize, float value)
{
memset(buff, 0x00, buffSize);
sprintf(buff, "%.2lf", value); //точность до 2х знаков после запятой
for(int i = 0; i < buffSize - 1; i++)
buff[i] = (buff[i] == 0x00 ? ' ' : buff[i]);
}
//обьявления препроцессора, чтобы каждый раз не передовать длину буфера
#define FloatToFullChar(buf, val) floatToChar(buf, sizeof(buf), val)
и вызов метода:
Код: Выбрать все
char szBuffer[10];
//можно так
FloatToFullChar(szBuffer, -0.331);
//или вот так
floatToChar(szBuffer, sizeof(szBuffer), 13.1);
Вот пример того что будет в буфере, то что в ковычка:
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Maxxtro2
- Механик
- Сообщений: 1024
- Зарегистрирован: 10 ноя 2009, 00:46
- Темы: 30
- Имя:
- Статус: Не в сети
arduino
Rokky, пока не вник я про буфер
написал немного по другому, так работает:
если ошибаюсь, поправь меня.
а про буфер на примере если только, я так далеко еще не углубился.
написал немного по другому, так работает:
Код: Выбрать все
void printTempIN()
{
int tempIN = sensors.getTempC(Thermometer2);
if(abs(last_tIN-tempIN)>=0.25)
{
TFTscreen.fillRect(62, 31, 40, 16, 0);
TFTscreen.setTextSize(2);
TFTscreen.setCursor(62, 31);
TFTscreen.setTextColor(ST7735_YELLOW, 0);
TFTscreen.println(tempIN);
}
last_tIN=tempIN;
}
если ошибаюсь, поправь меня.
а про буфер на примере если только, я так далеко еще не углубился.
- Rokky
- Наездник
- Сообщений: 422
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, используйте тег [ code ], ужасно читать, не совсем понял в чем проблема, можно пооптимизировать код:
напирмер, вот это можно вынести в глобальный переменные, чтобы каждый раз в цикле не выделялась память под элементы, если надо обнулить char[] поле, пишем data[0] = 0x00;
Дальше, вот тут:
если я правильно все просмотрел, эта часть у тебя везде одинаковая, поэтому:
1. можно сделать отдельную функцию которая будет вызываться с параметрами(номер_пина, значение)
2. на сколько я могу видеть, код работы с TFT повторятеся, и актуален только при первой отрисовке, дальше нету смысла его рисовать, т.к будет одно и тоже, а рисование это достаточно трудоемкий процесс
И не совсем понимаю зачем тут такой большой delay
напирмер, вот это можно вынести в глобальный переменные, чтобы каждый раз в цикле не выделялась память под элементы, если надо обнулить char[] поле, пишем data[0] = 0x00;
Код: Выбрать все
Time t = rtc.time();
const String Day = dayAsString(t.day);
char time[10];
char timeon[10];
char data[11];
char day[10];
Дальше, вот тут:
Код: Выбрать все
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 255);
TFTscreen.text("-", 15, 50);
TFTscreen.text("-", 15, 45);
TFTscreen.text("-", 15, 40);
analogWrite(heatL, heatLon3);
если я правильно все просмотрел, эта часть у тебя везде одинаковая, поэтому:
1. можно сделать отдельную функцию которая будет вызываться с параметрами(номер_пина, значение)
2. на сколько я могу видеть, код работы с TFT повторятеся, и актуален только при первой отрисовке, дальше нету смысла его рисовать, т.к будет одно и тоже, а рисование это достаточно трудоемкий процесс
И не совсем понимаю зачем тут такой большой delay
Код: Выбрать все
int getPressedButtonL()
{
buttonLVal = analogRead(buttonLpin);
if (buttonLVal < 15)
{
delay(150);
return BUTTON_ON_L;
}
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Rokky
- Наездник
- Сообщений: 422
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, про 0x0, почитайте про строки в С/C++, про нуль-символ, будет понятно
сделайте без delay. используйте millis (описание функции - в гугл)
т.е раз в N сек(милисек) считывать значение с кнопки, а не как сейчас: читаем на каждом цикле и делаем задержку. Из за этого прога тормозит свое выполнение
сделайте без delay. используйте millis (описание функции - в гугл)
т.е раз в N сек(милисек) считывать значение с кнопки, а не как сейчас: читаем на каждом цикле и делаем задержку. Из за этого прога тормозит свое выполнение
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Rokky
- Наездник
- Сообщений: 422
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, вот тут вот ты читаешь значение:
buttonLVal = analogRead(buttonLpin);
а дальше у тебя цепочка условий, если хоть под условие подходит значение buttonLVal, то у тебя программа останавливается на твой delay, т.е 150 мс
т.е по факту да, отрабатывает только при выполнении условий
пс: все, на 3 недели еду в отпуск. врятли тут появлюсь в это время =)
buttonLVal = analogRead(buttonLpin);
а дальше у тебя цепочка условий, если хоть под условие подходит значение buttonLVal, то у тебя программа останавливается на твой delay, т.е 150 мс
т.е по факту да, отрабатывает только при выполнении условий
пс: все, на 3 недели еду в отпуск. врятли тут появлюсь в это время =)
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Maxxtro2
- Механик
- Сообщений: 1024
- Зарегистрирован: 10 ноя 2009, 00:46
- Темы: 30
- Имя:
- Статус: Не в сети
arduino
Rokky, Немного изменил работу. Часы идут очень четко теперь. Но до конца так и не добился желаемого, не могу понять как заменить delay на millis. также пока не нашел возможность изменения времени с помощью кнопок, которые задействованы на другие нужды - грубо переход в сервисный режим.
Код: Выбрать все
#include <TFT.h> //LCD library
#define cs 10
#define dc 9
#define rst 8
TFT TFTscreen = TFT(cs, dc, rst);
#include <SPI.h>
#include <DS1302.h>
#define kCePin 5
#define kIoPin 6
#define kSclkPin 7
DS1302 rtc(kCePin, kIoPin, kSclkPin);
char pretime = 0;
char predata = 0;
#include <OneWire.h>
OneWire ds (2);
byte data[12];
byte addr1[8] = {0x28, 0xFF, 0x74, 0x82, 0xA1, 0x16, 0x04, 0x9E};
byte addr2[8] = {0x28, 0xFF, 0x4F, 0x1E, 0x92, 0x16, 0x05, 0xFD};
unsigned int raw;
int TempOUT, TempIN;
int preTempIN = 0;
int preTempOUT = 0;
float DS18B20(byte *adres)
{
ds.reset();
ds.select(adres);
ds.write(0x44, 1);
ds.reset();
ds.select(adres);
ds.write(0xBE);
for (byte i = 0; i < 9; i++)
{
data[i] = ds.read ();
}
raw = (data[1] << 8) | data[0];
float celsius = (float)raw / 16.0;
return celsius;
}
#define BL 3
int buttonL;
int buttonR;
int buttonLpin = A1;
int buttonRpin = A2;
int buttonLVal = 0;
int buttonRVal = 0;
int levelL = 0;
int levelR = 0;
int fadeL = 1;
int fadeR = 1;
int fade2L = 3;
int fade2R = 3;
const int BUTTON_ON_L = 1;
const int BUTTON_OFF_L = 2;
const int BUTTON_ON_R = 3;
const int BUTTON_OFF_R = 4;
const int BUTTON_NONE_L = 5;
const int BUTTON_NONE_R = 6;
int getPressedButtonL()
{
buttonLVal = analogRead(buttonLpin);
if (buttonLVal < 15)
{
delay(100);
levelL = levelL - fadeL;
if (levelL == 3 || levelL == -1)
{
levelL = fade2L;
}
if (levelL == 3)
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 255);
TFTscreen.text("-", 15, 50);
TFTscreen.text("-", 15, 45);
TFTscreen.text("-", 15, 40);
}
else if (levelL == 2)
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 255);
TFTscreen.text("-", 15, 50);
TFTscreen.text("-", 15, 45);
TFTscreen.stroke(0, 0, 0);
TFTscreen.text("-", 15, 40);
}
else if (levelL == 1)
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 255);
TFTscreen.text("-", 15, 50);
TFTscreen.stroke(0, 0, 0);
TFTscreen.text("-", 15, 45);
TFTscreen.text("-", 15, 40);
}
else
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 0);
TFTscreen.text("-", 15, 50);
TFTscreen.text("-", 15, 45);
TFTscreen.text("-", 15, 40);
}
return BUTTON_ON_L;
}
else if (buttonLVal < 80)
{
delay(100);
levelL = 0;
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 0);
TFTscreen.text("-", 15, 50);
TFTscreen.text("-", 15, 45);
TFTscreen.text("-", 15, 40);
return BUTTON_OFF_L;
}
return BUTTON_NONE_L;
}
int getPressedButtonR()
{
buttonRVal = analogRead(buttonRpin);
if (buttonRVal < 15)
{
delay(100);
levelR = levelR - fadeR;
if (levelR == 3 || levelR == -1)
{
levelR = fade2R;
}
if (levelR == 3)
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 255);
TFTscreen.text("-", 105, 50);
TFTscreen.text("-", 105, 45);
TFTscreen.text("-", 105, 40);
}
else if (levelR == 2)
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 255);
TFTscreen.text("-", 105, 50);
TFTscreen.text("-", 105, 45);
TFTscreen.stroke(0, 0, 0);
TFTscreen.text("-", 105, 40);
}
else if (levelR == 1)
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 255);
TFTscreen.text("-", 105, 50);
TFTscreen.stroke(0, 0, 0);
TFTscreen.text("-", 105, 45);
TFTscreen.text("-", 105, 40);
}
else
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 0);
TFTscreen.text("-", 105, 50);
TFTscreen.text("-", 105, 45);
TFTscreen.text("-", 105, 40);
}
return BUTTON_ON_R;
}
else if (buttonRVal < 80)
{
delay(100);
levelR = 0;
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 0);
TFTscreen.text("-", 105, 50);
TFTscreen.text("-", 105, 45);
TFTscreen.text("-", 105, 40);
return BUTTON_OFF_R;
}
return BUTTON_NONE_R;
}
int HHL = 0;
int heatL = 11;
int heatLon3 = 255;
int heatLon2 = 170;
int heatLon1 = 100;
int heatLon0 = 0;
int HHR = 0;
int heatR = 12;
int heatRon3 = 255;
int heatRon2 = 170;
int heatRon1 = 100;
int heatRon0 = 0;
void setup()
{
TFTscreen.begin();
TFTscreen.setRotation(2);
rtc.halt(false);
TFTscreen.background(0, 0, 0);
//LR
TFTscreen.stroke(160, 160, 160);
TFTscreen.point(32, 41);
TFTscreen.point(32, 42);
TFTscreen.point(32, 43);
TFTscreen.point(32, 44);
TFTscreen.point(32, 45);
TFTscreen.point(32, 46);
TFTscreen.point(32, 47);
TFTscreen.point(33, 47);
TFTscreen.point(34, 48);
TFTscreen.point(35, 49);
TFTscreen.point(36, 49);
TFTscreen.point(37, 49);
TFTscreen.point(38, 49);
TFTscreen.point(39, 49);
TFTscreen.point(40, 49);
TFTscreen.point(41, 50);
TFTscreen.point(42, 51);
TFTscreen.point(43, 52);
TFTscreen.point(44, 53);
TFTscreen.point(45, 54);
TFTscreen.point(46, 54);
TFTscreen.point(47, 54);
TFTscreen.point(48, 54);
TFTscreen.point(49, 54);
TFTscreen.point(50, 53);
TFTscreen.point(51, 52);
TFTscreen.point(52, 51);
TFTscreen.point(53, 50);
TFTscreen.point(54, 49);
TFTscreen.point(55, 49);
TFTscreen.point(56, 49);
TFTscreen.point(57, 49);
TFTscreen.point(58, 49);
TFTscreen.point(59, 49);
TFTscreen.point(60, 49);
TFTscreen.point(61, 49);
TFTscreen.point(62, 49);
TFTscreen.point(63, 49);
TFTscreen.point(64, 49);
TFTscreen.point(65, 49);
TFTscreen.point(66, 49);
TFTscreen.point(67, 49);
TFTscreen.point(68, 49);
TFTscreen.point(69, 49);
TFTscreen.point(70, 49);
TFTscreen.point(71, 49);
TFTscreen.point(72, 49);
TFTscreen.point(73, 49);
TFTscreen.point(74, 49);
TFTscreen.point(75, 49);
TFTscreen.point(76, 49);
TFTscreen.point(77, 49);
TFTscreen.point(78, 49);
TFTscreen.point(79, 49);
TFTscreen.point(80, 49);
TFTscreen.point(81, 50);
TFTscreen.point(82, 51);
TFTscreen.point(83, 52);
TFTscreen.point(84, 53);
TFTscreen.point(85, 54);
TFTscreen.point(86, 54);
TFTscreen.point(87, 54);
TFTscreen.point(88, 54);
TFTscreen.point(89, 54);
TFTscreen.point(90, 53);
TFTscreen.point(91, 52);
TFTscreen.point(92, 51);
TFTscreen.point(93, 50);
TFTscreen.point(94, 49);
TFTscreen.point(95, 49);
TFTscreen.point(96, 49);
TFTscreen.point(97, 49);
TFTscreen.point(98, 49);
TFTscreen.point(99, 49);
TFTscreen.point(100, 49);
TFTscreen.point(101, 49);
TFTscreen.point(102, 48);
TFTscreen.point(103, 47);
TFTscreen.point(104, 46);
TFTscreen.point(104, 45);
TFTscreen.point(104, 44);
TFTscreen.point(103, 43);
TFTscreen.point(102, 42);
TFTscreen.point(102, 41);
TFTscreen.point(102, 40);
TFTscreen.point(102, 39);
TFTscreen.point(102, 38);
TFTscreen.point(102, 37);
TFTscreen.point(102, 36);
TFTscreen.point(102, 35);
TFTscreen.point(102, 34);
TFTscreen.point(102, 33);
TFTscreen.point(102, 32);
TFTscreen.point(102, 31);
TFTscreen.point(102, 30);
TFTscreen.point(102, 29);
TFTscreen.point(102, 28);
TFTscreen.point(102, 27);
TFTscreen.point(101, 26);
TFTscreen.point(100, 25);
TFTscreen.point(99, 24);
TFTscreen.point(98, 24);
TFTscreen.point(97, 24);
TFTscreen.point(96, 24);
TFTscreen.point(95, 24);
TFTscreen.point(94, 24);
TFTscreen.point(93, 24);
TFTscreen.point(92, 24);
TFTscreen.point(91, 24);
TFTscreen.point(90, 24);
TFTscreen.point(89, 24);
TFTscreen.point(88, 24);
TFTscreen.point(87, 24);
TFTscreen.point(86, 24);
TFTscreen.point(85, 24);
TFTscreen.point(84, 24);
TFTscreen.point(83, 24);
TFTscreen.point(82, 24);
TFTscreen.point(81, 24);
TFTscreen.point(80, 24);
TFTscreen.point(79, 24);
TFTscreen.point(78, 24);
TFTscreen.point(77, 24);
TFTscreen.point(76, 24);
TFTscreen.point(75, 24);
TFTscreen.point(74, 24);
TFTscreen.point(73, 24);
TFTscreen.point(72, 25);
TFTscreen.point(71, 26);
TFTscreen.point(70, 26);
TFTscreen.point(69, 26);
TFTscreen.point(68, 26);
TFTscreen.point(67, 26);
TFTscreen.point(66, 26);
TFTscreen.point(65, 26);
TFTscreen.point(64, 26);
TFTscreen.point(63, 26);
TFTscreen.point(62, 26);
TFTscreen.point(61, 26);
TFTscreen.point(60, 26);
TFTscreen.point(59, 27);
TFTscreen.point(58, 28);
TFTscreen.point(57, 29);
TFTscreen.point(56, 30);
TFTscreen.point(55, 31);
TFTscreen.point(54, 32);
TFTscreen.point(53, 33);
TFTscreen.point(52, 34);
TFTscreen.point(51, 35);
TFTscreen.point(50, 36);
TFTscreen.point(49, 36);
TFTscreen.point(48, 36);
TFTscreen.point(47, 36);
TFTscreen.point(46, 36);
TFTscreen.point(45, 36);
TFTscreen.point(44, 36);
TFTscreen.point(43, 36);
TFTscreen.point(42, 36);
TFTscreen.point(41, 36);
TFTscreen.point(40, 36);
TFTscreen.point(39, 36);
TFTscreen.point(38, 36);
TFTscreen.point(37, 36);
TFTscreen.point(36, 36);
TFTscreen.point(35, 37);
TFTscreen.point(34, 38);
TFTscreen.point(33, 39);
TFTscreen.point(33, 40);
TFTscreen.setTextSize(1);
TFTscreen.stroke(255, 255, 255);
TFTscreen.text("___________________", 7, 65);
analogWrite(BL, 220);
pinMode(heatL, OUTPUT);
pinMode(heatR, OUTPUT);
}
void loop()
{
buttonL = getPressedButtonL();
buttonR = getPressedButtonR();
if (levelL == 3)
{
analogWrite(heatL, heatLon3);
HHL = 3;
}
else if (levelL == 2)
{
analogWrite(heatL, heatLon2);
HHL = 2;
}
else if (levelL == 1)
{
analogWrite(heatL, heatLon1);
HHL = 1;
}
else
{
analogWrite(heatL, heatLon0);
HHL = 0;
}
if (levelR == 3)
{
analogWrite(heatR, heatRon3);
HHR = 3;
}
else if (levelR == 2)
{
analogWrite(heatR, heatRon2);
HHR = 2;
}
else if (levelR == 1)
{
analogWrite(heatR, heatRon1);
HHR = 1;
}
else
{
analogWrite(heatR, heatRon0);
HHR = 0;
}
Time t = rtc.time();
char time[10];
char data[11];
snprintf(time, sizeof(time), "%02d:%02d", t.hr, t.min);
snprintf(data, sizeof(data), "%02d/%02d/%02d", t.date, t.mon, t.yr);
if(pretime !=t.min)
{
TFTscreen.setTextSize(4);
TFTscreen.setCursor(7, 110);
TFTscreen.setTextColor(ST7735_GREEN, 0);
TFTscreen.println(time);
pretime = t.min;
if(predata !=t.date)
{
TFTscreen.setTextSize(2);
TFTscreen.setCursor(7, 80);
TFTscreen.setTextColor(ST7735_GREEN, 0);
TFTscreen.println(data);
predata = t.date;
}
TempOUT = DS18B20(addr1);
TempIN = DS18B20(addr2);
if(preTempIN !=TempIN)
{
TFTscreen.fillRect(62, 31, 40, 16, 0);
TFTscreen.setTextSize(2);
TFTscreen.setCursor(62, 31);
TFTscreen.setTextColor(ST7735_YELLOW, 0);
TFTscreen.println(TempIN);
preTempIN = TempIN;
}
if(preTempOUT !=TempOUT)
{
TFTscreen.fillRect(15, 8, 48, 16, 0);
TFTscreen.setTextSize(2);
TFTscreen.setCursor(15, 8);
TFTscreen.setTextColor(ST7735_YELLOW, 0);
TFTscreen.println(TempOUT);
preTempOUT = TempOUT;
}
}
}
- Rokky
- Наездник
- Сообщений: 422
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2 писал(а):Источник цитаты также пока не нашел возможность изменения времени с помощью кнопок, которые задействованы на другие нужды - грубо переход в сервисный режим.
вот не очень понял.. это же зависит от вашего алгоритма, как кнопки будут работать..
Я чуть ниже опишу как я бы организовал примерно обработку клавиш, там будет и пример с delay, пока пару наблюдений на которые советовал обратить внимание:
Код: Выбрать все
int buttonL;
int buttonR;
int buttonLpin = A1;
int buttonRpin = A2;
int buttonLVal = 0;
int buttonRVal = 0;
Тут вы частично инициализируете переменные, частично нет.
Чтобы избегать ошибок, советую везде это делать.. т.к не инициализированная переменная может привести к разным результатам какому результату.
Далее, в методах:
int getPressedButtonL()
int getPressedButtonR()
Есть такая конструкция:
Код: Выбрать все
if (buttonLVal < 15)
{
...
return BUTTON_ON_L;
}
else if (buttonLVal < 80)
{
...
return BUTTON_OFF_L;
}
Немного опасно, т.к условия < 80 включает в себя условие < 15, только что порядок спасает. Я вообще плохо знаю, что у Вас там за кнопки, но по идее они должны давать цифру 1 или 0
Вот теперь по поводу как бы организовал..
Код: Выбрать все
//список возможных состояний кнопки
enum ePressedBtn
{
BUTTON_NONE = -1,
BUTTON_OFF = 0,
BUTTON_ON = 1
};
//пины кнопок
short PIN_BTN_L = 1;
short PIN_BTN_R = 2;
Код: Выбрать все
void loop()
{
ePressedBtn pressBtn = getPressedButton(PIN_BTN_L); // считываем значение кнопки с ПИНА PIN_BTN_L
if(pressBtn != BUTTON_NONE) //если кнопка была нажата
HandleACTION(PIN_BTN_L, pressBtn == BUTTON_ON ? true : false); //вызываем метод обработки кнопки, передаем туда пин кнопки и состояние , если pressBtn == BUTTON_ON -> true иначе false
ePressedBtn pressBtn = getPressedButton(PIN_BTN_R); // считываем значение кнопки с ПИНА PIN_BTN_L
if(pressBtn != BUTTON_NONE) //если кнопка была нажата
HandleACTION(PIN_BTN_R, pressBtn == BUTTON_ON ? true : false); //вызываем метод обработки кнопки, передаем туда пин кнопки и состояние , если pressBtn == BUTTON_ON -> true иначе false
//...
}
Где метод getPressedButton
Код: Выбрать все
//метод считывает значение с пина
//и возвращает состояние кнопки
ePressedBtn getPressedButton(short PIN)
{
static unsigned long lastTick = 0;
if(millis() - lastTick < 150) //будем считывать данные с кнопки не чаще чем раз в 150 мс
return BUTTON_NONE;
[b]lastTick = millis();[/b]
int buttonLVal = analogRead(PIN); //считали значение с пина
if (buttonLVal < 15)
return BUTTON_ON;
else
if (buttonLVal < 80)
return BUTTON_OFF;
return BUTTON_NONE;
}
Где метод HandleACTION
Код: Выбрать все
//метод обрабатывает дейстие на пине
//метод обрабатывает дейстие на пине
// short PIN - номер пина
// BOOL IsON - состояние вкл или выкл
void HandleACTION(short PIN, BOOL IsON)
{
if(IsON) //делаем какие то действия если пин включен
{
if(PIN == PIN_BTN_L)
{
//todo
}
else
if(PIN == PIN_BTN_R)
{
//todo
}
}
else //делаем какие то действия если пин выключен
{
if(PIN == PIN_BTN_L)
{
//todo
}
else
if(PIN == PIN_BTN_R)
{
//todo
}
}
}
Нюанс в моем коде, что метод getPressedButton считывает значения с кнопки не чаще чем каждые 150 мс
Последний раз редактировалось Rokky 09 янв 2018, 17:02, всего редактировалось 1 раз.
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Maxxtro2
- Механик
- Сообщений: 1024
- Зарегистрирован: 10 ноя 2009, 00:46
- Темы: 30
- Имя:
- Статус: Не в сети
arduino
Rokky, кнопки резистивные, поэтому и проверяю приходящие показания. а millis хотелось бы применить после совпадения значения, для исключения дребезга.
Еще не могу понять каким образом задействовать функцию, чтобы с помощью этих же кнопок можно было бы перейти в сервисное меню для настройки часов.
По простому объясню- нажал кнопку, сравнил показания, сделал перерыв от дребезга, запустил или отключил mosfet и вывел на lsd. А если к примеру нажал и удерживаю кнопку или последовательно нажал кнопки, перешел в сервисный режим для настройки времени на часах.
Еще не могу понять каким образом задействовать функцию, чтобы с помощью этих же кнопок можно было бы перейти в сервисное меню для настройки часов.
По простому объясню- нажал кнопку, сравнил показания, сделал перерыв от дребезга, запустил или отключил mosfet и вывел на lsd. А если к примеру нажал и удерживаю кнопку или последовательно нажал кнопки, перешел в сервисный режим для настройки времени на часах.
- Rokky
- Наездник
- Сообщений: 422
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, Вот что-то накидал, мог ошибиться, под рукой ничего нету.
По ходу дела нагуглил еще тут - последний пост
Код: Выбрать все
int btnVal = 0;
unsigned long timePress = 0;
void loop()
{
auto pressBtn = getPressedButton(PIN_BTN_L); // считываем значение кнопки (ТОЛЬКО СЧИТЫВАЕМ)
if(btnVal != pressBtn)
{
//Будем орабатывать в момент отпускания кнопки
unsigned long curTime = millis();
if(curTime - timePress > 1000) //держим больше секнуды
ShowServiceSEttings(); //обработка нажатия длинного
else
if(curTime - timePress > 150) //обработка нажатия короткого 150 мс
{
//Обрабатываем нажатия короткого
}
btnVal = pressBtn;
timePress = millis();
}
По ходу дела нагуглил еще тут - последний пост
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Rokky
- Наездник
- Сообщений: 422
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, там вот этот параметр вообще нафиг не нужен int vremia=0;
Достаточно сохранить время нажатия кнопки и посмотреть через сколько ее отпустили или сколько времени она зажата
Достаточно сохранить время нажатия кнопки и посмотреть через сколько ее отпустили или сколько времени она зажата
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Rokky
- Наездник
- Сообщений: 422
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, попробуй определится как часто тебе надо вызывать analogWrite(), может раз в 1 секунду, а не на каждом цикле и т.п
надо код глянуть так сложновато сказать.
надо код глянуть так сложновато сказать.
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Maxxtro2
- Механик
- Сообщений: 1024
- Зарегистрирован: 10 ноя 2009, 00:46
- Темы: 30
- Имя:
- Статус: Не в сети
arduino
Rokky, Немного поэкспериментировал - у меня analogRead на A1 и A2, а analogWrite на 3,11 и 12.
Так вот тупняк по обработке начинается только при работе analogWrite на 3, а вот c 11 и 12 таких проблем нет.
Может он тупит так как на этом порту по умолчанию Interrupt?
Пока похожей инфы по проблемме с Mega не смог найти.
Лениво переделывать плату, все распаял уже под выводы.
Так вот тупняк по обработке начинается только при работе analogWrite на 3, а вот c 11 и 12 таких проблем нет.
Может он тупит так как на этом порту по умолчанию Interrupt?
Пока похожей инфы по проблемме с Mega не смог найти.
Лениво переделывать плату, все распаял уже под выводы.
Кто сейчас на форуме
Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 4 гостей