Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Описание предметной области. Умная розетка – базовый элемент Умного Дома, способный дать возможность



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

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

Практически каждый автономный проект, созданный на программируемых платформах семейств 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.


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

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

     

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

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

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

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

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

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


 


Описание модулей

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

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

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

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

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

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

     Сравнение платформ 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

 

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

 Реле – электромеханический модуль, а следовательно, подвержен износу. Поэтому нет смысла максимально экономить на реле, от его качества зависит долговечность всей конструкции. Хорошим выбором является реле с управляющим напряжением 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

LiquidCrystal lcd(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.4 Таблица идентификаторов

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

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

Идентификатор Тип Описание
#include Синтаксис #include используется для включения сторонних библиотек в ваш скетч.
int() Преобразование типов Приводит значение к типу int.
float() Преобразование типов Приводит значение к типу float.
const Область видимости переменной и спецификаторы Это спецификатор, который изменяет поведение переменной и делает ее доступной только для чтения.
unsigned int Данные Переменные типа unsigned int (беззнаковые целые) схожи с int-переменными тем, что они содержат двухбайтовые значения.
void Данные Kлючевое слово void используется только при объявлении функций.
If…else Управляющие операторы Проверка на истину выражения.
  delay   Время   Приостанавливает выполнение программы на указанный промежуток времени (в миллисекундах). (В 1 секунде - 1000 миллисекунд.)

 

ЗАКЛЮЧЕНИЕ

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

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

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

 

ПРИЛОЖЕНИЕ А

ТЕХНИЧЕСКОЕ ЗАДАНИЕ

 

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

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

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

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

 

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

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

 

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

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

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

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

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

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

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

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

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

 

ПРОДОЛЖЕНИЕ ПРИЛОЖЕНИЯ А

 

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

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

 

 

Таблица 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);

}

 

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

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

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;

}

 

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

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

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

Практически каждый автономный проект, созданный на программируемых платформах семейств 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.


Поделиться:



Последнее изменение этой страницы: 2019-06-19; Просмотров: 181; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.29 с.)
Главная | Случайная страница | Обратная связь