Содержание
Исполнительный таймер обратного отсчета — это схема, которая по истечению заданного нами времени включает исполнительное устройство. В данном случае это модуль электромагнитного реле.
ТЗ
Создать таймер обратного отсчета, который по окончании времени на табло будет приводить в действие реле. Цифры вбиваются слева-направо, как в калькуляторе. Максимальное значение таймера — это 9999 секунд. Таймер можно сбросить в любой момент, нажав соответствующую кнопку на клавиатуре. В нашем случае кнопка «А» — это кнопка «Пуск», а «звездочка» — это кнопка сброса таймера. После срабатывания таймера реле должно удерживаться в рабочем состоянии, пока мы не нажмем кнопку сброса.
Сборка в железе
Итак, для начала находим подходящее железо. Это, конечно же, сам модуль Arduino
клавиатура для Arduino
индикатор 1602 с кириллицей
его обратная сторона
ну а также модуль реле
Схема соединения всей конструкции будет выглядеть вот так (для полного открытия кликните на схему):
Вместо модуля реле здесь мы видим бузер для наглядности симуляции.
В сборе вся конструкция примет вот такой вид:
Как вы могли заметить, здесь мы также видим ползунковый переменный резистор, с помощью которого подбираем подсветку для нашего дисплея.
Программа
Первым делом не забываем подключить файл библиотеки LiquidCrystalRus.h . Для того, чтобы это сделать, нам надо скачать этот архив по этой ссылке. Потом делаем простые телодвижения:
Скетч—->Подключить библиотеку—->Добавить ZIP. библиотеку… и выбираем наш файл, который мы только что скачали
Ну а потом не забываем добавить этот файл в наш проект.
После благополучного исхода у нас вставится в код вот такая строчка
#include <LiquidCrystalRus.h>
Те же самые операции проводим и с Keypad.h . Скачать его можно здесь.
Собственно сама программа с комментариями:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 |
#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 } } } |
Прикрепляю файлы проекта.
Ты наверное далеко слишком зашел в радиоэлектронике, раз читаешь эту статью. Прочитай болеее простую статью, например про протоны.
Сопротивление формула — её нужна знать.
Популярные статьи