Исполнительный таймер на Arduino

timerrr

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

ТЗ

Создать таймер обратного отсчета, который по окончании времени на табло будет приводить в действие реле. Цифры вбиваются слева-направо, как в калькуляторе. Максимальное значение таймера — это 9999 секунд. Таймер можно сбросить в любой момент, нажав соответствующую кнопку на клавиатуре. В нашем случае кнопка «А»  — это кнопка «Пуск», а «звездочка» — это кнопка сброса таймера. После срабатывания таймера реле должно удерживаться в рабочем состоянии, пока мы не нажмем кнопку сброса.

Сборка в железе

Итак, для начала находим подходящее железо. Это, конечно же, сам модуль Arduino

Исполнительный таймер на Arduino

клавиатура для Arduino

Исполнительный таймер на Arduino

индикатор 1602 с кириллицей

Исполнительный таймер на Arduino

его обратная сторона

Исполнительный таймер на Arduino

ну а также модуль реле

Исполнительный таймер на Arduino

Схема соединения всей конструкции будет выглядеть вот так (для полного открытия кликните на схему):

Исполнительный таймер на Arduino

Вместо модуля реле здесь мы видим бузер для наглядности симуляции.

В сборе вся конструкция примет вот такой вид:

Исполнительный таймер на Arduino

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

Программа

Первым делом не забываем подключить файл библиотеки LiquidCrystalRus.h . Для того, чтобы это сделать, нам надо скачать этот архив по этой ссылке. Потом делаем простые телодвижения:

Скетч—->Подключить библиотеку—->Добавить ZIP. библиотеку… и выбираем наш файл, который мы только что скачали

Исполнительный таймер на Arduino

Ну а потом не забываем добавить этот файл в наш проект.

Исполнительный таймер на Arduino

После благополучного исхода у нас вставится в код вот такая строчка

#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
      }
     }
    }
   
 

Прикрепляю файлы проекта.

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

Сопротивление формула — её нужна знать.