1. Контроллер своими руками

<<  2345678 >>

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
1. Контроллер своими руками
В данной теме я постараюсь изложить материал так, чтобы он был доступен самому неопытному в части электроники и программирования пользователю.
Позже тема будет развиваться. В итоге я расскажу как изготовить устройство, которое по своим характеристикам не уступает тому, что можно преобрести в готовом исполнении. Точнее в готовом ничего даже близко подходящего Вы не найдете.

В качестве платформы будем использовать Arduino. Это устройство может работать как автономно (запитав его любым адаптером 7-12V или батарейкой), так и подключенным к компьютеру. Имеет 20 цифровых вводов/выводов, 6 из которых могут быть использованы как аналого-цифровые преобразователи, еще 6 могут работать в режиме широтно-импульсной модуляции. Встроенные интерфейсы I2C и SPI. И много чего еще. Более подробно: http://arduino.ru/Hardware/ArduinoBoardUno. Такая организация позволяет подключить к Arduino практически любое электронное приспособление. Простой язык программирования и наличие в сети готовых библиотек для популярных устройств позволяет без труда реализовать на базе Arduino любой проект.

Грубо говоря, до знакомства с Arduino мои знания в электроние ограничивались законом Ома. Через пару часов после приобретения я уже реализовывал простые проекты, а еще через пару дней террариум был оборудован контроллером.

Что нам понадобиться:
1. Контроллер Ардуино. Arduino на E-bay
Вариант Nano удобнее всего использовать в итоговом устройстве (стоит около 450р, есть варианты и дешевле, но по USB они напрямую не подключаются, поэтому лучше немного переплатить, и использовать более удобное). Для прототипирования лучше использовать UNO (цена ~600р)
2. Датчик влажности и температуры. Датчики DHT* на E-bay
Цена от 100р в зависимости от точности. Желательно использовать DHT21 или DHT22. У DHT11 погрешность измерения температуры +-2 градуса, что существенно.
3. Релейный модуль. Релейный модуль (цена от 100р)
Такие модули бывают от 1, 2, 4, 8 до 16 (видел и 32 для маньяков) выводов, т.е. чем больше устройств надо заюзають, тем больше модуль.
4. Резистор на 10 kOm 1шт. Купить можно в ближайшем магазине радиодеталей. Цена 3р (не в ближайшем 60коп ).
5. Провода. Удобные шнуры для датчика и соединений.

Не буду рассказывать об Arduino. Вот ссылка, где о нем есть несколько статей Амперка, которые позволят быстро подружить это устройство с компьютером (см. видео Первые шаги). Кстати кто не хочет связываться с E-bay по тем или иным причинам, практически все причендалы можно купить в их интернет магазине (не сочтите за рекламу).
Но поверьте, в покупках на E-bay нет ничего сложного. Правда ждать посылку придется около месяца, но зато бюджет устройства будет в разы меньше.

Так же нам понадобится библиотека для работы с датчиком, взять ее можно здесь: https://github.com/adafruit/DHT-sensor-library. Папку поместить в каталог libraries\ установленной программы Arduino

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


Подключение датчика (Подробно тут):
1-й пин датчика подключаем к 5v от Arduino
2-й пин датчика к 8-му (или любому понравившимуся) пину Arduino. Так же через резистро 10 кOm этот пин надо подтянуть к 5v.
3-й никуда не подключаем.
4-й пин к Земле.

Подлюкчаем Реле (все еще проще чем с датчиком).
1. Соединяем с питанием. На модуле будет указано, какой пин отвечает за 5v (VCC) и Землю (GND)
2. Цифровые пины Arduino подключаем к управляющим пинам модуля (In1, In2 и т.д.). В данном случае к 6 и 7.

Железо готово! Через реле подлючаем необходимые устройства и доставляем радость животному.


Мы использовали всего 3 из 18-ти возможных управляющих пинов. Это значит, что мы уже знаем как к тому же самому контроллеру подлючить еще 5 террариумов с независимым управлением (обладая более углубленными знаниями мы бы знали, как подлючить еще не один десяток...).

Чуть не забыл, вот текст программы, который надо загрузить в устройство, чтобы все заработало (программа максимально упрощена, для удобства восприятия и возможности внесений изменений. Используем простой принцип, если температура опустилась ниже указанной отметки, то включаем обогрев; с влажностью аналогично):

#include <DHT.h> // Подключаем библиотеку для работы с датчиком

#define DHTPIN 8 // Считывающий пин с датчика
#define DHTTYPE DHT11 // Модель датчика
#define tPIN 7 // Пин управления температурой
#define hPIN 6 // Пин управления влажностью

DHT dht(DHTPIN, DHTTYPE); // Создаем объект dht

int tStatus = HIGH; // определяем переменную, отвечающую за состоянеие нагревателя HIGH=выкл, LOW=вкл
int temp = 28; // Желаемая температура в градусах Цельсия (изменить на нужную)
int hStatus = HIGH; // определяем переменную, отвечающую за состоянеие увлажнителя HIGH=выкл, LOW=вкл
int hum = 45; // Желаемая влажность (изменить на нужную)

void setup() // инициализация основных данных
{
Serial.begin(9600); // Инициализируем COM-порт
dht.begin(); // Инициализируем датчик
pinMode(tPIN, OUTPUT); // Определяем пин для управления температурой как Вывод
digitalWrite(tPIN, tStatus); // Притягиваем пин к начальному статусу (Выкл)
}

void loop() // зацикливание (код управляющей программы)
{
int h = dht.readHumidity(); // Считываем влажность
int t = dht.readTemperature(); // Считываем температуру
tStatus = (t < temp) ? LOW:HIGH; // Если температура меньше желаемой, то статус обогревателя=Вкл, в противном случае Выкл
digitalWrite(tPIN, tStatus);
if (h < hum) hStatus = LOW; else hStatus = HIGH; // Если влажность меньше желаемой, то статус увлажнителя=Вкл, в противном случае Выкл
digitalWrite(hPIN, hStatus);
delay(1000); // Задержка в 1 секунду
Serial.print("t="); Serial.print(t); Serial.print(" h="); Serial.println(h); // Отправляем информацю о климате на COM-порт
}


Примечание (бонус ). При подключении к компютеру с COM порта можно будет считать информацию о температуре и влажности в цифрах. В самой программе Arduino можно открыть COM-монитор с помощью меню Tools/Serial Monitor и с периодичность в 1 сек будет обновляться инфа о температуре и влажности

Итого: Мы потратили около 700р. Получив контроллер с возможностью расширения до 6 терров. Устройство работает как подключенное к компьютеру, так и без него при наличии питания.

Если тема будет интересна то:
1. В следующий раз я расскажу, как наше устойство "научить" работать со времененем. И в зависимости от времени суток менять характеристики климата, а так же к реле подключить Освещение, которое будет включаться утром и выключаться вечером (если у Вас останутся свободные каналы...).
2. И по нарастающей... LCD-Дисплей с информацией; эффект рассвета и заката; управление с пульта ДУ, ПК или сенсорной панели; использование транзисторов вместо реле для устройств работающих от малого постоянного тока; и пр.

С вопросами и пожеланиями не стесняемся. Кому интересно, помогу чем смогу.

Изменено 27-4-2012 автор CiberRus
2012-03-26 добавлено 26/03/2012 13:37:26#365640

Постоянный посетитель





156
Ukraine
9 мес. назад
Уже второй месяц пытаемся собрать что-то с Arduino.
Всё работает за исключением того что если датчик DHT22 вытянут более чем на 100см от Шилда, то значения не возвращаются.
При выключении библиотеки данные поступают нормально. Но опрашивать 5 датчиков без библиотеки, пока не придумали как.

Изменено 26-3-2012 автор RNKot
2012-03-26 добавлено 26/03/2012 13:52:37#365641

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
сообщение RNKot
Уже второй месяц пытаемся собрать что-то с Arduino.
Всё работает за исключением того что если датчик DHT22 вытянут более чем на 100см от Шилда, то значения не возвращаются.
При выключении библиотеки данные поступают нормально. Но опрашивать 5 датчиков без библиотеки, пока не придумали как.

Изменено 26-3-2012 автор RNKot


У меня датчики ближе 1м, и проблем с датчиками не было.
Т.к. проблеммы зависят от длины кабеля, то скорее всего причина в качестве провода, контакта или недостатка питания.
1. Попробуй использовать качественную витую пару, как правило это помогает, по крайней мере для аналоговых датчиков есть такая рекомендация.
2. Возможно где-то в схеме есть "паразит", который тырит питание, и датчики "срываются".
3. Используемого питания платы недостаточно для питания "обвязки". Используте внешний источник питания, или подберите более сильный.
4. Для стабилизации питания датчика можно использовать конденсатор 0,1мкФ между питанием и землей, как можно ближе к датчику. Кстати на готовых платах кондер стоит (Датчик).


Изменено 26-3-2012 автор CiberRus
2012-03-26 добавлено 26/03/2012 14:17:39#365646

Новенький





41
Russian Federation Murmansk
4 г. назад
Весьма интересно. И что парадоксально, по предварительным подсчётам выходит много дешевле и менее трудозатратно, чем ваять девайс самостоятельно с нуля. Надеюсь цикл будет продолжен
2012-03-26 добавлено 26/03/2012 15:22:52#365652

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
сообщение gray
Весьма интересно. И что парадоксально, по предварительным подсчётам выходит много дешевле и менее трудозатратно, чем ваять девайс самостоятельно с нуля. Надеюсь цикл будет продолжен


Чтобы ваять с нуля, надо иметь доступ к дешевым деталям.
Если затариваться комплектующими в "Чип и Дейле" и им подобным где наценка 500-1000%%, то получится золотой девайс.

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

Так же поделюсь, в рамках наверное другой темы, бюджетными и интересными идеями по обогреву и увлажнению.
2012-03-26 добавлено 26/03/2012 15:50:36#365653

Новенький





41
Russian Federation Murmansk
4 г. назад
CiberRus


Интересно и думаю не одному мне. На форуме есть ветка "контроллер мечты", есть там дельные идеи и замечания, но в основном всё на стадии теории и обсуждения. В этой связи очень интересно лицезреть именно готовый продукт, и иметь возможность расчёта экономической целесообразности на фоне общей функциональности, тем более, что устройство имеет место быть физически и функционирует, если я всё правильно понял. А касательно комплектующих с "чип и дип'a" - сущая правда, самостоятельное изготовление выходит в разы дороже чем покупка готового в магазине и это не говоря о том, что придётся ещё программировать AVR/PIC контроллер, потратиться на программатор (ну или опять же делать самому) и проч. и проч. В общем мне кажется, что развитие этой темы будет весьма интересно многим.
2012-03-26 добавлено 26/03/2012 16:52:05#365660

Постоянный посетитель





156
Ukraine Odessa
9 мес. назад
Дело именно в библиотеке. Так и не можем разобраться почему с библиотекой работает на расстоянии меньше метра. Без библиотеки пашет на 5 метрах кабеля. Кабелей перепробовали кучу и напаялись как свиньи Потом оказалось что без библиотек - работает. Перепробовали несколько разных библиотек - без разницы - больше метра не пашет.
Сейчас подгоняем опрос датчиков без библиотеки. Поэтому всё долго и муторно.
2012-03-26 добавлено 26/03/2012 20:42:09#365685

Постоянный посетитель





156
Ukraine Odessa
9 мес. назад
Arduino на shield'е. Монитор и часы.



Коробка в которой всё пока что сложено кучей.



Сюда впаяны реле, контролирующие свет во всей стойке с террариумами.



Grove - Temperature&Humidity Sensor Pro



Изменено 26-3-2012 автор RNKot
2012-03-26 добавлено 26/03/2012 20:46:23#365686

Посетитель





78
Russian Federation Moscow
8 мес. назад
RNKot


Для меня все очевидно, если меньше метра работает, а больше нет, то проблема именно в проводах и потере напряжения. Это как с некачественным USB, 2-х метровый кабель отваливается периодически.
1. Пробовали витую пару использовать?
2. Подключен ли контроллер к внешнему источнику питания?

Сразу бы сказали, что 5 метров... 5 метров это не больше метра, а больше 4-х .

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


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

PS. Обычная LCD-шка жадная к контактам зато стоит 100рэ (приходится его допиливать с помощью сдвигового регистра до SPI за 30р), а из-за такой обвязки (Экран на Вашем фото), позволяющей подключить экран к I2C, китайцы берут порядка 400р. За эту цену уж лучше TFT брать, симпотичнее и информативнее.

Изменено 26-3-2012 автор CiberRus
2012-03-26 добавлено 26/03/2012 22:42:01#365702

Постоянный посетитель





156
Ukraine Odessa
9 мес. назад
Кабель изначально витая пара. Питание как от компа, так и от адаптера пробовали.
С библиотекой всё работает до метра. Больше метра с библиотекой не работает. Монитор мой работает на любом расстоянии. Часы тоже. А вот датчики - нет.
Без библиотеки все работает на любом расстоянии.
Проблема в данном случае - как опрашивать 5 датчиков без библиотеки. Рано или поздно разберемся конечно.
2012-03-26 добавлено 26/03/2012 22:50:23#365704

Посетитель





78
Russian Federation Moscow
8 мес. назад
RNKot

Ну тогда ХЗ.
Завтра попробую на длинном кабеле затестить.

Конечно не совсем понятно, почему один датчик можно опросить, а 5 нет. В чем там проблема? Кусок кода в студию.
2012-03-26 добавлено 26/03/2012 22:57:22#365705

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
сообщение CiberRus
RNKot

Ну тогда ХЗ.
Завтра попробую на длинном кабеле затестить.


Проверено на 8-ми метрах. Датчик работает как часы. Уверен, что и на большем расстоянии будет работать, т.к. характеристики витой пары гарантируют качество сигнала до 100м.
2012-03-27 добавлено 27/03/2012 09:02:20#365733

Постоянный посетитель





156
Ukraine
9 мес. назад
Вы используете библиотеку с первого поста?
http://https//github...
там 404
если можно, скиньте эту библиотеку на почту
Спасибо.

Изменено 27-3-2012 автор RNKot
2012-03-27 добавлено 27/03/2012 13:42:41#365756

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
сообщение RNKot
Вы используете библиотеку с первого поста?
http://https//github...
там 404
если можно, скиньте эту библиотеку на kot_@pochta.ru
Спасибо.


Адрес неправильно возвращается почему-то, вот он строкой: https://github.com/a...
Видать из-за хтпсс неправильно возвращается ссылка...
2012-03-27 добавлено 27/03/2012 13:59:43#365757

Постоянный посетитель





156
Ukraine
9 мес. назад
Что-то не обратил внимания что http:// повторяется два раза...
Вечером попробуем собрать на этой библиотеке
2012-03-27 добавлено 27/03/2012 14:57:20#365762

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
2. Upgrade
Управлять релейным блоком мы научились.
Но хотелось бы, чтобы днем температура была выше, а ночью ниже. А так же днем включалось освещение, а на ночь отключалось.

Нам потребуется немного доработать наше устройство. А именно: соединить один из выводов Arduino с 3-им входом реле. 3-е реле будет управлять освещением, подключаем к нему лампу (пусть это будет выход 5 на Arduino, но можно использовать любой понравившийся). "Железо" готово.

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


Доработаем программу.

Есть много способов организовать время используя системный таймер устройства. Самый простой, это использовать готовую библиотеку, которая сама следит за корректностью согласования пользовательского времени с системным. Поэтому качаем библиотеку: Ссылка, разархивируем и помещаем в ..\libraries\ основной программы.

И немного изменяем код:

#include <DHT.h> // Подключаем библиотеку для работы с датчиком
#include <Time.h> // Подключаем библиотеку работы с часами

#define DHTPIN 8 // Считывающий пин с датчика
#define DHTTYPE DHT11 // Модель датчика
#define tPIN 7 // Пин управления температурой
#define hPIN 6 // Пин управления влажностью
#define dPIN 13 // Пин на котором висит светодиод платы
#define lPIN 5 // Пин управления светом

DHT dht(DHTPIN, DHTTYPE); // Создаем объект dht

int tStatus = HIGH; // определяем переменную, отвечающую за состоянеие нагревателя HIGH=выкл, LOW=вкл
int tempDay = 28; // Желаемая дневная температура в градусах Цельсия
int tempNight = 25; // Желаемая ночная температура в градусах Цельсия
int hStatus = HIGH; // определяем переменную, отвечающую за состоянеие увлажнителя HIGH=выкл, LOW=вкл
int humDay = 45; // Желаемая влажность
int humNight = 40; // Желаемая влажность

void setup() // инициализация основных данных
{
Serial.begin(9600); // Инициализируем COM-порт
dht.begin(); // Инициализируем датчик
pinMode(tPIN, OUTPUT); // Определяем пин для управления температурой как Вывод
pinMode(hPIN, OUTPUT);
pinMode(dPIN, OUTPUT);
pinMode(lPIN, OUTPUT);
}

void loop() // зацикливание (код управляющей программы)
{
if (Serial.available() > 0) SetTime(); // Если на COM-порт поступила информация, то изменим системное время
int h = dht.readHumidity(); // Считываем влажность
int t = dht.readTemperature(); // Считываем температуру
int Hour = hour(); // Получаем значение текущего часа
boolean Day = (Hour >= 8 & Hour <20); // Если текущий час находится в промежутке от 8 до 20, то действуют дневные параметры
digitalWrite(dPIN, (Day) ? HIGH:LOW); // Зажгем сигнальный светодиод на плате, если сейчас день (Индикатор, чтобы понимать что все Ок)
tStatus = (t < ((Day) ? tempDay : tempNight)) ? LOW:HIGH; // Если температура меньше желаемой, то статус обогревателя=Вкл, в противном случае Выкл
digitalWrite(tPIN, tStatus);
if (h < ((Day) ? humDay : humNight)) hStatus = LOW; else hStatus = HIGH; // Если влажность меньше желаемой, то статус увлажнителя=Вкл, в противном случае Выкл
digitalWrite(hPIN, hStatus);
digitalWrite(lPIN, (Day) ? LOW:HIGH); // Если дневное время, то включим подсветку
delay(1000); // Задержка в 1 секунду
Serial.print("t="); Serial.print(t); Serial.print(" h="); Serial.println(h); // Отправляем информацю о климате на COM-порт
Serial.print(Hour);Serial.print(":");Serial.print(minute());Serial.print(":");Serial.println(second()); // Отправляем информацию о времени на COM
}

void SetTime() // установка времени из шаблона tчч:мм
{
if (Serial.read() == 't' // Если первый символ t, то установим указанное время
{
int h = (Serial.read() - '0' * 10 + (Serial.read() - '0';
Serial.read();
int m = (Serial.read() - '0' * 10 + (Serial.read() - '0';
setTime(h, m, 0, 0, 0, 0);
}
Serial.flush();
}


Поясню важные детали:
1. Время устройство не хранит, а это значит, что при отключении от питания или сбросе время собъется на 00:00:00 и его надо будет устанавливать. При открытии Serial monitor, так же время будет сбито.
2. Для того, чтобы можно было установить время, добавлена прослушка COM-порта и функцию SetTime(), которая расшифрует отправленную нами команду.
3. Для индикации дневного времени, помимо того, что включится свет используем системный светодиод на пине 13, если светодиод горит, то действуют дневные настройки.
4. Код снабжен подробными комментариями, по тексту видно какая строчка за что отвечает.
5. У каждого пользователя будут свои параметры температуры, влажности и светового дня. Их можно изменить в тексте кода под себя.

Как установить время?
Нужно отправить на COM-порт команду вида "tчч:мм", например t12:35 установить время 12:35.
Самый простой способ, через Serial monitor самой программы Arduino:

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

Можно так же использовать командную строку (CMD) выполнив код: echo.t12:35>com7. Последняя цифра - номер ком порта на котором висит устройство.

В данном исполнении устройствовполне можно использовать.

Из недостатков, которые решаются аппаратно:
1. Можно дополнить устройство специальным модулем на основе микросхемы ds1307 (На одном из фото RNKot'а он присутствует, то что с батарейкой), который позволяет энергонезависимо хранить время, и не переставлять его каждый раз при сбросе. Позже я расскажу как его подключить.
2. Электромагнитные реле издают небольшой щелчок при переключении. Для чутко спящих это может быть проблемой. В этом случае можно посоветовать отключать все устройства на ночь, если для животного это не критично (установив ночные параметры на 0 в тексте программы). Реле могут быть заменены на симисторные переключатели или биполярные транзисторы (на биполярных транзисторах позже остановимся подробней, т.к. они просты для понимания и позволяют управлять низковольтной нагрузкой).
3. Устройство представляет собой "черный ящик". А человек так устроен, что ему обязательно надо контролировать показатели. Это решаемо. Arduino позволяет без труда вывести информацию на разлинчые дисплеи (например на такой, как у RNKot'а в сообщении). Позже остановимся подробнее и на этом моменте.

Изменено 29-3-2012 автор CiberRus
2012-03-27 добавлено 27/03/2012 15:24:33#365767

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
3. Полевой транзистор и широтно-импульсная модуляция
Рассмотрим использование полевого транзистора N-типа.
Подходящие транзисторы можно взять к примеру из испорченного источника бесперебойного питания, их там 4-6шт. Важно, что пороговое напряжение на затворе было в пределах 5v (чтобы напряжения с контакта Arduino хватило для его полного открытия).
Или купить в магазине радиодеталей. Одна из распростаненных, дешевых и надежных к примеру: IRF540N. Имеет хороший запас прочности. При использовании тока до 12V,2A-24V,1A можно смело их использовать без дополнительного отвода тепла.



Схема подлкючения, которая нам подходит:
1. К Затвору(G) подлючаем ногу Arduino (пусть это будет 3 пин). Так же желательно притянуть этот контакт к земле через резистор 10КОм, чтобы отсечь возможные шумы, поступающие на затвор.
2. Исток(S) подключаем к Земле.
3. Сток(D) к управляемому прибору. Данный канал будет давать землю, поэтому если важна полярность, то его нужно согласовать с "-" на приборе.
4. "+" от источника питания прибора подключить к "+" прибора.
5. Землю от исочника питания соединить с Землей Arduino.


Теперь притянув контакт 3 к HIGH, нагрузка будет включена, при LOW - выключена.

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

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

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

Прототип:


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

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

Скетч (в текст модуля в буквальном смылсе добавлено 5 строк):
#include <DHT.h> // Подключаем библиотеку для работы с датчиком
#include <Time.h> // Подключаем библиотеку работы с часами

#define DHTPIN 8 // Считывающий пин с датчика
#define DHTTYPE DHT11 // Модель датчика
#define tPIN 7 // Пин управления температурой
#define hPIN 6 // Пин управления влажностью
#define dPIN 13 // Пин на котором висит светодиод платы
#define lPIN 5 // Пин управления светом
#define sdPIN 3 // Пин управления светодиодной лентой

DHT dht(DHTPIN, DHTTYPE); // Создаем объект dht

int tStatus = HIGH; // определяем переменную, отвечающую за состоянеие нагревателя HIGH=выкл, LOW=вкл
int tempDay = 28; // Желаемая дневная температура в градусах Цельсия
int tempNight = 25; // Желаемая ночная температура в градусах Цельсия
int hStatus = HIGH; // определяем переменную, отвечающую за состоянеие увлажнителя HIGH=выкл, LOW=вкл
int humDay = 45; // Желаемая влажность
int humNight = 40; // Желаемая влажность

void setup() // инициализация основных данных
{
Serial.begin(9600); // Инициализируем COM-порт
dht.begin(); // Инициализируем датчик
pinMode(tPIN, OUTPUT); // Определяем пин для управления температурой как Вывод
pinMode(hPIN, OUTPUT);
pinMode(dPIN, OUTPUT);
pinMode(lPIN, OUTPUT);
}

void loop() // зацикливание (код управляющей программы)
{
if (Serial.available() > 0) SetTime(); // Если на COM-порт поступила информация, то изменим системное время
int h = dht.readHumidity(); // Считываем влажность
int t = dht.readTemperature(); // Считываем температуру
int Hour = hour(); // Получаем значение текущего часа
boolean Day = (Hour >= 8 & Hour <20); // Если текущий час находится в промежутке от 8 до 20, то действуют дневные параметры
digitalWrite(dPIN, (Day) ? HIGH:LOW); // Зажгем сигнальный светодиод на плате, если сейчас день (Индикатор, чтобы понимать что все Ок)
tStatus = (t < ((Day) ? tempDay : tempNight)) ? LOW:HIGH; // Если температура меньше желаемой, то статус обогревателя=Вкл, в противном случае Выкл
digitalWrite(tPIN, tStatus);
if (h < ((Day) ? humDay : humNight)) hStatus = LOW; else hStatus = HIGH; // Если влажность меньше желаемой, то статус увлажнителя=Вкл, в противном случае Выкл
digitalWrite(hPIN, hStatus);
digitalWrite(lPIN, (Day) ? LOW:HIGH); // Если дневное время, то включим подсветку
int Minute = minute();
switch(Hour) // в зависимости от времени меняем яркость светодиодной ленты
{
case 7:analogWrite(sdPIN, map(Minute, 0, 59, 0, 255)); break;
case 20:analogWrite(sdPIN, map(Minute, 0, 59, 255, 0)); break;
default:analogWrite(sdPIN, (Day) ? 255:0);
}

delay(1000); // Задержка в 1 секунду
Serial.print("t="); Serial.print(t); Serial.print(" h="); Serial.println(h); // Отправляем информацю о климате на COM-порт
Serial.print(Hour);Serial.print(":");Serial.print(Minute);Serial.print(":");Serial.println(second()); // Отправляем информацию о времени на COM
}

void SetTime() // установка времени из шаблона tчч:мм
{
if (Serial.read() == 't' // Если первый символ t, то установим указанное время
{
int h = (Serial.read() - '0' * 10 + (Serial.read() - '0';
Serial.read();
int m = (Serial.read() - '0' * 10 + (Serial.read() - '0';
setTime(h, m, 0, 0, 0, 0);
}
Serial.flush();
}


Изменено 27-4-2012 автор CiberRus
2012-03-29 добавлено 29/03/2012 10:04:45#365991

Постоянный посетитель





156
Ukraine
9 мес. назад
А вообще огромное спасибо что подняли эту тему!
Оно на самом деле достаточно просто и весьма необходимо для нашего дела. Автоматизация весьма полезна!
2012-03-29 добавлено 29/03/2012 10:47:27#365993

Посетитель





57
Новый Уренгой
3 мес. назад
сделал все тоже самое, даже не знал что есть эта тема (((
многое искал по форумам )
а тут оказывается уже все есть с постингом кода.
у меня не много другой LCD.
плюс добавлен модуль для сети и датчики DS18B20
с выводом информации на сайт

Изменено 30-3-2012 автор opic
2012-03-30 добавлено 30/03/2012 13:48:47#366169

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
сообщение opic
сделал все тоже самое, даже не знал что есть эта тема (((
многое искал по форумам )
а тут оказывается уже все есть с постингом кода.
у меня не много другой LCD.
плюс добавлен модуль для сети и датчики DS18B20
с выводом информации на сайт

Изменено 30-3-2012 автор opic


Если необходимо контролировать только температуру, то указанный Вами датчик - оптимальный вариант. Главное его преимущество - интерфейс 1-Wire, позволяет подключить несколько датчиков задействовав всего 1 контакт. Если бы из доступного было что-то похожее для влажности, было бы целесообразно использовать связку. Возможно кто подскажет, датчик влажности с интерфействм 1-Wire или I2C доступный по цене (в пределах 5$ на E-bay)?

Изменено 4-4-2012 автор CiberRus
2012-04-02 добавлено 02/04/2012 08:01:09#366441

Постоянный посетитель





156
Ukraine
9 мес. назад
Я наоборот покупал "дорогой" датчик температуры-влажности
http://www.seeedstud...
т.к. у меня Древолазы, следовательно замеры влажности надо делать от 70% до 100%. Подавляющее большинство датчиков влажности меряет от 10 до 90% да и то при влажности больше 85% данные уже совсем не точные.
Для малой влажности от 20 до 80% есть много датчиков. На http://s.dx.com/sear... гляди. Тысячи их!
2012-04-02 добавлено 02/04/2012 10:51:16#366449

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
сообщение RNKot
Я наоборот покупал "дорогой" датчик температуры-влажности
http://www.seeedstud...
т.к. у меня Древолазы, следовательно замеры влажности надо делать от 70% до 100%. Подавляющее большинство датчиков влажности меряет от 10 до 90% да и то при влажности больше 85% данные уже совсем не точные.
Для малой влажности от 20 до 80% есть много датчиков. На http://s.dx.com/sear... гляди. Тысячи их!


Все это давно изучено. Датчики DHT21 и DHT22 (указанный Вами) давно используются. В примерах я использовал DHT11, т.к. под рукой нет свободного другого (в устройствах я его не использую, мало того что он имеет большую погрешность, так еще и не выводит десятые доли, что приводит к отсутствию обратной связи).
По второй ссылке - мусор.
Имелся ввиду датчик с интерфейсом I2C или 1-Wire, как у серии DS18B20.
Важное отличие: Чтобы подключить 10 датчиков DHT*, Вам необходимо занять 10 контактов контроллера; чтобы подключить 10 (и более) датчиков DS18B20 - всего один контакт (датчик опрашивается по адресу). Поэтому использование интерфейса 1-Ware во-первых, позволяет увеличить количество используемого оборудования без дополнительных приспособлений, во-вторых, унифицировать скетч и устройство (чтобы добавить еще один датчик/экран/..., контакт припаивается к уже имеющемуся выводу).

Вот интересный вариант I2C датчика: http://viewitem.eim.ebay.ru/1PCS-SHT10-Humidity--Temperature-Sensor-Made-in-SWISS-100original/130673978431/item. Но его цена сопоставима с ценой самой Arduino, что конечно же пагубно сказывается на бюджете устройства.

Изменено 2-4-2012 автор CiberRus
2012-04-02 добавлено 02/04/2012 11:34:22#366457

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
4. Модуль часов реального времени
Предыдущий вариант устройства имел существенный недостаток. Он не умел хранить текущее время, и при любой манипуляции к нему необходимо было подносить компьютер, чтобы заново его установить.
Сегодня мы устраним его, добавив микросхему DS1307. Купить ее можно к примеру тут: DS1307 module, по цене от 200р. Ну или собрать самостоятельно из микросхемы и деталей ненужной материнской платы (батарейка пара резисторов и кварцевый резонатор)...
Библиотеку можно скачать тут: http://arduino.cc/forum/index.php?topic=93077.0

Подключение (на фото отсутствует батарейка, представим, что она там есть):

Модуль подключается к питанию контроллера, Vcc к 5v Gnd к земле.
SDA - к аналоговому входу А4 (линия данных)
SCL - к аналоговому входу А5 (линия тактирования)


Модуль может содержать еще несколько контактов, в зависимости от дополнительных функций, это пока не важно.

Осталось немного модифицировать скетч:
#include <DHT.h> // Подключаем библиотеку для работы с датчиком
#include <DS1307.h> // Подключаем библиотеку управления модулем реального времени

#define DHTPIN 8 // Считывающий пин с датчика
#define DHTTYPE DHT11 // Модель датчика
#define tPIN 7 // Пин управления температурой
#define hPIN 6 // Пин управления влажностью
#define lPIN 5 // Пин управления светом
#define sdPIN 3 // Пин управления светодиодной лентой

DHT dht(DHTPIN, DHTTYPE); // Создаем объект dht

int tStatus = HIGH; // определяем переменную, отвечающую за состоянеие нагревателя HIGH=выкл, LOW=вкл
int tempDay = 28; // Желаемая дневная температура в градусах Цельсия
int tempNight = 25; // Желаемая ночная температура в градусах Цельсия
int hStatus = HIGH; // определяем переменную, отвечающую за состоянеие увлажнителя HIGH=выкл, LOW=вкл
int humDay = 45; // Желаемая дневная влажность
int humNight = 40; // Желаемая ночная влажность

void setup() // инициализация основных данных
{
Serial.begin(9600); // Инициализируем COM-порт
dht.begin(); // Инициализируем датчик
pinMode(tPIN, OUTPUT); // Определяем пин для управления температурой как Вывод
pinMode(hPIN, OUTPUT);
pinMode(lPIN, OUTPUT);
}

void loop() // зацикливание (код управляющей программы)
{
if (Serial.available() > 0) SetTime(); // Если на COM-порт поступила информация, то изменим системное время
float h = dht.readHumidity(); // Считываем влажность
float t = dht.readTemperature(); // Считываем температуру
int Hour = RTC.get(DS1307_HR,true); // Получаем значение текущего часа
int Minute = RTC.get(DS1307_MIN,false); // Получаем значение минут
int Second = RTC.get(DS1307_SEC,false); // Получаем значение секунд

boolean Day = (Hour >= 8 & Hour <20); // Если текущий час находится в промежутке от 8 до 20, то действуют дневные параметры
tStatus = (t < ((Day) ? tempDay : tempNight)) ? LOW:HIGH; // Если температура меньше желаемой, то статус обогревателя=Вкл, в противном случае Выкл
digitalWrite(tPIN, tStatus);
if (h < ((Day) ? humDay : humNight)) hStatus = LOW; else hStatus = HIGH; // Если влажность меньше желаемой, то статус увлажнителя=Вкл, в противном случае Выкл
digitalWrite(hPIN, hStatus);
digitalWrite(lPIN, (Day) ? LOW:HIGH); // Если дневное время, то включим подсветку
switch(Hour) // в зависимости от времени меняем яркость светодиодной ленты
{
case 7:analogWrite(sdPIN, map(Minute, 0, 59, 0, 255)); break;
case 20:analogWrite(sdPIN, map(Minute, 0, 59, 255, 0)); break;
default:analogWrite(sdPIN, (Day) ? 255:0);
}
Serial.print("t="); Serial.print(t, 1); Serial.print(" h="); Serial.println(h, 1); // Отправляем информацю о климате на COM-порт
Serial.print(addZero(Hour));Serial.print(":");Serial.print(addZero(Minute));Serial.print(":");Serial.println(addZero(Second)); // Отправляем информацию о времени на COM
delay(1000); // Задержка в 1 секунду
}

void SetTime() // установка времени из шаблона tчч:мм
{
if (Serial.read() == 't' // Если первый символ t, то установим указанное время
{
int h = (Serial.read() - '0' * 10 + (Serial.read() - '0';
Serial.read();
int m = (Serial.read() - '0' * 10 + (Serial.read() - '0';
RTC.stop();
RTC.set(DS1307_SEC,0); //set the seconds
RTC.set(DS1307_MIN,m); //set the minutes
RTC.set(DS1307_HR,h); //set the hours
RTC.start();

}
Serial.flush();
}

String addZero(int val) // Добавим 0 перед значением часа/минуты/секунды, если оно меньше 10
{
if (val<10) return "0" + String(val);else return String(val);
}


За одно немного улучшим функциональность:
1. Изменим тип переменных, хранящих текущую температуру и влажность с целочисленных, до вещественных. (int меняем на float). Для датчика DHT11 это не принципиально, для более точных это важно.
2. Добавим функцию addZero(), которая поможет оформить вывод времени в более "красивом" формате, т.е. вместо 9:12:5 будет возвращаться строка 09:12:05.
3. Сигнальный светодиод нам более не нужен, уберем его из функционала.

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

Изменено 18-10-2012 автор CiberRus
2012-04-06 добавлено 06/04/2012 10:40:12#366770

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
5. LCD дисплей
К контроллеру Arduino можно подключить различные дисплеи, для вывода информации. Рассмотрим один из наиболее распространенных. Купить можно здесь: LCD Display. Цена от 100р.

В стандартной комплектации данный дисплей подключается напрямую. Минимальное количество каналов, которые при этом необходимо занять - 6. 2 для команд, 4 для передачи данных. В сети есть масса примеров, как это сделать, к примеру тут: Подключение LCD
Есть вариант подключения по I2C интерфейсу (наилучший вариант, но такие дисплеи самые дорогие)
Или подключить с помощью сдвигового регистра по SPI интерфейсу. Очень подробно, с сылками на необходимые библиотеки: Подключаем кучу устройств по 5 проводам. В программе я использовал библиотеки из данной статьи.

В данном примере я использовал дисплей с интерфейсом SPI. Скетчи будут отличаться незначительно, поэтому я приведу их для обоих вариантов.
Для удобства интерфейс SPI разведен на плате сзади экрана с помощью сдвигового регистра, так что из него выходят всего 5 контактов.


Немного слов про сдвиговые регистры. С помощью них можно теоретически неограниченно увеличить количество вводов/выводов контроллера. Поэтому если требуется одним контроллером управлять больши количеством террариумов, то стоит рассматривать SPI интерфейс и сдвиговые регистры для решения данной задачи. Стоимость 8-битного сдвигового регистра 10-30р, при этом он превращает 1 вывод контроллера в 8. А каскадное подключение нескольких регистров делает из 1 вывода 16, 24 и тд.
Неприятным моментом является то, что сдвиговый регистр превращает 1 ввод/вывод в несколько либо только вводов, либо только выводов, что немного ограничивает их область применения, но большинство задач позволяют решать. (К примеру 8-канальный релейный блок, который я использую в примерах можно подключить через сдвиговый регистр, заняв всего 1 вывод контроллера вместо 8-ми) Дисплей, на фото выше при прямом подключении использовал бы 6 контактов Arduino - это треть из возможных, а с SPI всего один.

Прототип:


Итак, на экран выводим информацию о текущей температуре и влажности, ниже текущее время.
Если в данный момент работает обогрев или увлажнение, то под соответствующим показателем выводим "+".

Скетч (Для варианта SPI - зеленый цвет/ прямое подключение экрана - красный. В зависимости от использованного варианта лишнее удалить. Иные отличия от предыдующего кода - синий):
#include <DHT.h> // Подключаем библиотеку для работы с датчиком
#include <DS1307.h> // Подключаем библиотеку управления модулем реального времени

#include <LiquidCrystalExt.h> // Подключаем библиотеку управления экраном
#include <LineDriver.h> // Далее вспомогательные библиотеки для реализации интерфейса SPI
#include <SPI.h>
#include <SPI_Bus.h>
#include <Wire.h>


#include <LiquidCrystal.h> // Подключаем стандартную библиотеку управления экраном

#define DHTPIN 8 // Считывающий пин с датчика
#define DHTTYPE DHT11 // Модель датчика
#define tPIN 7 // Пин управления температурой
#define hPIN 6 // Пин управления влажностью
#define lPIN 5 // Пин управления светом
#define sdPIN 3 // Пин управления светодиодной лентой

DHT dht(DHTPIN, DHTTYPE); // Создаем объект dht

int tStatus = HIGH; // определяем переменную, отвечающую за состоянеие нагревателя HIGH=выкл, LOW=вкл
int tempDay = 28; // Желаемая дневная температура в градусах Цельсия
int tempNight = 25; // Желаемая ночная температура в градусах Цельсия
int hStatus = HIGH; // определяем переменную, отвечающую за состоянеие увлажнителя HIGH=выкл, LOW=вкл
int humDay = 45; // Желаемая дневная влажность
int humNight = 40; // Желаемая ночная влажность

SPI_Bus shreg(_8bit, 10); // Подключаем сдвиговый регистр
LiquidCrystal lcd(1, 2, 3, 4, 5, 6, &shreg, 7); // Инициализируем дисплей


LiquidCrystal lcd(12, 11, 10, 9, 4, 2); // Инициализируем дисплей

void setup() // инициализация основных данных
{
Serial.begin(9600); // Инициализируем COM-порт
dht.begin(); // Инициализируем датчик
pinMode(tPIN, OUTPUT); // Определяем пин для управления температурой как Вывод
pinMode(hPIN, OUTPUT);
pinMode(lPIN, OUTPUT);
lcd.begin(16,2); // устанавливаем размеры экрана
lcd.backlight(true); // Указываем использование подсветки экрана
}

void loop() // зацикливание (код управляющей программы)
{
if (Serial.available() > 0) SetTime(); // Если на COM-порт поступила информация, то изменим системное время
float h = dht.readHumidity(); // Считываем влажность
float t = dht.readTemperature(); // Считываем температуру
int Hour = RTC.get(DS1307_HR,true); // Получаем значение текущего часа
int Minute = RTC.get(DS1307_MIN,false);
int Second = RTC.get(DS1307_SEC,false);
boolean Day = (Hour >= 8 & Hour <20); // Если текущий час находится в промежутке от 8 до 20, то действуют дневные параметры
tStatus = (t < ((Day) ? tempDay : tempNight)) ? LOW:HIGH; // Если температура меньше желаемой, то статус обогревателя=Вкл, в противном случае Выкл
//Relay.lineWrite(tPIN, tStatus);
digitalWrite(tPIN, tStatus);
if (h < ((Day) ? humDay : humNight)) hStatus = LOW; else hStatus = HIGH; // Если влажность меньше желаемой, то статус увлажнителя=Вкл, в противном случае Выкл
digitalWrite(hPIN, hStatus);
digitalWrite(lPIN, (Day) ? LOW:HIGH); // Если дневное время, то включим подсветку
switch(Hour) // в зависимости от времени меняем яркость светодиодной ленты
{
case 7:analogWrite(sdPIN, map(Minute, 0, 59, 0, 255)); break;
case 20:analogWrite(sdPIN, map(Minute, 0, 59, 255, 0)); break;
default:analogWrite(sdPIN, (Day) ? 255:0);
}
lcd.setCursor(1,0); // устанавливаем позицию курсора на экране (на один символ правее левого верхнего угла)
lcd.print(t, 1); lcd.print("C "); lcd.print(h, 1); lcd.print("%"); // Выводим информацию о климате
lcd.setCursor(4,1); // устанавливаем курсор для вывода времени
lcd.print(addZero(Hour));lcd.print(":");lcd.print(addZero(Minute));lcd.print(":");lcd.println(addZero(Second)+ " "); // Выводим время
lcd.setCursor(1,1);lcd.print((tStatus == LOW) ? "+":" "); // Выводим индикатор работы подогрева
lcd.setCursor(13,1);lcd.print((hStatus == LOW) ? "+":" "); // Выводим индикатор работы увлажнения

delay(500); // Задержка в пол секунды
}

void SetTime() // установка времени из шаблона tчч:мм
{
if (Serial.read() == 't' // Если первый символ t, то установим указанное время
{
int h = (Serial.read() - '0' * 10 + (Serial.read() - '0';
Serial.read();
int m = (Serial.read() - '0' * 10 + (Serial.read() - '0';
RTC.stop();
RTC.set(DS1307_SEC,0); //set the seconds
RTC.set(DS1307_MIN,m); //set the minutes
RTC.set(DS1307_HR,h); //set the hours
RTC.start();
}
Serial.flush();
}

String addZero(int val)
{
if (val<10) return "0" + String(val);else return String(val);
}


Примечание 1. Возможно Ваши номера контактов SPI шины, использованные при инициализации дисплея будут отличаться.
Примечание 2. В стандатном варианте подключения дисплея соединить контакты Arduino c контактами экрана соответственно: 12 - RS, 11 - E, 10 - DB4, 9 - DB5, 4 - DB6, 2 - DB7. Остальные контакты экрана разводим как в ссылке: http://audio.probudget.ru/arduino/arduino-i-lcd-ekran
Примечание 3. Форматирование сообщения съедает лишние пробелы, поэтому чтобы информация на экране отображалась так, как на фото, необходимо добавить пробелы вручную. lcd.print("C ") - после С 5 пробелов, lcd.print("%") - после % 2 пробела, lcd.println(addZero(Second)+ " ") - в кавычках 5 пробелов.

Изменено 19-10-2012 автор CiberRus

Изменено 23-10-2012 автор CiberRus
2012-04-06 добавлено 06/04/2012 14:30:14#366794

Посетитель





78
Palestinian Territory Ramallah
8 мес. назад
Пример готового устройства
Данный контроллер я делал для сестры.

Функциональность:
1. Вся система, включая оборудование работает от одного источника питания - адаптер 24v 3A.
2. Подключение цифрового датчика температуры и влажности.
3. Подключение произвольного аналогового датчика.
4. Выход на 4 устройства, 3 из которых с возможностью регулировать нагрузку с помощью ШИМ.
5. 3 кнопки для удобства изменения параметров, времени, режимов и пр.
6. Модуль часов реального времени.
7. Дисплей.
8. Регулятор напряжения, преобразующий 24в в 12в для питания контроллера.


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


Оборудование:
1. Датчик.
2. Источник тепла. Изготовлен из линейного регулятора напряжения, радиатора и нагрузочного резистора.
3. Туманогенератор.
4. Светодиодная лента.
5. Адаптер на 24v 3A.

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

По бюджету:
1. Контроллер - около 800р (arduino, датчик, дисплей, часы, 4 транзистора, регулятор напряжения, корпус, макетка и мелочевка).
2. Адаптер - в районе 500р.
3. Оборудование - максимум 300р (туманогенератор, отрезок светодиодной ленты, радиатор с источником тепла).
4. Бесоонная ночь (около 8ч работы).

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

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

Из рекомендаций проектирования можно отметить следующее:
1. Разделить схему на логически отдельные модули, возможно некоторые из них выполнить на отдельных платах с выводом контактов для соединения с основной платой. Во-первых, некоторые элементы схемы могут некорректно работать на макетке, во-вторых, можно оптимизировать количество контактов, в-третьих проект получается более гибкий к изменениям и исправлениям. В данном случае часы реального времени выполнены на отдельной плате, как минимум это обусловленно необходимостью исключить помехи для кварцевого резонатора, интерфейс экрана находится на его задней части, что позволяет уменьшить количество линий шлейфа.
2. Желательно на макетку не припаивать, а предусмотреть разъемы для основных модулей. Это позволит легко их заменять в случае выхода из строя, некорректной работы или смены функциональности. Так же это позволит вынуть основные детали для использования их в новом проекте. В данном случае arduino, часы и шлейфы вставляются в разъемы. Остальное без труда выпаивается.
3. Будущие дорожки на макетке лучше всего спроектировать заранее на бумаге/компьютере. Это позволит избежать большинства пересечений.
4. Для минимизации работы паяльником для проектирования можно использовать шилды (к примеру шилд для UNO), специально разработанные для arduino; и готовые модули, имеющие библиотеки для подключения к arduino.

Изменено 27-4-2012 автор CiberRus
2012-04-27 добавлено 27/04/2012 10:46:52#368565

<<  2345678 >> Создать новую темуБыстрый ответ