arduino

Обсуждение увлечений, которые помогают нам скоротать свободное время
Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 422
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 28 окт 2017, 15:53

Maxxtro2, суть проблемы такова, например:
есть температура -10, для отрисовки этого числа, необходимо буфер из 3 символов, и на экране соответственно перерисовывается место где эти 3 символа должны быть выведены (под каждую цифру на экране рисуется свой прямоугольник). Осознайте этот момент в голове.
Далее.., когда у вас температура стала 10 например, соответственно у вас уже только 2 символа, и соответственно на экране перерисуется только место где эти 2 символа должны быть, а где был третий символ из предыдущего вывода, оно не перерисуется, и как итог, (если тут не ошибаюсь) цифра 0 останется.
т.е на 1ом шаге рисуется: -10
на втором шаге рисуется: 100 (и последний 0 остается от предыдущего числа)

В голову сходу пришло такое решение: выделяете буфер char[10], например, туда записываете выше значение, а все остальное свободное место в буфере заполняете пробелами
Может быть есть еще варианты, но надо гуглить.. сча нету времени
Изображение

https://www.drive2.ru/r/audi/a4/453354483729040251/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 30 окт 2017, 17:45

Rokky, при char пишет иероглифы какие-то

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 422
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 30 окт 2017, 20:32

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);


Вот пример того что будет в буфере, то что в ковычка:
1.jpg
Изображение

https://www.drive2.ru/r/audi/a4/453354483729040251/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 31 окт 2017, 02:26

Rokky, пока не вник я про буфер :stars:
написал немного по другому, так работает:

Код: Выбрать все

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;
}

если ошибаюсь, поправь меня.
а про буфер на примере если только, я так далеко еще не углубился.

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 31 окт 2017, 14:09

Rokky, С одним разобрался с другим столкнулся, теперь не хватает скорости, считывание и обработка с аналогового порта теперь с задержкой.
Как же все таки это описать правильно?
 КОД
#include <TFT.h>
#include <SPI.h>
#include <DS1302.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define cs 10
#define dc 9
#define rst 8
TFT TFTscreen = TFT(cs, dc, rst);
#define kCePin 5
#define kIoPin 6
#define kSclkPin 7
DS1302 rtc(kCePin, kIoPin, kSclkPin);

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = {
0x28, 0xFF, 0x74, 0x82, 0xA1, 0x16, 0x04, 0x9E };
DeviceAddress Thermometer2 = {
0x28, 0xFF, 0x4F, 0x1E, 0x92, 0x16, 0x05, 0xFD };
int last_tOUT;
int last_tIN;
#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(150);
return BUTTON_ON_L;
}
else if (buttonLVal < 80)
{
delay(150);
return BUTTON_OFF_L;
}
return BUTTON_NONE_L;
}
int getPressedButtonR()
{
buttonRVal = analogRead(buttonRpin);
if (buttonRVal < 15)
{
delay(150);
return BUTTON_ON_R;
}
else if (buttonRVal < 80)
{
delay(150);
return BUTTON_OFF_R;
}
return BUTTON_NONE_R;
}
int heatL = 11;
int heatLon3 = 255;
int heatLon2 = 170;
int heatLon1 = 100;
int heatLon0 = 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);
sensors.begin();
sensors.setResolution(Thermometer1, 10);
sensors.setResolution(Thermometer2, 10);
TFTscreen.background(0, 0, 0);
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);
}
String dayAsString(const Time::Day day) {
switch (day) {
case Time::kSunday: return "Sunday";
case Time::kMonday: return "Monday";
case Time::kTuesday: return "Tuesday";
case Time::kWednesday: return "Wednesday";
case Time::kThursday: return "Thursday";
case Time::kFriday: return "Friday";
case Time::kSaturday: return "Saturday";
}
return "(unknown day)";
}
void printTempOUT()
{
int tempOUT = sensors.getTempC(Thermometer1);
if(abs(last_tOUT-tempOUT)>=0.25)
{
TFTscreen.fillRect(15, 8, 48, 16, 0);
TFTscreen.setTextSize(2);
TFTscreen.setCursor(15, 8);
TFTscreen.setTextColor(ST7735_YELLOW, 0);
TFTscreen.println(tempOUT);
}
last_tOUT=tempOUT;
}
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;
}
void loop() {
Time t = rtc.time();
const String Day = dayAsString(t.day);
char time[10];
char timeon[10];
char data[11];
char day[10];
snprintf(time, sizeof(time), "%02d:%02d", t.hr, t.min);
snprintf(timeon, sizeof(time), "%02d:%02d:%02d", t.hr, t.min, t.sec);
snprintf(data, sizeof(data), "%02d/%02d/%02d", t.date, t.mon, t.yr);
snprintf(day, sizeof(day), "%s", Day.c_str());
buttonL = getPressedButtonL();
switch (buttonL)
{
case BUTTON_ON_L:
levelL = levelL - fadeL;
if (levelL == 3 || levelL == -1)
{
levelL = fade2L;
}
break;
case BUTTON_OFF_L:
break;
case BUTTON_NONE_L:
break;
}
buttonR = getPressedButtonR();
switch (buttonR)
{
case BUTTON_ON_R:
levelR = levelR - fadeR;
if (levelR == 3 || levelR == -1)
{
levelR = fade2R;
}
break;
case BUTTON_OFF_R:
break;
case BUTTON_NONE_R:
break;
}
if (levelL == 3)
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 255);
TFTscreen.text("-", 15, 50);
TFTscreen.text("-", 15, 45);
TFTscreen.text("-", 15, 40);
analogWrite(heatL, heatLon3);
}
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);
analogWrite(heatL, heatLon2);
}
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);
analogWrite(heatL, heatLon1);
}
else
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 0);
TFTscreen.text("-", 15, 50);
TFTscreen.text("-", 15, 45);
TFTscreen.text("-", 15, 40);
analogWrite(heatL, heatLon0);
}
if (levelR == 3)
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 255);
TFTscreen.text("-", 105, 50);
TFTscreen.text("-", 105, 45);
TFTscreen.text("-", 105, 40);
analogWrite(heatR, heatRon3);
}
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);
analogWrite(heatR, heatRon2);
}
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);
analogWrite(heatR, heatRon1);
}
else
{
TFTscreen.setTextSize(3);
TFTscreen.stroke(0, 0, 0);
TFTscreen.text("-", 105, 50);
TFTscreen.text("-", 105, 45);
TFTscreen.text("-", 105, 40);
analogWrite(heatR, heatRon0);
}
sensors.requestTemperatures();
TFTscreen.setTextSize(2);
TFTscreen.setTextColor(ST7735_YELLOW, 0);
TFTscreen.setCursor(15, 8);
printTempOUT();
TFTscreen.setCursor(62, 31);
printTempIN();
TFTscreen.setTextSize(2);
TFTscreen.setCursor(7, 80);
TFTscreen.setTextColor(ST7735_GREEN, 0);
TFTscreen.println(data);
TFTscreen.setTextSize(4);
TFTscreen.setCursor(7, 110);
TFTscreen.setTextColor(ST7735_GREEN, 0);
TFTscreen.println(time);
}

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 422
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 31 окт 2017, 15:42

Maxxtro2, используйте тег [ code ], ужасно читать, не совсем понял в чем проблема, можно пооптимизировать код:
напирмер, вот это можно вынести в глобальный переменные, чтобы каждый раз в цикле не выделялась память под элементы, если надо обнулить 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/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 31 окт 2017, 16:00

Rokky, Про data[0] = 0x00; не совсем понял. По отрисовке попробую исправить. По delay(150); это я применил для того чтобы убрать дребезг и повторное срабатывание кнопки.

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 422
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 31 окт 2017, 16:23

Maxxtro2, про 0x0, почитайте про строки в С/C++, про нуль-символ, будет понятно
сделайте без delay. используйте millis (описание функции - в гугл)
т.е раз в N сек(милисек) считывать значение с кнопки, а не как сейчас: читаем на каждом цикле и делаем задержку. Из за этого прога тормозит свое выполнение
Изображение

https://www.drive2.ru/r/audi/a4/453354483729040251/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 31 окт 2017, 19:07

Rokky, В моем понимании delay отрабатывает только при совпадении значения, или я не прав?

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 422
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 31 окт 2017, 19:13

Maxxtro2, вот тут вот ты читаешь значение:
buttonLVal = analogRead(buttonLpin);

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

пс: все, на 3 недели еду в отпуск. врятли тут появлюсь в это время =)
Изображение

https://www.drive2.ru/r/audi/a4/453354483729040251/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 31 окт 2017, 20:05

Rokky, меня такое условие вполне устраивает, нажатие кнопки происходит очень редко.
По часам спасибо за инфу, перепаял кварц, взял с материнки и часы стали точнее идти.

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 09 янв 2018, 12:26

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

Сообщение Rokky » 09 янв 2018, 16:08

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

Сообщение Maxxtro2 » 09 янв 2018, 16:38

Rokky, кнопки резистивные, поэтому и проверяю приходящие показания. а millis хотелось бы применить после совпадения значения, для исключения дребезга.
Еще не могу понять каким образом задействовать функцию, чтобы с помощью этих же кнопок можно было бы перейти в сервисное меню для настройки часов.
По простому объясню- нажал кнопку, сравнил показания, сделал перерыв от дребезга, запустил или отключил mosfet и вывел на lsd. А если к примеру нажал и удерживаю кнопку или последовательно нажал кнопки, перешел в сервисный режим для настройки времени на часах.

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 422
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 09 янв 2018, 17:30

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/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 09 янв 2018, 22:25

Rokky, По последнему примеру получается что отсчет времени ведется от начала работы программы и обнуляется после нажатия кнопки, получается считает время до нажатия кнопки

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 422
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 10 янв 2018, 08:10

Maxxtro2, там вот этот параметр вообще нафиг не нужен int vremia=0;
Достаточно сохранить время нажатия кнопки и посмотреть через сколько ее отпустили или сколько времени она зажата
Изображение

https://www.drive2.ru/r/audi/a4/453354483729040251/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 02 фев 2018, 23:28

Rokky, Так, с кнопками и переходом по меню немного подразобрался. Но теперь еще другая проблемка вылезла - у меня есть analogWrite() и millis(), сейчас analogWrite() мешает обработке кнопок

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 422
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 03 фев 2018, 00:40

Maxxtro2, попробуй определится как часто тебе надо вызывать analogWrite(), может раз в 1 секунду, а не на каждом цикле и т.п
надо код глянуть так сложновато сказать.
Изображение

https://www.drive2.ru/r/audi/a4/453354483729040251/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 06 фев 2018, 01:44

Rokky, Немного поэкспериментировал - у меня analogRead на A1 и A2, а analogWrite на 3,11 и 12.
Так вот тупняк по обработке начинается только при работе analogWrite на 3, а вот c 11 и 12 таких проблем нет.
Может он тупит так как на этом порту по умолчанию Interrupt?
Пока похожей инфы по проблемме с Mega не смог найти.
Лениво переделывать плату, все распаял уже под выводы.


Вернуться в «На досуге...»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 2 гостей