SUNFOUNDER: быстрый старт для создания умного дома
Добавил(а) microsin
Не секрет, что современные системы типа "Умный дом" обычно очень сложные, либо очень дорогие, либо и то и другое одновременно. Приходится читать кучу скучной документации, что-то там программировать, настраивать... Но как быть, если лишних денег нет, программировать тоже как-то не сложилось (но руки растут из правильного места), но хочется иметь дома сигнализацию + что-то еще (например, управление отопительным котлом и контроль его состояния, контроль температуры в теплице, полив автоматический и по команде издалека)? Тут Вам на помощь может прийти дешевый и сердитый наборчик SUNFOUNDER [1].
У SUNFOUNDER есть несколько разновидностей китов и наборов для создания умного дома. Мне попался набор на основе Arduino Mega 2560 за $80, купленный на ebay.com [2]. Несмотря на наличие в названии Raspberry Pi, никакого Raspberry Pi в моем наборе не было, просто этот набор бывает в 2 модификациях - один подешевле на основе Arduino Mega 2560 (как у меня), другой подороже на основе Raspberry Pi.
На картинке показано, что входит в набор на основе Arduino Mega 2560.
1. Плата с 4 реле. Можно программно управлять освещением, включать и выключать любые электрические приборы. 2. Фото-резистивный сенсор. Может определять уровень освещенности (например, насколько хорошо освещена теплица). 3. Датчик газа и задымления MQ-2. Обладает высокой чувствительностью к наличию в воздухе природного газа, углеводородов на основе пропана, бутана, и к различному задымлению. 4. Датчик атмосферного давления BMP180. 5a, 5b. 5 светодиодов и 5 токоограничительных резисторов для их подключения. 6. Датчик влажности и температуры HDT11. 7. Основная управляющая плата Arduino Mega 2560 [7]. 8. Ethernet-шилд на основе чипа W5100, совмещенный со слотом карт microSD. 9. Ключ-брелок на основе метки RFID. 10. Считыватель меток RFID RC522. 11. Дополнительная платка Arduino Nano. 12. Пироэлектрический датчик присутствия (PIR). 13. 2 модуля для беспроводной связи NRF24L01. Это никакой не Wi-Fi, модули работают по стандарту промышленной связи ISM 2.4..2.5 ГГц. 14. Плата для макетирования (так называемая Solderless BreadBoard). 15. Набор соединительных кабелей. 16. Компакт-диск с примерами кода, видеороликами (чтобы показать - да, это работает!) и средой радиотехнического конструирования Fritzing.
Удивительно, как такое богатство уложилось в цену $79.99. Китайцы, что и говорить, все у них не как у людей. У нас в России только платка с реле стоила бы столько же, если не дороже. Конечно, чтобы попробовать собрать систему для умного дома и поэкспериментировать с примерами кода, совсем необязательно покупать набор именно у SUNFOUNDER, все нужные комплектующие можно купить по отдельности на ebay.com, aliexpress.com или dex.com. Однако по стоимости Вы много не выиграете, разве что можете не покупать то, что Вам не нужно. Лично мне в наборе интересно все, разве что не нужна плата BreadBoard (она у меня уже есть), все остальное пригодится.
Набор от SUNFOUNDER предназначен для того, чтобы Вы попробовали простейшие примеры, обрадовались тому, как все просто и понятно, и уже на этой основе соорудили что-то своё (удаленное управление газовым котлом, контроллер теплицы, домашнюю сигнализацию и т. д.).
Основная идея набора: можно собрать некую автономную систему, которая будет находиться дома (на даче или еще где-то). Она может работать как автономно, по какому-то своему алгоритму, но также (что более интересно) может быть подключена к Интернет. В этом случае Вы можете с любого места, где есть доступ к Интернету (с рабочего компьютера, с мобильного телефона, из гостиницы на отдыхе и т. д.) получить информацию о состоянии системы (температура, влажность, освещение, состояние каких-то датчиков) и даже поуправлять ей (включить/выключить освещение, обогрев, полив растений и т. п.). Пример такой системы в общем виде показан на картинке.
Основное ядро этой системы - плата Arduino Mega 2560 с установленным Ethernet-шилдом на чипе WS5100, обеспечивающим связь с Интернет. Для упрощения создания удаленного управления SUNFOUNDER предлагает воспользоваться сервисом devicebit.com. Т. е. для того, чтобы у Вас была какая-то минимальная система, доступная для управления через Интернет, Вам нужна Arduino Mega 2560 с воткнутым в неё Ethernet-шилдом. В плату Arduino Mega 2560 нужно записать скетч Arduino, который сам будет связываться с сервером DeviceBit под Вашим аккаунтом. На плату Arduino Mega 2560 можно уже сверху навесить всякие датчики, релюшки, светодиодики, и замутить таким образом немеряно крутую систему. Также, если Вам этого хочется, можно с помощью модулей беспроводной связи подключить платку Arduino Nano, которая будет служить выносным модулем управления (она тоже может управлять реле, собирать информацию с датчиков и т. п.).
[Готовые примеры проектов]
Чтобы быстро воткнуться, как это работает, нужно просмотреть видеоролики, записанные на компакт диске, и потом попробовать поиграться с примерами скетчей Arduino, которые записаны на этом же компакт диске:
Это самый простой скетч. Аналоговый уровень напряжения считывается с выхода фотоэлемента (с помощью АЦП микроконтроллера), и выводится в Serial-консоль. Плата фотодатчика подключается к плате Arduino Mega 2560 с помощью 3 проводков (GND, сигнал и + питания).
Этот пример кода будет замечательно работать как с платой Arduino Mega 2560, так и с платой Arduino Nano (надо только перед компиляцией правильно выставить тип платы в системе разработки).
Принцип работы фотодатчика простой. По сути это резистор, у которого сопротивление зависит от направленного на него потока света. Если поверхность фоторезистора затемнена, то его сопротивление большое (тысячи килоом), но если на фоторезистор попал свет, то его сопротивление уменьшается. Чем ярче свет, тем сопротивление меньше. Изменение сопротивления преобразуется в плате фотодатчика в изменение уровня напряжения с помощью делителя напряжения, после чего это напряжение может быть прочитано узлом АЦП микроконтроллера.
// George Hadjikyriacou - оригинальная версия (??)
// Модифицировано SimKard - Version 0.2 (24/11/2010)
// Модифицировано Rob Tillaart - Version 0.3 (28/03/2011)
// + добавлены комментарии
// + удален весь код, не относящийся к DHT11
// + добавлены ссылки
// Модифицировано Rob Tillaart - Version 0.4 (17/03/2012)
// + добавлена поддержка 1.0
// Модифицировано Rob Tillaart - Version 0.4.1 (19/05/2012)
// + добавлены коды ошибок
#include "dht11.h"
// Возвращаемые значения:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int DHT11::read(int pin)
{
// Буфер для приема:uint8_t bits[5];
uint8_t cnt =7;
uint8_t idx =0;
// Очистка буфера:for (int i=0; i<5; i++) bits[i] =0;
// Запрос выборки:
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(18);
digitalWrite(pin, HIGH);
delayMicroseconds(40);
pinMode(pin, INPUT);
// Подтверждение (ACKNOWLEDGE) или таймаут (TIMEOUT)unsignedint loopCnt =10000;
while(digitalRead(pin) == LOW)
if (loopCnt--==0) return DHTLIB_ERROR_TIMEOUT;
loopCnt =10000;
while(digitalRead(pin) == HIGH)
if (loopCnt--==0) return DHTLIB_ERROR_TIMEOUT;
// Чтение выходных данных - 40 бит => 5 байт, иначе таймаутfor (int i=0; i<40; i++)
{
loopCnt =10000;
while(digitalRead(pin) == LOW)
if (loopCnt--==0) return DHTLIB_ERROR_TIMEOUT;
unsignedlong t = micros();
loopCnt =10000;
while(digitalRead(pin) == HIGH)
if (loopCnt--==0) return DHTLIB_ERROR_TIMEOUT;
if ((micros() - t) >40) bits[idx] |= (1<< cnt);
if (cnt ==0) // следующий байт?
{
cnt =7; // перезапуск со старшего бита (MSB)
idx++; // перейти к следующему биту
}
else cnt--;
}
// Записи в переменные bits[1] и bits[3] всегда будут// нулями - они пропущены в формулах.
humidity = bits[0];
temperature = bits[2];
uint8_t sum = bits[0] + bits[2];
if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;
return DHTLIB_OK;
}
Схема подключения датчика DHT11 также очень простая - GND, питание, сигнал данных.
Пример кода будет работать как с платой Arduino Mega 2560, так и с платой Arduino Nano (надо только перед компиляцией правильно выставить тип платы в системе разработки, и поменять в скетче номер цифрового порта).
Пример кода будет работать как с платой Arduino Mega 2560, так и с платой Arduino Nano (надо только перед компиляцией правильно выставить тип платы в системе разработки).
Это также очень простой пример кода, который может работать как Arduino MEGA 2560, так и с Arduino Nano (не забудьте только поменять номера портов и правильно выставить тип платы в среде разработки).
Также для этого примера на компакт-диске есть проект Fritzing.
Принцип работы простейший: датчик присутствия PIR имеет цифровой выход, который изменяет свое состояние при наличии в комнате изменений уровня инфракрасного излучения (от тела человека или животного). Об изменении уровня на выходе датчика сигнализирует светодиод. Микроконтроллер считывает состояние с выхода датчика точно так же, как он мог бы опрашивать состояние кнопки или перемычки. Собственно для такого алгоритма работы плата Arduino тут даже не нужна - светодиод можно подключить прямо к выходу датчика PIR. Но зато на микроконтроллере можно обрабатывать информацию с датчика PIR вместе с информацией от других датчиков, и на основе этой информации предпринимать какие-то действия (например, может быть организована сигнализация с оповещением о незаконном проникновении в помещение).
voidsetup(void)
{
Serial.begin(9600);
Serial.println("Pressure Sensor Test"); Serial.println("");
/* Initialise the sensor */if(!bmp.begin())
{
/* Обнаружена проблема с детектированием наличия BMP085. Если
это произошло, проверьте соединения с датчиком. */
Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");
while(1);
}
/* Отображение информации, полученной от датчика. */
displaySensorDetails();
}
voidloop(void)
{
/* Получение нового события сенсора */sensors_event_t event;
bmp.getEvent(&event);
/* Отобразить результаты (барометрическое давление измеряется в hPa) */if (event.pressure)
{
Serial.print("Pressure: ");
Serial.print(event.pressure);
Serial.println(" hPa");
/* Вычисление высоты над уровнем моря с подходящей точностью требует *
* наличия величины атмосферного давления Вашего местоположения в *
* момент получения данных датчиком, а также температуры окружающего *
* воздуха в градусах Цельсия. Если у Вас нет этой информации, то *
* можно использовать 'стандартное' значение давления 1013.25 hPa *
* (определено макросом SENSORS_PRESSURE_SEALEVELHPA в файле *
* sensors.h), однако это не идеальный вариант, так что результаты *
* измерений будут не точными. *
* *
* Вы можете обычно узнать текущее значение SLP (Sea Level Pressure) *
* на сайтах погоды или от центров информационных прогнозов недалеко *
* от аэропорта. *
* *
* Например, для Парижа можно проверить текущее давление и уровень *
* над поверхностью мирового океана по ссылке http://bit.ly/16Au8ol *//* Сначала мы получим температуру от датчика BMP085 */float temperature;
bmp.getTemperature(&temperature);
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
/* Затем получим атмосферное давление, и по SLP и температуре получим
высоту над уровнем моря. *//* Исправьте следующую строку, чтобы указать в ней корректное значение
SLP: тогда результаты будут точнее. */float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;
Serial.print("Altitude: ");
Serial.print(bmp.pressureToAltitude(seaLevelPressure,
event.pressure,
temperature));
Serial.println(" m");
Serial.println("");
}
else
{
Serial.println("Sensor error");
}
delay(1000);
}
В тексте скетча постоянно упоминается датчик BMP085, но код работоспособен и для датчика BMP180. Чтобы не загромождать статью, код библиотек Adafruit_BMP085_U и Adafruit_Sensor здесь не приведен.
Код может работать не только на Arduino MEGA 2560, но и на Arduino Nano. Для чтения цифровых данных с датчика используется интерфейс I2C (TWI), при этом используется класс Wire от Arduino.
voidloop()
{
uchar status;
uchar str[MAX_LEN];
status = rfid.request(PICC_REQIDL, str);
if (status != MI_OK)
{
return;
}
rfid.showCardType(str);
status = rfid.anticoll(str);
if (status == MI_OK)
{
Serial.print("The card's number is: ");
memcpy(serNum, str, 5);
rfid.showCardID(serNum);
Serial.println();
Serial.println();
}
delay(500);
rfid.halt(); //команда карте перейти в режим сна (sleep mode)
}
Второй пример rfidTest.ino не намного сложнее, он просто проверяет считанные с RFID-ключа идентификаторы, и на основе прочитанных значений предпринимает какие-то разные действия. Все тупо и просто. Используется библиотеки rfid и softspi, код которых опять не привожу для краткости (все библиотеки и коды примеров присутствуют на компакт-диске SUNFOUNDER).
Этот проект выглядит на первый взгляд феерически сложным. Какие-то платы, кнопочки, модули, провода... Однако на самом деле ничего сложного тут нет, просто демонстрируется обмен данными по радио между двумя платами Arduino с помощью модулей NRF24L01 диапазона ISM 2.4 МГц. Одна плата является передатчиком команд по радио (Arduino MEGA 2560, скетч nrfTest_send.ino), другая приемником - она команды обрабатывает и выполняет (Arduino Nano, скетч nrfTest_receive.ino). Совершенно не принципиально, какую плату использовать в качестве передатчика или приемника - код одинаково хорошо будет работать на любой плате Arduino.
staticvoidsend (void)
{
// чтение регистра статусаunsignedchar status = SPI_Read(STATUS);
// если прерывание готовности данных передачи transmit data send (TX_DS)if(status&TX_DS)
{
SPI_RW_Reg(FLUSH_TX,0);
// записать полезную нагрузку (данные) в TX_FIFO
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
}
// если прерывание готовности приема данных receive data ready (MAX_RT),// то повторная передача SETUP_RETRif(status&MAX_RT)
{
SPI_RW_Reg(FLUSH_TX,0);
// запрет режима standy
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
}
// очистка флагов прерывания RX_DR, TX_DS или MAX_RT
SPI_RW_Reg(WRITE_REG+STATUS,status);
}
digitalWrite(CSN, 0); // CSN==0, начало транзакции SPI
status = SPI_RW(reg); // выбор регистра
SPI_RW(value); // .. и запись в него значения ..
digitalWrite(CSN, 1); // затем перевод CSN обратно в лог. 1return(status); // возврат байта состояния nRF24L01
}
digitalWrite(CSN, 0); // CSN==0, инициализация обмена SPI
SPI_RW(reg); // выбор регистра для чтения ..
reg_val = SPI_RW(0); // .. и затем чтение его значения
digitalWrite(CSN, 1); // CSN==1, прервать обмен по SPIreturn(reg_val); // возврат значения регистра
}
unsignedcharSPI_Read_Buf(unsignedchar reg, unsignedchar*pBuf, unsignedchar bytes)
{
unsignedchar status,i;
digitalWrite(CSN, 0); // CSN==0, инициализация обмена SPI
status = SPI_RW(reg); // выбор регистра для записи и чтение байта из регистра статусаfor(i=0; i < bytes; i++)
{
pBuf[i] = SPI_RW(0); // выполнить SPI_RW для чтения байтов из nRF24L01
}
digitalWrite(CSN, 1); // вернуть CSN в состояние лог. 1return(status); // возврат байта состояния nRF24L01
}
digitalWrite(CSN, 0); // CSN==0, инициализация обмена SPI
status = SPI_RW(reg); // выбор регистра для записи и чтение байта из регистра статусаfor(i=0; i < bytes; i++) // в цикле записать все значения байт из буфера (*pBuf)
{
SPI_RW(*pBuf++);
}
digitalWrite(CSN, 1); // вернуть CSN в состояние лог. 1return(status); // возврат байта состояния nRF24L01
}
// Функция: init_io();
// Описание: однократно мигает светодиодом, разрешает
// чип (для готовности режима TX или RX), запрещает
// SPI, на выходе тактовый сигнал SPI в уровне лог. 1.
unsignedcharSPI_RW_Reg(unsignedchar reg, unsignedchar value)
{
unsignedchar status;
digitalWrite(CSN, 0); // CSN==0, начало транзакции SPI
status = SPI_RW(reg); // выбор регистра
SPI_RW(value); // .. и запись в него значения ..
digitalWrite(CSN, 1); // затем перевод CSN обратно в лог. 1return(status); // возврат байта состояния nRF24L01
}
unsignedcharSPI_Read(unsignedchar reg)
{
unsignedchar reg_val;
digitalWrite(CSN, 0); // CSN==0, инициализация обмена SPI
SPI_RW(reg); // выбор регистра для чтения ..
reg_val = SPI_RW(0); // .. и затем чтение его значения
digitalWrite(CSN, 1); // CSN==1, прервать обмен по SPIreturn(reg_val); // возврат значения регистра
}
digitalWrite(CSN, 0); // CSN==0, инициализация обмена SPI
status = SPI_RW(reg); // выбор регистра для записи и чтение байта из регистра статусаfor(i=0; i < bytes; i++)
{
pBuf[i] = SPI_RW(0); // выполнить SPI_RW для чтения байтов из nRF24L01
}
digitalWrite(CSN, 1); // вернуть CSN в состояние лог. 1return(status); // возврат байта состояния nRF24L01
}
digitalWrite(CSN, 0); // CSN==0, инициализация обмена SPI
status = SPI_RW(reg); // выбор регистра для записи и чтение байта из регистра статусаfor(i=0; i < bytes; i++) // в цикле записать все значения байт из буфера (*pBuf)
{
SPI_RW(*pBuf++);
}
digitalWrite(CSN, 1); // вернуть CSN в состояние лог. 1return(status); // возврат байта состояния nRF24L01
}
voidRX_Mode(void)
{
digitalWrite(CE, 0);
// Для устройств RX и TX используется один и тот же адрес
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // разрешить Auto.Ack:Pipe0
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // разрешить Pipe0
SPI_RW_Reg(WRITE_REG + RF_CH, 40); // выбрать RF-канал 40
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // выбрать длину полезной нагрузки RX// такую же, как и для TX
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // установить бит PWR_UP, разрешить CRC & Prim:RX,// разрешены прерывания РRX_DR.
digitalWrite(CE, 1); // CE==1, чтобы разрешить работу устройства RX// Теперь это устройство готово к приему одного пакета из 16 байт полезной нагрузки// от устройства TX, которое делает отправку на адрес '3443101001' с автоподтверждением,// счетчиком повторных передач 10, на RF-канале 40 и на скорости данных = 2 Mbps.
}
Как Вы наверное заметили, код передающей и приемной стороны похож в том плане, что используются те же самые низкоуровневые подпрограммы для работы с регистрами и оборудованием радиомодулей NRF24L01.
Суть работы проекта в том, что когда Вы нажимаете на передающем модуле кнопки, то на дальний приемный модуль по радио передаются команды, которые заставляют включаться и выключаться реле.
Этот пример проекта самый сложный, потому что на него понавешано множество датчиков, и плата Arduino MEGA 2560 общается не только со всеми этими датчиками и с дочерней платой по радио, но еще и через Интернет обменивается данными с сервисом DeviceBit. Однако если Вы успешно справились с предыдущими примерами, и ознакомились с руководством, то и с этим проектом не будет никаких проблем.
staticvoidsend (void)
{
// чтение регистра статусаunsignedchar status = SPI_Read(STATUS);
// если прерывание готовности данных передачи tratsmit data send (TX_DS)if(status&TX_DS)
{
SPI_RW_Reg(FLUSH_TX,0);
// записать полезную нагрузку (данные) в TX_FIFO
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
}
// если прерывание готовности приема данных receive data ready (MAX_RT),// то повторная передача SETUP_RETRif(status&MAX_RT)
{
// запрет режима standy
SPI_RW_Reg(FLUSH_TX,0);
// запись полезной нагрузки в TX_FIFO
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
}
// очистка флагов прерывания RX_DR, TX_DS или MAX_RT
SPI_RW_Reg(WRITE_REG+STATUS,status);
}
unsignedcharSPI_RW_Reg(unsignedchar reg, unsignedchar value)
{
unsignedchar status;
digitalWrite(CSN, 0); // CSN==0, начало транзакции SPI
status = SPI_RW(reg); // выбор регистра
SPI_RW(value); // .. и запись в него значения ..
digitalWrite(CSN, 1); // затем перевод CSN обратно в лог. 1return(status); // возврат байта состояния nRF24L01
}
unsignedcharSPI_Read(unsignedchar reg)
{
unsignedchar reg_val;
digitalWrite(CSN, 0); // CSN==0, инициализация обмена SPI
SPI_RW(reg); // выбор регистра для чтения ..
reg_val = SPI_RW(0); // .. и затем чтение его значения
digitalWrite(CSN, 1); // CSN==1, прервать обмен по SPIreturn(reg_val); // возврат значения регистра
}
unsignedcharSPI_Read_Buf(unsignedchar reg, unsignedchar*pBuf, unsignedchar bytes)
{
unsignedchar status,i;
digitalWrite(CSN, 0); // CSN==0, инициализация обмена SPI
status = SPI_RW(reg); // выбор регистра для записи и чтение байта из регистра статусаfor(i=0; i < bytes; i++)
{
pBuf[i] = SPI_RW(0); // выполнить SPI_RW для чтения байтов из nRF24L01
}
digitalWrite(CSN, 1); // вернуть CSN в состояние лог. 1return(status); // возврат байта состояния nRF24L01
}
unsignedcharSPI_Write_Buf(unsignedchar reg, unsignedchar*pBuf, unsignedchar bytes)
{
unsignedchar status,i;
digitalWrite(CSN, 0); // CSN==0, инициализация обмена SPI
status = SPI_RW(reg); // выбор регистра для записи и чтение байта из регистра статусаfor(i=0; i < bytes; i++) // в цикле записать все значения байт из буфера (*pBuf)
{
SPI_RW(*pBuf++);
}
digitalWrite(CSN, 1); // вернуть CSN в состояние лог. 1return(status); // возврат байта состояния nRF24L01
}
voidsetup()
{
Serial.begin(9600);
pinMode(relayPin, OUTPUT);
starttime = millis();
// Вам доступно 2 способа инициализации сетевого интерфейса// 1. Самый простой:
client =new DeviceBitTcpClient(DB_USERKEY, DB_GATEWAY);
// 2. Полная настройка сетевого интерфейса://client = new DeviceBitTcpClient(DB_USERKEY, DB_GATEWAY,mac,ip,mydns,gw,subnet);// switchTest является функцией, которую Вы напишете и вставите ниже, чтобы// работать с программным "relay", имя контроллера которого Вы установили // на сайте http://www.devicebit.com/ в меню "control command manager".// Мы тестировали передачу с сайта в плату Arduino.
UserSwitch us1 (switchTest,"relay",0);
client->addUserSwitch(us1);
//client->easySetupMode(true);
}
Дополнительным приложением к примерам служит руководство SmartHome kit For Arduino.pdf, где подробно, с картинками и пояснениями разобраны все эти примеры, даны схемы коммутации - как и что с чем соединять. Все довольно просто и ясно написано, на хорошем английском языке.
Чтобы позапускать проекты, Вы можете воспользоваться либо системой разработки Fritzing [3] (она есть на компакт-диске с примерами, но лучше всего скачать свежую версию с сайта авторов Fritzing), либо системой разработки Arduino IDE [4] (её на компакт-диске нет, но можно свободно скачать с сайта arduino.cc). Если Вы достаточно опытны, то вместо Arduino-совместимых сред программирования можете использовать AVR Studio, IAR, Keil, CodeVision AVR или что-нибудь еще - выбор систем программирования для AVR большой.
[devicebit.com]
Платформа DeviceBit [5] является системой реального времени, которая является посредником между так называемым новомодным "Интернетом вещей" (Internet of Things, IOT) и людьми, которые хотят своими вещами удаленно управлять (под "вещами" подразумевается интеллектуальные домашние системы наподобие холодильников, сигнализаций, теплиц, газовых котлов и т. п.). Посредничество осуществляется через специальное API. Сервера DeviceBit дают быстрый и простой метод добавлять устройства (Devices) и приложения (Applications), к платформе DeviceBit. При этом предоставляется хранилище статистики, работающее в реальном времени, и возможность удаленного управления объектами. Платформа DeviceBit является не просто простым методом для экспериментирования с новыми датчиками, которые могут передавать данные через Интернет; это также сервис, который помогает компаниям вывести свои продукты на рынок.
Платформа DeviceBit предоставляет инструменты как для базового анализа данных для быстрой оценки данных, так и предупреждения об авариях и предупреждения, которые приходят от сенсоров в реальном времени и сообщают об различных "ненормальных" ситуациях.
Вы можете реализовать свои собственные идеи и разработать свои собственные устройства, которые полагаются на возможности платформы DeviceBit. Вы можете сфокусироваться на аппаратуре вместо того, чтобы разрабатывать программную инфраструктуру.
Также платформа DeviceBit обменивается данными с существующими социальные сетями, такими как Twitter и Facebook, что позволяет предоставлять в общий доступ Вашим друзьям свои устройства (для управления или получения информации), что может быть очень полезным в различных похожих областях деятельности.
Чтобы получить доступ к возможностям DeviceBit (это понадобится, чтобы запустить пример Union с компакт-диска SUNFOUNDER), нужно зарегистрироваться у них на сайте [5]. Это очень просто: введите логин, придумайте пароль, укажите свой реальный email и нажмите на кнопку Sign Up. На этом регистрация завершится.
После входа на сайт Вы увидите приглашение, и получите доступ к инструментарию DeviceBit. Можно добавлять свои устройства, подключать к ним сенсоры и т. п.