Эксперимент 17. Светофор

Используя модуль «Светофор», соберем имитацию дорожного светофора, работающего по нажатию кнопки и отсчитывающий секунды.

Схема эксперимента

Рисунок 1. Электрическая принципиальная схема эксперимента

Рисунок 2. Монтажная схема эксперимента

Программный код эксперимента

Exp17
  1. const int a = 6;
  2. const int b = 7;
  3. const int c = 9;
  4. const int d = 3;
  5. const int e = 2;
  6. const int f = 5;
  7. const int g = 4;
  8. const int h = 8;
  9. const int keyPin = 10;
  10. int data [11][8] = {{1,1,1,1,1,1,0,1},
  11. {0,1,1,0,0,0,0,1},
  12. {1,1,0,1,1,0,1,1},
  13. {1,1,1,1,0,0,1,1},
  14. {0,1,1,0,0,1,1,1},
  15. {1,0,1,1,0,1,1,1},
  16. {1,0,1,1,1,1,1,1},
  17. {1,1,1,0,0,0,0,1},
  18. {1,1,1,1,1,1,1,1},
  19. {1,1,1,1,0,1,1,1},
  20. {0,0,0,0,0,0,0,0}};
  21.  
  22. const int pinRed = 13;
  23. const int pinYellow = 12;
  24. const int pinGreen = 11;
  25. void displ(int);
  26.  
  27. void setup () {
  28. for(int i = 2; i <= 13; i++)
  29. pinMode(i,OUTPUT);
  30. pinMode(keyPin,INPUT);
  31. digitalWrite(pinRed,HIGH);
  32. displ(0);
  33. }
  34.  
  35. int x = 0;
  36. int button_old = 0;
  37. boolean btnStatus = false;
  38. void loop() {
  39. int mTime = 1000;
  40. if(x == 0) {
  41. digitalWrite(pinRed, HIGH);
  42. digitalWrite(pinYellow, LOW);
  43. digitalWrite(pinGreen, LOW);
  44. displ(x);
  45. mTime = 20;
  46. btnStatus = true;
  47. }
  48. if((x <= 3) and (x > 0)) {
  49. digitalWrite(pinGreen, LOW);
  50. delay(500);
  51. digitalWrite(pinGreen, HIGH);
  52. mTime = 500;
  53. x--;
  54. }
  55. if((x <= 10) and (x >= 4)) {
  56. digitalWrite(pinRed, LOW);
  57. digitalWrite(pinYellow, LOW);
  58. digitalWrite(pinGreen, HIGH);
  59. x--;
  60. }
  61. if((x <= 15) and (x >= 11)) {
  62. digitalWrite(pinYellow, HIGH);
  63. x--;
  64. }
  65. if((x <= 20) and (x >= 16)) {
  66. x--;
  67. }
  68. if((digitalRead(keyPin) == LOW)&&(button_old == 1)&&(btnStatus == true)) {
  69. x = 20;
  70. btnStatus = false;
  71. }
  72. if(x >= 10)
  73. displ(x-10);
  74. else
  75. displ(x);
  76. button_old = digitalRead(keyPin);
  77. delay(mTime);
  78. }
  79.  
  80. void displ(int num) {
  81. int j = 0;
  82. digitalWrite(a, data[num][j]); j = j + 1;
  83. digitalWrite(b, data[num][j]); j = j + 1;
  84. digitalWrite(c, data[num][j]); j = j + 1;
  85. digitalWrite(d, data[num][j]); j = j + 1;
  86. digitalWrite(e, data[num][j]); j = j + 1;
  87. digitalWrite(f, data[num][j]); j = j + 1;
  88. digitalWrite(g, data[num][j]); j = j + 1;
  89. digitalWrite(h, data[num][j]); j = j + 1;
  90. }

В программе при нажатии кнопки устанавливаем переменную счетчика в 20 сек, и при каждом цикле начинаем ее уменьшать на единицу, условные блоки проверяют состояние счетчика и соответственно выполняют заложенные в них инструкции.

Дополнительное задание

Создайте свой вариант светофора, например добавьте к схеме светодиоды для пешеходного светофора.