Нужна помощь в отладке скетча
- Войдите на сайт для отправки комментариев
Пт, 12/11/2021 - 15:23
Здравствуйте, необходима помощь в доработке скетча. Проблема в том что при наборе на клавиатуре предельной температуры, ввод данных как бы подвисает, и возможен только в определенное время, в остальное время нажатия игнорируются. http://disk.yandex.ru/d/QY3kwb9Cym8IoA
ссылка не открывается (по крайней мере у меня)
Вы понимаете, что это радел платной помощи? Там у Вас делов на минуту, а потратить пару килорублей всё равно придётся. Если скетч написан Вами, то могу подсказать в чём проблема и Вы сами легко доделаете.
P.S. Если Вам нужно именно разместить заказ, то подождите других, я не беру заказов
-------------------
ссылка не открывается (по крайней мере у меня)
У меня открылась после двух капчей. Там надо просто заменить блокирующий вызов DallasTemperature на неблокирующий.
https://cloud.mail.ru/public/6GSh/q7PdSYa8a
Скетч не мой, писали для меня. Пару кило рублей конечно много, попробую сам исправить по вашей подсказке, спасибо!
Пару кило рублей конечно много, попробую сам исправить по вашей подсказке, спасибо!
Информация для Вас и для других просителей - любая работа с чужим скетчем, даже поправить одну запятую - стоит не менее 1500-2000 руб. Почему - многократно обьяснено в этом разделе.
те, кто рассчитывает на 300-500р - ищите школьников или студентов.
те, кто рассчитывает на 300-500р - ищите школьников или студентов.
или скучающих пенсионеров )))
править видимо эту процедуру:
01
// Чтение температуры
02
void
updateCurrentTemperature()
03
{
04
sensor1.requestTemperatures();
05
sensor2.requestTemperatures();
06
sensor3.requestTemperatures();
07
08
currentTemperature[0] = sensor1.getTempCByIndex(0);
09
currentTemperature[1] = sensor2.getTempCByIndex(0);
10
currentTemperature[2] = sensor3.getTempCByIndex(0);
11
12
for
(
int
i=0; i<3; i++)
13
{
14
if
(currentTemperature[i] > targetTemperature[i] && isNeedOffWarm >= 0)
15
{
16
isNeedOffWarm = i+1;
17
needSound =
true
;
18
}
19
}
20
}
К сведению
скучающих пенсионеров
Не только
править эту процедуру
если править только её - это ничего не даст - она вызывается раз в пять секунд.
Посмотрел разделы по сайту, интересно стало, делают либо за пару тысяч либо бесплатно))) Спасибо всем отозвавшимся!
А я думал в сторону блокировки выполнения программы на время редактирования.
Т.е. вошли в редактирование, и пока не выйдем по таймауту или по нажатию клавиши остальной loop не выполняется.
Кстати нашел загадочный для меня кусок.
Это глюк, или я не все знаю про массивы?
1
В начале программы
2
3
String tempTarget[3] = {
" "
,
" "
,
" "
};
4
int
targetIndex = -1;
5
6
Позже в программе
7
8
targetIndex = -1;
9
tempTarget[targetIndex] =
" "
;
если править только её - это ничего не даст - она вызывается раз в пять секунд.
будет интересно посмотреть, что именно и как решается
попробую сам исправить по вашей подсказке, спасибо!
Если нужен пример неблокирующего вызова, то их тут есть. Там ещё надо будет немного логику программы изменить. Ничего особенного, но если программировать не умеете, то быстрее и проще будет заплатить, желающие тут найдутся.
Посмотрел разделы по сайту, интересно стало, делают либо за пару тысяч либо бесплатно)))
все просто - если бесплатно, то скинул код и ушел, дальше разбирайся сам, отсуствие ошибок не гарантируется :)
Связываться с деньгами - значит брать на себя обязательство гарантии и последующей поддержки - а лезть в это менее чем за 1500-2000 нет никакого резона.
и еще - бывают задачки и дороже двух тыщ :)
чтобы больше ничего не менять может так?
01
// Чтение температуры
02
void
updateCurrentTemperature()
03
{
04
static
bool
didNotSendYet =
true
;
05
if
(didNotSendYet) {
06
SendYet();
07
didNotSendYet =
false
;
08
}
else
if
( sensor1.isConversionComplete()) {
09
currentTemperature[0] = sensor1.getTempCByIndex(0);
10
currentTemperature[1] = sensor2.getTempCByIndex(0);
11
currentTemperature[2] = sensor3.getTempCByIndex(0);
12
SendYet();
13
didNotSendYet =
false
;
14
}
15
for
(
int
i = 0; i < 3; i++)
16
{
17
if
(currentTemperature[i] > targetTemperature[i] && isNeedOffWarm >= 0)
18
{
19
isNeedOffWarm = i + 1;
20
needSound =
true
;
21
}
22
}
23
}
24
25
void
SendYet(
void
) {
26
sensor1.requestTemperatures();
27
sensor2.requestTemperatures();
28
sensor3.requestTemperatures();
29
}
Нормальные люди обработку кнопок через прерывания делают.
Ну, значить я ненормальный.
Ну, значить я ненормальный.
... будем перечислять кто тут ненормальный? Задействовать столь драгоценный ресурс как прерывания на обработку каких-то кнопок, смысл, ... если они не используются то конечно жеж можно к примеру всё тот же SoftwareSerial загребает же под себя все PCINTы )))
Через нормальные.
Через нормальные.
Да, хрен их знает под сколько там градусов, я больше 40 уже давно не потребляю. Спросите у нормальных людей.
Можно INT0, INT1 Это в идеале. Можно PCINT обрабатывать.
При желании можно даже сторожевой таймер юзать для этих целей.
Можно INT0, INT1 Это в идеале. Можно PCINT обрабатывать.
При желании можно даже сторожевой таймер юзать для этих целей.
можно, только зачем? кнопки отлично обрабатываются без прерываний.
Кнопки через прерывания обычно новички пытаются дергать - те, у которых без прерывания проблема "не могу выйти из цикла"
Похоже "нормальный" вы тут один. ;)))))
Нет, ну я, может быть, второй.) И то, даже не так.)
Это когда заказчик просит модернизировать свой супер-пупер скетч. Который, только откроешь, сразу же думаешь, что лучше бы не открывал... И тогда настраиваешь свободный таймер на 1-10-мс прерывание и вставляешь тудой его кнопку.)
Можно и таймеры. Забыл про них. :)
А я думал в сторону блокировки выполнения программы на время редактирования.
Т.е. вошли в редактирование, и пока не выйдем по таймауту или по нажатию клавиши остальной loop не выполняется.
Кстати нашел загадочный для меня кусок.
Это глюк, или я не все знаю про массивы?
1
В начале программы
2
3
String tempTarget[3] = {
" "
,
" "
,
" "
};
4
int
targetIndex = -1;
5
6
Позже в программе
7
8
targetIndex = -1;
9
tempTarget[targetIndex] =
" "
;
01
void
keyboardHandler()
02
{
03
static
String newValue =
" "
;
04
char
key = keypad.getKey();
05
06
if
(key)
07
{
08
if
(targetIndex < 0)
09
{
10
newValue =
""
;
11
switch
(key)
12
{
13
case
'A'
:
14
lcd.cursor();
15
lcd.setCursor(12,1);
16
targetIndex = 0;
17
updateDisplay();
18
break
;
19
20
...
Вообще, достаточно keyboardHandler(); вызывать по таймеру. ТОгда нажатие не про... , не потеряется.
Вообще, достаточно keyboardHandler(); вызывать по таймеру. ТОгда нажатие не про... , не потеряется.
Вы продолжаете предлагать решения оторванные от контекста задачи (да и в общем случае довольно спорные). Например - keyboardHandler() производит вывод на экран, и его нельзя вызывать по прерыванию или по таймеру если в другом месте программы еще есть вывод на экран.
Я писал про простой (с моей точки зрения) способ решения конкретной проблемы. Т.к. блокирующее действие вызывается раз в 5 сек, то скорее всего его можно отложить и на большее время. Это легко сделать установкой и снятием флага редактирования.
Возможны случаи когда нельзя приостанавливать некоторые действия программы.
Возможны - когда наоборот надо остановить остальную обработку до установки и верификации всех параметров.
Как вариант разнести получение температуры с датчиков по времени. Делать это за 3 прохода цикла LOOP. Тогда на каждом проходе задержка составит 1 секунду.
Как вариант разнести получение температуры с датчиков по времени. Делать это за 3 прохода цикла LOOP. Тогда на каждом проходе задержка составит 1 секунду.
Мужики, вы о чём странном спорите. Вам не кажется, что просто исключить блокирующее действие (читать температуру без блокирования) сразу решит все проблемы?
Вам не кажется, что просто исключить блокирующее действие (читать температуру без блокирования) сразу решит все проблемы?
Так может казаться, а чтобы быть уверенным надо разобраться в коде. Возможно вывод на экран в коде вызываемом раз в 5 сек будет мешать работе с клавиатурой, еще там есть playSound() что тоже может мешать и т.д.
Вам не кажется, что просто исключить блокирующее действие (читать температуру без блокирования) сразу решит все проблемы?
мне кажется вся эта дискуссия лишена смысла. Путей решения может быть очень много. Просто товарищ Шторм139 влез тут ни к месту со своими "нормальными прерываниями" - вот и понеслось....
Нам так и не удалось заслушать
"начальника транспортного цеха"ТС, может оно ему уже не актуально?Где-то даже у меня это было. Надо только порыться.
Нормальное высказывание. При сработке того же INT0, INT1 или DWG похрену вообще что там блокирует. Обработка прерывания произойдет всеравно.
не надо так опрометчиво, есть приоритет...
Нам так и не удалось заслушать
"начальника транспортного цеха"ТС, может оно ему уже не актуально?Решил что лучше поправить не только проблему с кнопками но и добавить некоторый функционал системе, экономически будет выгоднее сделать один раз. Ну и по читав ветку, понял почему доработка не может стоить 500р.
Доработка может стоить недешево, т.к. надо разбираться, убирать ошибки, добавлять новые ...
Поставить заплатку (на конкретную проблему с клавиатурой, и игнорируя остальные ошибки) довольно дешево. Если умеете программировать, то можете сами сделать. Если допустимо пропускать измерение, управление на время работы с клавиатурой.
Если есть нажатия клавиши, то выставляете флаг нажатия и в цикле проверяете время с последнего нажатия, пока оно меньше например 3 сек, то пропускаете блок вызываемый раз в 5 сек. Когда время с последнего нажатия становится больше 3 сек, то считаете, что редактирование закончено, сбрасываете флаг нажатия и разрешаете выполнять блок измерений.
Если хотите, Upper321@yandex.ru , могу за 200 руб написать.
Даже бармалей так низко не опускается. Ужос.(
Даже бармалей так низко не опускается. Ужос.(
ну, это ещё не дно - запас есть.
Так русским языком совсем бесплатно написано. И это ведь просто заплатка.
Даже бармалей так низко не опускается. Ужос.(
ну, это ещё не дно - запас есть.
Нууу, Доширак это дорого. Это для обеспеченных пацанов!
Нууу, Доширак это дорого. Это для обеспеченных пацанов!
И я про то же! Даже таких дорогих блюд на озвученную сумму можно аж четыре штуки купить, а некоторые считают эту сумму дном.
С вами не соскучишся. Спасибо еще раз, очень отзывчивые ребята.
очень отзывчивые ребята.
Не понимаю сарказма. Мне казалось, что я Вам всё объяснил, а в #11 даже пример кода дал. Другой человек, предложил Вам сделать эту работу за смешные деньги (#38). У Вас какие-то претензии? Вы ждали чего-то ещё?
Не в коем случае не сарказм, 45 сообщений в теме, все разъяснили, по полочкам разложили, даже не ожидал.
очень отзывчивые ребята.
Не понимаю сарказма. Мне казалось, что я Вам всё объяснил, а в #11 даже пример кода дал. Другой человек, предложил Вам сделать эту работу за смешные деньги (#38). У Вас какие-то претензии? Вы ждали чего-то ещё?
а как же я?
а как жеж мой безвозмездный код, что, там совсем всё плохо?
Даже бармалей так низко не опускается. Ужос.(
ну, это ещё не дно - запас есть.
Нууу, Доширак это дорого. Это для обеспеченных пацанов!
богатым будешь...вспоминал...что-то думаю давно не появляется...а тут и ты нарисовался )))
Ага. Просветите нас по приоритетам прерываний на АВР. У них у всех одинаковый приоритет. Это не СТМ, где его менять можно. Единственное прерывание у него это прерывание в его коде по переполнению таймера. И то оно у него только на millis() работает. По сути на ардуино это прерывание всегда активно. значения для millis() постоянно считается.