Давайте соберем детектор призраков! Не думайте, что мы сумасшедшие. Это довольно простой проект, на сборку которого уйдет немного времени, после чего вы сразу сможете приступить к поиску привидений. Вам страшно? Нам — нет.
Нам понадобится
- Плата Arduino Uno
- Макетная плата
- Перемычки
- 3 красных светодиода
- 1 желтый светодиод
- 6 зеленых светодиода
- 10 резисторов с сопротивлением 220 Ом
- 20-ти сантиметровый провод
- Резистор с сопротивлением 1 МОм
Нам понадобитсяПринцип работы
Согласимся с тем, что мы немного пофантазировали, назвав этот проект детектором призраков. По сути, устройство обнаруживает электромагнитные поля, но многие люди считают, что это как раз и есть призрачные субстанции.
В этом проекте вы настроите антенну, обнаруживающую «призраков», и светодиодную панель, оповещающую о высоком уровне электромагнитной активности вокруг. Оголенный провод действует как антенна, определяя электромагнитное поле в радиусе двух метров. В зависимости от силы сигнала светодиоды будут загораться последовательно: чем сильнее сигнал, тем больше светодиодов загорится. Включите Arduino и направьте ваш детектор в пространство комнаты, чтобы зафиксировать присутствие чего-нибудь сверхъестественного. Имейте в виду, что электрические приборы, например телевизоры, будут оказывать влияние на детектор из-за электромагнитного поля, которое они излучают.
Сборка
Установите светодиоды на макетную плату, поместив их ножки по обе стороны от канавки (см. раздел «Макетные платы» в проекте 0, чтобы узнать больше о схеме подключения компонентов к макетной плате), как показано на рис. 6.1. Мы начали с желтого светодиода, а затем установили шесть зеленых и три красных светодиода, чтобы собрать шкалу (перечисляем цвета слева направо). Вы можете использовать светодиоды любого цвета и устанавливать их по своему усмотрению.
Рисунок 6.1: Установка светодиодовЭлектромагнитные поля
Электрические поля создаются различиями в потенциалах: чем выше напряжение, тем сильнее результирующее поле. Магнитные поля создаются при течении электрического тока: чем сильнее ток, тем сильнее магнитное поле. Электромагнитное поле можно рассматривать как сочетание этих двух полей.
Электромагнитные поля присутствуют повсюду в окружающей среде, но невидимы для человеческого глаза. Электрические поля производятся локальным накоплением электрических зарядов в атмосфере и связаны с грозами. Земля постоянно излучает магнитное поле. Оно используется птицами и рыбой для навигации и заставляет стрелку компаса ориентироваться на север.
Электромагнитное полеПодключите к каждому светодиоду резистор с сопротивлением 220 Ом. Одна из ножек резистора подключается к короткой ножке (катоду) светодиода, а вторая ножка резистора устанавливается в гнездо шины заземления макетной платы (см. рис. 6.2). Длинные ножки (аноды) светодиодов подключите к цифровым контактам 2-11 платы Arduino.
Подключение
Рисунок 6.2: Размещение светодиодов на макетной плате3. Возьмите одножильный провод длиной примерно 20 см и с помощью стриппера (или ножа) зачистите примерно сантиметр изоляции с одного конца. Этот конец прикрепите к контакту А5 платы Arduino. Зачистите примерно 7 см изоляции с другого конца — этот оголенный конец провода и будет антенной, улавливающей электромагнитное излучение (см. рис. 6.3).
Рисунок 6.3: Зачистка провода для создания антенны4. Подключите одну ножку резистора с сопротивлением 1 МОм к контакту GND платы Arduino, а вторую — к контакту А5 платы Arduino; это повысит чувствительность устройства.
5. Убедитесь, что ваша цепь соответствует схеме на рис. 6.4, а затем загрузите в память Arduino код скетча, приведенный в разделе «Скетч» далее в этом проекте.
Рисунок 6.4: Принципиальная схема детектора призраковСкетч
Оголенный провод улавливает электромагнитные импульсы в окружающей среде и отправляет значение в диапазоне от 0 до 1023 на плату Arduino. Программа анализирует показания с аналогового выхода, чтобы вычислить, сколько светодиодов следует последовательно включить или выключить, оповестив пользователя о силе электромагнитного сигнала. В данном случае, 1023 — это самое высокое значение, при котором все светодиоды будут гореть; при значении 550 загорятся пять светодиодов. Скетч работает в цикле, чтобы постоянно анализировать поступающие аналоговые данные, а на светодиоды непрерывно подается напряжение, чтобы моментально отображать результат замеров. Если вы обнаружите, что любые показания электромагнитного излучения приводят к свечению всех светодиодов, поправьте это, уменьшив значение переменной senseLimit. Во время цикла программа выполняет в среднем 25 замеров и использует усредненное значение по результатам показаний для уменьшения сильных колебаний, способных привести к излишне быстрому зажиганию светодиодов.
После того, как вы собрали детектор призраков, попробуйте добавить компоненты для звукового сопровождения (с изменением скорости воспроизведения или уровня громкости в зависимости от показаний). Соорудите корпус для устройства, чтобы получился персональный карманный детектор, и отправляйтесь на охоту за призраками. Вы также можете поэкспериментировать с проводом разного типа/толщины и/или снять резистор, чтобы настроить уровень чувствительности.
#define NUMREADINGS 25 // Увеличьте значение, чтобы увеличить скорость захвата данных
int senseLimit = 1023; // Увеличьте значение, чтобы снизить чувствительность антенны (не более 1023)
int probePin = 5; // Установка аналогового контакта, к которому подключена штырь А0 контроллера антенна
int val = 0; // Считывание из probePin
// Подключение контактов к светодиодной панели с последовательно подключенными резисторами
int LED1 = 11;
int LED2 = 10;
int LED3 = 9;
int LED4 = 8;
int LED5 = 7;
int LED6 = 6;
int LED7 = 5;
int LED8 = 4;
int LED9 = 3;
int LED10 = 2;
int readings[NUMREADINGS]; // Считывание с аналогового входа
int index = 0; // Индекс текущего считывания
int total = 0; // Общее количество
int average = 0; // Окончательное усреднение считанных проб
void setup() {
Serial.begin (9600); // Запуск последовательного подключения к IDE для отладки и т.п.
for (int i = 0; i < NUMREADINGS; i++)
readings [i] = 0; // Инициализация всех считываний в виде 0
pinMode(2, OUTPUT); // Перевод контактов, к которым подключена светодиодная панель, в режим вывода
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop () {
val = analogRead(probePin); // Чтение показаний с антенны
if (val >= 1) { // Если показание не равно нулю, продолжить
val = constrain(val, 1, senseLimit); // Если показание превышает текущее значение senseLimit, присвоить senseLimit более высокое значение
val = map(val, 1, senseLimit, 1, 1023); // Сопоставить лимиты в диапазоне от 1 до 1023
total -= readings[index]; // Вычитание последнего значения считывания
readings [index] = val; // Чтение с датчика
total += readings[index]; // Добавление показания к итогу
index = (index + 1); // Переход к следующему индексу
if (index >= NUMREADINGS) { // Если это последний индекс в массиве, перейти в начало
index = 0;
average = total / NUMREADINGS;
}// Вычисление среднего значения считывания
if (average > 50) { // Если среднее значение считывания выше 50, подать напряжение на первый светодиод
digitalWrite(LED1, HIGH);
} else {
digitalWrite(LED1, LOW); // Если нет, выключить этот светодиод
}
if (average > 150) { // и т.д.
digitalWrite(LED2, HIGH);
}
else {
digitalWrite(LED2, LOW);
}
if (average > 250) {
digitalWrite(LED3, HIGH);
}
else {
digitalWrite(LED3, LOW);
}
if (average > 350) {
digitalWrite(LED4, HIGH);
}
else {
digitalWrite(LED4, LOW);
}
if (average > 450) {
digitalWrite(LED5, HIGH);
}
else {
digitalWrite(LED5, LOW);
}
if (average > 550) {
digitalWrite(LED6, HIGH);
}
else {
digitalWrite(LED6, LOW);
}
if (average > 650) {
digitalWrite(LED7, HIGH);
}
else {
digitalWrite(LED7, LOW);
}
if (average > 750) {
digitalWrite (LED8,HIGH);
}
else {
digitalWrite(LED8, LOW);
}
if (average > 850) {
digitalWrite(LED9, HIGH);
}
else {
digitalWrite(LED9, LOW);
}
if (average > 950) {
digitalWrite(LED10, HIGH);
}
else {
digitalWrite(LED10, LOW);
}
Serial.println(val); // Применение выходных данных для калибровки
}
}
Теги: