Оглавление:

Проверка решения класса CPC: 10 шагов
Проверка решения класса CPC: 10 шагов

Видео: Проверка решения класса CPC: 10 шагов

Видео: Проверка решения класса CPC: 10 шагов
Видео: Как Решать Тест – 5 Правил и 1 Секретное Оружие 2024, Ноябрь
Anonim
CPC Class Polution Checker
CPC Class Polution Checker
CPC Class Polution Checker
CPC Class Polution Checker
CPC Class Polution Checker
CPC Class Polution Checker

Привет, я студент из Бельгии, и это мой первый большой проект на степень бакалавра! В этом руководстве рассказывается, как сделать измеритель содержания воздуха в закрытых помещениях, особенно в классных комнатах!

Я слышал, вы думаете, зачем нужен этот проект? Ну, все началось, когда я пошел в среднюю школу. Во второй половине дня после хорошего обеда и перерыва уроки начинаются снова. Но есть проблема, учитель забыл открыть окно, пока мы обедали, поэтому жарко, потно, и вы не можете сосредоточиться, потому что засыпаете. Это потому, что в воздухе много CO2.

Мой проект решит эту проблему и сделает всех учеников более сосредоточенными на уроках.

Запасы

1 xRaspberry Pi 4 (55 евро)

1 шаговый двигатель с водителем (5 евро)

2 батареи 12 В, 6800 мАч (2 батареи по 20 евро)

2 x понижающий модуль (2 x 5 €)

1 x 16x2 ЖК-дисплей (1,5 евро)

Датчики: 1x MQ8, 1x MQ4, 1x MQ7, 1x MQ135, 1x HNT11, 1x TMP36 (1 x 23 евро)

ИС: 1x MCP3008, 2x 74hc595AG (1x 2,30 евро, 2x 0,40 евро)

Светодиоды: 2 зеленых, 2 красных, 3 желтых (есть в старом оборудовании, обычно по 0,01 евро каждый)

Разъем для батарей (2 x 0,35 €)

40 соединительных кабелей f-f-f (1,80 €)

40 соединительных кабелей f-to-m (1,80 €)

Соединительные кабели длиной 20 м (1,80 евро)

2 платы для пайки (2 платы 0,70 евро)

Инструменты:

Паяльник (желательно 60 Вт)

Олово для пайки

Лист алюминиевый 50х20

Корпус (я использовал старый мини компьютерный корпус)

Это вполне может быть какой-нибудь МДФ или собственные идеи.

Шаг 1. Настройка RPi

Настройка RPi
Настройка RPi

Итак, наше сердце, наш мозг и наша душа находятся в этом продукте. Угрожайте этому хорошо, потому что это может тем или иным образом навредить вам. Я использую RPi 4B 4 ГБ, другие модели тоже подойдут. Можно было ожидать большего отставания от старых моделей.

Мы получили ОС от нашей школы с некоторым предустановленным программным обеспечением, таким как phpMyAdmin.

Прежде всего убедитесь, что вы можете подключиться к Raspberry Pi через ssh, нам это понадобится много времени.

Итак, сначала мы должны включить шину SPI, контакты GPIO и отключить другие шины, они нам не понадобятся.

Сделать это можно в меню raspi-config. Перейдите к интерфейсам и включите GPIO и SPI, как правило, в этом нет необходимости. Пока вы здесь, расширьте свое хранилище, перейдя в расширенный режим, а затем нажмите Enter для расширения хранилища.

Теперь перезагрузитесь. Нам понадобятся некоторые расширения для использования VS Code на нашем пи, для запуска нашего сервера и базы данных.

Процесс установки расширения VS Code можно найти здесь.

Теперь мы установим расширения для нашего сервера и базы данных. Используйте терминал и введите «python install flask, flask-cors, mysql-python-connector, eventlet», дождитесь завершения.

Теперь можно приступить к созданию проекта.

Шаг 2: MCP3008 + TMP36

MCP3008 + TMP36
MCP3008 + TMP36
MCP3008 + TMP36
MCP3008 + TMP36
MCP3008 + TMP36
MCP3008 + TMP36

Итак, у нас есть 6 датчиков: 4 датчика газа, 1 датчик влажности + температуры и 1 датчик температуры. Заставить их работать - настоящая задача. Все датчики являются аналоговыми датчиками, поэтому нам необходимо преобразовать аналоговый сигнал в цифровой сигнал. Это потому, что RPi (Rasberry Pi) может «понимать» только цифровые сигналы. Для дополнительной информации щелкните здесь.

Для выполнения этой задачи вам понадобится MCP3008, он отлично справится со своей задачей!

Он имеет 16 портов, считая сверху (маленький пузырек) влево, вниз, с другой стороны и вверх. Контакты 1-8 - это входы для аналогового сигнала от наших датчиков. Контакт 9 на другой стороне - это GND, его необходимо подключить к GND всей цепи, иначе это не сработает. Контакты 10-13 необходимо подключать более тщательно, они будут передавать данные на RPi и обратно. Контакт 14 - это еще один GND, а контакты 15 и 16 - это VCC, они должны быть подключены к положительной стороне цепи.

Это схема для проводки:

  • MCP3008 VDD на внешний 3,3 В MCP3008 VREF на внешний 3,3 В
  • MCP3008 AGND на внешний GND
  • MCP3008 DGND на externalGND
  • MCP3008 CLK к контакту 18 Raspberry Pi
  • MCP3008 DOUT для вывода 23 Raspberry Pi
  • MCP3008 DIN для Raspberry Pi, вывод 24
  • MCP3008 CS / SHDN к контакту 25 Raspberry Pi

Это также хорошее время для подключения GND от RPI к внешнему GND. Это заставит электричество течь от RPi.

Вот как это правильно подключить.

Убедитесь, что вы подключаете правильно, иначе вы можете все замкнуть накоротко!

Здесь появляется первый фрагмент кода.

Вы можете скопировать мой код из моего проекта на github в models. Analog_Digital.

Внизу страницы вы найдете исходный код для его работы.

Но нам нужен наш первый датчик, чтобы мы могли протестировать.

Нам нужно проверить наш датчик, если он работает. Подключите источник питания 3,3 В или 5 В к положительной стороне TMP36. Не забудьте также подключить его к GND, это может случиться что-то глупое, но поверьте мне. Это реальность;). Вы можете проверить с помощью мультиметра выход датчика, это средний контакт. С помощью этого простого уравнения вы можете проверить температуру в ° C. ((милливольт * входное напряжение) -500) / 10 и вуаля, дон! До свидания! Ну нет, хахах, нам нужен MCP3008. Подключите аналоговый контакт вашего TMP36 к первому входному контакту MCP3008. Это контакт 0.

Вы можете использовать пример кода внизу для этого класса MCP. Или что-то, что вы найдете в Интернете, и оно отлично справится с этой задачей.

Шаг 3: База данных

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

Итак, сначала нам нужно подумать, что мы получим в качестве входных данных, и нужно ли нам регистрировать определенные вещи, такие как статусы определенных объектов.

Мой ответ был бы таков: входные данные от 6 датчиков, поэтому нам нужно создать таблицу датчиков, с помощью этих датчиков мы будем делать значения. Что связано с ценностью? Для меня это состояние окна, открыто оно или закрыто, пока датчик измерял значение. Но расположение также влияет на мою ценность, поэтому мы добавим это к. Время и дата для значения также важны, поэтому я добавлю это к.

Для будущего расширения я добавил пользовательскую таблицу.

Итак, какова моя идея относительно таблиц: значения таблицы, адрес таблицы (связанный с комнатой), комната таблицы (связанный со значением), окно таблицы (привязанное к значению), датчик таблицы (связанный со значением) и таблица в дикой природе для пользователей.

Что касается связывания таблиц вместе. Для каждого значения нужен один датчик, одно окно, значение для датчика, идентификатор, чтобы мы могли сделать значение уникальным, отметку времени, когда значение было сделано, и, в конце концов, нам не нужна комната, поэтому это необязательно, но может быть добавлен.

Вот как это выглядит сейчас. Это то, что я использую для остальной части моего проекта.

Шаг 4: HNT11, для настоящих парней

Так как нам не разрешалось использовать какие-либо библиотеки. Мы должны все программировать сами.

HNT11 - это однопроводная система, поэтому это означает, что у вас есть GND и VCC, как и у любого другого электронного устройства, но 3-й контакт является входным и выходным контактами. Это немного странно, но я многому из этого научился.

Подключите VCC к внешнему 3.3V и GND к внешнему GND.

Техническое описание DHT11 содержит все, что нужно для использования этих датчиков.

Мы можем определить, что старший бит содержит младший и старший бит. Но длительность высокой части на самом деле определяет бит. Если высокая часть излучается дольше 100 мкс (обычно 127 мкс), бит является высоким. Если бит короче 100 мкс (обычно около 78 мкс), то бит низкий.

Когда HNT11 активирован, он начинает подавать сигналы. Это всегда 41 бит. Он начинается с начального бита, это ничего не значит, поэтому мы можем пропустить его. Первые 16 бит / 2 байта являются целочисленной и плавающей частью для влажности. То же самое для последних 2 байтов, но теперь для температуры.

Итак, нам нужно только рассчитать длительность каждого бита, и на этом все готово.

В исходном коде DHT11 вы найдете мой метод решения этой проблемы.

Шаг 5: газовые датчики (только легенды)

Датчики газа (только легенды)
Датчики газа (только легенды)
Датчики газа (только легенды)
Датчики газа (только легенды)

Поэтому в начале проекта я подумал, что было бы неплохо использовать много датчиков. Подумайте, прежде чем действовать и покупать на месте, это сэкономит вам много часов сна! Потому что вы можете начать раньше, и это заставит вас пойти на это с большей охотой.

Итак, у меня 4 датчика газа. MQ135, MQ8, MQ4 и MQ7 все эти датчики имеют определенные газы, которые они измеряют лучше всего. Но все они разные по своей конфигурации.

Итак, сначала я воспользовался таблицей данных, это не вызвало у меня особого желания. Затем я поискал примеры кода. Я нашел одну библиотеку от Adafruit. Я постарался воспроизвести это как можно лучше. Он работал с одним из четырех датчиков.

Я дал ему немного отдохнуть и вернулся к этому.

Что я сделал, чтобы он работал с одним датчиком, так это:

- Я использовал таблицу, чтобы отметить точки газа, которые я хотел измерить. Итак, от 1 ro / rs до 400ppm, от 1,2 до 600ppm…

- Затем я поставил все эти точки в «отлично» и извлек формулу кривой. Я сохранил это в своей базе данных.

- Из таблицы данных я также прочитал нормальное сопротивление и сопротивление чистого воздуха. Эти значения также сохраняются в базе данных.

Я вложил все это в какой-то код, вы можете найти это как последние три функции в классе MCP3008. Но это еще не конец, к сожалению, времени не хватило.

Шаг 6: Регистр сдвига, 74HC595AG

Регистр сдвига, 74HC595AG
Регистр сдвига, 74HC595AG
Регистр сдвига, 74HC595AG
Регистр сдвига, 74HC595AG
Регистр сдвига, 74HC595AG
Регистр сдвига, 74HC595AG
Регистр сдвига, 74HC595AG
Регистр сдвига, 74HC595AG

Итак, это IC. И в нем есть что-то особенное: с помощью этого устройства можно использовать меньше выходов GPIO для того же выходного сигнала. Я использовал его для ЖК-дисплея (жидкокристаллического дисплея) и светодиодов. Я покажу IP-адрес на ЖК-дисплее, чтобы все могли зайти на сайт.

Для светодиодов разумно выбрать 2 красных, 3 желтых и 2 зеленых. Это в любой момент покажет качество воздуха в комнате.

Регистр сдвига - это устройство параллельного вывода, поэтому невозможно выводить разные сигналы за период времени. Это было бы возможно, если бы оно было запрограммировано извне, но изначально не поддерживалось.

Как пользоваться ИС? Итак, у вас есть 5 входов и 9 выходов. 8 логических выходов для 8 контактов, а затем 9-й контакт для отправки оставшихся данных в другой регистр сдвига.

Итак, мы подключаем контакт 16 к внешнему VCC, следующий контакт является первым выходом, поэтому он нам понадобится для ЖК-дисплея. Контакт 14 - это линия данных, здесь мы будем отправлять данные. 13-й контакт - это включение переключателя, низкий сигнал включает IC, высокий сигнал необходим для ее выключения. Контакт 12 - это контакт, на котором мы можем определить, когда был отправлен бит, когда вы опускаете этот контакт, чтобы он считывал состояние сигнала контакта 13 и сохранял его в своей 8-битной памяти. Вывод 11 аналогичен, когда на этом выводе установлен высокий уровень, а затем низкий, он выводит 8 битов на свой порт. И последний вывод, вывод 10 - это общий сброс, этот вывод должен оставаться высоким, иначе он не будет работать. Последнее соединение - это контакт 8 GND, который нам нужен, чтобы подключить его к внешнему GND.

Итак, теперь подключите контакты к Raspberry Pi, как вам нравится. Я сделал это так, чтобы соединить их как можно ближе друг к другу, чтобы убедиться, что я знаю, где они находятся.

Когда вы получите правильный результат. Вы можете припаять его к плате со светодиодами. и резисторы 220 Ом. Припаяйте выход микросхемы к соответствующему светодиоду. Теперь у вас должно получиться что-то вроде этого.

Вы можете найти мой тестовый код здесь, в Shiftregister. Когда вы работаете с 74HC595N, MR вам не понадобится, поэтому вы можете оставить его отключенным.

ЖК-дисплей почти такой же. Его довольно легко использовать с регистром сдвига, потому что вход для ЖК-дисплея в точности совпадает с входом для регистра сдвига.

Для ЖК-дисплея есть другой код, который заставляет его работать, но он практически такой же, как и просто регистр переключения. Вы можете найти тестовый код здесь, под ЖК-дисплеем.

Шаг 7: интерфейс - ценный урок

Итак, здесь я отвлекусь, это раздел о том, как вы должны это делать. Это что-то очень ценное, чему я научился.

Сделайте фронтенд перед бэкендом !!!!

Я сделал наоборот. Я делал бесполезные обращения к своей базе данных, я трачу на это много времени.

На целевой странице мне нужна была текущая температура и влажность, а также значения всех газовых датчиков в красивой диаграмме. Мне также нужно показать IP-адрес RPi.

На странице датчиков мне нужен выбор одного датчика и время выбора. Я выбрал для выбора один день, а затем период с этого дня. Это облегчило мне задачу, потому что я мог больше контролировать это.

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

Итак, сначала я сделал дизайн, чтобы я мог легко начать работу над кодированием. Постепенно я прогрессировал по одному. Сначала задание было мобильным, поэтому я сосредоточусь на нем в первую очередь. Затем я перейду к большим экранам.

Вы можете найти мои страницы, css и js в моем Github.

Шаг 8: Бэкэнд

Эту часть я смешал с интерфейсом. Когда я делал что-то для внешнего интерфейса, я заставлял его работать на внутреннем интерфейсе. Так что позже это не потребует доработки. Это было то, чего я изначально не делал, и из-за этого я определенно потерял 2 недели времени. Глупый я! Но урок, который я, к счастью, извлекаю из других проектов.

Итак, когда вы делаете бэкэнд, сделайте что-нибудь, что вы будете использовать. Но сделайте его перспективным, сделав его многоразовым, а не жестко запрограммированным. Итак, когда мне нужны последние 50 значений моего DHT11, я проверю, создаются ли значения? Да, как мне поместить их в базу данных. Как мне вытащить их из базы данных. Как мне это показать? Диаграмма, график или просто данные? Затем я создаю новый маршрут с различными параметрами и свойствами, такими как даты, конкретные сенсорные имена или то, что я буду вызывать. Я имею в виду, вызываю ли я все значения датчиков MQ или все датчики с MQ в имени. Затем я добавляю некоторую обработку ошибок. Только когда запрос от вызова является правильным методом, он может продолжаться, в противном случае он получает приятную ошибку.

Также здесь расположены потоки, это части программного обеспечения, позволяющие запускать параллельный код. Вы можете запускать вызовы веб-сайтов, функцию создания ценности и регистр led + shift. Эти функции работают совершенно независимо друг от друга.

Итак, для светодиодов. Я установил нижнее / нормальное значение для CO2. Это значение пришло из нескольких правительственных источников. Здоровое значение для классных комнат составляет менее 600 ppm CO2 на кубический метр. Нездоровое значение - все, что выше 2000 ppm. Итак, светодиоды образуют мост. Если значение датчика MQ4 равно 1400, будет автоматически рассчитан уровень опасности. 2000 - 600 = 1400, поэтому общий диапазон составляет 1400/7 = 200. Поэтому, когда значение достигает 550, загорается зеленый светодиод. 750 показывает 2 зеленых светодиода, 950 1 желтый 2 зеленых светодиода. И так далее.

Когда значение превышает середину, открывается окно. Я использовал шаговый двигатель из-за высокого крутящего момента и точности. А когда значение превышает 2000, срабатывает небольшой сигнал тревоги. Это нужно для того, чтобы встревожить людей в комнате.

Мы также можем обнаруживать дымовые газы при пожаре. Он также это регистрирует. Когда оно превышает определенное значение, включается аварийный сигнал и мигает светодиодный индикатор.

ЖК-дисплей в основном предназначен для отображения IP-адреса, чтобы вы могли перемещаться по сайту.

Вы можете найти все + код в моем Github в app.py

Шаг 9: Изготовление корпуса

Создание дела
Создание дела
Создание дела
Создание дела
Создание дела
Создание дела

Я нашел небольшой компьютерный корпус для всех своих компонентов.

Я вырезал алюминиевый лист по размеру. И просверлил несколько отверстий там, где будет лежать лист. Это соответствует отверстиям на материнской плате.

Потом посмотрел, как все уместится внутри корпуса. Я все разложил и двинулся.

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

Я взял с каждой микросхемы или другого устройства кабели и связал их вместе. Это потому, что я мог видеть, для чего нужны кабели. Я разместил все красиво на стойках и использовал несколько гаек и винтов, чтобы все хорошо удерживать на месте.

Для питания всего этого я использовал 2 батареи. Они обеспечивают много энергии, но это все еще батареи, поэтому со временем они разрядятся. Я закрепил их на липучке. Я использовал липучку, потому что тогда я мог легко заменить или избавиться от батареек.

Шаговый двигатель, ЖК-дисплей и светодиоды будут выходить из верхней части корпуса. Поэтому я аккуратно положил крышку корпуса сверху, разметил отверстия и просверлил их дрелью. Так что все легко видно.

Поскольку корпус готов, нам нужно все подключить, здесь вы можете найти схему подключения.

Шаг 10: оценка и заключение

Оценка и заключение
Оценка и заключение

Так что это был мой первый проект.

Думаю, все в порядке.

Я узнал много нового, узнал о хороших и плохих сторонах управления проектами. Это действительно был ценный урок. Я полагал, что ты не можешь ждать, тебе действительно нужно продолжать давать. Вам нужно задокументировать каждое движение (почти самое движение), и то, что вам нужно сделать это, когда вы только что это сделали.

Сосредоточьтесь на одной вещи за раз. Хотите, чтобы на экране отображалась температура? Делай то, то и то. Не ждите и не пытайтесь позволить этому пройти. Это не поможет. И это потеряет так драгоценное время.

Также 4 недели кажутся большим количеством времени. Но верно меньше. Это просто неправильно. У вас всего 4 недели. Первые 2 недели не очень-то такое давление. 3-недельное финиширование и 4-недельная бессонная ночь. Вот как этого делать не следует.

Возможно, я был немного амбициозен: у меня суперкомпактный корпус, нет простых в использовании датчиков, батарей… Сделайте это намного проще, а затем постепенно усложняйте и усложняйте, только тогда вы получите хороший прототип / продукт.

Рекомендуемые: