Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

SMART CUBE:новый способ контролировать свой дом

Компоненты и расходные материалы

Arduino 101
× 1
LED (общий)
1 синий - 1 желтый - 1 зеленый - 2 красных
× 5
Резистор 221 Ом
× 5
Макет (общий)
Не обязательно
× 1
Seeed Base Shield V2
× 1
ЖК-подсветка Seeed Grove LCD с RGB-подсветкой
× 1
Звуковой датчик Seeed Grove
× 1
Зуммер Seeed Grove
× 1
Датчик температуры Seeed Grove
× 1
Клавиатура
× 1
Перемычки (общие)
× 1
Батарея 9 В (стандартная)
× 1
Зажим для батареи 9 В
× 1
Волокно средней плотности (МДФ) 20x30 см
МДФ 3 мм или другой материал для лазерной резки
× 1

Необходимые инструменты и машины

Лазерный резак (универсальный)
Паяльник (универсальный)

Приложения и онлайн-сервисы

IDE Arduino
Nordic Semiconductor nRF Connect SDK
Не обязательно

Об этом проекте

Что такое SMART CUBE?

Smart Cube - это контроллер для ваших устройств Smart Home.

В настоящее время более разумное управление всеми устройствами в наших домах становится необходимостью . Нам нужно что-то простое и интуитивно понятный использовать. Умный куб может быть решением:это портативное устройство, содержащее Arduino 101 плата и несколько датчиков которые обмениваются данными с приборами и приводами в вашем умном доме.

Нововведение этого пульта дистанционного управления связано с нововведением платы Arduino 101. Используется Bluetooth (BLE) . для управления освещением, температурой и телевизором, а также вы можете синхронизировать его со своим смартфоном . Но главное нововведение - это способ взаимодействия со Smart Cube . жестом с помощью гироскопа и акселерометра. Куб имеет 6 граней, каждая из которых управляет определенной функцией . Функция, которую вы хотите использовать, определяется с помощью гироскопа, распознающего верхнюю часть лица . Например, вы можете открыть свет в комнате, в которой вы находитесь, просто поместив куб с «светлой гранью» в верхнее положение . . Если вы хотите выключить свет, вам просто нужно встряхнуть куб.

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

Этот проект призван помочь вам создать умный контроллер . . Этому устройству нужен приемник . (умная центральная линия на картинке), которые интерпретируют данные и управлять функциями вашего умного дома. Основной вывод куба - это сигнал BLE, который можно использовать разными способами:например, вы можете подключить куб с помощью приложения для смартфона (или сделайте свою собственную), или вы можете построить станцию ​​с другим Arduino которые собирают данные BLE и напрямую контролируют бытовую технику в вашем доме. Из-за разнообразия случаев эта часть зависит от вашей требовательности. В этом руководстве мы увидим, как построить умный куб, и вы узнаете, как его персонализировать.

Функции:

Структуру кода легко персонализировать (мы проанализируем код позже), чтобы вы могли решить, какими функциями управлять. Вот функции, которые я решил контролировать:

ФОНАРЬ :Это лицо в ВВЕРХ положение открытое огни комнаты, в которой вы находитесь. Если встряхнуть куб, свет погаснет и загорится желтый светодиод в этом лице активируется, поэтому вы можете найти куб в темноте. общение со своими лампами сделан БЛЭ из 101 доски.

ТЕМПЕРАТУРА :Это лицо ВВЕРХ активировать (через BLE) кондиционер если жарко или нагрев если холодно. Он определяет температуру с помощью термодатчика . и откройте синий светодиод если кондиционер включен (снежинка) или красный один, если включен обогрев (солнце).

ТАЙМЕР :Это лицо ВВЕРХ запустите таймер, который вы видите на ЖК-дисплее. Есть зуммер, который работает как будильник когда обратный отсчет закончится. Если вы встряхнете, вы остановите таймер, и вы увидите оставшееся время. Когда обратный отсчет закончится, цвет ЖК-дисплея изменится с синего на красный, а зуммер издаст три звука.

ТВ :Это лицо ВВЕРХ откройте телевизор. Куб становится удаленным контроллером для вашего телевизора. Есть панель кнопок с цифрами, которая активируется только в том случае, если это лицо ВЕРХНЕЕ, чтобы избежать случайных прикосновений. Номер, который вы нажимаете, отправляется через BLE на центральный контроллер, подключенный к вашему телевизору. Встряхнув кубик, вы закрываете телевизор.

ЗВУК :Это лицо ВВЕРХ активируйте светодиод, яркость которого зависит от уровня шума в комнате. Шум обнаруживается благодаря звуковому датчику. Если вы встряхнете кубик, вы закроете эту функцию. (Если вы хотите, вы можете активировать свою личную функцию, хлопая в ладоши).

ВЫКЛ лицо:если вы не встряхиваете куб, это лицо похоже на нейтральное положение в котором ничего не изменилось. Если вы хотите закрыть все расположите куб ВЫКЛЮЧЕННОЙ лицевой стороной ВВЕРХ и встряхните его. Этот жест похож на кнопку «Домой» на смартфоне, которую вы нажимаете, если хотите быстро выйти. Есть красный светодиод чтобы вы могли найти куб, если он темный.

Отличия от концепции:

Изначально планировалось использовать также ИК-связь . для подключения телевизора напрямую к кубу. Поскольку Arduino 101 не поддерживает (на данный момент) библиотеку, которая управляет ИК-сигналами, я решил отправить информацию через BLE на станцию, которая может управлять этой библиотекой (например, Arduino UNO). Из-за этой проблемы я удалил радиофункцию . (очень похоже на лицо телевизора), заменив его на лицо датчика звука. Это лицо можно использовать для распознавания громкого шума (например, хлопка в ладоши), чтобы что-то активировать. Самое большое изменение коснулось материала куба. Сначала я думал построить его на 3D-принтере . но потом я решил использовать лазерный резак . Таким образом легче заменить лицо, если вы хотите изменить функцию. Например, вы можете удалить циферблат таймера и заменить его лицом, которое автоматически наполняет миску вашей кошки. модульность вам не нужно перестраивать всю конструкцию!

Давайте построим:

Следуйте этим инструкциям, чтобы построить свой собственный умный куб. Начнем с оборудования , сборка электроники сначала компоненты, а затем вырезанный лазером корпус куба из МДФ. После этой операции я объясню, как работает код . и как его можно персонализировать . После загрузки кода на Arduino 101 вы можете загрузить приложение . чтобы увидеть вывод BLE куба или подключить его напрямую к своему умному дому!

Аппаратное обеспечение - электроника:

Начнем с вашего Arduino 101. Это фриттинг схема, которой нужно следовать:

Установите базовый щит Grove на вашей доске и начните с подключений.

Клавиатура :вы должны подключить провода по порядку к контактам:10, 8, 7, 6, 5, 4, 2.

Подключение светодиодов :

Прежде всего нам нужно подготовить светодиоды:

- подключите длинную ножку светодиода (анод) к сопротивлению 220 Ом, а затем к красному проводу (это кабель для подключения к контакту)

- подключите короткую ножку (катод) к белому проводу (он пойдет на землю)

- припаять детали и обмотать их изолентой

- соедините все белые кабели с одним белым кабелем (он пойдет на землю) и спаяйте их все вместе

Теперь подключите красные провода к Arduino:ЗЕЛЕНЫЙ к выводу 9, ЖЕЛТЫЙ к выводу 11, КРАСНЫЙ к выводу 12, СИНИЙ к выводу 13 и последний КРАСНЫЙ к выводу A2.

Датчики Grove :

Подключите датчики рощи к щиту (см. Схему на насадках).

Зуммер на D3, ЖК-дисплей RGB на I2C, датчик температуры на A0, датчик звука на A1.

Хорошо, теперь мы подключили все электрические части. Теперь вам нужен футляр . .

Фурнитура - коробка

Вы можете скачать эскиз куба для резки лазером. Красные линии на эскизе - символы лиц, просто выгравировать их. Черные линии необходимо обрезать . Внутренний размер куба - 9 см . . Эскиз подойдет, если вы используете материал 3 мм . , если вы используете другую толщину, вам следует изменить ее (вы можете использовать этот сайт:http://www.makercase.com/).

Я выбрал материал МДФ . (Волокно средней плотности), но вы можете использовать то, что хотите.

Вот несколько изображений лазерной резки :

Теперь нам нужно собрать .

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

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

Теперь ЖК-экран RGB . Это идеально подходит для отверстия.

Подготовим разъем аккумулятора . :

Я вырезал старую вилку трансформатора и подключил ее к зажиму аккумулятора. Таким образом мы экономим место внутри коробки.

На данный момент это то, что у вас должно быть:

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

СОВЕТ:закрепите плату и аккумулятор корпусом так, чтобы при встряхивании куба они были устойчивы.

Код

Вы можете найти код в приложениях . Загрузите его на свою плату с помощью Arduino IDE (не забудьте обновить программное обеспечение для совместимости с Arduino 101).

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

В начале есть библиотеки и все переменные объявление .

В этой части также есть определение BLE сервисов и характеристика . Я использовал Automation IO услуга. Я использовал Цифровой характеристика для освещения и температуры (для этого используется 2 бита, поэтому можно кодировать 4 возможных случая) и Аналог для ТВ (для отправки всех кодов клавиатуры).

Затем настройка . Этот патч выполняется только один раз с начала. Здесь мы инициализируем компоненты как входы или выходы и инициализируем BLE и гироскоп платы 101.

Основная часть - это петля . Он разделен на четыре части:

  • 1 Первая часть скопирована из руководства веб-сайта Arduino:(https://www.arduino.cc/en/Tutorial/Genuino101CurieIMUAccelerometerOrientation) эта часть постоянно выполняется и возвращает ориентацию доски.
  • 2 Во второй части мы активируем лицо только если он находится в верхнем положении более двух секунд . Мы используем миллис функция для подсчета времени. При изменении положения запоминается значение в миллисекундах, и если ориентация остается прежней, через интервал (2 секунды) мы входим в if-зону, где выбранное лицо стало истинным (для 4-й части).
  • 3 Третья часть активируется, только если куб встряхнуть . с определенной интенсивностью и более 2 секунд. последний активированный функция лица закрыта и лицо установлено как false . Если лицо ложное, то в 4-ю часть нельзя попасть.
  • 4 Четвертая часть предназначена только для истинного лица. Здесь находится ядро ​​функций умного куба. В этой части постоянно выполняются только те грани, которые верны в цикле.

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

  if (face2 ==true) {// ТЕМПЕРАТУРА face // НАЧАЛО ИЗМЕНЕНИЯ ЗДЕСЬ digitalWrite (LEDOFF, LOW); // если эта грань истинна, светодиод ВЫКЛЮЧЕННОЙ грани - НИЗКИЙ if (central.connected () ==true) {// если куб подключен к BLE // считываем значение температуры int val =analogRead (pinTemp); // получаем аналоговое значение сопротивления =(float) (1023-val) * 10000 / val; // получаем температуру сопротивления =1 / (log (сопротивление / 10000) /B+1/298.15) -273.15; // вычисляем температуру // условия включения if (temperature> tooHot) {// включаем кондиционер digitalWrite (LEDhot, LOW); // закрываем светодиод нагрева digitalWrite (LEDcold, HIGH); // открытый светодиод кондиционера termoChar.setValue (1); // задаем через BLE условие 1 =холодное включение - горячее выключение} if (temperature  tooCold &&temperature  

Вы должны закодировать «истинную» часть (как в предыдущем коде), а также «ложную» часть при встряхивании куба:

  // Деактивация ТЕМПЕРАТУРЫ if (lastFUNCTION ==2) {// ТЕМПЕРАТУРА face // НАЧАЛО ИЗМЕНЕНИЯ ЗДЕСЬ // если центральное устройство подключено к периферийному устройству:if (central.connected () ==true) {digitalWrite (LEDhot, НИЗКИЙ); // температура закрытия красного светодиода digitalWrite (LEDcold, LOW); // температура закрытия синего светодиода termoChar.setValue (0); // сигнал температуры BLE:0 =холодное отключение - горячее отключение // ЗДЕСЬ КОНЕЦ} Serial.println ("TEMPERATURE false - CLOSE"); face2 =ложь; // ТЕМПЕРАТУРА лицо стало ложным}  

Не забудьте установить для лица значение false когда вы встряхиваете.

Приложение:

Чтобы увидеть выходные данные куба BLE, вы можете скачать это приложение: nRF Connect

https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=it

Когда вы его открываете, просто ищите для устройств и подключиться с "smartcubesketch". Затем вы увидите три вкладки «Автоматизация ввода-вывода», щелкните по ним и нажмите на сборщик непрерывных данных.

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

Как это работает:ВИДЕО

Загрузите код, вставьте аккумулятор, закройте коробку и ...

... теперь у вас есть УМНЫЙ КУБ!

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

Выводы

Этот проект - только первый шаг в умный дом. Моей целью было использовать Arduino 101 возможность создания чего-то нового . Я думаю, что акселерометр и гироскоп дать совету директоров новые возможности с точки зрения мобильности . С помощью BLE помимо портативности, его также легко подключить .

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

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

Я очень рад возможности использовать Arduino 101 и комплект Grove (набор очень простой и быстрый для прототипирования).

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

Может быть, это не революция, но это новый способ взаимодействия с вашим домом .

Надеюсь, вам понравился этот урок.

Теперь ваша очередь :возьмите куб и взломайте его!

Код

  • SMART CUBE - полный код с комментариями
SMART CUBE - полный код с комментариями Arduino
Это код для загрузки на ваш Arduino 101. Вы можете использовать этот код как есть или настроить в соответствии с вашими потребностями. Следуйте комментариям, чтобы понять, как это работает.
 // Библиотеки # include "CurieIMU.h" // Акселерометр и гироскоп # include  // Bluetooth Low Energy # include  #include "rgb_lcd .h "// LCD # include  // Keypadrgb_lcd lcd; // Инициализация ЖК-дисплея // Инициализация Bluetooth:BLEPeripheral blePeripheral; // Периферийное устройство BLE (программируемая плата) // BLE ServicesBLEService lightsService ("1815"); // BLE Automation IO (1815) - высвечивает информациюBLEService termoService ("1815"); // BLE Automation IO - информация о температуреBLEService TVService ("1815"); // BLE Automation IO - телевизионная информация // Характеристика BLEBLEUnsignedCharCharacteristic lightsChar ("2A56", // Характеристика BLE Digital (2A56) - подсветка BLERead | BLENotify); BLEUnsignedCharCharacteristic termoChar ("2A56", // Характеристика BLE Digital - температура BLENotifyead | ); BLEUnsignedCharCharacteristic TVChar ("2A58", // Аналоговая характеристика BLE (2A58) - tv BLERead | BLENotify); // Объявление констант и переменных:// Функции ориентации лица и встряхивания:int lastOrientation =- 1; // предыдущая ориентация (для сравнения) unsigned long previousMillis =0; // последнее обновление без знака long interval =2000; // время ждать в верхнем положении перед активацией лицаunsigned long SHAKEpreviousMillis =0; // последнее обновление без подписи long SHAKEinterval =2000; // время ждать при встряхивании для деактивации лицаboolean keep =false; // используется для подсчета только одного раза изменения ориентации лица int lastFUNCTION =-1; // это используется, чтобы узнать, какова была предыдущая риентация // Инициализация лиц:в начале каждое лицо ложно булево лицо0 =ложь; логическое лицо1 =ложь; логическое лицо2 =ложь; логическое лицо3 =ложь; логическое лицо4 =ложь; логическое лицо5 =false; // СВЕТИЛЬНИКИ faceconst int LEDlights =11; // вывод 11:желтый светодиод // ТЕМПЕРАТУРА faceconst int pinTemp =A0; // вывод A0:датчик температурыconst int LEDhot =12; // вывод 12:красный ledconst int LEDcold =13; // вывод 13:синий светодиод, температура поплавка; // запоминание значения температурыint B =3975; // Величина термисторного поплавкового сопротивления; // запоминание значения сопротивления float tooHot =26.0; // температура, при которой включается кондиционер [SET] float tooCold =23.0; // температура, при которой включается нагреватель [УСТАНОВКА] // ТАЙМЕР faceint BUZZER =3; // вывод 3:buzzerboolean KEEPtime =false; // это используется для подсчета только одного раза изменения ориентации лица (не перезапуска во время подсчета) int TIMERmillis =0; // the following are for the countdown determinationint prevSHOWsecond =0;int CountdownInMillis =0;int SHOWmillis =0; // millis value calculation resultint SHOWminute =0; // minutes value to show in the monitor for the countdownint SHOWseconds =0; // seconds value to show in the monitor for the countdownconst int SETminute =2; // set 2 minute timer [SET]const int SETsecond =30; // set 30 seconds timer [SET]// SOUND faceconst int soundLED =9; // pin 9:green led const int soundSENSOR =A1; // pin A0:sound sensorint brightness =0; // green led brightness initialization// TV faceconst byte ROWS =4; // four rows keypadconst byte COLS =3; // three columns keypadchar keys[ROWS][COLS] ={ {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'}}; // keypad button valuesbyte rowPins[ROWS] ={10,8,7,6}; // pin 10,8,7,6:connect to the row pinouts of the keypadbyte colPins[COLS] ={5,4,2}; // pin 5,4,2:connect to the column pinouts of the keypadKeypad keypad =Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // keypad initialization// OFF faceconst int LEDOFF =A2; // pin A2:red ledvoid setup() { pinMode(LEDlights, OUTPUT); // every led is set as an output pinMode(LEDhot, OUTPUT); pinMode(LEDcold, OUTPUT); pinMode(soundLED,OUTPUT); pinMode(LEDOFF, OUTPUT); Serial.begin (9600); // initialize Serial communication CountdownInMillis =(SETminute*60 + SETsecond)*1000; // this calculates the corrispondent value in millis from the minutes and seconds setting lcd.begin(16, 2); // LCD initialization lcd.setRGB(0, 0, 0); // LCD RGB is OFF at the beginning // initialize device Serial.println("Initializing IMU device..."); CurieIMU.begin (); // Set the accelerometer range to 2G CurieIMU.setAccelerometerRange(2); // Enable Shock Detection CurieIMU.setDetectionThreshold(CURIE_IMU_SHOCK, 7000); // 7.0g =7000 mg (this value set the intensity of the shock) CurieIMU.setDetectionDuration(CURIE_IMU_SHOCK, 2000); // 2000ms (this value set the duration of the shock) CurieIMU.interrupts(CURIE_IMU_SHOCK); // BLE setup initialization blePeripheral.setLocalName("SmartCubeSketch"); // the name of the project blePeripheral.setAdvertisedServiceUuid(lightsService.uuid()); // add the lights service UUID blePeripheral.addAttribute(lightsService); // add the BLE lights service blePeripheral.addAttribute(lightsChar); // add the BLE lights characteristic lightsChar.setValue(3); // initial value for this characteristic =3 //BLE lights value meaning:0 =lights off, 1 =lights on, 3 =initial state, 4 =not used blePeripheral.setAdvertisedServiceUuid(termoService.uuid()); // add the temperature service UUID blePeripheral.addAttribute(termoService); // add the BLE temperature service blePeripheral.addAttribute(termoChar); // add the BLE temperature characteristic termoChar.setValue(0); // initial value is 0:cold off - hot off //BLE termo value meaning:0 =cold off - hot off, 1 =cold on - hot off, 2 =cold off - hot on, 3 =not used blePeripheral.setAdvertisedServiceUuid(TVService.uuid()); // add the tv service UUID blePeripheral.addAttribute(TVService); // add the BLE tv service blePeripheral.addAttribute(TVChar); // add the tv characteristic TVChar.setValue('x'); // initial value for this characteristic (x means nothing) //BLE TV value meaning:#number corrispond to the pressed button, C:close TV, O:open TV, x:initial state blePeripheral.begin(); Serial.println("Bluetooth device active, waiting for connections..."); } // setup endvoid loop() { BLECentral central =blePeripheral.central(); // BLE connection unsigned long currentMillis =millis(); // current value of time in milliseconds // the following code comes from www.arduino.cc/en/Tutorial/Genuino101CurieIMUccelerometerOrientation // it is used to detect the orientation of the board int orientation =- 1; // the board's orientation String orientationString; // string for printing description of orientation // read accelerometer:int x =CurieIMU.readAccelerometer(X_AXIS); int y =CurieIMU.readAccelerometer(Y_AXIS); int z =CurieIMU.readAccelerometer(Z_AXIS); // calculate the absolute values, to determine the largest int absX =abs(x); int absY =abs(y); int absZ =abs(z); if ( (absZ> absX) &&(absZ> absY)) { // base orientation on Z if (z> 0) { orientationString ="up"; orientation =0; } else { orientationString ="down"; orientation =1; } } else if ( (absY> absX) &&(absY> absZ)) { // base orientation on Y if (y> 0) { orientationString ="digital pins up"; orientation =2; } else { orientationString ="analog pins up"; orientation =3; } } else { // base orientation on X if (x <0) { orientationString ="connector up"; orientation =4; } else { orientationString ="connector down"; orientation =5; } } // end of the tutorial code. // at this point you have the orientation value of the board constantly updated:/* The orientations of the board:0:flat, processor facing up (TIMER) 1:flat, processor facing down (TV) 2:landscape, analog pins down (TEMPERATURE) 3:landscape, analog pins up (OFF) 4:portrait, USB connector up (LIGHTS) 5:portrait, USB connector down (SOUND) */ // for this project you need to know if the face has changed from the previous face function [lastFUNCTION !=orientation] // but this information is printed only if the face is in the UP position for more than [interval] time // and only for one time [keep] (you don't nedd to constantly activate the face, you just need it one time) // because the orientation value is constantly updated you need to start counting time when the orientation change [orientation !=lastOrientation] if (orientation !=lastOrientation) { // if the orientation has changed, start to count time lastOrientation =orientation; // memorize the current orientation of the face previousMillis =currentMillis; // memorize the time when the face has changed keep =false; } else if (currentMillis - previousMillis> interval &&keep ==false &&lastFUNCTION !=orientation) { //this condition print the orientation only if the face is up for an interval //and only for one time (keep) //and only if the face is different from the previous loop Serial.println(orientationString); // print the orientation // the current face [orientation] is set as true (that means that the face function is set as activated) if (orientation ==1) { // TV face face1 =true; // TV face becomes true lastFUNCTION =orientation; // memorize this activation in [lastFUNCTION] Serial.println("TV true"); // print the activated face TVChar.setValue('O'); // O:open the tv signal (BLE):tv is open only one time } if (orientation ==4) { // LIGHTS face face4 =true; lastFUNCTION =orientation; Serial.println("LIGHTS true"); } if (orientation ==3) { // OFF face face3 =true; lastFUNCTION =orientation; Serial.println("OFF true"); } if (orientation ==5) { // SOUND face face5 =true; lastFUNCTION =orientation; Serial.println("SOUND true"); } if (orientation ==2) { // TEMPERATURE face face2 =true; lastFUNCTION =orientation; Serial.println("TEMPERATURE true"); } if (orientation ==0) { // TIMER face face0 =true; lastFUNCTION =orientation; Serial.println("TIMER true"); if (KEEPtime ==false) { // timer is activated only if it is the 1st cycle or has been stopped TIMERmillis =currentMillis; // start counting time } } keep =true; // [keep] change value so that, in the next loop, you can't enter in this condition if the face don't change (avoid to activate another time the same face) } // this condition is for the shake function:if you shake for more than [SHAKEinterval] time, the face is deactivated if (CurieIMU.getInterruptStatus(CURIE_IMU_SHOCK) &¤tMillis - SHAKEpreviousMillis> SHAKEinterval) { Serial.println("SHAKE"); // print "SHAKE" if shake is detected // the last activated face [lastFUNCTION] is set as false (that means that the face function is deactivated) //TV deactivation if (lastFUNCTION ==1) { // TV face TVChar.setValue('C'); // C:close the tv BLE signal Serial.println("TV false - CLOSE"); // print the closed face face1 =false; // TV face becomes false } //LIGHTS deactivation if (lastFUNCTION ==4) { // LIGHTS face if (central.connected() ==true) { // if a central is connected to peripheral:lightsChar.setValue(0); // lights OFF BLE signal digitalWrite (LEDlights, HIGH); // open the yellow led to see the cube in the dark } Serial.println("LIGHTS false - CLOSE"); face4 =false; // LIGHTS face become false } // OFF if (lastFUNCTION ==3) { // OFF face // OFF face shaked:everything is closed and red led OFF is open digitalWrite (LEDOFF, HIGH); // red led OFF is on when cube is closed // now close all the activated functions:// CLOSE TV TVChar.setValue('C'); // C:close the tv BLE signal Serial.println("TV false - CLOSE"); face1 =false; // CLOSE LIGHTS Serial.println("LIGHTS false - CLOSE"); if (central.connected() ==true) { lightsChar.setValue(0); digitalWrite (LEDlights, LOW); // lights led is closed if OFF face is shaked } face4 =false; // CLOSE SOUND analogWrite(soundLED, LOW); // close the sound led Serial.println("SOUND false - CLOSE"); face5 =false; //CLOSE TEMPERATURE if (central.connected() ==true) { digitalWrite(LEDhot, LOW); digitalWrite(LEDcold, LOW); termoChar.setValue(0); // temperature BLE signal:0 =cold off - hot off } Serial.println("TEMPERATURE false - CLOSE"); face2 =false; // CLOSE TIMER Serial.println("TIMER false - CLOSE"); lcd.setRGB(0, 0, 0); // the LCD RGB is closed lcd.clear(); KEEPtime =false; face0 =false; // The cube is inactive, only OFF led is active Serial.println("OFF false - CLOSE"); face3 =false; // OFF face becomes false } // SOUND deactivation if (lastFUNCTION ==5) { // SOUND face analogWrite(soundLED, LOW); // close the sound led Serial.println("SOUND false - CLOSE"); face5 =false; // SOUND face becomes false } // TEMPERATURE deactivation if (lastFUNCTION ==2) { // TEMPERATURE face // if a central is connected to peripheral:if (central.connected() ==true) { digitalWrite(LEDhot, LOW); // close temperature red led digitalWrite(LEDcold, LOW); // close temperature blue led termoChar.setValue(0); // temperature BLE signal:0 =cold off - hot off } Serial.println("TEMPERATURE false - CLOSE"); face2 =false; // TEMPERATURE face became false } // TIMER deactivation if (lastFUNCTION ==0) { // TIMER face Serial.println("TIMER false - CLOSE"); face0 =false; // TIMER face became false // if you shake the cube when the time is running, the LCD became red and show the remaining time to countdown lcd.setRGB(180, 40, 0); // the RGB backlight become red lcd.clear(); // lcd is cleared lcd.setCursor(0, 0); lcd.print("STOP AT "); lcd.setCursor(8, 0); lcd.print(SHOWminute); // indicates the minutes when you shake the cube lcd.setCursor(9, 0); lcd.print (":"); lcd.setCursor(10, 0); lcd.print(SHOWseconds); // indicates the seconds when you shake the cube tone(BUZZER,1000,1000); // it make a short sound delay(2000); lcd.clear (); // clear the LCD lcd.setRGB(0, 0, 0); // LCD RGB backlight is closed KEEPtime =false; // TIMER face became false } SHAKEpreviousMillis =currentMillis; // memorize the value for the [SHAKEinterval] calculation } // the following instructions are executed in loop only if the face is activated if (face1 ==true) { // TV face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW if (central.connected() ==true) { // if the cube is BLE connected char key =keypad.getKey(); // read the value from the keypad if (key &&orientation ==1){ // if something is pressed and only when the tv face is up (avoid involuntary keypad pression) if (key =='0') { // if the pressed key is 0 TVChar.setValue(key); // send the [key] value via BLE Serial.println(key); // print the pressed button (comment if you don't want to show this information) } if (key =='1'){ TVChar.setValue(key); Serial.println(key); } if (key =='2'){ TVChar.setValue(key); Serial.println(key); } if (key =='3'){ TVChar.setValue(key); Serial.println(key); } if (key =='4'){ TVChar.setValue(key); Serial.println(key); } if (key =='5'){ TVChar.setValue(key); Serial.println(key); } if (key =='6'){ TVChar.setValue(key); Serial.println(key); } if (key =='7'){ TVChar.setValue(key); Serial.println(key); } if (key =='8'){ TVChar.setValue(key); Serial.println(key); } if (key =='9'){ TVChar.setValue(key); Serial.println(key); } if (key =='*'){ TVChar.setValue(key); Serial.println(key); } if (key =='#'){ TVChar.setValue(key); Serial.println(key); } } } } if (face4 ==true) { // LIGHTS face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW if (central.connected() ==true) { // if a central is connected to peripheral:lightsChar.setValue(1); // LIGHTS activated BLE signal digitalWrite (LEDlights, LOW); // yellow led is closed because the home lights are on } } if (face3 ==true) { // OFF face // when OFF face is up nothing is done digitalWrite (LEDOFF, LOW); // led OFF is activated only when the cube is shaked, so now is LOW } if (face5 ==true) { // SOUND face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW // sound sensor is activated, led brightness regulated by the sond // this code comes from brightness regulation example long sum =0; for (int i=0; i<32; i++) { sum +=analogRead(soundSENSOR); } sum>>=5; brightness =(sum*255)/1024; // calculate the brightness value analogWrite(soundLED,brightness); // green led brightness intensity is regulated by the noise delay(50); //end brightness example } if (face2 ==true) { // TEMPERATURE face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW if (central.connected() ==true) { // if the cube is BLE connected // read temperature value int val =analogRead(pinTemp); // get analog value resistance=(float)(1023-val)*10000/val; // get resistance temperature=1/(log(resistance/10000)/B+1/298.15)-273.15; // calculate temperature //conditions of activation if (temperature> tooHot) { // activate air conditioning digitalWrite(LEDhot, LOW); // close heating led digitalWrite(LEDcold, HIGH); // open air conditioner led termoChar.setValue(1); // set via BLE the condition 1 =cold on - hot off } if (temperature  tooCold &&temperature  

Изготовленные на заказ детали и корпуса

This is the file (.dxf) that you can upload on your laser cutter. I used a medium density fiberboard (MDF) of 3mm. Cut the black lines and engrave red lines. Important:if your material thickness is different you have to modify this sketch. smart_cube_8sVCflFmhM.dxfThe same file of the box but in a different format:.pdf

Схема

This is a .jpeg of the Fritzing scheme (yellow wires are connected to Grove components) This is a scheme of the connections in the Grove Shield _cI0IwUsPVZ.Base%20shield%20connections

Производственный процесс

  1. Почему солнечные панели - это разумное вложение в ваш дом
  2. Делайте большие успехи или идите домой с новым дизайном продукта
  3. Приложения домашней автоматизации
  4. Создание сети беспроводных датчиков в вашем доме
  5. Следите за температурой в доме с помощью Raspberry Pi
  6. Пробел в навыках умного дома
  7. Станьте умнее:будущее вашего дома
  8. Интеллектуальная безопасность:как защитить устройства умного дома от хакеров
  9. Способы повышения безопасности вашего умного дома
  10. Smart Plant IoT