Разработку будем вести в Arduino IDE. По умолчанию Arduino IDE не поддерживает микроконтроллеры семейства ATtiny, но есть способ их подружить между собой. Зачем это делать? Для того чтобы вести разработку в знакомой среде, не выходить из зоны комфорта. Качаем библиотеки ATtiny тут. Затем распаковываем архив и кладем в папку C:\Program Files\arduino-1.8.2\hardware\. Должно получиться примерно как на картинке.
Как прошивать микроконтроллеры Attiny через Arduino описано здесь, поэтому не буду на этом заострять внимание.
Собираем на макетной плате схему. Светодиоды подключаем к разъему J1 по два параллельно:
12 - красный
11 - желтый
10 - зеленый
9 - красный
8 - желтый
7 - зеленый
Светофор работает в двух режимах, ручном и автоматическом. В ручной режим он переходит по нажатию кнопки. При повторном нажатии кнопки происходит переключение сигналов светофора. Если в течение одной минуты кнопку не нажимать светофор переходит в автоматический режим. В автоматическом режиме переключение сигналов происходит каждые 7 секунд.
Код программы с описанием представлен ниже
////////////////////////
// --== Светофор ==-- //
////////////////////////
int m_control = 0; // флаг сработки прерывания
int auto_control = 1; // флаг автоматического управления
int man_out = 0; // обратный отсчет до выхода из авто режима
int red = 13;
int yellow = 12;
int green = 11;
int red2 = 10;
int yellow2 = 9;
int green2 = 8;
void setup() {
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
pinMode(red2, OUTPUT);
pinMode(yellow2, OUTPUT);
pinMode(green2, OUTPUT);
attachInterrupt(0, manual_control, RISING); // инициализация прерывания
}
void loop() {
red_led();
man_delay();
yellow_led();
man_delay();
red2_led();
man_delay();
yellow_led();
man_delay();
}
void red_led() { // красный горит
digitalWrite(red, HIGH);
digitalWrite(red2, LOW);
digitalWrite(yellow, LOW);
digitalWrite(yellow2, LOW);
digitalWrite(green, LOW);
digitalWrite(green2, HIGH);
}
void yellow_led() { // желтый горит
digitalWrite(red, LOW);
digitalWrite(red2, LOW);
digitalWrite(yellow, HIGH);
digitalWrite(yellow2, HIGH);
digitalWrite(green, LOW);
digitalWrite(green2, LOW);
}
void red2_led() { //красный 2 горит
digitalWrite(red, LOW);
digitalWrite(red2, HIGH);
digitalWrite(yellow, LOW);
digitalWrite(yellow2, LOW);
digitalWrite(green, HIGH);
digitalWrite(green2, LOW);
}
void man_delay() { // умная задержка с проверкой флага прерывания
for (int i=0; i <= 14; i++) {
delay(500);
if (m_control == 1) {
auto_control = 0;
man_contr();
}
}
}
void auto_dellay() { // задержка с обратным отсчетом до перехода в авторежим
if (man_out == 0) {
auto_control = 1;
m_control = 1;
}
else {
--man_out;
delay(500);
}
}
void man_contr() { // ручное управление
m_control = 0;
digitalWrite(red, LOW); // гасим все светодтоды на полсекунды, знак того что светофор
digitalWrite(red2, LOW); // перешел в ручной режим
digitalWrite(yellow, LOW);
digitalWrite(yellow2, LOW);
digitalWrite(green, LOW);
digitalWrite(green2, LOW);
delay(500);
while (auto_control == 0) { // если флаг авторежима = 1 то выходим из ручного режима
while (m_control == 0) { // red & green2
red_led();
auto_dellay();
}
m_control = 0;
while (m_control == 0) { // yellow & yellow2
yellow_led();
auto_dellay();
}
m_control = 0;
while (m_control == 0) { // red2 & green
red2_led();
auto_dellay();
}
m_control = 0;
while (m_control == 0) { // yellow & yellow2
yellow_led();
auto_dellay();
}
m_control = 0;
}
}
////////////////////////////////////
// Функции обработчики прерывания //
////////////////////////////////////
void manual_control() {
m_control = 1;
man_out = 120;
}
Разработку печатной платы произвел в привычной САПР DipTrace.
Изготавливал печатную плату методом ЛУТ.
Корпус изготовил из мягкого пластика. Такой пластик используют для изготовления табличек на дверях. Столб – шариковая ручка.
Юный бета тестер остался доволен.
Комментариев нет:
Отправить комментарий