МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Кафедра Полупроводниковых приборов и Микроэлектроники Лабораторная работа № 1 «Знакомство со средой разработки ARDUINO IDE и лабораторным стендом на основе отладочной платы ARDUINO MEGA» Факультет: РЭФ Группа: РМС7-81 Студент: Мельниченко И.Е. Преподаватель: Лобач О.В. Дата выполнения работы: 15.10.2021 Новосибирск, 2021 ИСПОЛЬЗУЕМЫЕ ФУНКЦИИ 1. pinMode(pin,mode) – устанавливает режим используемых портов. pin – вывод, с которым собираемся работать. mode – указывается как должен работать порт (на выход, вход) 2. digitalWrite(pin,value) – принимает параметры порта. pin – номер цифрового порта. value – значение, которое отправляется на порт. (HIGH или LOW). 3. millis () – возвращает количество миллисекунд, прошедших с запуска программы. 4. digitalRead (pin) – считывание показаний цифрового вывода. 5.If (условие) – задание условий, при котором будет выполняться действие. 6. switch () – позволяет создавать конструкции, разветвляющие действия в зависимости от значения одной переменной. 7. #define – директива определяет идентификатор и последовательность символов, которой будет замещаться данный идентификатор при его обнаружении в тексте программы. 2 1. НАПИСАТЬ ПРОГРАММУ РЕАЛИЗУЮЩИЮ АЛГОРИТМ РАБОТЫ СВЕТОФОРА Текст программы: #define RED 13 #define YELLOW 12 #define GREEN 11 unsigned long VREMYA1,VREMYA2,VREMYA3; //считаем время с начала работы контроллера void setup() { // put your setup code here, to run once: pinMode(RED,OUTPUT); pinMode(YELLOW,OUTPUT); pinMode(GREEN,OUTPUT); } void loop() { // put your main code here, to run repeatedly: if ((millis()- VREMYA1 > 0 && millis()- VREMYA1 < 5000)) // 5 сек горит красный и захватывает время с жёлтым { digitalWrite(RED, HIGH); } else { digitalWrite(RED, LOW); } if((millis() - VREMYA2 > 3000 && millis() - VREMYA2 < 5000) || (millis() - VREMYA2 > 11000 && millis() - VREMYA2 < 12000)) // желтый горит 3-5 секунд вместе с красным, { // и 11-12 сек. после мигания зеленого 3 digitalWrite(YELLOW,HIGH); // и завершает цикл } else { digitalWrite(YELLOW,LOW); } if((millis() - VREMYA3 > 5100 && millis() - VREMYA3 < 8100) || (millis() - VREMYA3 > 8500 && millis() - VREMYA3 < 9000) || (millis() - VREMYA3 > 9500 && millis() - VREMYA3 < 10000) || (millis() - VREMYA3 > 10500 && millis() - VREMYA3 < 11000)) //зеленый горит 6-8 сек и(ИЛИ) { // моргает с периодичностью пол секунды три раза до 10.5 digitalWrite(GREEN,HIGH); } else { digitalWrite(GREEN,LOW); } if (millis() - VREMYA1 > 12000) { VREMYA1 = millis(); } if (millis() - VREMYA2 > 12000) { VREMYA2 = millis(); } if (millis() - VREMYA3 > 12000) { VREMYA3 = millis(); } // в конце все таймеры обнуляются, цикл повторяется 4 } Вывод: Реализован алгоритм работы светофора с использованием функции millis. 5 2.НАПИСАТЬ ПРОГРАММУ ВЫБОРА РЕЖИМА РАБОТЫ СВЕТОФОРА (МОРГАНИЕ ЖЕЛТОГО И ОБЫЧНЫЙ РЕЖИМ). Текст программы: #define RED 13 #define YELLOW 12 #define GREEN 11 int button =0; // текущее состояние кнопки int previous_bs; // предыдущее состояние кнопки int MODE=0; // начальный режим работы светофора т.е выключен. unsigned long v,y; // предыдущее значение millis int state_flash=0; //состояние желтого светодиода при моргании. void setup() { pinMode(RED, OUTPUT); pinMode(YELLOW, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(2, INPUT_PULLUP); button = digitalRead(2); //считывание кнопки previous_bs = button; // определение переменной 6 } void loop() { button = digitalRead(2); if(button==HIGH && previous_bs==LOW) //нажатие кнопки { MODE++; // смена режима +1 delay(20); // задержка для исключения дребезга if(MODE>2) //количество режимов 2. { MODE=1; //если переменная режима больше 2, то возрат к 1 } } previous_bs=button; //сохранение состояния кнопки. switch (MODE) //автомат для переключения режимов. { case 0: //выключенное состояние светофора. break; 7 case 1: //моргание желтым. digitalWrite(RED,LOW); digitalWrite(GREEN,LOW); switch (state_flash) { case 0: if(millis()-y>200) { state_flash=1; y=millis(); digitalWrite(YELLOW,HIGH); } break; case 1: if(millis()-y>200) { state_flash=0; 8 y=millis(); digitalWrite(YELLOW,LOW); } break; } v=millis(); // фиксирование millis для того, чтобы светофор начинал работу с зеленого break; case 2: digitalWrite(YELLOW,LOW); if (millis()-v<=3000) //зеленый горит. { digitalWrite (GREEN,HIGH); } if (millis()-v>3000 && millis()-v<=3200) //моргание зеленого. { digitalWrite (GREEN,LOW); } 9 if (millis()-v>3200 && millis()-v<=3400) { digitalWrite (GREEN,HIGH); } if (millis()-v>3400 && millis()-v<=3600) { digitalWrite (GREEN,LOW); } if (millis()-v>3600 && millis()-v<=3800) { digitalWrite (GREEN,HIGH); } if (millis()-v>3800 && millis()-v<=4000)//зелёный гаснит { digitalWrite (GREEN,LOW); } if (millis()-v>4000 && millis()-v<=7000) //загорается желтый. { 10 digitalWrite (YELLOW,HIGH); } if (millis()-v>7000 && millis()-v<=10000) //Красный. { digitalWrite (YELLOW,LOW); digitalWrite (RED,HIGH); } if (millis()-v>10000 && millis()-v<=12000) //Касный и Желтый { digitalWrite (YELLOW,HIGH); digitalWrite (RED,HIGH); } if (millis()-v>12000) //конец цикла, сброс. { digitalWrite (YELLOW,LOW); digitalWrite (RED,LOW); v=millis(); 11 } break; } } Вывод: Реализован алгоритм выбора режима работы светофора (моргание желтого и обычный режим). 12