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

<< 1 3456789 >>

Посетитель





78 2
Palestinian Territory Ramallah
5 г. назад
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
Нравится DragonNagaina

Новенький





3
Russian Federation Tomsk
12 г. назад
CiberRus

Приветствую вас!
Почитал ветку форума, все очень интересно.
Сам сейчас думаю на тему того как замерить влажность грунта (работаю с ардуино).
После беглого прочтения обсуждений понял, что самый простой метод замера сопротивления между электродами не подходит (мерить нужно не постоянным током).
Возникал мысль - если закопать датчик влажности DHT22. Допустим под небольшим колпачком, чтобы вода и грунт не попадали внутрь? На сколько точные данные можно получить?
2012-05-13 добавлено 13/05/2012 20:17:47#370148

Новенький





3
Russian Federation Barnaul
12 г. назад
CiberRus

И следом еще один вопрос - как вы сделали туманогенератор? По вашим данным, он обошелся менее 300р.
2012-05-14 добавлено 14/05/2012 08:45:46#370215

Посетитель





78 2
Palestinian Territory Ramallah
5 г. назад
сообщение first-leon
CiberRus

Приветствую вас!
Почитал ветку форума, все очень интересно.
Сам сейчас думаю на тему того как замерить влажность грунта (работаю с ардуино).
После беглого прочтения обсуждений понял, что самый простой метод замера сопротивления между электродами не подходит (мерить нужно не постоянным током).
Возникал мысль - если закопать датчик влажности DHT22. Допустим под небольшим колпачком, чтобы вода и грунт не попадали внутрь? На сколько точные данные можно получить?

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

Вот ссылка на самую простую схему: http://robocraft.ru/blog/arduino/444.html
Резистор R1 = 10КОм.
Желательно программно стабилизировать показатели, т.к. они будут скакать и может случиться незапланированный полив.
Использовать только качественный провод к датчику, витая пара подойдет. Иначе будут сильные шумы.
В качестве электродов использовать нержавеющий металл, в противном случае датчик со временем будет искажать измерения.
Показания V = 5v*R1/(R1+R2), где R2 - сопротивление почвы.

По поводу туманки, вот они от 130р, есть и с блоком питания от 250р: Туманогенератор
Качество исполнения их конечно не очень. Как повезет 50/50, бывают долго работают, а бывают месяц и на запчасти.
2012-05-14 добавлено 14/05/2012 09:55:09#370218

Новенький





3
Russian Federation Barnaul
12 г. назад
CiberRus


За туманогенератор спасибо!
А вот с электродами вопрос все таки. Схему эту я видел, но люди не советую мерить влажность простым замером сопротивления.
Вроде как точность низкая, скачет, со временем показания будут меняться даже при использовании нержавеющих электродов (по идее горшок будет превращаться в нечто похожее на очень плохой топливный элемент).
Хотя возможно эти погрешности не так катастрофичны? Допустим для крупной теплицы такой метод будет выдавать данные с допустимыми погрешностями?
С теплицей пример возможно не слишком правильный, но со временем есть мысль автоматизировать у родителей теплицу. Потому хочется сразу разобраться
2012-05-14 добавлено 14/05/2012 11:17:44#370227

Посетитель





78 2
Palestinian Territory Ramallah
5 г. назад
сообщение first-leon
CiberRus


За туманогенератор спасибо!
А вот с электродами вопрос все таки. Схему эту я видел, но люди не советую мерить влажность простым замером сопротивления.
Вроде как точность низкая, скачет, со временем показания будут меняться даже при использовании нержавеющих электродов (по идее горшок будет превращаться в нечто похожее на очень плохой топливный элемент).
Хотя возможно эти погрешности не так катастрофичны? Допустим для крупной теплицы такой метод будет выдавать данные с допустимыми погрешностями?
С теплицей пример возможно не слишком правильный, но со временем есть мысль автоматизировать у родителей теплицу. Потому хочется сразу разобраться


С горшками это работает. Теплица сложнее, большая и неравномерная по влажности поверхность и пр. тонкости.
Я привел эту ссылку как самый простой пример. Возможно ее стоит улучшить, для дополнительной защиты контроллера и минимизации проходящих токов, добавив сопротивление между 5v и гвоздем; поменять местами 5v и GND, конденсатор для стабилизации и пр.

Вот готовый измеритель. Цена порядка 100р или около того. Сейчас затрудняюсь на вскидку указать место, где его можно купить, но зато можно рассмотреть его тривиальную схему:

В ней как раз два резистора, один из которых уменьшает ток (между 5v и гвоздем 100-500Ом), второй выполняет функцию делителя (так же как в указанной схеме).
Еще там добавлен транзистор, по мне, так это лишняя запчасть, он разделяет электроды, когда датчик не подключен, т.е. когда на него не подается питание. Какой в этом скрытый смысл, я понять не могу, никакого влияния на показания он не имеет.

Вы попробуйте собрать и протестить, сразу и поймете, стоит использоавть такую схему или нет. Я использую такое исполнение, меня результат вполне устраивает. Зачем мне городить сложную схему, когда Arduino может выполнить 99% работы.

Опять же повторюсь, показатели будут скакать в определенном диапазоне, иногда довольно сильно. Поэтому надо использовать алгоритмы коррекции ошибок, т.е. сверять текущие показания с предыдущими. Примерно так:

float d = 0.2; // Степень доверия датчику от 0 до 1 (чем точнее датчик, тем больше может быть это значение)
float h;
void Setup()
{
h = AnalogRead(0); // Считываем начальное значение датчика. Датчик висит на 0-вом входе.
}

void Loop()
{
h = AnalogRead(0)*d + h*(1-d); // Это некая аналогия программно реализованного конденсатора.
}



Изменено 14-5-2012 автор CiberRus
2012-05-14 добавлено 14/05/2012 12:33:06#370236

Новенький





22
Singapore Singapore
11 г. назад
На фото готового устройства для сестры добавлены три кнопочных
выключателя. Для чего?
Можно ли модернизировать устройство так, что бы можно было вводить к примеру
желаемую температуру не через программу, а через цифровую клавиатуру?
Тогда бы это был полноценный автономный прибор.

http://www.sgbotic.c...

Изменено 5-6-2012 автор Alex1503
2012-05-15 добавлено 15/05/2012 15:43:17#370358

Посетитель





78 2
Palestinian Territory Ramallah
5 г. назад
Alex1503


При нажатии определенной кнопки происходит определенное действие (например, вкл/откл подсветки экрана, вкл/откл режим линька, вкл/отк слабого освещения в террариуме в ночное время)

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

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

Полноценность и автономность прибора была соблюдена!

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

Изменено 15-5-2012 автор CiberRus
2012-05-15 добавлено 15/05/2012 16:14:23#370362

Новенький





22
Singapore Singapore
11 г. назад
Было бы интересно ( думаю не мне одному) посмотреть текст программы с использованием вышеперечисленных кнопок.
Сейчас в процессе создания контроллера для морского аквариума и домашней минитеплицы.
Живу в Сингапуре, а здесь стоит проблема не нагрева, а охлаждения будь то воды или почвы.
Примеры из Ваших скетчей оказались мне очень полезны.
2012-05-15 добавлено 15/05/2012 16:45:29#370365

Посетитель





78 2
Palestinian Territory Ramallah
5 г. назад
6. Кнопки и хранение параметров
Цель. Поставим простую задачу, пусть есть два параметра (желаемая температура и влажность),
1. При удержании первой кнопки переходим в режим программирования с позицией на изменение первого параметра.
2. При коротком нажатии на первую кнопку осуществляется переход на изменение последующего параметра, а если параметры закончились, то выходим из режима программирования.
3. При коротком нажатии на вторую кнопку в режиме программирования будем добавлять +1 к параметру, а при достижении верхней границы (пусть для температуры это будет 40С, а влажности 95%) - обнулять его.
4. При удержании второй кнопки в режиме программирования будет происходить циклическое увеличение значения.
5. Установленные значения будем сохраненять в энергонезависимой памяти устройства (чтобы при повторном включении или перезагрузке установленные значения не сбросились).

Кнопки:
Описание схемы подключения и простой пример смотрим, например, тут: http://arduino.ru/tutorials/button
Достаточно подробный видеоурок: " class="alink" target="_blank">Часть 1, " class="alink" target="_blank">Часть 2.
Видеурок о использовании прерываний с пояснением, как "грамотно" подключить кнопку: " class="alink" target="_blank">Прерывания. Прерывания позволяют более лаконично и удобочитаемо оформить код, но требуют аппаратных доработок, а так же более глубокого понимания среды программирования. Нам достаточно и простого подключения, возможные аппаратные проблемы (такие как дребезг контакта) решаются на программном уровне.
Для того, чтобы обезопасить устройство от возможного короткого замыкания, стоит ограничивать цепь замыкания кнопки резистором 100-200 Ом. Зачем это надо? Можно случайно ошибиться в программном коде, или старый код устройства может иметь функционал, который может привести к неблагоприятным последствиям для контроллера. К примеру, кнопка подведена ко 2-му контакту, а в скетче имеется такой текст:
pinMode(2, OUTPUT);
digitalWrite(2, LOW);

т.е. контакт 2 притянут к Земле, а это значит, что при нажатии на кнопку произойдет короткое замыкание, следствием которого может стать выход из строя контроллера. Наличие резистора в данном случае спасет устройство. (В примере я его не использую, т.к. он примитивный, и ошибиться трудно.)
Часто в проектировании приходится подтягивать контакты контроллера либо к Земле, либо к +5v. Из вышеизложенного примера видно, что прямое подключение необходимо использовать крайне осторожно, как минимум перед проектированием убедиться, что контроллер либо чист, либо старый код не несет в себе опасности.

Память
Описание библиотеки для работы с энергонезависимой памятью Arduino: http://arduino.ru/Reference/Library/EERPOM
К сожаленю есть один недостатки этой памяти, основной - ограниченный ресурс перезаписи, что накладывает ограничения на область применения. Собственно наша задача не требовательна к частым изменениям значений ячеек, т.е. не имеет противопоказаний к использованию данного инструментария. А к примеру если решать задачу с накоплением статистики в энергонезависимой памяти, то это быстро приведет к сбою ячеек.

Прототип:


Скетч:
#include <EEPROM.h> // Подключаем библиотеку для работы с энергонезависимой памятью

#define switchPIN_1 3 // Кнопка №1 на 3-ем контакте
#define switchPIN_2 2 // Кнопка №2 на 2-ом контакте

int temp; // Декларируем переменную, которая будет хранить желаемую температуру
int hum; // Декларируем переменную, которая будет хранить желаемую влажность
int edit = 0; // Переменную будем использовать для определения режима редактирования
long last_micros = 0; // Вспомогательная переменная, используется для определения сколько микросекунд прошло после предыдущей операции
int lastButton1 = LOW; // Предыдущее состояние кнопки №1
int currentButton1 = LOW; // Текущее состояние кнопки №1
int lastButton2 = LOW; // Предыдущее состояние кнопки №2
int currentButton2 = LOW; // Текущее состояние кнопки №2

void setup() // инициализация основных данных
{
Serial.begin(9600); // Инициализируем COM-порт
temp = EEPROM.read(1); // Получаем параметр из первой ячейки
if (temp == 255) temp = 28; // Если ячейка пуста, т.е. ее значение = 255, то устанавливаем параметр температуры в значение по умолчанию, в данном случае 28С.
hum = EEPROM.read(2); // Получаем параметр из второй ячейки
if (hum == 255) hum = 60; // Если ячейка пуста, то установим параметр в 60%
pinMode(switchPIN_1, INPUT); // Устанавливаем тип контакта Кнопки №1 как Вход
pinMode(switchPIN_2, INPUT); // Устанавливаем тип контакта Кнопки №2 как Вход
pinMode(13, OUTPUT); // Т.к. мы не будем использовать в примере дисплей и пр. методы индикации, задействуем хотябы сигнальный светодиод.
}

void loop() // зацикливание (код управляющей программы)
{
static unsigned long lastTime = 0; // Декларируем переменную и устанавливаем ее начальное значение в 0
if (millis() - lastTime > 3000) // Не используем в данном случае задержку Delay, т.к. это приведет к запаздыванию нажатий кнопок
{
Serial.print("t="); Serial.print(temp); Serial.print(" h="); Serial.println(hum); // Отправляем информацю о параметрах на COM-порт каждые 3 секунды
lastTime = millis();
}
Switch();
}

void Switch()
{
if (millis() - last_micros >= 300) // Производим опрос кнопок каждую треть секунды, это необходимо, чтобы избежать повторных выполнений кода в следствие дребезга контактов
{
last_micros = millis();
currentButton1 = digitalRead(switchPIN_1); // Считываем текущее состояние кнопки №1
currentButton2 = digitalRead(switchPIN_2); // Считываем текущее состояние кнопки №1

if (lastButton1 == LOW && currentButton1 == HIGH) // Если Кнопка №1 изменила состояние на Нажатие
{
long t_millis = millis(); // Фиксируем начальное время нажатие кнопки, чтобы определить, не была ли она зажата
while (digitalRead(switchPIN_1) == HIGH && millis() - t_millis <= 2000 && edit==0) {} // Пока кнопка зажата не даем программе двигаться дальше
if (millis() - t_millis > 2000) // Если кнопка была нажата дольше 2-х секунд, то переведем состояние в режим программирования
{
edit = 1;
digitalWrite(13, HIGH); // Зажгем сигнальный светодиод, чтобы понять что "чудо" произошло
}
// Иначе отрабатываем короткое нажатие при различных условиях
else if (edit==1) edit = 2; // Если программа была в режиме изменения первого параметра, переведем ее на изменение второго параметра
else if (edit==2) // Если программа была в режиме изменения второго параметра, переведем ее в штатный режим и сохраним параметры в энергонезависимую память
{
edit = 0;
EEPROM.write(1, temp); // Запимываем параметр температуры в 1-ю ячейку памямти
EEPROM.write(2, hum);
digitalWrite(13, LOW); // Потушим сигнальный светодиод
}
else {}; // Если программа не была в режиме редактирования, то можно выполнить тоже какое-то действие, для этого в фигурных скобках необходимо описать его функционал
}
if (currentButton2 == HIGH && edit != 0) // Если нажата Кнопка №2, при состоянии редактирования параметров то...
{
if (edit == 1) // ...если режим изменения температуры
{
temp = (temp == 40) ? 0temp+1);
}
else if (edit == 2) // ...если режим изменения влажности
{
hum = (hum == 95) ? 0hum+1);
}
}
else if (lastButton2 == LOW && currentButton2 == HIGH) // Если было короткое нажатие на Кнопку №2 не в режиме редактирования, то можно выполнить какое либо действие, если описать его в фигурных скобках ниже
{}
lastButton1 = currentButton1; // Запоминаем предыдущее значение Кнопки №1
lastButton2 = currentButton2; // Запоминаем предыдущее значение Кнопки №2
}
}


На состоянии COM-порта убеждаемся, что все работает:


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

Изменено 15-6-2012 автор CiberRus
2012-06-09 добавлено 09/06/2012 12:03:47#372590

Новенький





22
Singapore Singapore
11 г. назад
Большое спасибо за статью про кнопки.

Вы написали, что энергонезависимая память EEPROM имеет
ограниченный ресурс перезаписи.
У меня Arduino UNO, у которого EEPROM равен 1 Кб .
Значит ли это, что через тысячу с небольшим запоминаний произойдет сбой?

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

Это пример из Вашего скетча:
tStatus = (t < ((Day) ? tempDay : tempNight)) ? LOW:HIGH; // Если температура меньше желаемой, то статус обогревателя=Вкл, в противном случае Выкл
digitalWrite(tPIN, tStatus);
if (h < ((Day) ? humDay : humNight)) hStatus = LOW; else hStatus = HIGH; // Если влажность меньше желаемой, то статус увлажнителя=Вкл, в противном случае Выкл
Значит ли это два варианти записи одного и того же?

Я делитант в этом деле, поэтому вопросов много и извиняюсь если они не очень грамотные.

Хочу сделать контроллер для морского аквариума с возможностью плавного нарастания и затухания LED света , то есть имитации рассвета и заката. Света два, белый и синий. Каждый должен себя вести по своему. Кроме того нужен режим Moon Light, когда ночью горит в очень слабом режиме только синий.
Собираюсь использовать примеры из Ваших скетчей и нижеприведенной ветки
http://www.reefledco...
Вопрос рассвета и заката в скетчах из этой ветки решается немного по другому.

Для увеличения числа свободных пинов хочу перейти на использование Serial Enabled LCD.
Параллельное подключение уже освоил, все оказалось довольно просто.
В Вашем проекте использован дисплей с интерфейсом SPI.
Я так понимаю, что скетч написан под конкретный SPI интерфейс (а где его взять?) и если купить готовый интерфейс ( скажем вот этот http://www.sparkfun.... , что для меня проще), то скетч будет абсолютно другой. Правильно?

Спасибо.

Изменено 17-6-2012 автор Alex1503
2012-06-17 добавлено 17/06/2012 05:48:19#373229

Посетитель





78 2
Russian Federation Moscow
5 г. назад
сообщение Alex1503
Вы написали, что энергонезависимая память EEPROM имеет
ограниченный ресурс перезаписи.
У меня Arduino UNO, у которого EEPROM равен 1 Кб .
Значит ли это, что через тысячу с небольшим запоминаний произойдет сбой?

Запись в EEPROM занимет 3.3 милисекунды. EEPROM память расчитана на 100,000 циклов записи/удаления, это следует учитывать при разработке программ.

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

Я указал методику организации меню, далее все по аналогии. Конечно же не надо пытаться запомнить в памяти установленное время, это не имеет никакого смысла. Приведу пример для изменения минут (пусть это будет режим 3):

else if (edit == 3)
{
int Minute = RTC.get(DS1307_MIN,true); // Получаем значение текущей минуты
RTC.set(DS1307_MIN, (Minute ==59) ? 0Minute + 1)); // И сразу сохраняем в DS1307 значение на 1 большее, или 0 если дошли до 59.
}

Это пример из Вашего скетча:
tStatus = (t < ((Day) ? tempDay : tempNight)) ? LOW:HIGH; // Если температура меньше желаемой, то статус обогревателя=Вкл, в противном случае Выкл
digitalWrite(tPIN, tStatus);
if (h < ((Day) ? humDay : humNight)) hStatus = LOW; else hStatus = HIGH; // Если влажность меньше желаемой, то статус увлажнителя=Вкл, в противном случае Выкл
Значит ли это два варианти записи одного и того же?

Да, вы правильно подметили. Тернарная операция O1 ? O2 : O3 аналогична конструкции if O1 then O2 else O3. Ее часто используют, чтобы сократить запись.

Хочу сделать контроллер для морского аквариума с возможностью плавного нарастания и затухания LED света , то есть имитации рассвета и заката. Света два, белый и синий. Каждый должен себя вести по своему. Кроме того нужен режим Moon Light, когда ночью горит в очень слабом режиме только синий.
Собираюсь использовать примеры из Ваших скетчей и нижеприведенной ветки
http://reefcentral.c...
Вопрос рассвета и заката в скетчах из этой ветки решается немного по другому.

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

Для увеличения числа свободных пинов хочу перейти на использование Serial Enabled LCD.
Параллельное подключение уже освоил, все оказалось довольно просто.
В Вашем проекте использован дисплей с интерфейсом SPI.
Я так понимаю, что скетч написан под конкретный SPI интерфейс (а где его взять?) и если купить готовый интерфейс ( скажем вот этот http://www.sparkfun.... , что для меня проще), то скетч будет абсолютно другой. Правильно?

Вы можете использовать любой интерфейс подключения. Различия от приведенных примеров как правило будут в подключаемых библиотеках и строке инициализации (они отмечены зеленым для SPI, красным для прямого подключения), остальные процедуры и функции идентичны. К приобретаемым девайсам часто дают ссылки на библиотеку и пример использования, по которым можно понять, не будет ли проблем с освоением. Судя по библиотеке
http://arduino.cc/playground/Code/SerLCD для указанного драйвера все процедуры один в один как в базовой.

Изменено 17-6-2012 автор CiberRus
2012-06-17 добавлено 17/06/2012 10:03:39#373245

Новенький





22
Singapore Singapore
11 г. назад
Спасибо за быстрый и понятный ответ.

По поводу сайта конкретного вопроса нет, просто я думал, что Вам будет интересно ознакомиться.
Ваш вариант решения мне понравился больше потому, что он дает плавное, а не ступенчатое
изменение света.
http://pastie.org/17...
Так, что буду комбинировать лучшее из скетчей.

Изменено 17-6-2012 автор Alex1503
2012-06-17 добавлено 17/06/2012 11:13:50#373255

Новенький





22
Singapore Singapore
11 г. назад
Как надо изменить Ваш конечный скетч чтобы он компилировался в Arduino-1.0?
Я использую стандартное подключение LCD.
2012-07-28 добавлено 28/07/2012 10:45:11#376793

Посетитель





78 2
Palestinian Territory Ramallah
5 г. назад
сообщение Alex1503
Как надо изменить Ваш конечный скетч чтобы он компилировался в Arduino-1.0?
Я использую стандартное подключение LCD.


Если нет особой необходимости, то лучше использовать версию 0.23.
99% библиотек и примеров в сети написаны под старые версии.
Т.к. в 1.0 были переименованы некоторые базовые библиотеки, то большинство библиотек и скетчей потеряли совместимость. Так же изменены некоторые функции.
Если Вы не обладаете углубленным знанием обоих платформ, то нет смысла пытаться их подружить с 1.0. В большинстве случаев это не сложно, но цель не оправдывает средств, 1.0 не несет каких-либо качественных изменений стоящих того, чтобы копаться в модулях библиотек.
1.0 и выше есть смысл использовать, если 0.23 не поддерживает вашу плату (К примеру у Вас Arduino Leonardo).
Если Вы все же намерены использовать 1.0, то изучите эту статью:
http://arduino.cc/en/Main/ReleaseNotes
Из нее следует:
1. В модулях и скетчах, где есть указание:
#include "WProgram.h"
его необходимо заменить на
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
2. Функции write(), print(), и println() возвращают занчение size_t(). Это может приводить к несоответствию типов в новой платформе.
3. Так же проблемы возникают с функциями библиотеки Wire.h
2012-07-30 добавлено 30/07/2012 09:17:13#376911

Новенький





22
Singapore Singapore
11 г. назад
Дело в том, что я купил Sparkfun Serial Enabled LCD Backpack ( писал о нем ранее), но библиотека serLCD
( предложенная Вами, очень удобная и простая ) написана для 1.0 версии. Попробовал прилагающиеся к библиотеке примеры,
прекрасно работают в 1.0 , но в 0.023 не компилируются.
Хотел в Вашем конечном скетче ( кстати прекрасно работает, а за кнопки особое спасибо )
перейти на серийное подключение LCD, но не получается. Надо или Ваш скетч перевести в 1,0 или найти другую библиотеку ( для 0,023 ), а существует ли она.
Кстати и имеющаяся работает только с 16х2 дисплеем.
Есть другие варианты кодов для Sparkfun Backpack , но они слишком ветьеватые для меня так как только начинаю осваивать Arduino.

Заказал себе комплект измерения pH для Arduino https://www.atlas-sc...
Получу через неделю. Выяснилось, что образец кода придаваемый к устройству тоже написан для версии 1,0.
Я хотел добавить к вашему скетчу, но опять проблема.
Если получится с pH, то в перспективе надо будет доьавить https://www.atlas-sc...

Да вот еще один вопрос.
А что если надо чтобы дневные параметры начинались не в 8, а скажем в 8.30, а светодиодная лента начала увеличение яркости не
в 7, а в 7.40?

Изменено 4-8-2012 автор Alex1503

Изменено 4-8-2012 автор Alex1503

Изменено 5-8-2012 автор Alex1503

Изменено 5-8-2012 автор Alex1503

Изменено 5-8-2012 автор Alex1503

Изменено 5-8-2012 автор Alex1503
2012-07-31 добавлено 31/07/2012 16:08:21#377068

Посетитель





78 2
Palestinian Territory Ramallah
5 г. назад
сообщение Alex1503
Да вот еще один вопрос.
А что если надо чтобы дневные параметры начинались не в 8, а скажем в 8.30, а светодиодная лента начала увеличение яркости не
в 7, а в 7.40?

Есть много вариантов подходов к решению, оптимальный зависит от конкретной задачи. Универсальный подход - перевести часы в минуты.
Например:
FullMinutes = Hour * 60 + Minute;
boolean Day = (FullMinutes >= 8 * 60 + 30 & FullMinutes <20 * 60); // Определение День не День
int sdStatus = min(map(FullMinutes, 7*60+40, 8*60, 0, 255), map(FullMinutes, 20*60, 21*60, 255, 0)); // Получаем мощность подсветки в зависимости от времени (с 7.40 до 8.00 плавно увеличиваем, с 20.00 до 21.00 плавно уменьшаем)
analogWrite(sdPIN, constrain(sdStatus, 0, 255)); // ограничиваем значение мощности допустимым интервалом (0;255)
2012-08-08 добавлено 08/08/2012 13:29:22#377726

Новенький





22
Singapore Singapore
11 г. назад
С минутами разобрался, спасибо.
Я так понимаю, что единственная причина, по которой Ваш код не компилируется в v1.0 - это библиотека DS1307.h.
Пробовал сам ее переделать следуя Вашим рекомендациям, не получилось.
Обращался в : http://arduino.cc/fo...
Затем в : http://arduino.ru/fo...
Бесполезно. Видно непростая задача.
2012-08-12 добавлено 12/08/2012 06:11:52#377955

Посетитель





78 2
Palestinian Territory Ramallah
5 г. назад
сообщение Alex1503
С минутами разобрался, спасибо.
Я так понимаю, что единственная причина, по которой Ваш код не компилируется в v1.0 - это библиотека DS1307.h.
Пробовал сам ее переделать следуя Вашим рекомендациям, не получилось.
Обращался в : http://arduino.cc/fo...
Затем в : http://arduino.ru/fo...
Бесполезно. Видно непростая задача.


Вот ссылка на DS1307 для 1.0:
http://arduino.cc/forum/index.php?topic=93077.0
2012-08-13 добавлено 13/08/2012 07:49:02#378011

Новенький





22
Singapore Singapore
11 г. назад
DS1307
Заработало!
Огромное спасибо.
2012-08-16 добавлено 16/08/2012 18:17:42#378375

Новенький





22
Singapore Singapore
11 г. назад
Ethernet shield
Дополнил Вашу систему pH и EC измерителями. Очень доволен.
Недавно прикупил Ethernet shield R3. Хотелось бы иметь возможность
проверять параметры системы находясь на удалении используя интернет.
Есть ли готовые наработки в этом направлении?
2012-09-29 добавлено 29/09/2012 06:06:45#382498

Новенький





13
Russian Federation Saint Petersburg
4 г. назад
CiberRus

Спасибо. Есть вопрос к топикстартеру.
Возможно ли управление большими нагрузками без использования реле? К примеру у меня стоит терморегулятор, управляющий нагрузкой до 500вт и он включает обогреватель бесшумно. А увлажнитель включается через реле и меня его щелканье по ночам достало.
Если возможно, то как это реализовать на arduino? Спасибо.
P.S. Если долго объяснять, дайте ссылку, желательно в духе темы, кратко на отдельной готовой плате и по бросовой цене.
2012-10-18 добавлено 18/10/2012 19:09:58#384509

Посетитель





78 2
Palestinian Territory Ramallah
5 г. назад
сообщение Policemen1984
CiberRus

Спасибо. Есть вопрос к топикстартеру.
Возможно ли управление большими нагрузками без использования реле? К примеру у меня стоит терморегулятор, управляющий нагрузкой до 500вт и он включает обогреватель бесшумно. А увлажнитель включается через реле и меня его щелканье по ночам достало.
Если возможно, то как это реализовать на arduino? Спасибо.
P.S. Если долго объяснять, дайте ссылку, желательно в духе темы, кратко на отдельной готовой плате и по бросовой цене.


Одним из вариантов регулирования нагрузки, как вкл/выкл так и плавное ее изменение, является использование симистора.

Самая простая схема реализации реле приведена в даташите к оптодрайверу, который удобно использовать для управления симистором через порт микроконтроллера: http://www.datasheetcatalog.org/datasheet/motorola/MOC3061.pdf

Вот более наглядная картинка:


Причем, если изначально известно, что нагрузка не индуктивная, то из схемы можно исключить RC цепь между выходами симистора, в общем случае лучше не исключать.
Пример индуктивной нагрузки: двигатель, трансформатор; неиндуктивная: лампа накаливания, обогреватель.
Стоимость компонентов для одного реле: Оптодрайвер 30р, симистор 30р, 3 резистора по 3р, (+резистор и конденсатор для RC еще 10р).
Пример реализации

!!!Не стоит забывать, что при работе с 220v необходимо детально ознакомиться с принципом работы симистора, его характеристиками, допустимыми значениями и схемой включения.

Еще один вариант - твердотельное реле.


Принцип действия прост, контакты 1 и 2 в разрыв высоковольтной нагрузки, контакт 4 - земля, 3 - пин arduino.

Я покупал тут (рублей 120 за шт.): Поиск на e-bay

Альтернативой модуля из электромагнитных реле можно найти модуль из твердотельных:
8-ми канальный модуль твердотельных реле
Кстати всего 700р., считай в подарок.


Так же в случае с влажностью, если это не критично, в ночные часы можно ее не контролировать.

Изменено 19-10-2012 автор CiberRus
2012-10-19 добавлено 19/10/2012 08:30:36#384542

Новенький





46
Russian Federation Kazan
5 г. назад
CiberRus


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







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

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

Изменено 19-10-2012 автор Rust
2012-10-19 добавлено 19/10/2012 10:26:25#384552

Новенький





13
Russian Federation Saint Petersburg
4 г. назад
CiberRus

Спасибо, все очень наглядно и понятно, вобщем, в духе темы. Пишите еще!
2012-10-19 добавлено 19/10/2012 15:07:11#384572

Посетитель





78 2
Russian Federation Moscow
5 г. назад
сообщение Rust
CiberRus


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




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

code:

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) ? "+":" "); // Выводим индикатор работы увлажнения



2. Базовая библиотека DHT.h в случае ошибки посылает сообщение на COM-порт, к примеру при отсутствии датчика на своем месте. Чем чаще происходит опрос, тем чаще будет происходить отправка на COM, это может приводить к нежелательным последствиям, вплоть до артефактов на LСD дисплее. А если COM-порт задействован в разработке, то к лишним сигналам. Как правило, если датчик подключен, то и проблем нет, но все равно этот момент стоит учитывать, или немного переписать библиотеку (Удалить строки Serial.print("Read fail"); в двух местах файла DHT.cpp).

Изменено 20-10-2012 автор CiberRus
2012-10-20 добавлено 20/10/2012 21:26:33#384666

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