Сегодня решил подключить к предыдущему проекту «КОНТРОЛЬ ДИСТАНЦИИ НА ЭКРАНЕ LCD1602 И ДАТЧИК HC-SR04» три разноцветных светодиода. Один вариант в режиме светофора, второй- в режиме предупреждения.

pi_traffic_frontРежим светофора:

  • Все светодиоды выключены
  • На определенной дистанции включается красный
  • При дальнейшем приближении красный гаснет, а желтый включается.
  • И последним включается зеленый, а желтый гаснет.
Режим предупреждения близкого приближения к объекту:
  • Горит зеленый.
  • На определенной дистанции включается желтый, зеленый гаснет.
  • При дальнейшем приближении включается красный, желтый гаснет. Можно еще добавить звуковой сигнал.
НАМ ПОНАДОБИТСЯ
  • Плата Arduino Uno
  • Ультразвуковой датчик HC-SR04
  • Три светодиода: красный, желтый и зеленый
  • Три резистора сопротивлением 220-270 Ом
  • Дисплей LCD 1602 I2C
  • Провода
СХЕМА ПОДКЛЮЧЕНИЯ

Untitled Sketch2_bb

Интерфейс I2C позволяет подключить данный дисплей по двум проводам к ардуино, не считая проводов питания. Также хочу обратить внимание на адрес дисплея. Скорее всего адрес будет 0х27. Но у меня на одном из дисплеев не появились символы на экране. Я определил адрес с помощью скетча «Сканнер I2C адресов». Адрес оказался 0x3F.

Сканнер I2C адресов

Да, выявил следующую проблему: при загрузке скетча в ардуино на дисплее появился только один первый символ. Выяснилось, что на версиях Arduino IDE старше 1.65 есть такой глюк. Откатитесь до версии 1.65 и будет счастье.

код режим светофора:
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
//подключаем нужные библиотеки
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "Ultrasonic.h"

LiquidCrystal_I2C lcd(0x27,16,2);   // Задаем адрес и размерность дисплея
Ultrasonic ultrasonic(12,11); //trigPin - 12; echoPin - 11;
const int ledPinRed = 10;  // пин 10 – красный светодиод
const int ledPinYel = 9;  // пин 9 – желтый светодиод
const int ledPinGr = 8;  // пин 8 –  зеленый светодиод
 
void setup()  {
  pinMode(ledPinRed, OUTPUT); // задаем светодиод - выходной пин
  pinMode(ledPinYel, OUTPUT); // задаем светодиод - выходной пин
  pinMode(ledPinGr, OUTPUT); // задаем светодиод - выходной пин
  Serial.begin(9600); // инициализация послед. порта
  Wire.begin();
  lcd.init();                       // Инициализация lcd             
  lcd.backlight();                  // Включаем подсветку
  lcd.print("Distance:");  //печатаем текст  
}
void loop()  { 
  Serial.println(ultrasonic.Ranging(CM)); // выводим в последовательный порт
  lcd.setCursor(10,0);  //устанавливаем курсор
  lcd.print(ultrasonic.Ranging(CM)); //выводим на lcd 
  lcd.print("cm"); //печатаем текст cm
  lcd.print("   "); //печатаем  пробелы для стирания лишних символов при увеличении разрядности значений
 
  if (ultrasonic.Ranging(CM)>20) // задаем условие отключения всех светодиодов.
                                   //У меня для демонстрации задано > 20 см.
{
  digitalWrite(ledPinRed, 0); // выключаем красный
  digitalWrite(ledPinYel, 0); // выключаем желтый
  digitalWrite(ledPinGr, 0); //  выключаем зеленый
  lcd.setCursor(0,1);  //устанавливаем курсор
  lcd.print("Red, Yel, Gr off"); //печатаем красный 
} 
//else
 if (ultrasonic.Ranging(CM)>10) // задаем условие включения красного на дистанции более 10 сантиметром 
{
  digitalWrite(ledPinRed, 1); // включаем красный светодиод
  digitalWrite(ledPinYel, 0); // выключаем желтый
  digitalWrite(ledPinGr, 0); //  выключаем зеленый
  lcd.setCursor(0,1);  //устанавливаем курсор
  lcd.print("Red on          "); //печатаем красный вкл.
} 
else
 if (ultrasonic.Ranging(CM)>5) // задаем условие включения желтого на дистанции от 5 до 10 сантиметром 
{
  digitalWrite(ledPinYel, 1); // включаем желтый светодиод
  digitalWrite(ledPinRed, 0); // выключаем красный светодиод
  digitalWrite(ledPinGr, 0); //  выключаем зеленый
  lcd.setCursor(0,1);  //устанавливаем курсор
  lcd.print("Yellow on       "); //печатаем желтый вкл.
}  
else //иначе включаем зеленый, желтый гасим
{
  digitalWrite(ledPinGr, 1); // включаем зеленый светодиод
  digitalWrite(ledPinYel, 0); // выключаем желтый светодиод
  digitalWrite(ledPinRed, 0); // выключаем красный светодиод
  lcd.setCursor(0,1);  //устанавливаем курсор
  lcd.print("Green on        "); //печатаем зеленый вкл.
}  
  delay(100);
}

Код режим предупреждения близкого приближения к объекту:

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
//подключаем нужные библиотеки
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "Ultrasonic.h"

LiquidCrystal_I2C lcd(0x27,16,2);   // Задаем адрес и размерность дисплея
Ultrasonic ultrasonic(12,11); //trigPin - 12; echoPin - 11;
const int ledPinRed = 10;  // пин 10 – красный светодиод
const int ledPinYel = 9;  // пин 9 – желтый светодиод
const int ledPinGr = 8;  // пин 8 –  зеленый светодиод
 
void setup()  {
  pinMode(ledPinRed, OUTPUT); // задаем светодиод - выходной пин
  pinMode(ledPinYel, OUTPUT); // задаем светодиод - выходной пин
  pinMode(ledPinGr, OUTPUT); // задаем светодиод - выходной пин
  Serial.begin(9600); // инициализация послед. порта
  Wire.begin();
  lcd.init();                       // Инициализация lcd             
  lcd.backlight();                  // Включаем подсветку
  lcd.print("Distance:");  //печатаем текст  
}
void loop()  { 
  Serial.println(ultrasonic.Ranging(CM)); // выводим в последовательный порт
  lcd.setCursor(10,0);  //устанавливаем курсор
  lcd.print(ultrasonic.Ranging(CM)); //выводим на lcd 
  lcd.print("cm"); //печатаем текст cm
  lcd.print("   "); //печатаем  пробелы для стирания лишних символов при увеличении разрядности значений
 
 if (ultrasonic.Ranging(CM)>20) // задаем условие включения зеленого на дистанции более 20 сантиметром 
{
  digitalWrite(ledPinRed, 0); // выключаем красный светодиод
  digitalWrite(ledPinYel, 0); // выключаем желтый
  digitalWrite(ledPinGr, 1); //  включаем зеленый
  lcd.setCursor(0,1);  //устанавливаем курсор
  lcd.print("Green on        "); //печатаем зеленый вкл.
} 
else
 if (ultrasonic.Ranging(CM)>10) // задаем условие включения желтого на дистанции от 10 до 20 сантиметром 
{
  digitalWrite(ledPinYel, 1); // включаем желтый светодиод
  digitalWrite(ledPinRed, 0); // выключаем красный светодиод
  digitalWrite(ledPinGr, 0); //  выключаем зеленый
  lcd.setCursor(0,1);  //устанавливаем курсор
  lcd.print("Yellow on       "); //печатаем желтый вкл.
}  
else //иначе включаем красный, желтый гасим
{
  digitalWrite(ledPinGr, 0); // выключаем зеленый светодиод
  digitalWrite(ledPinYel, 0); // выключаем желтый светодиод
  digitalWrite(ledPinRed, 1); // включаем красный светодиод
  lcd.setCursor(0,1);  //устанавливаем курсор
  lcd.print("Red on          "); //печатаем красный вкл.
}  
  delay(100);
}

Еще раз необходимые библиотеки:
LiquidCrystal_I2C.h
Ultrasonic.h

IMG_0023IMG_0021IMG_0022

Комментариев 2 “Светофор, управляемый ультразвуковым датчиком

  1. Станислав on 03.06.2016 at 15:14 Пишет:

    Статья очень понравилась, появилась даже желание самому попробовать сделать эту конструкцию. Спасибо!!!

  2. admin on 03.06.2016 at 15:31 Пишет:

    Спасибо. Не боги горшки обжигают.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Навигация по записям