Интернет Вещей

Разработка проекта бытовой метеостанции, измеряющей температуру, давление, влажность, на основе микроконтроллера Arduino. Выбор операционных систем, демонстрация преимуществ и недостатков разных платформ, языков программирования и конструктивных решений.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 12.12.2018
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.Allbest.Ru/

Размещено на http://www.Allbest.Ru/

Размещено на http://www.Allbest.Ru/

Введение

Интернет Вещей (англ. Internet of Things, IoT) - это система, объединяющая вычислительные устройства, механические и цифровые машины, предметы, животных и людей. Для объединения данных элементов в единую сеть, каждый должен обладать своим уникальным идентификатором и возможностью передачи данных по сети. Цель этой системы - свести к минимуму взаимодействие человек-машина.

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

Интернет Вещей зародился в 1999 году как идея, прошел свой путь и на данный момент является востребованной на мировом рынке нишей. По оценкам шведской компании Ericsson (лидер по производству телекоммуникационного оборудования), уже в 2018 году число датчиков и IoT-устройств превысит количество мобильных телефонов и станет самой большой категорией подключенных устройств. Совокупный среднегодовой темп роста (CAGR) данного сегмента в период с 2015 по 2021 год будет составлять 23%. Аналитики компании прогнозирует, что из приблизительно 28 млрд подключенных устройств по всему миру, к 2021 году, около 16 миллиардов будут связаны с IoT. СНГ рынок Интернета Вещей также активно развивается. Для обычного человека знакомств с этой технологией начинается с не самого сложного проявления Интернета Вещей - Умный Дом.

Умный Дом - это комплекс средств, которые позволяют человеку автоматизировать процессы внутри дома, например, дистанционно включать электрические приборы. Благодаря стремительному развитию технологий, автоматизации поддаётся каждый компонент современного жилого помещения.

Процесс Автоматизации дома начинается с его охранной системы - различные виды Умного Замка (кодовый, биометрический), Умные Видеокамеры с возможностью распознования лиц, видеодомофоны, сирены и контроллеры ворот. Основные задачи автоматизированного комплекса охраны - регистрация несанкцианированного проникновения, уведомление владельцев, включение сирены, запуск видеосъемки, запирание входных и межкомнатных дверей. Существует множество сценариев использования умных бытовых приборов, ниже приведены некоторые из них (управлять всеми можно из любой точки мира, необходим выход в интернет):

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

- В Умную Мультиварку можно утром сложить необходимые продукты, затем по пути домой активировать программу для данного рецепта и по приходу домой хозяина будет ждать готовый ужин.

- В зимнюю пору Умный Обогреватель может к приходу хозяина обогреть комнату, не работая в его отсутвии, тем самым экономя электроэнергию и оповещать хозяина о температуре в помещении.

1. Общая часть

1.1 Описание предметной области

Умная розетка - базовый элемент Умного Дома, способный дать возможность дистанционного управления питанием любых сетевых устройств, особо востребовано для осветительных (светильники, ночники, люстры) и обогревательных (сетевые обогреватели, теплые полы) приборов.

Практически каждый автономный проект, созданный на программируемых платформах семейств Arduino, Esp, Stm, Tibbo разных модификаций и их аналогов используется в связке с Умной Розеткой. Это обуславливается особенностью данных микрокомпьютеров - от владельца не требуется проведение никаких процедур инициализации, так как при подаче микроконтроллер автоматически начинает выполнять код прошивки

Благодаря данному свойсту программируемых платформ, хозяин способен дистанцинно включать свои проекты (автоматизированная кормушка, система полива растений, метеостанция, сигнализация). Встречаются умные розетки с модификациями: с диммером, для управления уровнем яркости освещения или интенсивноти обогрева теплых полов, с таймером, для включения по расписанию, ваттметром, для наглядной демонстрации потребляемой энергии и портом USB type A, для питания устройств с данным интерфейсом подключения. Также в Умной Розетке можно реализовать поддержку различных технологий быстрой зарядки аккумуляторов мобильных устройств, например - Quick Charge 3.0, но из-за повышенных требований к элементной базе, связанных с повышенной производительностью, стоимость компонентов возрастает на 5$ (напряжение до 20В при токе потребления 1.5А, вместо обычных 5В и 1.5-2А).

Умные розетки различаются в зависимости от своей конструкции: умные модули, которые вставляются в подрозетник и модули, которые вставляются в розетку. Устройство первого типа обладает несомненным преимуществом - оно сохраняет привычный внешний вид розетки, но требует определенных навыков для установки. Устройство второго типа работает по принципу Plug&Play. Готовое устройство вставляется в розетку, а к нему подключается управляемый прибор. Недостатки данного решения это непривычный внешний вид и немного большая стоимость, но преимущество в виде максимально низкого порога вхождения сделало коммерчески успешным данный вид Умных Розеток.

Данный курсовой проект был выполнен в двух вариациях. На разных платформах и на разных языках программирования. Сделано с целью демонстрации преимуществ и недостатков разных платформ, языков программирования и конструктивных решений.

Из всех видов беспроводных соединений необходимо выделить Bluetooth и Wi-Fi. Оба стандартам широко распространены, находятся почти в каждом смартфоне, планшете и смартфоне, и при этом используются для разных вещей. Wi-Fi используется для подключения одного или многих устройств к Интернету, или создания локальной беспроводной сети, которая может связать несколько устройств. Наиболее типичным сценарием использования Wi-Fi для потребителей является беспроводной маршрутизатор установлен дома или в офисе. Эта центральная базовая станция, маршрутизатор, в лабораторных условиях распространяет сигнал на расстояние около 100 метров, на практике это число уменьшается до 35 метров из-за толстых стен и помех от других приборов же, как правило, имеет меньший радиус действия - около 20 метров, но при этом обладает меньшим энергопотреблением. Bluetooth является технологией устройство-устройство и поэтому требует, чтобы бы два устройства были связаны между собой (как правило, это заключается в наборе номера, который генерируется другим устройством из пары). Wi-Fi не имеет такого требования нет спаривания, но для успешного получения доступа к частной сети Wi-Fi все так же требуется корректно введенный пароль. Он редко включает в себя получение на Интернет, и не зависит от какого-либо центрального устройства, как маршрутизатор. Это почти всегда используется для соединения двух устройств друг с другом в каком-то полезным способом.

В связи с развитием технологий сегодня радиусы действия Wi-Fi и Bluetooth 4.х не сильно отличаются, и любая технология обеспечит устойчивый сигнал в пределах квартиры (не учитывая сложные ситуации со значительными помехами, которые создает внешняя среда). Однако возможность подключения сразу нескольких устройств и возможность подключения являются достаточным основанием для выбора Wi-Fi в качестве основной технологии передачи сигнала. Поэтому одним из требований к микрокомпьютеру, который будет управлять устройством, будет поддержка Wi-Fi стандарта.

1.2 Обзор элементов языка программирования

Исполняемые файлы, написанные для программируемых платформ, принято называть скетчами. Скетч для первого варианта проекта был написан на языке Arduino. Фактически, нет никакого языка, все скетчи пишутся на С++, скомпонованным с библиотекой AVR Libc.Следовательно, Arduino наследует строгую типизацию данных и регистрозависимость от C++. На данный момент этот метод считается самым удобным способом программирования устройств на микроконтроллерах. Таковым его делают три вещи:

· Среда разработки Arduino IDE. Она обладает интуитивно понятным интерфейсом, а пользователю доступен максимально удобный и локаничный комплекс инструментов для работы с программируемыми платформами: монитор последовательного порта (COM порт), выбор программатора, функцию записи загрузчика и менеджер библиотек. Отдельно следует рассмотреть менеджер плат - позволяет не выходя из IDE загрузить инструкции из репозитория для прошивки самых уникальных плат, что позволяет прошивать через данную среду прошить самую экзотическую платформу (ассортимент плат начинается со всего модельного ряда Arduino и заканчивается российским аналогом платформы Stm).

· Огромное количество официальных и пользовательских библиотек. Библиотеки открывают доступ к пользовательским методам, классам и объектам, благодаря которым без никаких глубоких познаний парой строк кода можно подкючить любой датчик. В этом и заключается самый сильный козырь Arduino. К примеру, чтобы подключить сервопривод (базовый элемент в роботехнике) с использованием стандартной библиотеки Servo.h и установить обратную связь с ним, требуется 4 строчки кода. Тем временем используемые методы и функции описываются в файле Servo.cpp и занимают 320 строчек кода.

· Среда разработки располагает максимально комфортной работе с платформами Arduino. Самый базовый проект - мигающий светодиод можно сделать не написав не единой строчки кода и загрузить прошивку в пару кликов (выбрать модель платы, COM порт, к которому подключено устройство и нажать кнопку «загрузить прошивку»).

Пример подключения сервопривода:

#include <Servo.h>/*используем библиотеку для работы с

сервоприводом*/

Servo servo; //объявляем переменную servo типа Servo

void setup() /*процедура setup, здесь прописывается код, который

выполнится единственный раз, при запуске микроконтроллера*/

{

servo.attach(10);//привязываем привод к порту 10

}

void loop() /*процедура loop, бесконечный цикл, написанное будет

выполняться раз за разом*/

{

servo.write(0); //ставим вал под 0

delay(2000); //ждем 2 секунды

servo.write(180); //ставим вал под 180

delay(2000); //ждем 2 секунды

}

В данном примере отсутствует необходимый для C++ файлов метод main(). Препроцессор Arduino создает его сам. Так выглядит готовыйC++ файл, который появляется при компиляции в Local Settings\Temp\build40910.tmp\:

#include «WProgram.h»

#include «Servo.h»

void setup();

void loop();

Servo servo;

void setup()

{

servo.attach(10);

}

void loop()

{

servo.write(0);

delay(2000);

servo.write(180);

delay(2000);

}

int main(void) // как и принято в С++ метод main()

{

init(); // в ней вызывается своя инициализация

setup;

for (;;) // в бесконечном цикле вызывается loop()

loop();

return 0;

}

Обязательным является использовать два основных метода - setup() и loop(). Все что находится внутри метода setup() будет выполнено один раз при каждом запуске ардуино. Здесь прописываются настройки и режимы работы самой платформы, также инициализируются датчики и модули, и прописываются их настройки и режимы работы. Грубо говоря - проходит подготовка к запуску основной программы.

Далее идет основой блок, метод loop. Все что находится внутри него, будет выполняться сверху вниз, в бесконечном цикле. Именно здесь происходит основное действие, считываются значения с датчиков, кнопок обработка информации, работа с данными, вывод их на дисплей или же отправка тем или иным методом.

Преимущества строгой типизации в C++:

· Все типы занимают разный объем памяти. Это крайне важно, так как работать приходится с платформами, с менее 16 килобайтами памяти на борту.

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

Типы данных в Arduino:

· Самый маленький тип данных - boolean, занимает 8 бит, или 1 байт, и может быть равен 1 или 0. Особенность bool переменной в том, что она является логическим типом, то есть может принимать значения true или false, это то же самое что 1 и 0. И самое удобное, что его значение очень удобно инвертировать, при помощи восклицательного знака.

· Char, по объему тоже занимает 1 байт, и может принимать значение от -128 до 127. Используется для хранения одного текстового символа, при помощи одинарных кавычек, причем символ хранится в виде числа согласно таблице символов ASCII.

· Данный тип тоже занимает 1 байт и так и называется, byte. Хранит значение от 0 до 255, используется для хранения небольших чисел

· Integer, или же int - самый популярный и используется чаще всех. Занимает 2 байта и Хранит в себе число от - до + 32000 с хвостиком тысяч. Еще есть вариант unsigned int, он хранит в себе только положительные числа, до 65000.

· Для хранения совсем больших чисел используется тип long, занимает он 4 байта и может хранить в себе число чуть больше двух миллиардов в обе стороны от нуля, соответственно unsigned long хранит положительное число до 4 миллиардов.

· Тип float используется для хранения чисел с плавающей точкой, то есть десятичных дробей, и занимает те же 4 байта. Тип double точнее чем чем float, но на ардуино они имеют одинаковую точность. Здесь присутствуют свои особенности, например переменной с типом float присваивать нужно обязательно число с точкой, даже если оно целое.

Если необходимо разделить число типа float на другое число, то делить нужно опять же на число с точкой, иначе результат будет целым числом. А в том случае если делить переменную целого типа ожидается получить дробное значение, то перед ней нужно поставить слово float в скобках. Это нужно для того чтобы компилятор выделил из памяти 4 байта для проведения вычислений десятичных чисел.

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

Второй вариант выполнен с применением скетча, написанным на Lua. Скетч сделан под прошивку NodeMCU.

NodeMCU - это открытый бесплатный проект на основе скриптового языка Lua. Прошивка предостваляет мощный инструментарий для создания типовых проектов интернета вещей и на данный момент существует только для платформ семейства Esp. Другими словами: на Arduino есть возможность создать скетч для любой программируемой платформы, а NodeMCU - эксклюзив для Esp. Самое сильное преимущество относительно прошивки Arduino - поддержка протоколов MQTT, JSON, CoAP. Протокол MQTT заслуживает отдельного внимания, так как имеет непосредственное отношение к интернету вещей, в частности - к умному дому.

MQTT или Message Queue Telemetry Transport - это легкий, компактный и открытый протокол обмена данными созданный для передачи данных на удалённых локациях, где требуется небольшой размер кода и есть ограничения по пропускной способности канала.Протокол работает на прикладном уровне поверх стека TCP/IP. Именно благодаря тому, что платформы Esp одни из немногих имеют аппаратную поддержку TCP/IP, на них можно использовать протокол MQTT.

Прошивка NodeMCU, впрочем, как и работа с Esp, требует более глубоких познаний, нежели Arduino. Все начинается с установки программы Esp8266 Flasher и загрузки бинарного файла прошивки NodeMCU. С помощью данной программы в загрузчик будет установлена прошивка NodeMCU и будет возможна дальнейшая работа. Самая распространенная среда разработки для Esp модулей - Esplorer. В отличие от Arduino IDE она обладает большим количеством полезных инструментов. Самые выделяющиеся возможности, имеющиеся у Esplorer и остутствующие у Arduino IDE:

· Аппаратная перезагрузка. Крайне полезно в целях отладки и тестирования.

· Просмотр серийного номера микропроцессора и чипа памяти. В большинстве случаев платформы заказываются из китайских интернет магазинов и возможность проверить подлинность самых важных компонентов платы очень важна. Нередки случаи, когда на корпусе чипа памяти маркировка 4 мб, когда на самом деле их всео 2.

· Инструменты для работы более чем с одним языком программирования. Esplorer может прошивать скетчами, написанными на MicroPython.

Типизация данных в lua не обязательна. В синтаксисе разбиение на строки не имеет значения, как и точка с запятой.

Следующие 3 записи абсолютно эквивалентны:

· a = 1

b = a*2

· a = 1;

b = a*2;

· a = 1 b = a*2

Пример базового когда на NodeMCU:local pin = 7local status = gpio.LOWlocal duration = 1000gpio.mode(pin, gpio.OUTPUT) -- переключение GPIO на вход или выходgpio.write(pin, status) -- установка состояния GPIOtmr.alarm(0, duration, 1, function () -- выполнение функции по расписанию if status == gpio.LOW then status = gpio.HIGH else status = gpio.LOW end gpio.write(pin, status)end)

2. СПЕЦИАЛЬНАЯ ЧАСТЬ

2.1 Общая постановка задачми

Требования для данногоустройства:

· Подключение к маршрутизатору через Wi-Fi (проводное соединение недопустимо).

· Управление мощными бытовыми приборами.

· Управление через веб-интерфейс.

· Поддержка протокола MQTT.

· Максимально низкая себестоимость, но не в убыток качеству.

2.2 Структурная и функциональная схема программы. Описание модулей

Умная Розетка состоит из четырех основных элементов:

· Платформа Esp, отдает команды реле, принимает и отправляет данные и проводит вычисления.

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

· Реле, управляет нагрузкой

· Источник питания для вышеперечисленных модулей.

В двух образцах использованы модули разных ценовых категорий, первый вариант - максимально удешевленный, второй - все компоненты собраны сбалансировано, качественно и без лишних затрат.

Преобразователь логических уровней в упрощеной модели сделан на основе транзистора и пары резисторой, что делает его стоимость равной паре центов. В оптимальной моделе используется многоканальный двунаправленный преобразователь 3.3-5В, стоимостью $0.70.

Сравнение платформ Esp, использованных в образцах:

Удешевленный ESP 01 (рис. 1)

Сбалансированный Lolin v3 (рис. 2)

Размер

13Ч21 мм

32Ч58 мм

Цена

$1.62

$2.88

Flash память

1 мб

4 мб

GPIO

4 (2 UART, 2 PWM)

11(1 АЦП, 10 PWM, 2 UART, 2 I2C, 3 SPI)

Поддержка TCP/IP

Да

Да

Потребление тока

220 мА

320 мА

Поддерживаемые режимы Wi-Fi

Точка доступа, клиент

Точка доступа, клиент

Наличие усилителей мощности и систем защиты

Нет

Стабилизатор тока, сглаживающие конденсаторы и фильтры

Интерфейс USB

Нет

Micro USB

Наличие встроенного программатора

Нет

CH340

Реле - электромеханический модуль, а следовательно, подвержен износу. Поэтому нет смысла максимально экономить на реле, от его качества зависит долговечность всей конструкции. Хорошим выбором является реле с управляющим напряжением 5В и коммутирующей нагрузкой 220В 10А, стоимостью $0.5.

Источник питания также является модулем, экономия на котором может пагубно отразиться на готовом продукте. При выборе источника питания есть нюанс: если в начале эксплуатации он выдает заявленный производителем ток без просадок по напряжению, обладает низкими пульсациями напряжения и не перегревается, то этот модуль врядли выйдет из строя ближайший десяток лет, так как ломаться там не чему. В дешевой модели используется блок питания от зарядного устройства, что крайне ненадежно. Силовые контакты оголены, а пульсации напряжения достигают 40 мВ. В оптимальной модели применен компактный блок питания на 5В 600 мА, полщадью не превышающий плату lolin v3. Это лучший кандидат со всего рынка, учитывая цену, размер и качество. Такой блок питания обойдется в $2. Выше были приведены розничные цены с учетом доставки.

Рис 1

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

Рис. 2

Образец с оптимальной схемой обойдется в $6.1.

Программная инициализация будет выглядеть так:

// Arduino MEGA

LiquidCrystal lcd(22, 23, 24, 25, 26, 27);

// Arduino UNO

LiquidCrystallcd(4, 5, 8, 9, 10, 11);

Температура, влажность DHT11

Подключение датчика температуры и влажности DHT11 (SainSmart). Датчик расположите лицевой стороной вверх, выводы будут описаны слева направо.

DHT11

Arduino Mega

DATA

Digital pin 2 (PWM) (см. ниже DHTPIN)

VCC

3,3--5 В (рекомендуется 5 В, лучше внешнее питание)

GND

GND

Программная инициализация

#define DHTPIN 2 // цифровойпин Digital pin 2 (PWM)

#define DHTTYPE DHT11 // см. DHT.h

// инициализация DHT dht(DHTPIN, DHTTYPE);

Барометр BMP180

Подключение датчика атмосферного давления BMP180 (барометр) + температура по интерфейсу I2C/TWI

BMP180

Arduino Mega

VCC

не подключен

GND

GND

SCL

21 (SCL)

SDA

20 (SDA)

3,3

3,3B

Для UNO: A4 (SDA), A5 (SCL).

// инициализация

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

// sensorID

Таблица 1

Модули используемые в проекте

Позиция

Описание

Плата Arduino Uno

Процессор: ATmega328p

Тактовая частота: 16 МГц

Память: 32 кб flash

Контакты: 20

Габариты: 6,9Ч5,3 см

Датчик температуры и влажности DHT 11

Потребляемый ток: 100 - 150 мкА

Напряжение питания: 5 В

Диапазон температур: 0-50 ?С

Погрешность измерения температуры: ± 2? С

Диапазон влажности: 20 - 90 %

Погрешность влажности: ±5%

Частота измерения: 1 раз в 2 секунды

Барометр BMP085

Потребляемые ток: 5 мкА

Напряжение питания: 3 - 5 В

Диапазон давления: 30 - 110 кПа

Разрешение: 3 Па ( 25 см) высокоточный режим

и 6 Па (50 см) в обычном режиме

LCD-дисплей 1602

Напряжение питания: 5 ВРазмер дисплея: 2.6 дюйма

Тип дисплея: 2 строки по 16 символовЦвет подсветки: синийЦвет символов: белый

Габаритные: 80мм x 35мм x 11мм

Модуль реального времени DS1302

Напряжение внешнего питания: 4,5-5,5В

Напряжение питания батарейки: 2-3,5 В

Потребляемый ток: 500 нА (?6 месяцев на

батарейке)

Выходной интерфейс: IІC

Габариты: 25,4Ч25,4 мм

2.3 Таблица идентификаторов

Идентификаторов - это уникальный признак объекта, позволяюший различать объекты или объект различающий объекты по идентификатору.

Таблица 2

Таблица идентификаторов

Идентификатор

Тип

Описание

#include

Синтаксис

#include используется для включения сторонних библиотек в ваш скетч.

int()

Преобразование типов

Приводит значение к типу int.

float()

Преобразование типов

Приводит значение к типу float.

const

Область видимости переменной и спецификаторы

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

unsigned int

Данные

Переменные типа unsigned int (беззнаковые целые) схожи с int-переменными тем, что они содержат двухбайтовые значения.

void

Данные

Kлючевое слово void используется только при объявлении функций.

If…else

Управляющие операторы

Проверка на истину выражения.

delay

Время

Приостанавливает выполнение программы на указанный промежуток времени (в миллисекундах). (В 1 секунде - 1000 миллисекунд.)

программирование микроконтроллер arduino бытовой метеостанция

ЗАКЛЮЧЕНИЕ

В итоге данного курсового проекта была разработан проект на основе микроконтроллера Arduino. Были выполнены все цели и задачи, поставленные перед началом данного проекта. Данный проект полностью работоспособен и совместим на различных операционных системах. В итоге всего получилась метеостанция, измеряющая температуру, давление, влажность и выводящая все результаты на дисплей.

CПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

1. ВикипедиЯ / материал на тему «Метеостанция»

ПРИЛОЖЕНИЕ А

Техническое задание

Настоящее техническое задание распространяется на метеостанцию.

Бытовые метеостанции позволяют получать точные показания о температуре и влажности в помещении и за окном (как правило, только цифровые метеостанции), измерять атмосферное давление, анализировать динамику изменения атмосферного давления, на основании которого самостоятельно делать прогноз погоды на 6-36 часов (только цифровые). Цифровые метеостанции имеют возможность подключения дополнительных беспроводных датчиков, которые будут передавать информацию о температуре (иногда и влажности) в помещениях вашего дома, гараже или улице в радиусе их действия.

1. Основание для разработки

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

2. Назначение разработки

Основным назначением проекта является демонстарция огромнейшего потенциала микроконтроллера Arduino.

3. Требование к программе и программному изделию

3.1 Требованиякфункциональнымхарактеристикам:

- Своевременноеотображение данных на дисплее;

- Удобный интерфейс и легкая возможность отключения питания;

- Удобноемодернизирование;

3.2 Требования к надежности:

- Предусмотреть контроль полученной информации о погодных условиях;

- Предусмотреть блокировку некорректных действий пользователя;

3.3 Требованияксоставуипараметрамтехническихсредств:

3.4 Требованияк транспортированию и хранению

Хранить и транспортировать проект нужно в влагозащитном чехле.

Таблица 1.А

Этапы и стадии разработки

№ этапа

Дата работ

Названия этапов

1

02.11.18

Изучение предметной области.

2

03.11.18

Общая постановка решаемой задачи.

3

04.11.18

Анализ входных и выходных с датчиков.

4

14.11.18

Сборка технической части проекта.

5

15.11.18

Создание кода программы.

6

16.11.18

Отладка программы.

7

17.11.18

Тестирование программного обеспечения.

8

19.11.18

Создание всей необходимой документации.

ПРИЛОЖЕНИЕ Б

Руководство пользователя

Для включения метеостанции, необхадимо нажать тактовую кнопу сбоку проекта. При повторном нажатии метеостация будет отключаться. Так же с другого бока есть потенциометр для регулировки контрасности текста на дисплее метеостанции.

Мтеостанция нуждается в смене питания каждые 3-4 недели, в зависимости от частоты использования. Необходимая батарея «Крона».

ПРИЛОЖЕНИЕ В

ЛИСТИНГ ПРОГРАММЫ

/* СОЕДИНЕНИЯ

Подключение датчика температуры-влажности DHT11 ---

- OUT > цифровой пин 9

- "+" > +3V (+5V)

- "-" > GND

Подключение датчика давления-температуры BMP085

- VCC > 3.3V; (поддерживается 1.8 - 3.6 В)

- GND > GND

- SDA > аналоговый пин A4

- SCL > аналоговый пин A5

Детектор газа

- A0

- VCC

- GND

ЖКИ- LCD RS > к цифровым выводам 12 - 8

- LCD Enable > к выводам 11 - 9

- LCD D4 > к выводам 5 - 4

- LCD D5 > к выводам 4 - 5

- LCD D6 > к выводам 3 - 6

- LCD D7 > к выводам 2 - 7

- LCD R/W > GND

- 10K резистор между +5V и землёй

- сброс > к LCD VO (пин 3)

*/

// Подключение библиотек:

#include <dht11.h> // датчика температуры-влажности

#include <LiquidCrystal.h> // LCD

#include <Wire.h> // датчика BMP085

#include <MQ135.h> // газовый детектор MQ135

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); /* соединение LCD-шилда

\x## - для вывода кириллических символов, где ## - номера символов в

таблице */

dht11 sensorTempHumid; // датчик температуры и влажности

MQ135 gasSensor = MQ135(A0); // датчикгаза

#define RZERO 76.63

float rzero; // показания с датчика газа

float ppm;

int del = 5000; // задержка, мс

/* Oversampling Setting (OSS) -

настройки разрешения для датчика давления BMP085,

см. https://www.sparkfun.com/tutorials/253

OSS может быть 0, 1, 2 или 3:

0 - ультранизкое потребление, низкое разрешение;

1 - стандартное потребление;

2 - высокое разрешение;

3 - ультравысокое разрешение и максимальное потребление. */

const unsigned char OSS = 0;

// Калибровочные переменные для BMP085:

int ac1;

int ac2;

int ac3;

unsigned int ac4;

unsigned int ac5;

unsigned int ac6;

int b1;

int b2;

int mb;

int mc;

int md;

long b5;

float temperature; // температура

long pressure; // давление

// Для прогноза:

const float p0 = 101325; // давление на уровне моря, Па.

const float currentAltitude = 179.5; // высота погодной станции над

уровнем моря, м;

const float ePressure = p0 * pow((1 - currentAltitude/44330), 5.255); //

нормальное давление на данной высоте, Па.

float weatherDiff;

#define DHT11PIN 9 // пин 9 датчика DHT11.

#define BMP085_ADDRESS 0x77 /* I2C адресдатчика BMP085;

см. https://www.sparkfun.com/tutorials/253 */

void setup() {

lcd.begin(16, 2); // инициализация ЖК

Wire.begin(); // инициализация I2C

bmp085Calibration(); // калибровка датчика BMP085

}

void loop() {

// Проверка датчика давления-влажности:

int chk = sensorTempHumid.read(DHT11PIN);

switch (chk) {

case DHTLIB_OK:

lcd.clear();

break;

case DHTLIB_ERROR_CHECKSUM:

lcd.clear();

lcd.print("Checksum error");

delay(del);

return;

case DHTLIB_ERROR_TIMEOUT:

lcd.clear();

lcd.print("Time out error");

delay(del);

return;

default:

lcd.clear();

lcd.print("Unknown error");

delay(del);

return;

}

// Считываем с датчика BMP085:

temperature = bmp085GetTemperature(bmp085ReadUT());

temperature *= 0.1;

pressure = bmp085GetPressure(bmp085ReadUP());

pressure *= 0.01;

// Разница давлений для вычисления простого прогноза

weatherDiff = pressure - ePressure;

rzero = gasSensor.getRZero();

ppm = gasSensor.getPPM();

// ЖК:

lcd.setCursor(0, 0); // курсор на строку 1, поз. 1;

//lcd.print("p = ");

lcd.print(pressure*3/4); // Па ->ммрт.ст.

lcd.print("mmHg "); // мм рт.ст.

// "Прогноз":

if(weatherDiff > 250)

lcd.print("Sun");

else if ((weatherDiff <= 250) || (weatherDiff >= -250))

lcd.print("Cloudy");

else if (weatherDiff > -250)

lcd.print("Rain");

lcd.setCursor(0, 1); // переход на строку 2

//lcd.print("t=");

lcd.print(temperature, 1);

lcd.print("C ");

//lcd.print("f=");

lcd.print(sensorTempHumid.humidity);

lcd.print("% ");

lcd.print(ppm);

//lcd.print("t=");

//lcd.print(sensorTempHumid.temperature);

//lcd.print("C ");

delay(del);

lcd.clear();

}

// ВЫЧИСЛЕНИЕ ДАВЛЕНИЯ

// Функция получает калибровочные значения для BMP085

// и должна быть запущена в начале.

void bmp085Calibration()

{

ac1 = bmp085ReadInt(0xAA);

ac2 = bmp085ReadInt(0xAC);

ac3 = bmp085ReadInt(0xAE);

ac4 = bmp085ReadInt(0xB0);

ac5 = bmp085ReadInt(0xB2);

ac6 = bmp085ReadInt(0xB4);

b1 = bmp085ReadInt(0xB6);

b2 = bmp085ReadInt(0xB8);

mb = bmp085ReadInt(0xBA);

mc = bmp085ReadInt(0xBC);

md = bmp085ReadInt(0xBE);

}

// Вычисление нескомпенсированной температуры.

// Возврашает значение в десятых долях градуса Цельсия.

short bmp085GetTemperature(unsigned int ut)

{

long x1, x2;

x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;

x2 = ((long)mc << 11)/(x1 + md);

b5 = x1 + x2;

return ((b5 + 8)>>4);

}

/* Вычисление нескомпенсированного давления.

Калибровочные значения должны быть уже известны.

b5 также необходимо, поэтому сначала нужно вызвать bmp085GetTemperature().

ВозврашаетзначениевПаскалях. */

long bmp085GetPressure(unsigned long up)

{

long x1, x2, x3, b3, b6, p;

unsigned long b4, b7;

b6 = b5 - 4000;

// вычисление b3:

x1 = (b2 * (b6 * b6)>>12)>>11;

x2 = (ac2 * b6)>>11;

x3 = x1 + x2;

b3 = (((((long)ac1)*4 + x3)<>2;

// вычисление b4:

x1 = (ac3 * b6)>>13;

x2 = (b1 * ((b6 * b6)>>12))>>16;

x3 = ((x1 + x2) + 2)>>2;

b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

b7 = ((unsigned long)(up - b3) * (50000>>OSS));

if (b7 < 0x80000000)

p = (b7<<1)/b4;

else

p = (b7/b4)<<1;

x1 = (p>>8) * (p>>8);

x1 = (x1 * 3038)>>16;

x2 = (-7357 * p)>>16;

p += (x1 + x2 + 3791)>>4;

return p;

}

// Чтение нескомпенсированного значения температуры.

unsigned int bmp085ReadUT()

{

unsigned int ut;

// Записывает 0x2E в регистр 0xF4

// для запроса показаний температуры:

Wire.beginTransmission(BMP085_ADDRESS);

Wire.write(0xF4);

Wire.write(0x2E);

Wire.endTransmission();

delay(5);

// Читает 2 байта из регистров 0xF6 и 0xF7

ut = bmp085ReadInt(0xF6);

return ut;

}

// Чтение давления (нескомпенсированного).

unsigned long bmp085ReadUP()

{

unsigned char msb, lsb, xlsb;

unsigned long up = 0;

// Записывает 0x34+(OSS<<6) в регистр 0xF4

// для запроса показаний давления:

Wire.beginTransmission(BMP085_ADDRESS);

Wire.write(0xF4);

Wire.write(0x34 + (OSS<<6));

Wire.endTransmission();

// Ожидание преобразования, задержка зависит от OSS:

delay(2 + (3<<="" msb="Wire.read();" lsb="Wire.read();" xlsb="Wire.read();" up="(((unsigned" long)="" <<="" 16)="" |="" ((unsigned="" 8)="" (unsigned="" xlsb)="" style="box-sizing: border-box;">> (8-OSS);

return up;

}

// Читает 1 байт из BMP085 по адресу 'address'.

char bmp085Read(unsigned char address)

{

unsigned char data;

Wire.beginTransmission(BMP085_ADDRESS);

Wire.write(address);

Wire.endTransmission();

Wire.requestFrom(BMP085_ADDRESS, 1);

while(!Wire.available());

return Wire.read();

}

// Читает 2 байта из BMP085, начиная с адреса 'address'.

int bmp085ReadInt(unsigned char address)

{

unsigned char msb, lsb;

Wire.beginTransmission(BMP085_ADDRESS);

Wire.write(address);

Wire.endTransmission();

Wire.requestFrom(BMP085_ADDRESS, 2);

while(Wire.available()<2);

msb = Wire.read();

lsb = Wire.read();

return (int) msb<<8 | lsb;

}

ПРИЛОЖЕНИЕ Г

Контрольный пример

Размещено на allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.