Давайте соберем детектор призраков! Не думайте, что мы сумасшедшие. Это довольно простой проект, на сборку которого уйдет немного времени, после чего вы сразу сможете приступить к поиску привидений. Вам страшно? Нам — нет.
Нам понадобится
- Плата Arduino Uno
- Макетная плата
- Перемычки
- 3 красных светодиода
- 1 желтый светодиод
- 6 зеленых светодиода
- 10 резисторов с сопротивлением 220 Ом
- 20-ти сантиметровый провод
- Резистор с сопротивлением 1 МОм

Принцип работы
Согласимся с тем, что мы немного пофантазировали, назвав этот проект детектором призраков. По сути, устройство обнаруживает электромагнитные поля, но многие люди считают, что это как раз и есть призрачные субстанции.
В этом проекте вы настроите антенну, обнаруживающую «призраков», и светодиодную панель, оповещающую о высоком уровне электромагнитной активности вокруг. Оголенный провод действует как антенна, определяя электромагнитное поле в радиусе двух метров. В зависимости от силы сигнала светодиоды будут загораться последовательно: чем сильнее сигнал, тем больше светодиодов загорится. Включите Arduino и направьте ваш детектор в пространство комнаты, чтобы зафиксировать присутствие чего-нибудь сверхъестественного. Имейте в виду, что электрические приборы, например телевизоры, будут оказывать влияние на детектор из-за электромагнитного поля, которое они излучают.
Сборка
Установите светодиоды на макетную плату, поместив их ножки по обе стороны от канавки (см. раздел «Макетные платы» в проекте 0, чтобы узнать больше о схеме подключения компонентов к макетной плате), как показано на рис. 6.1. Мы начали с желтого светодиода, а затем установили шесть зеленых и три красных светодиода, чтобы собрать шкалу (перечисляем цвета слева направо). Вы можете использовать светодиоды любого цвета и устанавливать их по своему усмотрению.

Электромагнитные поля
Электрические поля создаются различиями в потенциалах: чем выше напряжение, тем сильнее результирующее поле. Магнитные поля создаются при течении электрического тока: чем сильнее ток, тем сильнее магнитное поле. Электромагнитное поле можно рассматривать как сочетание этих двух полей.
Электромагнитные поля присутствуют повсюду в окружающей среде, но невидимы для человеческого глаза. Электрические поля производятся локальным накоплением электрических зарядов в атмосфере и связаны с грозами. Земля постоянно излучает магнитное поле. Оно используется птицами и рыбой для навигации и заставляет стрелку компаса ориентироваться на север.

Подключите к каждому светодиоду резистор с сопротивлением 220 Ом. Одна из ножек резистора подключается к короткой ножке (катоду) светодиода, а вторая ножка резистора устанавливается в гнездо шины заземления макетной платы (см. рис. 6.2). Длинные ножки (аноды) светодиодов подключите к цифровым контактам 2-11 платы Arduino.


3. Возьмите одножильный провод длиной примерно 20 см и с помощью стриппера (или ножа) зачистите примерно сантиметр изоляции с одного конца. Этот конец прикрепите к контакту А5 платы Arduino. Зачистите примерно 7 см изоляции с другого конца — этот оголенный конец провода и будет антенной, улавливающей электромагнитное излучение (см. рис. 6.3).

4. Подключите одну ножку резистора с сопротивлением 1 МОм к контакту GND платы Arduino, а вторую — к контакту А5 платы Arduino; это повысит чувствительность устройства.
5. Убедитесь, что ваша цепь соответствует схеме на рис. 6.4, а затем загрузите в память Arduino код скетча, приведенный в разделе «Скетч» далее в этом проекте.

Скетч
Оголенный провод улавливает электромагнитные импульсы в окружающей среде и отправляет значение в диапазоне от 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); // Применение выходных данных для калибровки } }
Теги: