простой терморегулятор инкубатора

Vyacheslav1982

✩✩✩✩✩✩✩
30 Мар 2022
17
2
Здравствуйте уважаемые форумчане! Заранее прошу отнестись с пониманием к человеку программирование для которого не является основным видом деятельности. Некоторое время назад я собрал простой инкубатор на ардуино уно, датчике температуры DHT 22, экране LCD 1602 и твердотельном реле FOTEK. Сварганил простенький скетч попросту надергав куски из примеров Ардуино иде, температурный диапазон нужно задавать в скетче. Все работает без вопросов. Но некоторое время назад потребовалось в процессе инкубации менять температуру. Чтобы каждый раз не перепрошивать ардуино решил добавить регуляцию температуры кнопкой. Так как с программированием я на Вы, то я взял за основу код из известной книги Джереми Блюма где кнопкой меняют цвет RGB светодиода и имеется функция подавления дребезга, добавил туда необходимые библиотеки, а в функцию void setMode которая меняет режимы свечения, вместо режимов свечения вставил свои режимы с разными нижними и верхними порогами температуры. Но почему то режимы не меняются кнопкой, а сами собой чередуются. Может кто-то подскажет в чем дело? В С++ делаю только первые шаги, изучаю теорию. Прилагаю скетчи: 1. скетч без терморегуляции(incubator1), 2. Код из книги Джереми Блюма взятый за основу(rgb_nighlight) и 3. свой плагиат(MENU_INCUBATOR)
 

Вложения

poty

★★★★★★✩
19 Фев 2020
3,230
940
Неверно сплагиатили функцию debounce, в частности, return current;нужно вынести перед закрывающей скобкой функции.
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
Приведите больше данных. Как ведёт себя программа, как Вы узнаете о переключении?
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
611
145
По моему, в коде слишком много лишних условий.
C++:
  if (RELEt> какого-то верхнего предела)
{
    digitalWrite(NAGRYZKA, LOW);
    NAGRYZKA_VCL=0;
  }
  if (RELEt< какого-то нижнего предела )
  {
   digitalWrite(NAGRYZKA, HIGH);
   NAGRYZKA_VCL=1;
  }
  if (NAGRYZKA_VCL==1)
  {
   digitalWrite(NAGRYZKA, HIGH);
  }
  if (NAGRYZKA_VCL==0)
  {
   digitalWrite(NAGRYZKA, LOW);
}
  }
То есть, сначала включается/выключается нагрев, в тоже время, соответственно, устанавливается/сбрасывается флаг включения/выключения нагрева, а после делается проверка состояния этого флага и снова включается/выключается нагрев.
Ну да ладно, это на скорость не особо влияет, да и не предъявляются высокие требования к быстродействию. Это первая придирка.

Вторая.
Ожидать по 4 секунды, два опроса датчика по две секунды, для следующего нажатия кнопки - это перебор.
Пардон 4,5 секунды. В функции LCD() есть непонятно для чего задержка в 500 милисекунд.
Функцию антидребезга я выбросил бы совсем. Вместо неё в loop() написал бы
C++:
if (dgigitalRead(BUTTON) == 1)
{
  delay (10);
  if (digitalRead(BUTTON ) == 1)
    {
     ledMode++;     //increment the Mode value
      if (ledMode ==8)
         {ledMode = 0;}
      setMode(ledMode);
     }
}
В функции
C++:
void setMode(int mode)
{
  float RELEh = dht.readHumidity();
  // Считывание температуры в цельсиях
  float RELEt = dht.readTemperature();
Не вижу смысла введения новых локальных переменных RELEh и RELEt. Можно сразу использовать глобальные переменные h и t, те которые объявлены до setup(), и их же использовать в функции LCD(), а не объявлять их снова и повторно тратить время на новый опрос датчика.
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,230
940
Да при таких задержках функция антидребезга вообще не нужна. Первое изменение в нужном направлении включает/выключает "процесс", который всё равно следующие несколько секунд никакие кнопки не проверяет.