Система напоминания о социальной дистанции на Arduino для COVID-19
Компоненты и материалы
- Arduino UNO (лучше Nano, но использовался UNO)
- Arduino Proto Shield (опционально)
- Мини-бредборд Adafruit
- LCD дисплей 16×2 (Elegoo)
- Ультразвуковой датчик HC-SR04
- Сенсор касания (или кнопка с pull-down резистором)
- NTC термистор 10 кОм (для компенсации температуры скорости звука)
- Резистор 10 кОм
- Пьезоизлучатель (buzzer)
- Потенциометр (регулировка контраста LCD)
- Провода-перемычки
- Прозрачный водонепроницаемый корпус (для защиты от дождя, с просветом для LCD)
Программное обеспечение
- Arduino IDE
О проекте
Что это?
Наиболее надежный способ замедлить распространение коронавируса — держать дистанцию; предупреждение лучше лечения. Но постоянно оглядываться раздражает. Нужен прибор, предупреждающий окружающих держать 2-метровую дистанцию. Это 2-в-1 устройство: термистор не только повышает точность измерения расстояния (скорость звука зависит от температуры), но и позволяет переключать режимы кнопкой/сенсором касания:
- Режим 1 — оповещение, если кто-то приближается.
- Режим 2 — измерение и вывод на LCD температуры и расстояния.
Как это работает?
- Arduino измеряет температуру термистором.
- Температура используется для более точного расчёта расстояния ультразвукового датчика.
В режиме 1:
- Дистанция 2–1 м: LCD подсвечивается, надпись «Please keep away» и расстояние.
- 1–0.5 м: подсветка мигает, надпись «Keep away».
- < 0.5 м: подсветка мигает 2 раза в сек., надпись «STAY AWAY!».
В режиме 2: на LCD сверху расстояние, снизу температура.
Для защиты от дождя использована половинка пластиковой бутылки, которую можно задвинуть вверх. Прибор крепится на рюкзак двумя шнурами и легко снимается.
Как собрать?
Соберите схему согласно диаграмме ниже. Импортируйте библиотеки (HCSR04 и LiquidCrystal) через Arduino IDE: Sketch → Include Library → Add .ZIP Library. Затем загрузите код.
Код
Основной скетч (Arduino)
#include <HCSR04.h>
#include <LiquidCrystal.h>
#define trigPin 7
#define echoPin 6
#define buzzer 9
#define backlight 10
LiquidCrystal lcd(12, 11, 5, 4, 3, 8);
UltraSonicDistanceSensor distanceSensor(trigPin, echoPin);
int tempReading;
double tempK;
float tempC;
int rounded;
int temp_round;
volatile boolean modes = 0;
double distance;
void setup() {
lcd.begin(16, 2);
attachInterrupt(0, changeMode, FALLING);
pinMode(2, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(backlight, OUTPUT);
digitalWrite(backlight, HIGH);
backlightOn();
}
void loop() {
tempReading = analogRead(A0);
tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK)) * tempK);
tempC = tempK - 273.15;
distance = distanceSensor.measureDistanceCm(tempC);
temp_round = round(tempC);
if (modes == 1) {
backlightOn();
if (distance >= 300 || distance <= 0) {
rounded = 0;
lcd.clear();
lcd.print("Out of range");
lcd.setCursor(0, 1);
lcd.print("Temperature:" + String(temp_round) + " C");
} else {
rounded = round(distance);
lcd.clear();
lcd.print("Distance: ");
lcd.print(rounded);
lcd.print(" cm");
lcd.setCursor(0, 1);
lcd.print("Temperature:" + String(temp_round) + " C");
}
} else {
if (distance >= 300 || distance <= 0) {
rounded = 0;
lcd.clear();
backlightOff();
} else {
rounded = round(distance);
if (distance >= 200) {
backlightOff(); lcd.clear();
} else if (distance <= 200 && distance > 100) {
backlightOn(); lcd.clear();
lcd.print("Please keep away");
lcd.setCursor(0, 1);
lcd.print("Distance:"); lcd.print(rounded); lcd.print(" cm");
} else if (distance <= 100 && distance > 50) {
backlightOn(); lcd.clear();
lcd.print("Keep away");
lcd.setCursor(0, 1);
lcd.print("Distance:"); lcd.print(rounded); lcd.print(" cm");
delay(200); buzz(); backlightOff(); delay(100); unbuzz(); backlightOn(); delay(100);
} else if (distance <= 50) {
backlightOn(); lcd.clear();
lcd.print("STAY AWAY!");
lcd.setCursor(0, 1);
lcd.print("Distance:"); lcd.print(rounded); lcd.print(" cm");
delay(200); buzz(); backlightOff(); delay(200); unbuzz(); backlightOn(); delay(200);
buzz(); backlightOff(); delay(200); unbuzz(); backlightOn();
}
}
}
delay(700);
}
void changeMode() { modes = !modes; }
void backlightOn() { digitalWrite(backlight, HIGH); }
void backlightOff() { digitalWrite(backlight, LOW); }
void buzz() { digitalWrite(buzzer, HIGH); }
void unbuzz() { digitalWrite(buzzer, LOW); }
Библиотеки
Схемы
Файл схемы Fritzing: coronavirus_distancing_WQxTcxgmYm.fzz
Производственный процесс
- Интерактивная кукла «Игра в кальмара» на Arduino UNO: DIY-проект
- Часы реального времени на Arduino с расчётом времени намаза
- Робот для поиска людей на базе Arduino Uno: пошаговая интеграция датчиков
- Веб-сервер на Arduino Uno WiFi: управление LED через браузер
- Простой калькулятор на Arduino UNO — базовый проект для начинающих
- Вывод изображений на 1.17-дюймовый TFT LCD с Arduino UNO
- Сборка портативного дисплея на основе эффекта сохранения изображения с Arduino UNO и ATtiny85
- Arduino-таймер для мытья рук: простое DIY-устройство для борьбы с COVID‑19
- Мастерство 8×8 LED-матрицы с Arduino Uno: Пошаговое руководство
- Управление 4-пиновым PWM-вентилятором 25 кГц на Arduino Uno — Сборка, код и тесты