Всем привет! Я - Артем Лужецкий и я буду вести серию статей посвященных "Умному дому" и IoT (англ. - Internet of Things, интернет вещей). Мы познакомимся с удивительными способами создания домашней сети из разнообразных устройств, которые будут работать либо автономно, либо при помощи человека. Ну что? Приступим!

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

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

Arduino UNO

Я думаю не надо знакомить вас с этой платой, она очень популярна среди начинающих и поклонников DIY. Скажу только то, что способности этой платы ограничены и UNO не может работать с протоколом https, не хватает вычислительной мощности микроконтроллера ATmega328P, поэтому, когда нам придется работать с микроконтроллером и протоколом https, то мы будем программировать ESP8266.

ESP8266

Я буду работать с Troyka-модулем ESP8266 от компании "Амперка", но можно спокойно использовать и обычный модуль ESP 8266, они практически не имеют отличий, главное при подключении посмотреть значение пинов и запомнить, что ESP работает по 3,3 вольтовой логике, поэтому нужно либо подключать через 5 вольт, но подключить в схему стабилизатор напряжения, либо просто использовать пин со подачей напряжения в 3,3 вольта.

Данный микроконтроллер не самый мощный в серии компании Espressif на общем рынке, но он один из самых дешевых и распространенных. Он будет основой наших IoT разработок.

Дополнительные детали

Также нам потребуется для создания всех опытов:

  1. Светодиоды
  2. Фоторезистор
  3. Термистор
  4. Ультразвуковой дальномер
  5. Пьезодинамик
  6. Мини Сервопривод
  7. ИК - датчик
  8. ИК - пульт

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

Программы и библиотеки

Первое - скачайте библиотеку, которая поможет вам намного проще работать в Arduino IDE, если вы используйте ESP8266 - http://wiki.amperka.ru/_media/iot-m:iot-m-libs.zip

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

  1. www.dweet.io
  2. maker.ifttt.com
  3. narodmon.ru
  4. и т.д.

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

  1. OpenHab
  2. Blink
  3. и т.д.

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

2. Делаем "умную лампу"

Я уже заставил вас скучать? Сделаем самую простую умную лампу, которая будет включатся, если в комнате темно.

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

Если вы не уверены в том, что готовы работать с электричеством в 220 вольт, то используйте вместо фонаря обычный светодиод. В начале я взял свою старую лампу TLI – 204, такие есть практически в любом магазине (отключил заранее от сети).

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

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

Общая электрическая схема должны будет выглядеть так:

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

Подключим к ардуино фоторезистор. Схема выглядит так:

3. Код для "умной лампы"

Теперь напишем код, по которому будем передавать ток на реле, если в комнате будет темно.

#define SHINE 5 //ПИН НА ФОТОРЕЗИСТОРЕ #define REL 13 //ПИН НА РЕЛЕ void setup(){ pinMode(SHINE, INPUT); pinMode(REL, OUTPUT); Serial.begin(9600); } void loop(){ if (analogRead(SHINE)<600) // Если света в комнате мало, то включаем лампу { digitalWrite(REL, HIGH) } else // если много, то выключаем { digitalWrite(REL, LOW); } Serial.printIn(analogRead(SHINE)); selay(500); }

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

В следующий раз мы попробуем усложнить код и добавить еще пару функций. До скорой встречи!

Для дополнительного задания

    еще 1 светодиод

    еще 1 резистор номиналом 220 Ом

    еще 2 провода

Принципиальная схема

Схема на макетке

Обратите внимание

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

    Постарайтесь разместить компоненты так, чтобы светодиод не засвечивал фоторезистор.

Скетч

p050_night_light.ino #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() { pinMode(LED_PIN, OUTPUT) ; } void loop() { // считываем уровень освещённости. Кстати, объявлять // переменную и присваивать ей значение можно разом int lightness = analogRead(LDR_PIN) ; // считываем значение с потенциометра, которым мы регулируем // пороговое значение между условными темнотой и светом int threshold = analogRead(POT_PIN) ; // объявляем логическую переменную и назначаем ей значение // «темно ли сейчас». Логические переменные, в отличие от // целочисленных, могут содержать лишь одно из двух значений: // истину (англ. true) или ложь (англ. false). Такие значения // ещё называют булевыми (англ. boolean). boolean tooDark = (lightness < threshold) ; // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH) ; } else { // ...иначе свет не нужен - выключаем его digitalWrite(LED_PIN, LOW) ; } }

Пояснения к коду

    Мы используем новый тип переменных - boolean , которые хранят только значения true (истина, 1) или false (ложь, 0). Эти значения являются результатом вычисления логических выражений. В данном примере логическое выражение - это lightness < threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

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

    В нашем эксперименте логическое выражение будет истинным, когда значение lightness меньше значения threshold , потому что мы использовали оператор < . Мы можем использовать операторы > , <= , >= , == , != , которые значат «больше», «меньше или равно», «больше или равно», «равно», «не равно» соответственно.

    Будьте особенно внимательны с логическим оператором == и не путайте его с оператором присваивания = . В первом случае мы сравниваем значения выражений и получаем логическое значение (истина или ложь), а во втором случае присваиваем левому операнду значение правого. Компилятор не знает наших намерений и ошибку не выдаст, а мы можем нечаянно изменить значение какой-нибудь переменной и затем долго разыскивать ошибку.

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

    У логического выражения lightness < threshold есть значение: true или false . Мы вычислили его и поместили в булеву переменную tooDark («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод»

    С таким же успехом мы могли бы сказать «если освещенность меньше порогового уровня, то включить светодиод», т.е. передать в if всё логическое выражение:

if (lightness < threshold) { // ... }

    За условным оператором if обязательно следует блок кода, который выполняется в случае истинности логического выражения. Не забывайте про обе фигурные скобки {} !

    Если в случае истинности выражения нам нужно выполнить только одну инструкцию, ее можно написать сразу после if (…) без фигурных скобок:

if (lightness < threshold) digitalWrite(LED_PIN, HIGH) ;

    Оператор if может быть расширен конструкцией else («иначе»). Блок кода или единственная инструкция, следующий за ней, будет выполнен только если логическое выражение в if имеет значение false , «ложь». Правила, касающиеся фигурных скобок, такие же. В нашем эксперименте мы написали «если слишком темно, включить светодиод, иначе выключить светодиод».

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

СПИСОК ДЕТАЛЕЙ ДЛЯ ЭКСПЕРИМЕНТА

- 1 плата Arduino Uno;

- 1 беспаечная макетная плата;

- 1 светодиод;

- 1 фоторезистор;

- 1 резистор номиналом 220 Ом, 1 резистор номиналом 10 кОм;

- 1 переменный резистор (потенциометр) ;

- 10 проводов «папа-папа».

ДЕТАЛИ ДЛЯ ДОПОЛНИТЕЛЬНОГО ЗАДАНИЯ

Еще 1 светодиод;

Еще 1 резистор номиналом 220 Ом;

Еще 2 провода.

ПРИНЦИПИАЛЬНАЯ СХЕМА

СХЕМА НА МАКЕТНОЙ ПЛАТЕ

СКЕТЧ

скачать скетч для Arduino IDE
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { // считываем уровень освещённости. Кстати, объявлять // переменную и присваивать ей значение можно разом int lightness = analogRead(LDR_PIN); // считываем значение с потенциометра, которым мы регулируем // пороговое значение между условными темнотой и светом int threshold = analogRead(POT_PIN); // объявляем логическую переменную и назначаем ей значение // «темно ли сейчас». Логические переменные, в отличие от // целочисленных, могут содержать лишь одно из двух значений: // истину (англ. true) или ложь (англ. false). Такие значения // ещё называют булевыми (англ. boolean). boolean tooDark = (lightness < threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

ПОЯСНЕНИЯ К КОДУ

  • Мы используем новый тип переменных — boolean , которые хранят только значения true (истина, 1 ) или false (ложь, 0 ). Эти значения являются результатом вычисления логических выражений. В данном примере логическое выражение — это lightness < threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.
  • Мы взяли это логическое выражение в скобки только для наглядности. Всегда лучше писать читабельный код. В других случаях скобки могут влиять на порядок действий, как в обычной арифметике.
  • В нашем эксперименте логическое выражение будет истинным, когда значение lightness меньше значения threshold , потому что мы использовали оператор < . Мы можем использовать операторы > , <= , >= , = = , != , которые значат «больше», «меньше или равно», «больше или равно», «равно», «не равно» соответственно.
  • Будьте особенно внимательны с логическим оператором = = и не путайте его с оператором присваивания = . В первом случае мы сравниваем значения выражений и получаем логическое значение (истина или ложь), а во втором случае присваиваем левому операнду значение правого. Компилятор не знает наших намерений и ошибку не выдаст, а мы можем нечаянно изменить значение какой-нибудь переменной и затем долго разыскивать ошибку.
  • Условный оператор if если ») — один из ключевых в большинстве языков программирования. С его помощью мы можем выполнять не только жестко заданную последовательность действий, но принимать решения, по какой ветви алгоритма идти, в зависимости от неких условий.
  • У логического выражения lightness < threshold есть значение: true или false . Мы вычислили его и поместили в булеву переменную tooDark («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод»
  • С таким же успехом мы могли бы сказать «если освещенность меньше порогового уровня, то включить светодиод», т.е. передать в if всё логическое выражение:
if (lightness < threshold) { // ... }
  • За условным оператором if обязательно следует блок кода, который выполняется в случае истинности логического выражения. Не забывайте про обе фигурные скобки {} !
  • Если в случае истинности выражения нам нужно выполнить только одну инструкцию, ее можно написать сразу после if (…) без фигурных скобок:
if (lightness < threshold) digitalWrite(LED_PIN, HIGH);
  • Оператор if может быть расширен конструкцией else («иначе»). Блок кода или единственная инструкция, следующий за ней, будет выполнен только если логическое выражение в if имеет значение false , «ложь ». Правила, касающиеся фигурных скобок, такие же. В нашем эксперименте мы написали «если слишком темно, включить светодиод, иначе выключить светодиод».

ВОПРОСЫ ДЛЯ ПРОВЕРКИ СЕБЯ

  1. Если мы установим фоторезистор между аналоговым входом и землей, наше устройство будет работать наоборот: светодиод будет включаться при увеличении количества света. Почему?
  2. Какой результат работы устройства мы получим, если свет от светодиода будет падать на фоторезистор?
  3. Если мы все же установили фоторезистор так, как сказано в предыдущем вопросе, как нам нужно изменить программу, чтобы устройство работало верно?
  4. Допустим, у нас есть код if (условие) {действие;} . В каких случаях будет выполнено действие ?
  5. При каких значениях y выражение x + y > 0 будет истинным, если x > 0 ?
  6. Обязательно ли указывать, какие инструкции выполнять, если условие в операторе if ложно?
  7. Чем отличается оператор = = от оператора = ?
  8. Если мы используем конструкцию if (условие) действие1; else действие2; , может ли быть ситуация, когда ни одно из действий не выполнится? Почему?

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ

  1. Перепишите программу без использования переменной tooDark с сохранением функционала устройства.
  2. Добавьте в схему еще один светодиод. Дополните программу так, чтобы при падении освещенности ниже порогового значения включался один светодиод, а при падении освещенности ниже половины от порогового значения включались оба светодиода.
  3. Измените схему и программу так, чтобы светодиоды включались по прежнему принципу, но светились тем сильнее, чем меньше света падает на фоторезистор.

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

Сопротивление фоторезистора зависит от света, попадающего на него. Используя фоторезистор в связке с обычным резистором 4.7 кОм, мы получаем делитель напряжения, в котором напряжение проходящее через фоторезистор, изменяется, в зависимости от уровня освещенности.

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

Принципиальная схема делителя показана ниже. Когда освещенность увеличивается, сопротивление фоторезистора падает и соответственно на выходе делителя (и входе АЦП) напряжение увеличивается. Когда освещенность падает все наоборот.

На фото ниже, показана собранная схема на макетной плате. Напряжения 0В и 5В берутся с Arduino. Ножка А0 используется как вход АЦП.

Ниже показан скетч Arduino. В данном уроке мы просто включаем и выключаем LED, который встроен в плату Arduino. Более яркий LED-светодиод, вы можете подключить к ноге 13 (через резистор ~220 Ом). Если будете подключать более мощную нагрузку, такую как лампу накаливания, то ее следует подключать через реле или тиристор.

В коде программы есть закомментированные участки, они служат для отладки. Можно будет контролировать значение АЦП (от 0 до 1024). Также, необходимо в коде изменить значение 500 (порог включения и выключения) на то, которое вы подберете опытным путем, изменяя освещенность.

/* ** Ночник ** ** www.hobbytronics.co.uk */ int sensorPin = A0; // устанавливаем входную ногу для АЦП unsigned int sensorValue = 0; // цифровое значение фоторезистора void setup() { pinMode(13, OUTPUT); Serial.begin(9600); // старт последовательного вывода данных (для тестирования) } void loop() { sensorValue = analogRead(sensorPin); // считываем значение с фоторезистора if(sensorValue<500) digitalWrite(13, HIGH); // включаем else digitalWrite(13, LOW); // выключаем // Для отладки раскомментируйте нижеследующие строки //Serial.print(sensorValue, DEC); // вывод данных с фоторезистора (0-1024) //Serial.println(""); // возврат каретки //delay(500); }

Добрый день или ночь, у кого как. Сегодня я поделюсь инструкцией по изготовления небольшого ночника. Основой послужит – матовый рассеиватель от сгоревшей светодиодной лампочки. А внутрь мы поместим Arduino Pro Mini и светодиоды SW2812. Я выложу только один скетч, но вариантов цветов или переливаний может быть очень много. Начнем, как всегда, со списка необходимого:

Рассеиватель от светодиодной ламы, цоколь Е27
- Блок питания на 5В
- Arduino Pro Mini 5V
- USB-TTL (для заливки скетча в ардуино)
- Светодиоды WS2812
- Тонкий пластик
- Двусторонний скотч
- Зарядка от телефона не нужная, но рабочая
- Паяльник
- Провода
- Припой, канифоль
- Термоклеевой пистолет

Шаг 1. Изготовление корпуса.
Для начал нам понадобиться добыть рассеиватель. Берем светодиодную лампочку, с цоколем Е27. Лучше, конечно, брать уже отработавшую свое лампочку:

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

Теперь нам надо изготовить основу, к которой мы будем приклеивать светодиоды. Для этого берем тонкий пластик, подойдет обложка от пластикового скоросшивателя. Теперь замеряем внутренний диаметр посадочного отверстия рассеивателя, а также надо измерить глубину рассеивателя. Переходим к изготовлению основы. Она будет в форме цилиндра, диаметр которого должен быть на 5 мм меньше внутреннего диаметра посадочного отверстия рассеивателя. А высота меньше на 7 мм глубины рассеивателя. Выглядеть должно примерно так:

На этом пока закончим.

Шаг 2. Электрика.
Как я уже говорил ранее, контролером будет Arduino Pro Mini, версия, работающая от 5 вольт. Светодиодная лента подключается вполне просто, для этого необходимо контакт +5V подключить к плюсу от блока питания на 5 вольт, а GND – к минусу. Контакт DIN (вход) соединить с pin 6 Arduino. Порт подключения ленты можно поменять на любой удобный в скетче. Arduino будем питать от того же блока питания. Так как блок питания будем использовать стабилизированный, соединяем плюс от блока питания с контактом 5V на Arduino. Минус блока питания должен быть подключен к GND Arduino. Схема такая:

Итак, один светодиод, при максимальной яркости всех трех цветов, потребляет 60 мА. У меня поместилось 25, значит получается:

25 х 60 mA = 1500 mA = 1.5 А

То есть, мне нужен блок питания 5 В, 1.5 А. Это максимальный показатель силы тока, который будет при включение все светодиодов в режим максимальной яркости всех трех цветов.

В качестве блока питания возьмем старую зарядку от телефона. Блок питания надо выбирать на 5 вольт, а по мощности, посчитать сколько у вас поместиться светодиодов:

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

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

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

Если у вас получилось так же, не расстраивайтесь, просто обрежьте свисающую по краям ленту и припаяйте провода напрямую к светодиодам. Контакты WS2812:

Обратить внимание, светодиодная лента на WS2812B имеет направление, с одной стороны (начало или вход) у нее контакты DIN, +5V, GND. А с другой стороны (конец или выход) DO, +5V, GND. Если припаиваете на прямую к светодиодам, смотри на расположение контактов, ориентируясь на ключ (срез угла). Для упрощения монтажа, на ленте нарисованы стрелки, указывающие на направление. Особое внимание уделите переходу на верх, получается очень резкий изгиб, велика вероятность переломить ленту. У меня получилось вот так:


Сверху припаивался на прямую к светодиодам:

А посередине, вторым уровнем, еще пару светодиодов:

И для надежности, заливаем провода термоклеем:

Теперь вставляем наш цилиндр со светодиодами внутрь шара от лампочки. Используя термоклей, фиксируем цилиндр внутри шара по кругу:

Не забудьте проделать прорезь для вывода наружу провода питания:

Шаг 3. Подготовка среду и прошивка.
Для загрузки скетча (или прошивки) будем использовать Arduino IDE. Скачиваем с официального последнюю версию и устанавливаем ее.

Чтобы это сделать, вначале скачиваем архив. Затем распаковываем этот архив. И перемещаем распакованные файлы в папку «libraries», которая находится в папке с установленной Arduino IDE. Можно сделать проще. Запускаем Arduino IDE. Не распаковываем скачанный архив. Прямо в среде Arduino IDE выбираем пункт меню Скетч – Подключить библиотеку. В самом верху выпадающего списка выбираем пункт «Добавить.Zip библиотеку». Должно появиться диалоговое окно. Далее в нем выбираем нашу библиотеку, Adafruit_NeoPixel-master. Немного стоит подождать. Снова открываем пункт меню Скетч – Подключить библиотеку. Теперь в самом низу выпадающего списка вы увидите новую библиотеку. Перезагрузив Arduino IDE, библиотеку можно использовать.

Скачиваем мой скетч:

Осталось залить скетч в Arduino. Мы используем Arduino Pro Mini. У этой версии популярной Arduino нет распаянного на плате USB-TTL чипа. Поэтому для связи с компьютером и заливки скетча необходимо использовать отдельный USB-TTL. Подключение по следующей схеме:

Arduino – USB-TTL
RX (P0) – TX
TX (P1) – RX
GND – GND

Питание USB-TTL будет от USB порта компьютера. Arduino можно запитать от USB-TLL или использовать внешний источник питания. Главное, чтобы контакт GND USB-TTL и Arduino были соединены. Чаще всего в продаже попадаются USB-TTL без вывода контакта DTR. Контакт DTR необходимо соединить с Reset Arduino для осуществления автоматической перезагрузки перед загрузкой скетча. Если у вас, как и у меня, такого вывод нет, перезагрузку перед заливкой скетча необходимо выполнять вручную. Действуем так: подключаем всем по схеме, описанной выше, открываем Arduino IDE, открываем скаченный вами скетче, нажимает кнопку – Загрузка – и смотрим что написано внизу. Пока идет «компиляция», ничего не делаем, просто ждем, когда появится надпись «загрузка» нам необходимо нажать кнопку Reset на Arduino. Если не удобно нажимать кнопку на плате, можно вывести кнопку, подключенную к GND и Reset. Или просто вывести провода к тем же выводам и замыкать их в нужный момент.

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


Close