Перейти к содержимому

IPB Style © Fisana

Энкодер KY-040. Собираем реле времени для электросушилки.

Опубликовано: 27.08.2018

видео Энкодер KY-040. Собираем реле времени для электросушилки.

Подключение модуля энкодера KY-040 к Arduino, простейший счетчик импульсов
Часть первая: Лирическая. Отвечает на вопрос «ЗАЧЕМ?»

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



. Мне-же эти ардуинки в свое время вообще обошлись в полцены, поскольку хитрый прод горсть заказанных 328-х обильно разбавил 168-ми и, пойманный за руку, не торгуясь, вернул половину суммы.

В качестве устройства отображения отлично подошел дисплейчик на TM1637 с высотой цифр 0.36”, найденный в запасах и продающийся сейчас на ебее . Данный дисплей изначально заточен на отображение времени, поэтому для моей цели вписался прекрасно.


S043 - Rotation Encoder Module (KY-040)

Для силовой коммутации я применил самое популярное одноканальное реле SDR-05VDC-SL-C, предлагаемое на . Но тут у меня сначала возникли сомнения – потянет ли? Хотя на нем и написано: 10A 250VAC, что-то я засомневался в способности этой малютки держать не то, что 2.5, а даже нужные мне полкиловатта. Пришлось обратиться к гуру электроники и наш уважаемый Ksiman развеял мои сомнения, поручившись за эту релюху.


Arduino: Rotary encoder (KY-040 37in1 kit) | TechKrowd

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

В качестве питания для ардуины, как ни странно, подошел маленький и исключительно поганый БП 220VAC-5VDC, купленный еще во времена оные за компактность и валяющийся без дела по причине нежелания ардуино-девайсов работать с таким мерзким питанием. Однако, к моему удивлению, с моим текущим набором компонент эта гадость подружилась отлично.

Наконец я и подошел к самому интересному – устройству ввода. Как осуществлять ввод быстро, безошибочно, с максимальным комфортом, не городя при этом многокнопочных панелей? И вот тут своего звездного часа дождался наконец энкодер KY-040, о существовании которого я когда-то узнал тут-же на муське, тогда-же его заказал и у меня давно чесались руки познакомиться с этим девайсом поближе.

На фото один из двух энкодеров, полученных мной с алиэкспресса еще в конце зимы. Цену видно на скриншоте заказа, сейчас они стоят чуть дороже, но стоимость также измеряется в центах. Что такое энкодер, объяснять, думаю, не надо. Ежедневно каждый из нас пользуется колесиком мыши. Особенностью же данного энкодера является наличие встроенной кнопки, срабатывающей при нажатии на торец вала сверху вниз. Кнопка без фиксации. Поворот вала на один шаг сопровождается легким, но вполне ощутимым щелчком и таких шагов здесь всего 30 на один полный поворот вала.

Посмотрим на пины энкодера поближе. Кроме питания + и GND видим пины CLK, DT и SW. Пин DT, при вращении вала, выдает простую последовательность 0 и 1 и служит для подсчета количества шагов, на которое вал поворачивается. А вот пин CLK позволяет определить направление вращения, для чего его значение нужно сравнить со значением на пине DT. Ну а пин SW и есть та самая пресловутая кнопка.

И как же, спросите вы, можно одним энкодером реализовать весь функционал по управлению реле? Можно. Но для этого я программным способом расширю возможности кнопки – введу понятия «короткое нажатие» и «длинное нажатие». Поэтому пора собирать стенд и приступать к моей любимой части любого проекта – программированию.

В качестве мозга для стенда я предпочитаю arduino UNO за большое количество доступных без макеток пинов, как пап, так и мам, наличия напряжений 5V и 3.3V и высокую скорость загрузки скетчей. При этом сохраняется полная совместимость с arduino Pro Mini, поскольку UNO базируется на том же самом чипе Atmega 328.

Схему подключения рисовать смысла нет, поскольку все подключения пинов расписаны в головном блоке программы. Ну и не забываем энкодер, дисплей и БП подключить к VCC и GND ардуино, соблюдая полярность. Прежде чем перейти к скетчу, хочу обратить внимание на то, что в качестве счетчика времени будет использоваться внутренний таймер ардуины. Да, это не такой точный таймер, как, например, DS3231 и я провел эксперимент, в результате которого выявилась ошибка в 2 сек на каждый час. Т.е. за 10 часов накопится ошибка в 20 сек. Для моих целей это несущественно и поэтому ставить точный сторонний таймер было бы экономически нецелесообразно. К тому-же я уверен, что тем-же механическим таймерам и такая точность не по-плечу.

Скетч

// © Klop 2018 // Реле времени для часов/минут // погрешность ~ 2 секунды в час #include <TM1637Display.h> #include <TimerOne.h> #include <Encod_er.h> #define CLK 4 // пин 4 подключаем к CLK дисплея #define DIO 3 // пин 3 подключаем к DIO дисплея #define pin_DT 9 // пин 9 подключаем к DT энкодера #define pin_CLK 2 // пин 2 подключаем к CLK энкодера #define pin_SW 12 // пин 12 подключаем к SW энкодера #define pin_Relay 7 // пин 7 подключаем к реле #define pin_Speaker 11// пин 11 подключаем к + пищалки ( - пищалки на землю) #define NotPush 0 #define ShortPush 1 #define LongPush 2 #define DurationOfLongPush 2000 // длительность длинного нажатия #define interval 250 Encod_er encoder(pin_CLK, pin_DT, pin_SW); TM1637Display display(CLK, DIO); byte cyfra[]={63,6,91,79,102,109,125,7,127,111}; byte data[] = {0,0,0,0}; byte mask=15, Hour=0, Minut=0, flsvet, zn, Signal=0; unsigned long TimeOfPush, tempu, TimerSec=0, mycounter=0, temp1, temp2; bool dvoet, myfl=false, ModeArbeiten=false, UkazHM=true, flEND=false; int8_t VAL; struct myMerz {word freq; unsigned long temp; bool flsvet; }; myMerz trig[]={{500,0,false}, // интервал мерцания двоеточия при работе {200,0,false}, // интервал мерцания минут и часов при задании времени {1000,0,false}};// интервал прерывания сигнала при окончании работы void setup() { Serial.begin(9600); Timer1.initialize(interval); // инициализация таймера 1, период interval мкс Timer1.attachInterrupt(timerInterrupt, interval); // задаем обработчик прерываний display.setBrightness(1); pinMode (pin_DT,INPUT); pinMode (pin_CLK,INPUT); pinMode (pin_SW,INPUT); pinMode (pin_Relay,OUTPUT); digitalWrite(pin_Relay, HIGH); digitalWrite(pin_SW, HIGH); // подтягиваем к 5V TimeOfPush=0; delay(100); encoder.timeLeft= 0; encoder.timeRight= 0; } //------------------------------------------------------------ // обработчик прерывания void timerInterrupt() { encoder.scanState(); if (ModeArbeiten) {tempu++; if (tempu==4000) {tempu=0; mycounter++;} } } //------------------------------------------------------------ void View() { // byte h=Hour; byte m=Minut; //для любителей видеть неполные мин (править ниже Hour и Minut на h и m) // if (ModeArbeiten && mycounter>0) {m++; if (m==60) {m=0; h++;} data[0]=cyfra[Hour/10]; data[1]=cyfra[Hour%10]; data[2]=cyfra[Minut/10]; data[3]=cyfra[Minut%10]; for (byte i=0;i<4;i++) if (!bitRead(mask,i)) data[3-i]=0; if (dvoet) data[1]= data[1]|0x80; display.setSegments(data); } //------------------------------------------------------------ bool procmerz(byte num) { unsigned long tempmillis=millis(); // триггер переключается с периодом из trig if (tempmillis-trig[num].temp>trig[num].freq) { trig[num].temp=tempmillis; trig[num].flsvet=!trig[num].flsvet; } return(trig[num].flsvet); } //------------------------------------------------------------ byte mypush() // возвращает длинное-2, короткое-1 или осутствие нажатия-0 { unsigned long tpr=millis(); bool res=NotPush; if (!digitalRead(pin_SW)) { if (TimeOfPush==0) TimeOfPush=tpr; else if (tpr-TimeOfPush>DurationOfLongPush && !myfl) { TimeOfPush=0; myfl=true; return(LongPush); } } else { if (TimeOfPush>0 && !myfl) res=ShortPush; TimeOfPush=0; myfl=false; } return(res); } //------------------------------------------------------------ int8_t norm(int8_t aa, byte dob, byte mf) // делаем аа в пределах mf, начиная от dob { if (aa>mf) return(dob); if (aa<dob) return(mf); return(aa); } //------------------------------------------------------------ void Sec2HourMin() { Hour=(TimerSec-mycounter)/3600; Minut=(TimerSec-mycounter)%3600/60; } //------------------------------------------------------------ void loop() { dvoet=true; zn=procmerz(1); mask=15; unsigned long tempx=millis(); if (procmerz(2) && flEND && tempx-temp2<10000L) analogWrite(pin_Speaker,150); // издаем звук else analogWrite(pin_Speaker,0); byte rrr=mypush(); if (rrr!=NotPush) // произошло нажатие { flEND=false; if (rrr==ShortPush) UkazHM=!UkazHM; // короткое if (rrr==LongPush) {ModeArbeiten=!ModeArbeiten; // длинное if (ModeArbeiten) { mycounter=0; // запуск таймера TimerSec=Hour*3600L+Minut*60L; if (TimerSec==0) ModeArbeiten=false; else digitalWrite(pin_Relay,LOW); } else { digitalWrite(pin_Relay,HIGH);//отключаем реле принудительно Hour=0; Minut=0; } } } if (ModeArbeiten) // режим работы { dvoet=procmerz(0); if (TimerSec==mycounter) { ModeArbeiten=false; // отключаем реле по времени digitalWrite(pin_Relay,HIGH); temp2=tempx; flEND=true; } Sec2HourMin(); } else // режим установки времени {if (UkazHM) { if (zn) mask=B0011; Hour=norm(Hour+VAL,0,99); } else {if (zn) mask=B1100; Minut=norm(Minut+VAL,0,59); } if (tempx-temp1<500) mask=15; // не моргать при вращении энкодера } VAL=0; if (encoder.timeRight!=0) // обрабатываем повороты энкодера { VAL=1; encoder.timeRight=0; goto m1; } else if (encoder.timeLeft!=0) { VAL=-1; encoder.timeLeft=0; m1: temp1=tempx; flEND=false; // при любом повороте отключаем сигнал if (!digitalRead(pin_SW)) VAL=0; // если кнопка нажата, поворот игнорить } View(); }

В скетче используются 3 дополнительные библиотеки: , ,

Основные моменты скетча я снабдил комментариями.

Поясню вкратце логику работы.

При подаче питания мы увидим на дисплее нули на месте часов и минут, причем часы быстро мигают. Это означает, что именно часы находятся в режиме редактирования и поворот вала энкодера приведет к изменению их значения. Короткое нажатие на энкодер переключит нас с часов на минуты. Коротким считается нажатие кнопки на время менее 2 сек и отрабатывается по отпусканию кнопки. Значения часов меняются с 0 до 99 по кругу, значения минут с 0 до 59 аналогично. Для комфортного выставления времени, во время вращения вала, изменяемое значение не мигает. В режиме редактирования времени двоеточие горит постоянно. Нажатие кнопки и ее удерживание более 2 сек считается длинным нажатием и автоматически наступает после 2 сек удерживания кнопки, отпускание может произойти когда угодно потом. Но пока не будет отпущена кнопка, следующего нажатия не произойдет. Итак, длинное нажатие стартует реле времени, если оно находилось в режиме редактирования времени или принудительно отключает его, если то находилось в режиме работы. Во втором случае оставшиеся часы и минуты обнуляются. В режиме работы на дисплее выводится оставшееся время, двоеточие мигает с периодом 1 сек. В этом режиме реле не реагирует на вращение вала и короткие нажатия. По истечении заданного времени реле отключается и на протяжении 10 сек выдаются прерывистый сигнал об окончании работы. Если во время сигнализации повернуть вал энкодера или нажать на него, сигнал снимается.

Все отлажено и проверено. Заливаем полученный скетч в arduino Pro Mini и паяем всю конструкцию.

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

Для пьезопищалки просверлил отверстие и вклеил пищалку точно напротив него. На вал энкодера насадил маховичок из загашника. С одной стороны в коробку заходит провод с вилкой, с другой провод с розеткой. В итоге получился такой удлиннитель с реле времени посередине. Во время многочасовой работы нагрева не зафиксировано.

В конце обзора короткое видео работы реле:

В итоге, благодаря использованию энкодера KY-040 я получил довольно удобное управление для реле времени и заказал себе еще пару на будущее.

А реле этот урожай конечно отработает и перейдет на ПМЖ в гараж, где этому колхозу самое место ). Там у меня электрокоптильня с теном 700W, которая используется круглогодично. И тоже без реле времени.

Планирую купить +1 Добавить в избранное


rss