Урок 42. Контроллер элемента Пельтье. Реализация пользовательского интерфейса и защитных функций.

Ардуино контроллер элемента Пельтье

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

Предыдущий урок     Список уроков     Следующий урок

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

 

Осталось:

  •  добавить в схему индикатор, кнопки и ключ вентилятора;
  •  определить, как управлять устройством (интерфейс с пользователем);
  •  закончить резидентную программу;
  • написать программу верхнего уровня (на компьютер);
  • проверить работу устройства.

В этом уроке сделаем первые 3 пункта списка.

 

Принципиальная схема контроллера.

Закончим разработку схемы. Добавим LCD индикатор, кнопки и ключ управления вентилятором. Выводы для подключения этих компонентов мы определили еще в уроке 36.

Назначение выводов

В качестве дисплея я выбрал LCD индикатор FDCC0801 FLYYBW-51LR (FDCC0801 FLYYBW-51LR.pdf). У него 1 строка из 8 символов. Можно выбрать любой подобный с контроллером HD44780. Можно использовать индикатор с большим числом строк и символов. О LCD индикаторах и о подключении их к плате Ардуино я подробно писал в уроке 23.

Вентилятор подключим через обыкновенный транзисторный ключ.

Полностью схема Ардуино контроллера элемента Пельтье выглядит так.

Схема контроллера элемента Пельтье

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

Собранное устройство

Скорее это макет. Но для проверки работы программы и всего устройства вполне достаточно.

 

Интерфейс с пользователем.

Теперь необходимо определить пользовательский интерфейс, т.е.:

  • что и в каком виде отображать на дисплее;
  • какие параметры задавать;
  • назначение кнопок, как ими устанавливать параметры;
  • как отображать аварийные ситуации.

Я выбрал такой вариант. На индикаторах отображаются следующие параметры:

  • измеренная температура в камере;
  • заданная температура в камере;
  • электрическая мощность на модуле Пельтье;
  • заданная максимальная мощность;
  • измеренная температура радиатора горячей стороны модуля;
  • предельная температура радиатора.

Пользователь может задавать:

  • температуру в камере;
  • максимальную мощность на охлаждающем элементе.

Управление происходит с помощью трех кнопок, которые я назвал: ”+”, ”-” и ”ВЫБОР”.

 

Управление контроллером.

После включения устройства по экрану дисплея пробегает звездочка (*). Это примитивная проверка индикатора. К тому же неплохо при проверке устройства видеть, когда происходит сброс  контроллера.

Тест индикатора

После этого на дисплее отображается текущее значение температуры в камере.

Индикация параметров

При нажатой кнопке ”ВЫБОР” дисплей отображает значение заданной температуры в камере.

Индикация параметров

Установить заданную температуру можно с помощью кнопок ”+” и ”-” при нажатой кнопке ”ВЫБОР”. Каждое нажатие кнопки ”+” или ”-” изменяет параметр на 0,1 °C. Если удерживать одну из кнопок ”+” или ”-” нажатой, то через 0,8 сек параметр будет автоматически изменяться на 0,1 °C со скоростью 5 раз в секунду.

Запись параметра в энергонезависимую память (EEPROM) происходит при отпускании кнопки ”ВЫБОР”. Запись происходит только в случае, если параметр был изменен.

Если нажать кнопку ”+” при отжатой кнопке ”ВЫБОР”, то устройство перейдет в режим отображения электрической мощности на модуле Пельтье.

Индикация параметров

Нажав кнопку ”ВЫБОР” можно посмотреть заданную максимальную мощность на охлаждающем модуле.

Индикация заданной мощности

Кнопками ”+” и ”-” (при нажатой кнопке ”ВЫБОР”) можно установить максимальную мощность устройства. Каждое нажатие на кнопку ”+” или ”-” изменяет значение мощности на 1 Вт.

Следующее нажатие кнопки ”+” (с отжатой кнопкой ”ВЫБОР”) переведет устройство в режим индикации температуры радиатора.

Индикация параметров

Если в этом режиме нажать кнопку ”ВЫБОР”, то на дисплее отобразится максимально допустимое значение температуры радиатора.

Индикация параметров

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

Резюмируя можно сказать, что при отжатой кнопке ”ВЫБОР”  кнопки ”+” и ”-” меняют режим отображения информации в последовательности:

  • ->  Температура в камере  ->  выходная мощность  ->  температура радиатора  ->
  • <-  Температура в камере  <-  выходная мощность  <-  температура радиатора  <-

А нажатая кнопка  ”ВЫБОР” переводит устройство в режим установки параметра.

Контроллер обрабатывает следующие аварийные ситуации:

  • Ошибки чтения обоих термодатчиков. При неисправности датчика вместо значения температуры на дисплее отображается ”----”.  Датчик температуры считается неисправным, если недостоверные данные приходят 3 раза в подряд. Т.е. если в течение 3 секунд считывается хотя бы одно правильное значение температуры, то система работает в обычном режиме.
  • Ошибка заданных параметров в EEPROM. Параметры сохраняются в энергонезависимой памяти Ардуино и сопровождаются контрольным кодом. При нарушении целостности данных возникает ошибка. Реально такая ошибка может появиться при первом включении контроллера после загрузки программы в плату Ардуино. Исправляется ошибка повторным заданием параметров.
  • Ошибка перегрева радиатора. Появляется в случае, если радиатор горячей стороны модуля Пельтье нагрелся выше заданной температуры. Такая ошибка может появиться при неисправном вентиляторе.
  • При появлении любой ошибки контроллер отключает охлаждающий модуль и индицирует об ошибке миганием светодиода ”ОШИБКА”.

 

Резидентное программное обеспечение контроллера.

Что должна делать программа понятно. Структура программы, измерительные функции, регуляторы подробно описаны в предыдущих уроках, начиная с урока 36. Я добавил:

  • блок индикации и установки параметров  (цикл 20 мс);
  • блок загрузки параметров из EEPROM  (интервал 1);
  • блок контроля температуры радиатора (интервал 47);
  • функции записи и чтения данных из EEPROM с контролем целостности данных;
  • добавил нужные параметры в блок передачи данных на компьютер (интервалы 11-13).

В программе много комментариев. Скетч можно загрузить по этой ссылке:

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Для управления LCD индикатором я использовал библиотеку LiquidCrystal.h. Перед применением библиотеки измерил время выполнения функций. Получил следующие результаты.

Функция Время выполнения Назначение
disp.begin(8, 1); 1406 мкс Инициализация дисплея
disp.print("1"); 287 мкс Вывод текстовой строки (1 символ)
disp.print("12345678"); 2264 мкс Вывод текстовой строки (8 символов)
disp.clear(); 2280 мкс Очистка экрана
disp.home(); 2280 мкс Курсор в начало экрана
disp.write(ccc); 281 мкс Вывод байта (char) на экран
disp.print(ddd); 1610 мкс Вывод числа int на экран

 

Параметры в EEPROM хранятся в следующем формате:

Адрес Содержимое Параметр
5…8 число float Заданная температура в камере
9 сумма байтов 5…8 ^ 0xe5
10…13 число float Максимальная выходная мощность
14 сумма байтов 10…13 ^ 0xe5

 

Еще я свел в таблицу константы, которые можно изменить в программе для адаптации контроллера под свою задачу. Остальные константы лучше не трогать.

Константа Формат Ед. изм. Описание
powerU float В Напряжение источника питания. Используется для вычисления напряжения на элементе Пельтье. Должно быть задано достаточно точно. Лучше измерить вольтметром реально значение.
koeffU float Масштабный коэффициент измерителя напряжения. Определяется сопротивлениями резисторов делителя.
koeffI float Масштабный коэффициент измерителя тока. Определяется сопротивлениям датчика тока.
koeffRegPwrInt float Интегральный коэффициент регулятора температуры
koeffRegTmpPr float Пропорциональный коэффициент регулятора температуры
koeffRegTmpDif float Дифференцирующий коэффициент регулятора температуры
tempOnVent float °C Температура включения вентилятора
tempOffVent float °C Температура выключения вентилятора
MAX_POWER float Вт Максимальная выходная мощность контроллера. Мощность определяется силовой частью контроллера и охлаждающими модулями. Это максимальная мощность, которую можно установить кнопками контроллера.
INC_MAX_POWER float Вт Приращение максимальной выходной мощности при установке. Определяет на сколько изменяется параметр при каждом нажатии кнопки ”+” или ”-”.
MAX_SET_TEMP float °C Максимальная заданная температура, которую можно установить кнопками.
MIN_SET_TEMP float °C Минимальная заданная температура, которую можно установить кнопками.
INC_SET_TEMP float °C Приращение заданной температуры при установке. Определяет на сколько изменяется параметр при каждом нажатии кнопки ”+” или ”-”.
TIME_PRESS int 20 мс Время удержания кнопок “+” и “-“ для ускорения изменения параметра (* 20 мс). Определяет сколько времени надо держать кнопку нажатой, чтобы значение параметра начало изменяться автоматически.
INC_BUTT_TIME int 20 мс Время изменения параметров при удержании кнопки (* 20 мс). Определяет, с какой частотой параметр изменяется автоматически при удержании кнопки ”+” или ”-”.
overHeatTemp float °C Температура перегрева радиатора. Порог, при котором контроллер отключается.
NUM_VER_TEMP_SEN int Число попыток чтения датчиков температуры в подряд, после чего датчик считается неисправным.

Числа с форматом типа float обязательно указываются с децимальной точкой. Например, 10.5, 1.23, 1., 1.0.

На компьютер контроллер передает данные в текстовом виде, со скоростью 19200 бод, в следующей последовательности:

Обозначение Формат Ед. измерения Параметр
U=xx.xx float В Напряжение на выходе
I=xx.xx float А Ток потребления регулятора
P=xx.xx float Вт Выходная мощность
p=xx.xx float ед. ШИМ Интегральное звено регулятора мощности
t=xx.xx float °C температура в камере
t=xx.xx float °C Температура радиатора
E=xx.xx float °C Ошибка рассогласования
W=xx.xx float Вт Заданная мощность для регулятора мощности
I=xx.xx float Вт Интегральная часть
P=xx.xx float Вт Пропорциональная часть
D=xx.xx float Вт Дифференциальная часть
K=xx.xx float интегральный коэффициент регулятора мощности
i=xx.xx float Интегральный коэффициент регулятора температуры
p=xx.xx float Пропорциональный коэффициент регулятора температуры
d=xx.xx float Дифференцирующий коэффициент регулятора температуры
V=xx.x float °C Температура включения вентилятора
v=xx.x float °C Температура выключения вентилятора
H=xx.x float °C Температура перегрева радиатора
P=xx.x float Вт Максимальная заданная мощность
T=xx.xx float °C Заданная температура в камере
E=xx DEC Признаки ошибок

  • 0 - ошибка EEPROM;
  • 1 - вентилятор включен;
  • 2 - перегрев;
  • 3 -фатальная ошибка
V=x.x string Версия программы

 

Включил, проверил. Вроде все работает правильно. Контролировал работу устройства по данным монитора последовательного порта.

Окно монитора

Данные в таком виде анализировать трудно. В следующем уроке напишу программу верхнего уровня (на компьютер), которая будет отображать данные в “человеческом” виде, строить графики изменения параметров.

 

Тогда окончательно проверю устройство. Возможно, что-то в программе придется исправить.

Предыдущий урок     Список уроков     Следующий урок

0

Автор публикации

не в сети 9 часов

Эдуард

285
Комментарии: 1946Публикации: 198Регистрация: 13-12-2015

42 комментария на «Урок 42. Контроллер элемента Пельтье. Реализация пользовательского интерфейса и защитных функций.»

  1. ЭДУАРД Спасибо. Начал собирать новый контроллер, но есть одно предложение сделать регулировку максимально допустимого значение температуры радиатора, т.к. у меня интервал температур радиатора от 70 до 95С, кратковременно возможно до 100С. и я охлаждаю до +35-+40С.

    0
    • Я считаю давать возможность пользователю менять этот параметр нельзя. Параметр зависит от конструкции. Если его изменить, то можно повредить устройство.
      Сейчас Вы можете задать значение параметра при компиляции.
      В следующем варианте программы я собираюсь добавить возможность установки технологических параметров от компьютера без перезагрузки программы.

      0
  2. приветствую.
    а что если при перегреве радиатора не выключать устройство а плавно менять (уменьшать) мощность. если за определенное время температура радиатора не уменьшилась. то тогда выключать или изменить заданную мощность

    0
    • Я посчитал, что перегрев радиатора может случиться только при выходе из строя вентилятора. А в этом случае устройство все равно нормально работать не будет. Надо ремонтировать.

      0
  3. в до гонку к предыдущему. если перегрев при подводим мощности 50% от заданной. тревога. авария с охлаждением . не работает ветродуй

    0
  4. почему не будет работать. будет но только в аварийном режиме на минимальной подводимой мощности. пока на него (регулятор) не обратят внимание

    0
  5. я уже открыл одну. праздники. погром в доме . осциллограф после переезда никак не найду в какой коробке. читаю пока форумы. склоняюсь что для более мощного устройства надо связку АВР ЦАП и TL494

    0
  6. а в каком разделе. где можно было обсуждать общие вопросы. алгоритма. интерфейса ну и пожелания. кто что хочет получить. из данного устройства

    0
  7. Добрый день, Эдуард. Фундаментальная работа. Изучаю с удовольствием. В качестве развития темы: использоваться в качестве индикатора цветной графический дисплей с сенсорной панелью дюйма на 3,2-3,5. Можно выводить графики и отказаться от кнопок.

    0
    • Здравствуйте! Можно, конечно. Но это значительно повысит цену устройства. Да и диаграммы нужны только для настройки и в учебных целях.

      0
  8. Здавствуйте Эдуард! У меня вопрос. В скече вы используете признаки состояния кнопок:
    wasPress и wasChoise, а почему не использовали признаки которые есть в библиоте

    0
    • Здравствуйте!
      Я уже не помню. В библиотеке признаки показывают нажатие отдельных кнопок, а, очевидно, эти признаки показывают состояние режима управления.

      0
  9. Спасибо.Буду пробывать дальше.Дело в том,что я использую в своем проэкте вашу библиотеку LedDigitsKeys.h и решил привязать к ней алгоритм управления из урока.Пока не все получается.

    0
  10. Здравствуйте Эдуард. Во первых огромное спасибо за великолепную просветительскую работу. Будучи не очень молодым человеком изучая ваши уроки пытаюсь освоить освоить программирование. В моем проекте требуется получение сигнала при отпускании кнопки. Я сломал голову но так и не получилось доработать библиотеку Button.h чтобы получить этот сигнал. Если есть возможность помогите пожалуйста.

    0
    • Здравствуйте!
      Спасибо за добрые слова.
      Я не совсем понял «получение сигнала при отпускании кнопки». Если вам надо, чтобы активным уровнем кнопки был не 0, а 1, то необходимо в файле Button.cpp сделать в 2 местах изменения:

      if ( flagPress != digitalRead(_pin) ) {
      заменить на
      if ( flagPress == digitalRead(_pin) ) {

      По сути вы проинвертируете чтение вывода.

      0
  11. Здравствуйте Эдуард.
    Спасибо за быстрый ответ. Я действительно плохо сформулировал свой вопрос. Но я имел в виду создание дополнительного признака как переход с 0 на 1 (отпускание клавиши) дополнительно к уже 3-м имеющимся: fflagPress= true , flagPress= false, flagClick= true. Условно => flagClickof= true.

    0
    • После строки
      if ( flagPress == true ) flagClick= true; // признак клика кнопки
      надо добавить
      if ( flagPress == false ) flagClickOff= true; // признак клика кнопки
      Логика такая. Обе строки
      if ( flagPress == true ) flagClick= true;
      и новая строка включены в блок
      // состояние кнопки изменилось
      Если состояние кнопки изменилось и кнопка оказалась нажатой, означает, что был клик на нажатие. Второй строкой мы добавляем условие, если состояние кнопки изменилось и кнопка оказалась отжата. Т.е. клик на отжатие.

      0
  12. Огромное спасибо за подсказку Эдуард.
    Логика флагов почему-то мне трудно дается. С математикой у меня как-то легче получается. Мне показалось удобнее, нелинейную характеристику резистивного автомобильного термодатчика не с помощью таблицы учитывать, а с помощью аппроксимации дробями. Ардуино как оказалось очень хорошо и быстро выполняет операции деления.

    0
  13. Здравствуйте, Эдуард. Объясните, пожалуйста, почему LED+ дисплея вы подключаете к 12В. Про ограничение тока я понимаю, но в даташите на дисплей сказано что максимальное напряжение +4,6В…или я не туда смотрю? или я не то понял?

    0
    • Здравствуйте!
      Сигналы LED+ и LED- это выводы светодиода подсветки индикатора. 4,6 В это падение напряжения на светодиоде. Ток в цепи определяется, как (12 В — 4,6 В) / R1. Т.е. в прямом включении напряжение на светодиоде определяется параметрами светодиода, а яркость свечения определяется током. Лишнее напряжение ограничивается на R1.

      0
  14. огромнейшее вам спасибо за проект, он мало сказать просто шикарный, я буквально с нуля освоил многое по работе с контроллерами, жалко пока нет времени подробнее изучить все, есть необходимость быстрее доделать данный контроллер.
    есть вопрос, у меня в наличии LCD модулm Nokia 5110
    http://arduino.ua/prod1793-nokia-5110-lcd-modyl
    подскажите пожалуйста как правильно добавить в скетч контроллера контроллера? и если можно по подключению соорентируйте

    0
    • Здравствуйте! Спасибо за отзыв.
      Такой дисплей подключается по последовательному интерфейсу и требует другой библиотеки. Я никогда не использовал его.
      На форуме сайта есть обсуждение проекта контроллера холодильника с таким дисплеем. http://mypractic-forum.ru/viewtopic.php?t=55

      0
  15. еще такая ошибка при компиляции не могу разобраться
    C:\Users\Роман\Documents\Arduino\sketch_jun12a__Pelte_\sketch_jun12a__Pelte_.ino:7:20: fatal error: Button.h: No such file or directory

    0
    • Здравствуйте!
      Не может найти файл Button.h.
      Либо библиотека не подключена, либо мешает кириллица в пути к файлу. Оставьте только латинские имена в пути.

      0
  16. к сожалению на форуме не нашел ничего полезного, библиотеки есть, вот только как подключить по последовательному интерфейсу не знаю, можете както сориентировать?

    0
  17. Мне помогли настроить работу контроллера с дисплеем Nokia 5110. Вот скетч исправленный, может кому-нибудь будет полезно
    https://drive.google.com/open?id=1lsl677YGok7hgYn7C6PduBg6qchnI3kC
    Схема подключения:
    https://arduino-kit.ru/textpage_ws/pages_ws/proekt-16_—graficheskiy-indikator.-podklyuchenie-displeya-nokia-5110

    0
  18. p=0.50000 d=50.00000 V=30.0 v=27.0 H=50.0 P=20.0 T=15.00 E=9 V=1.1
    Подскажите пожалуйста, вот такая ошибка о чем говорит?

    0
  19. Добрый день!
    У меня установлен 3 COM порт, на этом порту работает с контроллером Arduino IDE, также на этом порту определяется сама плата моей ОС — Windows 10
    Но столкнулся с проблемой, что программа ArduinoRef_2_1 работает с контроллером в одностороннем режиме: через эту программу передаются установочные данные в контроллер, сохраняются и отслеживаются через монитор порта в Arduino IDE (я запускаю Arduino IDE и ArduinoRef_2_1 в разное время), но красный кружок не пропадает в ArduinoRef_2_1, а счетчик при этом тикает.
    Подскажите, пожалуйста, в какую сторону копать? Программу в режиме совместимости уже запускал, как и в режиме администратора.
    Спасибо

    0
  20. Поясните пожалуйста, почему в интервале 1 сверка значений переменных с их копиями в EEPROM выполняется оператором if в подряд дважды.
    if ( readFloatFromEeprom(EEPROM_SET_TEMP_REF, & setTempRef) == false ) {
    if ( readFloatFromEeprom(EEPROM_SET_TEMP_REF, & setTempRef) == false ) {
    fatalError= true;
    ……………………………. }}

    0
    • Здравствуйте!
      Если проверка даст результат — данные не верны, то произойдет сброс системы. Это не очень хорошее событие. Поэтому проверка происходит дважды. Только при условии, что два раза подряд была зафиксирована ошибка, произойдет сброс.
      По отношению к внутреннему EEPROM, возможно, можно обойтись одной проверкой. Но для внешней памяти, обращение к которой происходит через выводы, внешние связи и подвержено помехам и наводкам, подтверждение чтения данных необходимо.

      0
  21. Здравствуйте!
    При компиляции скетча выходит ошибка в месте инициализации кнопок, вот тут:

    Button buttonPlus(8, 15); // кнопка «+»
    Button buttonMinus(11, 15); // кнопка «-»
    Button buttonChoice(12, 15); // кнопка «выбор»

    Точно ли библиотека button.h работает так, а не вот так:

    Button buttonPlus(8, PULLUP); // кнопка «+»
    Button buttonMinus(11, PULLUP); // кнопка «-»
    Button buttonChoice(12, PULLUP5); // кнопка «выбор»

    Просто я плохо разбираюсь в программировании и ищу почему выходит ошибка:
    no matching function for call to ‘Button::Button(int, int)’

    0
    • Здравствуйте!
      Установите библиотеку Button с моего сайта. Появилась другая библиотека с таким же названием и при обновлении Arduino IDE она иногда заменяет мою.

      0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".