===== Эксперимент 17. Светофор =====
Используя модуль "Светофор", соберем имитацию дорожного светофора, работающего по нажатию кнопки и отсчитывающий секунды.
==== Схема эксперимента ====
{{ :products:ardu:swetofor_sch17.png?nolink&400 |}}
{{ :products:ardu:exp14_shema_tk.png?nolink&400 |}}
{{ :products:ardu:exp13_sch.png?nolink&400 |}}
//Рисунок 1. Электрическая принципиальная схема эксперимента//
{{ :products:ardu:exp17.png?direct&600 |}}
//Рисунок 2. Монтажная схема эксперимента//
==== Программный код эксперимента ====
const int a = 6;
const int b = 7;
const int c = 9;
const int d = 3;
const int e = 2;
const int f = 5;
const int g = 4;
const int h = 8;
const int keyPin = 10;
int data [11][8] = {{1,1,1,1,1,1,0,1},
{0,1,1,0,0,0,0,1},
{1,1,0,1,1,0,1,1},
{1,1,1,1,0,0,1,1},
{0,1,1,0,0,1,1,1},
{1,0,1,1,0,1,1,1},
{1,0,1,1,1,1,1,1},
{1,1,1,0,0,0,0,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,0,1,1,1},
{0,0,0,0,0,0,0,0}};
const int pinRed = 13;
const int pinYellow = 12;
const int pinGreen = 11;
void displ(int);
void setup () {
for(int i = 2; i <= 13; i++)
pinMode(i,OUTPUT);
pinMode(keyPin,INPUT);
digitalWrite(pinRed,HIGH);
displ(0);
}
int x = 0;
int button_old = 0;
boolean btnStatus = false;
void loop() {
int mTime = 1000;
if(x == 0) {
digitalWrite(pinRed, HIGH);
digitalWrite(pinYellow, LOW);
digitalWrite(pinGreen, LOW);
displ(x);
mTime = 20;
btnStatus = true;
}
if((x <= 3) and (x > 0)) {
digitalWrite(pinGreen, LOW);
delay(500);
digitalWrite(pinGreen, HIGH);
mTime = 500;
x--;
}
if((x <= 10) and (x >= 4)) {
digitalWrite(pinRed, LOW);
digitalWrite(pinYellow, LOW);
digitalWrite(pinGreen, HIGH);
x--;
}
if((x <= 15) and (x >= 11)) {
digitalWrite(pinYellow, HIGH);
x--;
}
if((x <= 20) and (x >= 16)) {
x--;
}
if((digitalRead(keyPin) == LOW)&&(button_old == 1)&&(btnStatus == true)) {
x = 20;
btnStatus = false;
}
if(x >= 10)
displ(x-10);
else
displ(x);
button_old = digitalRead(keyPin);
delay(mTime);
}
void displ(int num) {
int j = 0;
digitalWrite(a, data[num][j]); j = j + 1;
digitalWrite(b, data[num][j]); j = j + 1;
digitalWrite(c, data[num][j]); j = j + 1;
digitalWrite(d, data[num][j]); j = j + 1;
digitalWrite(e, data[num][j]); j = j + 1;
digitalWrite(f, data[num][j]); j = j + 1;
digitalWrite(g, data[num][j]); j = j + 1;
digitalWrite(h, data[num][j]); j = j + 1;
}
В программе при нажатии кнопки устанавливаем переменную счетчика в 20 сек, и при каждом цикле начинаем ее уменьшать на единицу, условные блоки проверяют состояние счетчика и соответственно выполняют заложенные в них инструкции.
==== Дополнительное задание ====
Создайте свой вариант светофора, например добавьте к схеме светодиоды для пешеходного светофора.