Нужна помощь в отладке скетча

Денис Чу
Offline
Зарегистрирован: 12.11.2021

Здравствуйте, необходима помощь в доработке скетча. Проблема в том что при наборе на клавиатуре предельной температуры, ввод данных как бы подвисает, и возможен только в определенное время, в остальное время нажатия игнорируются. http://disk.yandex.ru/d/QY3kwb9Cym8IoA

b707
Онлайн
Зарегистрирован: 26.05.2017

ссылка не открывается (по крайней мере у меня)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы понимаете, что это радел платной помощи? Там у Вас делов на минуту, а потратить пару килорублей всё равно придётся. Если скетч написан Вами, то могу подсказать в чём проблема и Вы сами легко доделаете.

P.S. Если Вам нужно именно разместить заказ, то подождите других, я не беру заказов

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

b707 пишет:

ссылка не открывается (по крайней мере у меня)

У меня открылась после двух капчей. Там надо просто заменить блокирующий вызов DallasTemperature на неблокирующий.

Денис Чу
Offline
Зарегистрирован: 12.11.2021
Денис Чу
Offline
Зарегистрирован: 12.11.2021

Скетч не мой, писали для меня. Пару кило рублей конечно много, попробую сам исправить по вашей подсказке, спасибо!

b707
Онлайн
Зарегистрирован: 26.05.2017

Денис Чу пишет:

Пару кило рублей конечно много, попробую сам исправить по вашей подсказке, спасибо!

Информация для Вас и для других просителей - любая работа с чужим скетчем, даже поправить одну запятую - стоит не менее 1500-2000 руб. Почему - многократно обьяснено в этом разделе.

те, кто рассчитывает на 300-500р - ищите школьников или студентов.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

b707 пишет:

те, кто рассчитывает на 300-500р - ищите школьников или студентов.

или скучающих пенсионеров )))

править видимо эту процедуру:
 

// Чтение температуры
void updateCurrentTemperature()
{
    sensor1.requestTemperatures();
    sensor2.requestTemperatures();
    sensor3.requestTemperatures();
    
    currentTemperature[0] = sensor1.getTempCByIndex(0);
    currentTemperature[1] = sensor2.getTempCByIndex(0);
    currentTemperature[2] = sensor3.getTempCByIndex(0);

    for(int i=0; i<3; i++)
    { 
      if (currentTemperature[i] > targetTemperature[i] && isNeedOffWarm >= 0)
      {
          isNeedOffWarm = i+1;
          needSound = true;
      }
    }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

К сведению

ua6em пишет:

скучающих пенсионеров

Не только

ua6em пишет:

править эту процедуру

если править только её -  это ничего не даст - она вызывается раз в пять секунд.

Денис Чу
Offline
Зарегистрирован: 12.11.2021

Посмотрел разделы по сайту, интересно стало, делают либо за  пару  тысяч либо бесплатно))) Спасибо всем отозвавшимся! 

Upper
Offline
Зарегистрирован: 23.06.2020

А я думал в сторону блокировки выполнения программы на время редактирования.

Т.е. вошли в редактирование, и пока не выйдем по таймауту или по нажатию клавиши остальной loop не выполняется.

Кстати нашел загадочный для меня кусок.
Это глюк, или я не все знаю про массивы?

В начале программы

String tempTarget[3] = {"      ", "      ", "      "};
int targetIndex = -1;

Позже в программе

	targetIndex = -1;
	tempTarget[targetIndex] = "      ";

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

если править только её -  это ничего не даст - она вызывается раз в пять секунд.

будет интересно посмотреть, что именно и как решается

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Денис Чу пишет:

попробую сам исправить по вашей подсказке, спасибо!

Если нужен пример неблокирующего вызова, то их тут есть. Там ещё надо будет немного логику программы изменить. Ничего особенного, но если программировать не умеете, то быстрее и проще будет заплатить, желающие тут найдутся.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Upper пишет:
Это глюк ... ?
Нет, это говнокод.

b707
Онлайн
Зарегистрирован: 26.05.2017

Денис Чу пишет:

Посмотрел разделы по сайту, интересно стало, делают либо за  пару  тысяч либо бесплатно)))

все просто - если бесплатно, то скинул код и ушел, дальше разбирайся сам, отсуствие ошибок не гарантируется :)

Связываться с деньгами - значит брать на себя обязательство гарантии и последующей поддержки - а лезть в это менее чем за 1500-2000 нет никакого резона.

 

и еще - бывают задачки и дороже двух тыщ :)

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

чтобы больше ничего не менять может так?
 

// Чтение температуры
void updateCurrentTemperature()
{
  static bool didNotSendYet = true;
  if (didNotSendYet) {
    SendYet();
    didNotSendYet = false;
  } else if ( sensor1.isConversionComplete()) {
    currentTemperature[0] = sensor1.getTempCByIndex(0);
    currentTemperature[1] = sensor2.getTempCByIndex(0);
    currentTemperature[2] = sensor3.getTempCByIndex(0);
    SendYet();
    didNotSendYet = false;
  }
  for (int i = 0; i < 3; i++)
  {
    if (currentTemperature[i] > targetTemperature[i] && isNeedOffWarm >= 0)
    {
      isNeedOffWarm = i + 1;
      needSound = true;
    }
  }
}

void SendYet(void) {
  sensor1.requestTemperatures();
  sensor2.requestTemperatures();
  sensor3.requestTemperatures();
}

 

storm134
Offline
Зарегистрирован: 14.04.2017

Нормальные люди обработку кнопок через прерывания делают.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

storm134 пишет:
Нормальные люди обработку кнопок через прерывания делают.

Ну, значить я ненормальный. 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

storm134 пишет:
Нормальные люди обработку кнопок через прерывания делают.

Ну, значить я ненормальный. 

... будем перечислять кто тут ненормальный? Задействовать столь драгоценный ресурс как прерывания на обработку каких-то кнопок, смысл, ... если они не используются то конечно жеж можно к примеру всё тот же SoftwareSerial загребает же под себя все PCINTы )))

rst
Offline
Зарегистрирован: 25.06.2018

storm134 пишет:
Нормальные люди обработку кнопок через прерывания делают.
Через какие?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rst пишет:

storm134 пишет:
Нормальные люди обработку кнопок через прерывания делают.
Через какие?

Через нормальные.

rst
Offline
Зарегистрирован: 25.06.2018

ЕвгенийП пишет:

rst пишет:

storm134 пишет:
Нормальные люди обработку кнопок через прерывания делают.
Через какие?

Через нормальные.

Это которые расположены под 90 градусов?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

storm134
Offline
Зарегистрирован: 14.04.2017

Можно INT0, INT1 Это в идеале. Можно PCINT обрабатывать.

При желании можно даже сторожевой таймер юзать для этих целей. 

b707
Онлайн
Зарегистрирован: 26.05.2017

storm134 пишет:

Можно INT0, INT1 Это в идеале. Можно PCINT обрабатывать.

При желании можно даже сторожевой таймер юзать для этих целей. 

можно, только зачем? кнопки отлично обрабатываются без прерываний.

Кнопки через прерывания обычно новички пытаются дергать - те, у которых без прерывания проблема "не могу выйти из цикла"

rst
Offline
Зарегистрирован: 25.06.2018

DetSimen пишет:
Ну, значить я ненормальный.

b707 пишет:
можно, только зачем? кнопки отлично обрабатываются без прерываний.

storm134 пишет:
Можно INT0, INT1 Это в идеале. Можно PCINT обрабатывать.

Похоже "нормальный" вы тут один.  ;)))))

Green
Offline
Зарегистрирован: 01.10.2015

Нет, ну я, может быть, второй.) И то, даже не так.)
Это когда заказчик просит модернизировать свой супер-пупер скетч. Который, только откроешь, сразу же думаешь, что лучше бы не открывал... И тогда настраиваешь свободный таймер на 1-10-мс прерывание и вставляешь тудой его кнопку.)

storm134
Offline
Зарегистрирован: 14.04.2017

Можно и таймеры. Забыл про них.  :)

storm134
Offline
Зарегистрирован: 14.04.2017

Upper пишет:

А я думал в сторону блокировки выполнения программы на время редактирования.

Т.е. вошли в редактирование, и пока не выйдем по таймауту или по нажатию клавиши остальной loop не выполняется.

Кстати нашел загадочный для меня кусок.
Это глюк, или я не все знаю про массивы?

В начале программы

String tempTarget[3] = {"      ", "      ", "      "};
int targetIndex = -1;

Позже в программе

	targetIndex = -1;
	tempTarget[targetIndex] = "      ";

 

 

void keyboardHandler()
{
    static String newValue = "      ";
    char key = keypad.getKey();
    
    if (key)
    {
        if (targetIndex < 0)
        {
            newValue = "";
            switch(key)
            {
                case 'A':
                    lcd.cursor();
                    lcd.setCursor(12,1);
                    targetIndex = 0;
                    updateDisplay();
                break;

        ...

 

Вообще, достаточно keyboardHandler(); вызывать по таймеру. ТОгда нажатие не про... , не потеряется.

Upper
Offline
Зарегистрирован: 23.06.2020

storm134 пишет:

Вообще, достаточно keyboardHandler(); вызывать по таймеру. ТОгда нажатие не про... , не потеряется.

Вы продолжаете предлагать решения оторванные от контекста задачи (да и в общем случае довольно спорные). Например - keyboardHandler() производит вывод на экран, и его нельзя вызывать по прерыванию или по таймеру если в другом месте программы еще есть вывод на экран.

Я писал про простой (с моей точки зрения) способ решения конкретной проблемы. Т.к. блокирующее действие вызывается раз в 5 сек, то скорее всего его можно отложить и на большее время. Это легко сделать установкой и снятием флага редактирования.

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

storm134
Offline
Зарегистрирован: 14.04.2017

Как вариант разнести получение температуры с датчиков по времени.  Делать это за 3 прохода цикла LOOP. Тогда на каждом проходе задержка составит  1 секунду. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

storm134 пишет:

Как вариант разнести получение температуры с датчиков по времени.  Делать это за 3 прохода цикла LOOP. Тогда на каждом проходе задержка составит  1 секунду. 

Мужики, вы о чём странном спорите. Вам не кажется, что просто исключить блокирующее действие (читать температуру без блокирования) сразу решит все проблемы?

Upper
Offline
Зарегистрирован: 23.06.2020

ЕвгенийП пишет:

 Вам не кажется, что просто исключить блокирующее действие (читать температуру без блокирования) сразу решит все проблемы?

Так может казаться, а чтобы быть уверенным надо разобраться в коде. Возможно вывод на экран в коде вызываемом раз в 5 сек будет мешать работе с клавиатурой, еще там есть playSound() что тоже может мешать и т.д.

b707
Онлайн
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

 Вам не кажется, что просто исключить блокирующее действие (читать температуру без блокирования) сразу решит все проблемы?

мне кажется вся эта дискуссия лишена смысла. Путей решения может быть очень много. Просто товарищ Шторм139 влез тут ни к месту со своими "нормальными прерываниями" - вот и понеслось....

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Нам так и не удалось заслушать "начальника транспортного цеха" ТС, может оно ему уже не актуально?

storm134
Offline
Зарегистрирован: 14.04.2017

Где-то даже у меня это было. Надо только порыться.

 

storm134
Offline
Зарегистрирован: 14.04.2017

Нормальное высказывание. При сработке того же INT0, INT1 или DWG похрену вообще что там блокирует.  Обработка прерывания произойдет всеравно.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

storm134 пишет:
Обработка прерывания произойдет всеравно.

не надо так опрометчиво, есть приоритет...

Денис Чу
Offline
Зарегистрирован: 12.11.2021

ua6em пишет:

Нам так и не удалось заслушать "начальника транспортного цеха" ТС, может оно ему уже не актуально?

Решил что лучше поправить не только проблему с кнопками но и добавить некоторый функционал системе, экономически будет выгоднее сделать один раз. Ну и по читав ветку, понял почему доработка не может стоить 500р.

Upper
Offline
Зарегистрирован: 23.06.2020

Доработка может стоить недешево, т.к. надо разбираться, убирать ошибки, добавлять новые ...

Поставить заплатку (на конкретную проблему с клавиатурой, и игнорируя остальные ошибки) довольно дешево. Если умеете программировать, то можете сами сделать. Если допустимо пропускать измерение, управление на время работы с клавиатурой.

Если есть нажатия клавиши, то выставляете флаг нажатия и в цикле проверяете время с последнего нажатия, пока оно меньше например 3 сек, то пропускаете блок вызываемый раз в 5 сек. Когда время с последнего нажатия становится больше 3 сек, то считаете, что редактирование закончено, сбрасываете флаг нажатия и разрешаете выполнять блок измерений.

Если хотите, Upper321@yandex.ru , могу за 200 руб написать.

Green
Offline
Зарегистрирован: 01.10.2015

Даже бармалей так низко не опускается. Ужос.(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Даже бармалей так низко не опускается. Ужос.(

ну, это ещё не дно - запас есть.

Upper
Offline
Зарегистрирован: 23.06.2020

Так русским языком совсем бесплатно написано. И это ведь просто заплатка.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

Green пишет:

Даже бармалей так низко не опускается. Ужос.(

ну, это ещё не дно - запас есть.

Нууу, Доширак  это дорого. Это для обеспеченных пацанов! 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

Нууу, Доширак  это дорого. Это для обеспеченных пацанов! 

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

Денис Чу
Offline
Зарегистрирован: 12.11.2021

С вами не соскучишся. Спасибо еще раз, очень отзывчивые ребята. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Денис Чу пишет:

очень отзывчивые ребята. 

Не понимаю сарказма. Мне казалось, что я Вам всё объяснил, а в #11 даже пример кода дал. Другой человек, предложил Вам сделать эту работу за смешные деньги (#38). У Вас какие-то претензии? Вы ждали чего-то ещё?

Денис Чу
Offline
Зарегистрирован: 12.11.2021

Не в коем случае не сарказм, 45 сообщений в теме, все разъяснили, по полочкам разложили, даже не ожидал.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Денис Чу пишет:

очень отзывчивые ребята. 

Не понимаю сарказма. Мне казалось, что я Вам всё объяснил, а в #11 даже пример кода дал. Другой человек, предложил Вам сделать эту работу за смешные деньги (#38). У Вас какие-то претензии? Вы ждали чего-то ещё?

а как же я?

а как жеж мой безвозмездный код, что, там совсем всё плохо?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

wdrakula пишет:

ЕвгенийП пишет:

Green пишет:

Даже бармалей так низко не опускается. Ужос.(

ну, это ещё не дно - запас есть.

Нууу, Доширак  это дорого. Это для обеспеченных пацанов! 

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

rst
Offline
Зарегистрирован: 25.06.2018

storm134 пишет:
Можно и таймеры. Забыл про них.  :)
Спасибо что разрешили.  ;)

storm134
Offline
Зарегистрирован: 14.04.2017

Ага. Просветите нас по приоритетам прерываний на АВР.    У них у всех одинаковый приоритет. Это не СТМ, где его менять можно. Единственное прерывание у него это прерывание в его коде по переполнению таймера. И то оно у него только на millis() работает. По сути на ардуино это прерывание всегда активно. значения для millis() постоянно считается.