Исполнительный таймер на Arduino
Исполнительный таймер обратного отсчета — это схема, которая по истечению заданного нами времени включает исполнительное устройство. В данном случае это модуль электромагнитного реле.
ТЗ
Создать таймер обратного отсчета, который по окончании времени на табло будет приводить в действие реле. Цифры вбиваются слева-направо, как в калькуляторе. Максимальное значение таймера — это 9999 секунд. Таймер можно сбросить в любой момент, нажав соответствующую кнопку на клавиатуре. В нашем случае кнопка «А» — это кнопка «Пуск», а «звездочка» — это кнопка сброса таймера. После срабатывания таймера реле должно удерживаться в рабочем состоянии, пока мы не нажмем кнопку сброса.
Сборка в железе
Итак, для начала находим подходящее железо. Это, конечно же, сам модуль Arduino
клавиатура для Arduino
индикатор 1602 с кириллицей
его обратная сторона
ну а также модуль реле
Схема соединения всей конструкции будет выглядеть вот так (для полного открытия кликните на схему):
Вместо модуля реле здесь мы видим бузер для наглядности симуляции.
В сборе вся конструкция примет вот такой вид:
Как вы могли заметить, здесь мы также видим ползунковый переменный резистор, с помощью которого подбираем подсветку для нашего дисплея.
Программа
Первым делом не забываем подключить файл библиотеки LiquidCrystalRus.h . Для того, чтобы это сделать, нам надо скачать этот архив по этой ссылке. Потом делаем простые телодвижения:
Скетч—->Подключить библиотеку—->Добавить ZIP. библиотеку… и выбираем наш файл, который мы только что скачали
Ну а потом не забываем добавить этот файл в наш проект.
После благополучного исхода у нас вставится в код вот такая строчка
#include <LiquidCrystalRus.h>
Те же самые операции проводим и с Keypad.h . Скачать его можно здесь.
Собственно сама программа с комментариями:
#include <LiquidCrystalRus.h> //
#include <Keypad.h> //
#define LED1 10 //пин Arduino к которому подключен красный светодиод.
#define LED2 11 //пин Arduino к которому подключен зеленый светодиод.
#define RELAY 12 //пин Arduino к которому подключено реле
#define WE A5 //пин Arduino к которому подключен дисплей
#define RS A0 //пин Arduino к которому подключен дисплей
#define DB4 A1 //пин Arduino к которому подключен дисплей
#define DB5 A2 //пин Arduino к которому подключен дисплей
#define DB6 A3 //пин Arduino к которому подключен дисплей
#define DB7 A4 //пин Arduino к которому подключен дисплей
char m1=0; //1 знак единицы секунд
char m2=0; //2 знак десятки секунд
char h1=0; //3 знак сотни секунд
char h2=0; //4 знак тысячи секунд
unsigned long Time; //Здесь храним общую сумму секунд
char key; //Символ нажатой клавиши
int k=0; //Счетчик буфера нажатий
int m=0; //Счетчик знакоместа 1-4 цифры
int s=4; //Обратный счетчик знакомест
int d=0; //Счетчик буфера знакоместа
char z1=0;//Знакоместо 1 символа
char z2=0;//Знакоместо 2 символа
char z3=0;//Знакоместо 3 символа
char z4=0;//Знакоместо 4 символа
char myarraw[4] {0, 0, 0, 0}; //массив хранения набранных символов
const byte ROWS = 4; // здесь ты задаешь количество строк в матрице
const byte COLS = 4; // здесь количество столбцов
char keys[ROWS][COLS] = { // здесь ты создаешь таблицу соответствия символов к кнопкам на клаве
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
byte rowPins[ROWS] = {5, 4, 3, 2}; // здесь ты указывешь пины, подключенные к строкам матрицы
byte colPins[COLS] = {9, 8, 7, 6}; // здесь пины к столбцам матрицы
char button_pressed[4];
char znak_mesto [4] = {0, 0, 0, 0};// Массив хранения знакомест
unsigned long timing;//Здесь храним засеченное время, по нажатию кнопки А, старт таймера.
unsigned long cifra1;//Конвертация единиц секунд из символов в цифры
unsigned long cifra2;//Конвертация десятков секунд из символов в цифры
unsigned long cifra3;//Конвертация сотен секунд из символов в цифры
unsigned long cifra4;//Конвертация тысяч секунд из символов в цифры
unsigned long tim1;
unsigned long Otschet;
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // здесь ты создаешь объект клавиатуры с указанными
LiquidCrystalRus lcd(RS, WE, DB4, DB5, DB6, DB7); //Объявляем переменные
void setup() //цикл настроек
{
pinMode(RELAY, OUTPUT); // это конфигурация пина на выход
digitalWrite(RELAY, LOW); //это запись лог.единицы в пин
pinMode(LED1, OUTPUT); // это конфигурация пина на выход
pinMode(LED2, OUTPUT); // это конфигурация пина на выход
Serial.begin(9600);
pinMode(A0, OUTPUT); // это конфигурация пина на выход
pinMode(A1, OUTPUT); // это конфигурация пина на выход
pinMode(A2, OUTPUT); // это конфигурация пина на выход
pinMode(A3, OUTPUT); // это конфигурация пина на выход
pinMode(A4, OUTPUT); // это конфигурация пина на выход
lcd.begin(16, 2); // инициализируем дисплей
}
void loop() //Открываем основной цикл
{ timing=0; //Обнуляем переменные
Time=0; //Обнуляем переменные
lcd.setCursor(0, 1); // Устанавливаем курсор, нижняя строка, первый знак
lcd.print( "Ввод 4 знака сек" ); //Выводим текст, в нижней строке
key = keypad.getKey (); //опрос клавиатуры
if ( key != NO_KEY )
{ // если клавиша нажата выполн. условие
if( key == '*' ) // Если нажата кнопка *, выполняем условие
{
char button_pressed [4] {0, 0, 0, 0}; //Обнуляем массив
m1=0; //Обнуляем переменные
Time=0; //Обнуляем переменные
m2=0; //Обнуляем переменные
Time=0; //Обнуляем переменные
m2=0; //Обнуляем переменные
h1=0; //Обнуляем переменные
h2=0; //Обнуляем переменные
cifra1 = 0; //Обнуляем переменные
cifra2 = 0; //Обнуляем переменные
cifra3 = 0; //Обнуляем переменные
cifra4 = 0; //Обнуляем переменные
k=0; //Обнуляем переменные
digitalWrite (LED1, HIGH); //это запись лог. ноля в пин. ошиб кода
lcd.setCursor(0, 1); // Устанавливаем курсор, нижняя строка, первый знак
lcd.print( " " ); //Стираем текст, в нижней строке
lcd.setCursor(0, 0); // Устанавливаем курсор, нижняя строка, первый знак
lcd.print( "Сбр. наб. кода" ); //Выводим текст, в верхней строке
delay (1000); // задержка 1000 мсек (1 сек)
digitalWrite (LED1, LOW); //это запись лог. ноля в пин. ошиб кода
lcd.setCursor(0, 0); // Устанавливаем курсор, нижняя строка, первый знак
lcd.print( " " ); //Стираем текст, в верхней строке
s=4; //Обнуляем переменные
d=0; //Обнуляем переменные
char znak_mesto [4] {0, 0, 0, 0}; //Обнуляем массив
m=0; //Обнуляем переменные
z1=0; //Обнуляем переменные
z2=0; //Обнуляем переменные
z3=0; //Обнуляем переменные
z4=0; //Обнуляем переменные
return; //Выход в основной цикл
}
if(( key == 'B' ) ||( key == 'C' ) ||( key == 'D' ) ||( key == '#' )) // Если нажаты кнопки B, C, D, #, выполняем условие
{ lcd.setCursor(0, 1); // Устанавливаем курсор, нижняя строка, первый знак
lcd.print( " " ); //Стираем текст, в нижней строке
lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( "Непр. символ" ); //Выводим текст, в верхней строке
digitalWrite (LED1, HIGH); //это запись лог. ноля в пин. ошиб кода
delay (1000); // задержка 1000 мсек (1 сек)
digitalWrite (LED1, LOW); //это запись лог. ноля в пин. ошиб кода
lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в верхней строке
d=4; //Обнуляем переменные
s=4; //Обнуляем переменные
d=0; //Обнуляем переменные
char znak_mesto [4] {0, 0, 0, 0}; //Обнуляем массив
m=0; //Обнуляем переменные
z1=0; //Обнуляем переменные
z2=0; //Обнуляем переменные
z3=0; //Обнуляем переменные
z4=0; //Обнуляем переменные
return; //Выход в основной цикл
}
if (k >= 4) //Если счетчик нажатий к >= 4, то выполняем условие
{
if(key == 'A') //Если нажата клавиша А, выполняем условие
{
m=0; //Обнуляем переменные
lcd.setCursor(0, 1); // Устанавливаем курсор, нижняя строка, первый знак
lcd.print( " " ); //Стираем текст, в верхней строке
timing = millis(); // сохранили текущее время
k=0; //Обнуляем переменные
digitalWrite (LED2, HIGH); //это запись лог. 1 в пин. код совпал
delay (1000); // задержка 1000 мсек (1 сек);
digitalWrite (LED2, LOW); //это запись лог. 0 в пин. код совпал
m1=button_pressed [3]; //Присваиваем единицам секунд, третье значение массива
m2=button_pressed [2]; //Присваиваем десяткам секунд, второе значение массива
h1=button_pressed [1]; //Присваиваем сотням секунд, первое значение массива
h2=button_pressed [0]; //Присваиваем тысячам секунд, нулевое значение массива
cifra1 = (m1-47); //Присваиваем переменной значение первого набранного знака
cifra2 = (m2-47); //Присваиваем переменной значение первого набранного знака
cifra3 = (h1-47); //Присваиваем переменной значение первого набранного знака
cifra4 = (h2-47); //Присваиваем переменной значение первого набранного знака
Time=(((cifra1-1)*1000)+((cifra2-1)*10000)+((cifra3-1)*100000)+((cifra4-1)*1000000)); //Считаем общую сумму секунд таймера
delay (1000); //Задержка 1000 мсек (1 сек);
lcd.setCursor(0, 0); //Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в нижней строке
lcd.setCursor(0, 0); //Устанавливаем курсор, верхняя строка, первый знак
lcd.print( "Выдержка="); //Выводим текст, в нижней строке
Otschet=Time; //Присваиваем значение переменной
lcd.print( Otschet/1000 ); //Выводим текст, в нижней строке
lcd.setCursor(0, 0); //Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в нижней строке
Time=Time+3000; //Увеличиваем значение переменной
while(millis() < timing + Time) //Цикл отсчета времени
{ key = keypad.getKey (); //Опрос клавиатуры
tim1=(Time-(millis() - timing)); //Присваиваем переменной значение оставшегося времени
lcd.setCursor(0, 0); //Устанавливаем курсор, верхняя строка, первый знак
lcd.print("Счет пошел="); //Выводим текст, в верхней строке
lcd.setCursor(11, 0); //Устанавливаем курсор, верхняя строка, 12 знак
lcd.print(" "); //Стираем текст, в нижней строке
lcd.setCursor(11, 0); //Устанавливаем курсор, верхняя строка, 12 знак
lcd.print((tim1/1000)); //Выводим значение оставшихся секунд
lcd.setCursor(0, 1); //Устанавливаем курсор, верхняя строка, первый знак
lcd.print( "Выдержка=" ); //Выводим текст, в нижней строке
lcd.print( Otschet/1000); //Выводим значение выбранной выдержки
delay (1000); // задержка 1000 мсек (1 сек);
if( key == '*' ) // Если нажата кнопка *, выполняем условие
{
char button_pressed [4] {0, 0, 0, 0}; //Обнуляем массив
m1=0; //Обнуляем переменные
Time=0; //Обнуляем переменные
m2=0; //Обнуляем переменные
h1=0; //Обнуляем переменные
h2=0; //Обнуляем переменные
cifra1 = 0; //Обнуляем переменные
cifra2 = 0; //Обнуляем переменные
cifra3 = 0; //Обнуляем переменные
cifra4 = 0; //Обнуляем переменные
k=0; //Обнуляем переменные
s=4; //Обнуляем переменные
d=0; //Обнуляем переменные
m=0; //Обнуляем переменные
z1=0; //Обнуляем переменные
z2=0; //Обнуляем переменные
z3=0; //Обнуляем переменные
z4=0; //Обнуляем переменные
char znak_mesto [4] {0, 0, 0, 0}; //Обнуляем массив
digitalWrite (LED1, HIGH); //это запись лог. ноля в пин. ошиб кода
lcd.setCursor(0, 0); //Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в нижней строке
lcd.setCursor(0, 1); //Устанавливаем курсор, нижняя строка, первый знак
lcd.print( " " ); //Стираем текст, в верхней строке
lcd.setCursor(0, 0); //Устанавливаем курсор, верхняя строка, первый знак
lcd.print( "Сбр. таймера" ); //Выводим текст, в верхней строке
delay (1000); // задержка 5000 мсек (5 сек) // задержка 1000 мсек (1 сек);
lcd.setCursor(0, 0); //Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в нижней строке
lcd.setCursor(0, 1); //Устанавливаем курсор, нижняя строка, первый знак
lcd.print( " " ); //Стираем текст, в верхней строке
digitalWrite (LED1, LOW); //зажигаем светодиод сброс
return; //Выход в основной цикл
};
if(millis() > timing + Time)
{lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в нижней строке
lcd.setCursor(0, 1); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в нижней строке
while (true) //бесконечный цикл, реле включено, пока не нажата кнопка сброс
{
key = keypad.getKey (); //опрос клавиатуры
lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( "Реле включено." ); //Выводим текст, в верхней строке
digitalWrite (RELAY, HIGH); //это запись лог. ноля в пин. включ реле
char button_pressed [4] {0, 0, 0, 0}; //Обнуляем массив
m1=0; //Обнуляем переменные
Time=0; //Обнуляем переменные
m2=0; //Обнуляем переменные
h1=0; //Обнуляем переменные
h2=0; //Обнуляем переменные
cifra1 = 0; //Обнуляем переменные
cifra2 = 0; //Обнуляем переменные
cifra3 = 0; //Обнуляем переменные
cifra4 = 0; //Обнуляем переменные
k=0; //Обнуляем переменные
s=4; //Обнуляем переменные
d=0; //Обнуляем переменные
m=0; //Обнуляем переменные
z1=0; //Обнуляем переменные
z2=0; //Обнуляем переменные
z3=0; //Обнуляем переменные
z4=0; //Обнуляем переменные
char znak_mesto [4] {0, 0, 0, 0}; //Обнуляем массив
if( key == '*' )
{
digitalWrite (LED1, HIGH); //зажигаем светодиод сброс
lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " );//Стираем текст, в верхней строке
lcd.setCursor(0, 1); // Устанавливаем курсор, нижняя строка, первый знак
lcd.print( " " );//Стираем текст, в нижней строке
lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( "Сброс реле." ); //Выводим текст, в нижней строке
digitalWrite (RELAY, LOW); //это запись лог. ноля в пин. включ реле
delay (1000); // задержка 1000 мсек (1 сек)
lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " );//Стираем текст, в верхней строке
lcd.setCursor(0, 1); // Устанавливаем курсор, нижняя строка, первый знак
lcd.print( " " );//Стираем текст, в нижней строке
digitalWrite (LED1, LOW); //гасим светодиод сброс
char button_pressed [4] {0, 0, 0, 0}; //Обнуляем массив
m1=0; //Обнуляем переменные
Time=0; //Обнуляем переменные
m2=0; //Обнуляем переменные
h1=0; //Обнуляем переменные
h2=0; //Обнуляем переменные
cifra1 = 0; //Обнуляем переменные
cifra2 = 0; //Обнуляем переменные
cifra3 = 0; //Обнуляем переменные
cifra4 = 0; //Обнуляем переменные
k=0; //Обнуляем переменные
s=4; //Обнуляем переменные
d=0; //Обнуляем переменные
m=0; //Обнуляем переменные
z1=0; //Обнуляем переменные
z2=0; //Обнуляем переменные
z3=0; //Обнуляем переменные
z4=0; //Обнуляем переменные
char znak_mesto [4] {0, 0, 0, 0}; //Обнуляем массив
return; //Выход в основной цикл
}
}
}
}
}
}
}
if((key == '1' ) || (key == '2' ) || (key == '3' )
|| (key == '4' ) || (key == '5' ) || (key == '6' )
|| (key == '7' ) || (key == '8' ) || (key == '9' ) || (key == '0' )) //Если была нажаты цифровые клавиши, выполняем условие
{
if(m >= 4) //Проверяем счетчик нажатий, если меньше или равен 4
{
m=4; //то присваиваем переменной значение 4, и выходим в основной цикл
return; //Выход в основной цикл
}
m=m+1; //Увеличиваем значение переменной на 1 и возвращаем
s=s-1; //Уменьшаем значение переменной на 1 и возвращаем
d=s; //Присваиваем значение переменной
znak_mesto [d] = key;
z1=znak_mesto [3]; //Минуты 1 знак
z2=znak_mesto [2]; //Минуты 2 знак
z3=znak_mesto [1]; //Часы 1 знак
z4=znak_mesto [0]; //Часы 2 знак
if( m == 1 ) //Проверяем значение переменной
{
lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в верхней строке
lcd.setCursor(s, 0); // Устанавливаем курсор, верхняя строка, знакоместо переменная s
lcd.print( z1 ); //Выводим значение переменной, набранной цифры
}
if( m == 2 ) //Проверяем значение переменной
{
lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в верхней строке
lcd.setCursor(s, 0); // Устанавливаем курсор, верхняя строка, знакоместо переменная s
lcd.print( z1 ); //Выводим значение переменной, набранной цифры
delay (50); // задержка 50 мсек ;
lcd.print( z2 ); //Выводим значение переменной, набранной цифры
}
if( m == 3 ) //Проверяем значение переменной
{
lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в верхней строке
lcd.setCursor(s, 0); // Устанавливаем курсор, верхняя строка, знакоместо переменная s
lcd.print( z1 ); //Выводим значение переменной, набранной цифры
delay (50); // задержка 50 мсек ;
lcd.print( z2 ); //Выводим значение переменной, набранной цифры
delay (50); // задержка 50 мсек ;
lcd.print( z3 ); //Выводим значение переменной, набранной цифры
}
if( m == 4 ) //Проверяем значение переменной
{
lcd.setCursor(0, 0); // Устанавливаем курсор, верхняя строка, первый знак
lcd.print( " " ); //Стираем текст, в верхней строке
lcd.setCursor(s, 0); // Устанавливаем курсор, верхняя строка, знакоместо переменная s
lcd.print( z1 ); //Выводим значение переменной, набранной цифры
delay (50); // задержка 50 мсек ;
lcd.print( z2 ); //Выводим значение переменной, набранной цифры
delay (50); // задержка 50 мсек ;
lcd.print( z3 ); //Выводим значение переменной, набранной цифры
delay (50); // задержка 50 мсек ;
lcd.print( z4 ); //Выводим значение переменной, набранной цифры
}
delay (50); // задержка 50 мсек ;
lcd.setCursor(1, 0); // Устанавливаем курсор, нижняя строка, первый знак
button_pressed [k] = key; //присваиваем первому значению массива значение нажатой клавиши
digitalWrite (LED1, HIGH); //это запись лог. 1 в пин.
delay (300); // задержка 300 мсек (0.3 сек)
digitalWrite (LED1, LOW); //это запись лог. 0 в пин.
k=k + 1; //Увеличиваем значение переменной на 1 и возвращаем
if(d == 0) //Проверяем счетчик буфера знакоместа
{
return; //Выход в основной цикл
}
if(k >= 4) //Если счетчик нажатий равен или больше 4
{
k=4; //Присваиваем переменной значение 4
}
}
}
Прикрепляю файлы проекта.
Ты наверное далеко слишком зашел в радиоэлектронике, раз читаешь эту статью. Прочитай болеее простую статью, например про протоны.
Сопротивление формула — её нужна знать.









