Автокран, выключатель не горячей воды — 3, программное обеспечение

Ок, продолжаю делать выключатель не горячей воды. Устройство для пользователей Львовтеплоенерго — очень нужное, так как выключать подачу холодной воды, которая идет по горячим трубам — очень актуально.

Сейчас фактически есть все комплектующие, брекет для датчика температуры уже установлен, собираю макет.

Используются:

Вот так оно выглядит, часы оказались не нужны, показаны на фото для красоты.

avtomaticheskij-kran-arduino-001 Припаиваем все МГТФом, хотя в принципе можно было все смакетировать на бутербродной плате. Я же фактически так и буду ставить все в корпус готового устройства, поэтому решил сразу все и спаять. avtomaticheskij-kran-arduino-002

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

В модуль RTC  сзади вставляется батарейка, служащая для енергонезависимого хранения данных.

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

Простейший скетч, который показывает напряжение в цифровом виде.

void loop()
{
    //check keyboard
    int i_keyb  = analogRead(A1); 
 
    //show key
    char buff[20]="";
    sprintf(buff,"Key U= %03d ",i_keyb );
    lcd.setCursor(0,1);
    lcd.print(buff);  
}

Этот код просто показывает десятичное представление напряжения на входе. Клавиатура — представляет собой просто резистивный делитель. При нажатии кнопки подключается резистор и выход подтягивается к напряжению питания.

Однако для нормальной работы клавиатуры крайне желательно ставить на ее событие прерывание. Для этого можно усложнить схему, сделать формирователь импульса прерывания на 555-й ИМС. Я же просто подтянул выход напряжения клавиатуры к нулю, с помощью резистора, и изменив полярность питания клавиатуры. что не имеет никакого значения. В итоге ловится прерывание на 2-м выводе Ардуино, без всяких «лишних» деталей.

Собственно получилась такая таблица соответствия для клавиатуры:, причем не зависящая от напряжения питания «Ардуины».

  • Все отпущено — 386
  • SW1 (влево) — 1023
  • SW2 (вверх) — 890
  • SW3 (вниз) — 748
  • SW4 (вправо) — 635
  • SW4 (ввод) — 508

В некоторых положениях значения менялись, это следствие ограниченной в 10-ть разрядов точности АЦП «Ардуино» УНО. Этого, вполне достаточно для работы с клавиатурой. Однако чтобы исключить влияние этого фактора, стоит делать интервал сравнения, я его выбрал в 20-ть  единиц от «среднего положения». Переделываю скетч чтобы он показывал нажатую кнопку. Делаю функцию для показа номера кнопки и показываю ее результат.

 

int key_pressed()
{
  int i_keyb  = analogRead(A1); 
  int i_numkey[5] = {1013,890,748,635,508};
  int keypressed=-1; // nothing
  for (int i=0; i<6; i++)   {    if ( i_keyb>=i_numkey[i]-20 && i_keyb<=i_numkey[i]+20 )
   {
     keypressed = i;
     break;
   }
  }
  return keypressed+1;
}
 
void loop()
{
    char buff[20]="";
    if (key_pressed())
      sprintf(buff,"Key SW%1d ",key_pressed() );
    else
      sprintf(buff,"No Key  " );
    lcd.setCursor(0,1);
    lcd.print(buff);  
    delay(100);
}

Ну и результат работы:

arduino-klaviatura-nomer-001 arduino-klaviatura-nomer-002

 

Собственно код довольно несложный, можно было сделать его и на основе сравнений, но я не люблю «индийского» стиля программирования. По сути на этой отметке можно начать программировать меню. Для начала я повесил прерывание на изменение уровня.

attachInterrupt(0, key_receive, CHANGE);
void key_receive()
{
delay(17);
last_key = key_pressed();
}

Задержка подобрана экспериментально, по наилучшему отклику.  Дальше можно делать само меню, которое уже будет более менее работоспособным.

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

  • Нажание SW5 — вход/выход в/из режима меню (пускай состояние контролируется глобальной переменной bool b_menuon=false;).
  • menuon=false SW1/SW4 — принудительное «включение/ принудительное выключение/авто» режим крана. PERMAnent
  • menuon=true, SW1/SW4 — выбор пункта меню. Пускай текущий пункт меню также будет  глобальной переменной int  i_menupos=0;1/ Temp ON-> температура включения  10С…80С. Точность 1 градус.
    2/ Temp Interval -> диапазон температур, при которых не будет производиться изменение состояния крана 0,1…9,9С
    3/ Switch Time Длительность импульса включения/выключения крана 1…10сек

При выводе пункта меню в верхней строке, в нижней считывается выводиться показатель, который меняется на +-1 при нажатии кнопок вверх/вниз. Запись осуществляется при смене пункта меню или выходе из него. Меню автоматически закрывается приблизительно через 10-ть секунд, с записью.

Собственно все это дело реализовано, вот пару скриншотов вывода блока управления.

Для начала финальный, ну почти, вариант макета. Часы реального времени тут не нужны, оказались. Данные сохраняются в «Ардуине» в энергонезависимую память. А часы просто остались ненужны.

arduino-klaviatura-betta1-001 Плюс в первой позиции — включенный кран. Дальше идет режим, есть авто — то есть управление от температуры, постоянно включенный или постоянно выключенный режим. В первой строке в конце выведена температура включения, и диапазон. Кран включается при выключенном состоянии, подъеме температуры и температуре большей суммы этих двух значений. Соответственно ровно наоборот кран выключается.

Во второй строке показывается текущая температура (0,06С точность датчика) и «***» — в случае подачи питания на кран.arduino-klaviatura-betta1-002Температура срабатывания конфигурируется в меню
arduino-klaviatura-betta1-003 Диапазон такжеarduino-klaviatura-betta1-004 Время подачи питания на кранarduino-klaviatura-betta1-005 Также есть счетчики срабатываний.arduino-klaviatura-betta1-006 Которые можно посмотреть или очиститьarduino-klaviatura-betta1-007Таким образом программа для крана готова. Теперь предстоит сделать корпус, замерить рабочий ток крана, подобрать блок питания 12В и проверить все в сборе.

Скетч — можно взять вот здесь — avalve_01-002  Это для версии 1.0.4 Ардуино, я все никак не соберусь перейти на более новую. Использована асинхронная библиотека для считывания температуры — работает быстрей стандартной. Внутри есть скетч для поиска адреса датчика температуры.

UPD1. Добавил сторожевой таймер, так как эта плата плата Arduino UNO поддерживает его,  исправил ошибок. Обновленные скрипты — avalve_01-003.

UPD2. Исправлены ошибки, добавлено сохранение состояния при выключении. Обновленные скрипты — avalve_01-004

UPD3. Внесена часть проверяющая валидность показаний датчика, и лишь тогда передающая их в в устройство.
Обновленные скрипты — avalve_01_005

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

UPD6 — Обновил ПО, исправил ошибки отображения символов. Нашел ошибку в не-ограничении принимаемых показаний. Теперь чтобы датчик иногда за ерунду не выдавал (помехи в длинной линии), она не будет приниматься. Скачать можно — здесь avalve_01-006

Автокран, выключатель не горячей воды — 3, программное обеспечение: 2 комментария

  1. Уведомление: Автокран-4, блок питания | Хроники фрилансера

  2. Уведомление: Выключатель не горячей воды -7, установка | Хроники фрилансера

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

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