ARDUINO для автоматизации аквариума

<< 12345 78910111213 >>

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
ARDUINO для автоматизации аквариума
Создал отдельную тему по вопросам использования простых и не дорогих плат ARDUINO для целей автоматизации аквариума.
Идея такая - довести это устройство до полнофункционального контроллера для аквариума, в итоге - с WEB сервером для управления по сети в т.ч. Интернет, и GSM модулем с отправкой SMS.
Начало обсуждения в теме про дозатор :
http://www.aqa.ru/fo...

Информация будет, в основном, в виде конкретных примеров.

Пример 1. Использоание плат Arduino UNO и Arduino NANO для управления по времени суток устройствами в 2-х каналах посредством релейного модуля.
Предполагается использование для создания 2-х канального дозатора, но и для включения света, например подойдет, и для многих других целей также.

Используется модуль часов реального времени, для точного планирования по времени суток, и релейный модуль. В данном примере используется 4-канальный, но 2 канала не используются...

Схема коммутации в случае использования платы UNO R3:


Схема коммутации в случае использования платы NANO:


Программа для среды программирования Arduino:
//***************************************************
// Скетч для управления релейным модулем, в котором *
// использовано два канала. Используется также RTC *
// Релейный модуль - с инверсной логикой на входе *
// Автор: ZORS *
// Версия 1. Дата 21.12.2013 02:40 *
//***************************************************
//----------ИМПОРТ БИБЛИОТЕК-------------------------
#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC
#include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC

RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC

//----------Объявляем разные переменные------------
const int RelayChn1 = 6; //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
const int RelayChn2 = 7; //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля
//----------Настройки времени и продолжительности включения реле

//----------ПЕРВЫЙ канал----------------------------
const long StartRelCn_1 = 25200; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток)
//в данном случае 25200 - это 7 часов 00 минут = ( 60секунд *60 минут *7 = 25200)
const long DurationCh_1 = 10; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах)

//----------ВТОРОЙ канал----------------------------
const long StartRelCn_2 = 37800; //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток)
//В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800)
const long DurationCh_2 = 15; //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах)

//----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях)
void setup(){

pinMode(RelayChn1,OUTPUT); //Инициализируем порт для ПЕРВОГО канала как ВЫХОД
pinMode(RelayChn2,OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД

digitalWrite(RelayChn1,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
digitalWrite(RelayChn2,HIGH); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой



Wire.begin(); //Инициируем I2C интерфейс
RTC.begin(); //Инициирум RTC модуль

// RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале,
//для того, чтобы загрузить в RTC дату и время на момент компиляции программы
//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки
//времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!!

} // КОНЕЦ ИНИЦИАЛИЗАЦИИ

//--------------------------------------------------
void loop() // ПРОГРАММЫй безусловный ЦИКЛ
{
DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла

//----------Раздел обработки реле по времени ----
long utime = myTime.unixtime(); //сохраняем в переменную - время в формате UNIX
utime %= 86400; //Сохраняем в этой же переменной остаток деления на кол-во секнд в сутках,
//Это дает количество секунд с начала текущих суток

//------------КАНАЛ 1------------------------------
if ((utime >= StartRelCn_1) &&
(utime < (StartRelCn_1+DurationCh_1)))
//Если секунд с начала суток больше, чем задано для включения
//Но, одновременно и меньше, чем задано для включения + длительность
{
digitalWrite(RelayChn1,LOW); //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else //во всех остальных случаях
{
digitalWrite(RelayChn1,HIGH); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}

//------------КАНАЛ 2 - все аналогично -----------
if ((utime >= StartRelCn_2) &&
(utime < (StartRelCn_2+DurationCh_2)))
{
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}

}//------------Конец ЦИКЛА-----------------------------


(Редактор текста на данном сайте - к сожалению, "ломает" красивое форматирование.

PS: Выложил этот скетч на файлообменник :
http://my-files.ru/h...

В данной программе реализован, довольно-таки простой подход, а простота - основа надежности.

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

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

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

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

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

Весь этот пример тестировался на "живом" железе :

Для наглядности отладки был еще подключен LCD дисплей 16 сим в 2 строках.
Схема итоговая была такая:

Обратите внимание, что при использовании I2C последовательного интерфейса - соединения значительно упрощаются. И LCD дисплей подключен транзитом через модуль RTC (часов реального времени). Никаких паяных соединений нет вообще....все скоммутировано - проводами с разъемами.
Скетч - естественно, несколько другой использовался с добавлением строк инициализации и использования LCD 16x2.

Плата использовалась типа такой:
http://www.ebay.com/...
цена примерно 350 руб.

Релейный модуль
http://www.ebay.com/...
цена примерно 150 руб.

Модуль часов реального времени:
http://www.ebay.com/...
Цена примерно 55 руб.

Для сокращения бюджета можно использовать плату проще:
http://www.ebay.com/...
Цена примерно 200 руб.

Если есть потребность подключить ЖК дисплейчик, то лучше брать ЖК дисплей (LCD) c I2C интерфейсом - это сильно упрощает коммутацию, и сокращает количество использованных портов на микроконтроллере.
Например такой можно использовать :
http://www.ebay.com/...
цена около 180 руб.

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

Для использования I2C интерфейса - необходима библиотека Wire. Она есть в стандартном дистрибутиве среды программирования Arduino.
Для использования модуля RTC на микросхеме DS1307 нужна библиотека RTClib.
Если ее не будет в стандартном дистрибутиве, то ее можно взять в интернет. Например здесь :
http://arduino-info....

Необходимо, скачать, и разархивировать zip-файл в папку с понятным названием, например RTCLib. Затем эту папку поместить в папку, где среда Arduino хранит свои библиотеки. Если ставили среду программирования с настройками по умолчанию, то этой папкой будет :
C:\Program Files\Arduino\libraries
Сюда и помещайте папки с подключаемыми библиотеками. Если на этот момент, среда программирования была запущена - ее необходимо закрыть, и запустить заново. После этого библиотека будет доступна в меню Скетч/Импортировать библиотеку.

Микросхема RTC модуля DS1307, как правило использует адрес на шине I2C равный 0x68
поэтому, необходимо проверить в библиотечных файлах, библиотеки RTClib наличие строки типа этой:
#define DS1307_ADDRESS 0x68

Если будет использоваться LCD 16x2 с I2C интерфейсом, то - понадобиться библиотека LiquidCrystal_I2C. Можно скачать здесь :
http://dvrobot.ru/lc...
Как подключить к среде программирования Arduino - см. выше

ВАЖНО : при использовании I2C устройств - в скетче, библиотека Wire - должна быть объявлена первой, иначе - будут ошибки компиляции.

По этому примеру - все....

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


Изменено 24.12.13 автор Z0RS
2013-12-21 добавлено 21/12/2013 15:57:48#1907148

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
arch07
там юникс формат нельзя использовать? - тогда секунды проверять смысла нет. все равно мы периодом ввода поправок на 1 сек задаем.

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

В итоге выглядеть будет так:
Объявляем переменные
RTC_DS1307 RTC;
uint32_t TimeAdjustPeriod = 43200;
uint32_t TimeCorrection = 1;

Если TimeCorrection сделать отрицательной (-1) - то, наверное уже понятно, что время будет корректироваться в сторону убавления.
Причем можно убавлять/прибавлять не по одной секунде, а сразу несколько...это кому как будет востребовано.

В функции инициализации будет так:
void setup(){

Wire.begin();
RTC.begin();

}

В функции главного цикла будет так:
void loop() {

DateTime myTime = RTC.now();
uint32_t UTime = myTime.unixtime();

if (UTime > nextAdjustTime){
nextAdjustTime = UTime+TimeAdjustPeriod;
RTC.adjust(DateTime(UTime+TimeCorrection));
}

}

Потом, установка времени во время компиляции вот такой конструкцией, которая помещается в тело функции setup()
RTC.adjust(DateTime(__DATE__, __TIME__));
- приводит к отклонению установленного времени на количество секунд затраченное на заливку кода на микропроцессор.
Это при желании можно исправить, так же использую "любимый" формат времени UNIX:

RTC.adjust(DateTime(__DATE__, __TIME__));
DateTime myTime = RTC.now();
RTC.adjust(DateTime(myTime.unixtime()+11));

- здесь +11 это поправка на время компиляции в моем случае...

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

Кстати, каждая перезагрузка процессора - будет вызывать корректировку времени...но это можно исправить...только надо ли?
2014-04-01 добавлено 01/04/2014 03:29:25#1957596

Новичок




46
Germany
2 г. назад
Вот в этом куске кода нужно как-то избавиться от delay.

case btnUP:
{
lcd.setCursor(9, 0);
lcd.print("L");
for(int fadeValue = 0 ; fadeValue <= PWM_LR_MAX; fadeValue +=1)
{ analogWrite(PWM_LR_PIN, fadeValue);
delay(100);}
for(int fadeValue = 0 ; fadeValue <= PWM_LW_MAX; fadeValue +=1)
{ analogWrite(PWM_LW_PIN, fadeValue);
delay(100);}
break;
}
case btnDOWN:
{
lcd.setCursor(9, 0);
lcd.print("0");
for(int fadeValue = PWM_LW_MAX ; fadeValue >= 0; fadeValue -=1)
{ analogWrite(PWM_LW_PIN, fadeValue);
delay(100);}
for(int fadeValue = PWM_LR_MAX ; fadeValue >= 0; fadeValue -=1)
{ analogWrite(PWM_LR_PIN, fadeValue);
delay(100);}
break;

Изменено 1.4.14 автор kirex05
2014-04-01 добавлено 01/04/2014 13:54:40#1957716

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
kirex05
Вот в этом куске кода нужно как-то избавиться от delay.


У Вас при обработке события нажатия на кнопку в самой структуре множественного выбора case делается некоторая обработка, причем с организацией вспомогательных циклов for.
При таком построении функционала - никак нельзя избавиться от для чего-то требуемых задержек.

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

Тогда саму повторяемость структуры главного цикла можно использовать для того, что вы делаете в своих отдельных циклах, а именно для изменения значения, задаваемого в порт ШИМ. Пример, как это делается в главном цикле - есть в моем скетче с закатом и рассветом...да...там нет нажатия на кнопку, но есть увеличение значения параметра ШИМ именно в теле главного цикла, а не в отдельно организованных циклах, которые неизбежно затормозять выполнение главного цикла....

А для того, чтобы создавать задержки (для периодического повторения, например) какого-то действия в главном цикле, без его остановки (как это делает функция delay) - можно, например - использовать функцию millis(), или micros(), которые возвращают значение системных счетчиков в миллисекундах и в микросекундах соответственно.

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

Кстати, если вы это затеваете, чтобы делать плавное включение света - то , возможно, что в этом - нет необходимости, т.к. нормальные LED драйвера наращивают ток на светодиодной сборке не мгновенно, а с требуемой временной характеристикой - для защиты матриц. Разберитесь со своими драйверами - возможно, вы делаете то, что является избыточным...
2014-04-01 добавлено 01/04/2014 14:32:49#1957723

Свой на Aqa.ru




1148 187
Ростов-на-Дону
2 дн. назад
Z0RS

Так, за сутки часики убежали на 37 сек. Неужели это возможно?
Надо ставить коррекцию на полторы секунды с периодом каждый час ( 3600 сек).
2014-04-01 добавлено 01/04/2014 17:15:53#1957783

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
Дядька-рыбомор
Так, за сутки часики убежали на 37 сек. Неужели это возможно?


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

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

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


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

Изменено 1.4.14 автор Z0RS
2014-04-01 добавлено 01/04/2014 18:44:33#1957822

Новичок




2
Russian Federation
3 г. назад
Обращаюсь к автору темы. Собрал схему похожую на вашу, использую ваш код. Все работает первое время без нареканий. Но! Спустя некоторое время (все время разное) ардуина виснет. При этом на дисплее либо застывают символы в одном значении, либо выводятся кракозябры. Добавил дополнительный вывод в порт через сериал значение температуры. При зависании открываю монитор порта и вижу что ардуино перезагружается сам и все дальше нормально работает до следующего зависания. Подскажите в какую сторону копать!?
2014-04-02 добавлено 02/04/2014 08:16:23#1958004

Завсегдатай




460 39
Москва
3 мес. назад
plast88

Ну хоть я и не автор темы, но копать нужно начинать с питания.
Проверить соединения.
И затем попробовать заменить компоненты.
2014-04-02 добавлено 02/04/2014 08:47:55#1958019

Завсегдатай




460 39
Москва
3 мес. назад
Z0RS

А можно пояснить по OneWire? Я так понимаю в случае с термодатчиками мы их вешаем на один трехпроводной кабель параллельно и дальше определяем программно.
1. Резистор между +5 и Data - какой его функционал? Он один на всю шину или на каждый датчик.
2. Как выглядит опрос нескольких датчиков?
Читаю функцию из вашего скетча и не пойму.
Можно подробно как идиоту.
Я понял только проверки if(){} - 3 шт.


float getTemp(){ //функция чтения значения температуры с датчика DS18B20 по шине OneWire
byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
//no more sensors on chain, reset search
lcd.setCursor(0, 0);
lcd.print("NO more addrss!");

ds.reset_search();
return -1001;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
lcd.setCursor(0, 0);
lcd.print("CRC is not valid!");

return -1002;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
lcd.setCursor(0, 0);
lcd.print("NOT recognizd!");

return -1003;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1);

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE);


for (int i = 0; i < 9; i++) {
data[i] = ds.read();
}

ds.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float TRead = ((MSB<<8) | LSB);
float Temperature = TRead / 16;

return Temperature;
}
2014-04-02 добавлено 02/04/2014 09:51:35#1958058

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
plast88
....использую ваш код.

Какой конкретно?

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

plast88
Спустя некоторое время (все время разное) ардуина виснет. При этом на дисплее либо застывают символы в одном значении, либо выводятся кракозябры.

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

******Програмные
Одна из основных причин зависаний - некорректный код, приводящий либо к циклическому выполнению какой-нибудь ветки программы, либо утечки памяти.
С пямятью все сложнее.....нужно добавлять в код специальные функции периодически определяющие размер свободной памяти и выводящие это значение куда-нибудь, например в компорт.
Потом, есть даже некоторые библиотечные функции, которые не выполняются корректно на микроконтроллерах ATMEL. Особенно всевозможные макросы типа F () и PSTR (). Конструкции с этими макросами могут работать с зависаниями...
На шинах интерфейсов I2C и IC могут также быть конфликты приводящие к зависаниям МК.
И вообще много еще чего может быть...Отладка таких моментов - один из самых сложных процессов.

Для начала - напишите простейшую программу, по миганию светодиодом на 13 пине. Можно использовать пример с многокомандным таймером. Для 13 пина и мигания, скажем один раз в 6 секунд зажечь светодиод на 3 секунды - задание в структуре задач будет выглядеть так:
{13,6,0,3,HIGH}
Запустите этот пример, можно и без LCD. Светодиод на 13 пине должен загораться на 3 секунды, потом затмеваться на 3 секунды и так далее.
Таким образом проверите работоспособность железа своей платы. Этот пример у меня работал довольно долго...да и код проверен на утечки памяти. Если с железом все нормально, значит необходимо искать программные причины.

plast88
При зависании открываю монитор порта и вижу что ардуино перезагружается сам?

Каким образом? У Вас в программе есть какой-то вывод в компорт на этапе инициализации?
2014-04-02 добавлено 02/04/2014 10:03:24#1958063

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
arch07
А можно пояснить по OneWire? Я так понимаю в случае с термодатчиками мы их вешаем на один трехпроводной кабель параллельно и дальше определяем программно.
1. Резистор между +5 и Data - какой его функционал? Он один на всю шину или на каждый датчик.
2. Как выглядит опрос нескольких датчиков?


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

Если не разберетесь сами - то позже ...вечером...расскажу по-подробнее..
Сейчас ....извините .....дела....
2014-04-02 добавлено 02/04/2014 10:29:33#1958070

Новичок




2
Russian Federation
3 г. назад
Вывода в компорт на этапе инициализации нет. Я прописал вывод в порт значение с датчика (продублировал после вывода на дисплей вывод через serial. При открытии монитора порта, промаргивает светодиод питания (UNO) и по новой идет инициализация дисплея.
Моргание светодиодом попробую по вашему примеру, но до этого все другие програмки он нормально отрабатывал. Я склоняюсь больше к конфликту в i2c шине (там висит дисплей и датчик температурный) и проблеме с памятью.
Нагревов нет.

Изменено 2.4.14 автор plast88
2014-04-02 добавлено 02/04/2014 10:30:49#1958071

Новичок




46
Germany
2 г. назад
Z0RS
Я, в принципе уже устал повторять, что, обнаружение нажатия на кнопку необходимо делать в одном месте главного цикла, а обработку в другом


Да, только каким образом???
2014-04-02 добавлено 02/04/2014 12:41:58#1958122

Свой на Aqa.ru




1148 187
Ростов-на-Дону
2 дн. назад
Z0RS

Спасибо за помощь в корректировке времени. Во-первых, устранил разницу в 15 сек, которая образуется во время загрузки скетча (у вас 11 сек). Во-вторых, установил поправку в 1.5 сек за каждый час, через сутки посмотрим.
RTC компьютера у ме5ня синхронизированы с временем интернета (по умолчанию Linux).
ЗЫ.Кстати, в линуксе (у меня убунту 12.04 lts) программа для ардуино заработала сразу, а вот в старом добром win-xp почему-то закапризнячала, не смог разобраться с сом-портом. В win-7 тоже встала сразу без проблем.
2014-04-02 добавлено 02/04/2014 19:05:00#1958258

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
plast88
При открытии монитора порта, промаргивает светодиод питания (UNO) и по новой идет инициализация дисплея.

Это стандартный функционал. При инициализации USB порта на плате Arduino (если он присутствует конечно) - происходит сброс (reset) микроконтроллера. Это если не повреждена вот эта перемычка на плате :

Кстати на фотке кажется, что между площадками нет медной дорожки - но это не так, просто свержу перемычка прокрашена синим лаком
А если эту перемычку разорвать, то при присоединении к плате по USB и инициализации порта - сброс (reset) происходить не будет.

plast88
Я склоняюсь больше к конфликту в i2c шине (там висит дисплей и датчик температурный)......

Вот это очень интересный момент...вообще насколько я понимаю, у вас есть дисплей с I2C интерфейсным модулем, и температурный датчик DS18B20 или аналогичный?
Если это так, то эти устройства для 2 разных шин. I2C и IC (OneWire) - это разные шины, и должны организовываться на разных пинах. У вас так?

kirex05
Да, только каким образом???


В структуре множественного выбора (case) при опросе кнопок - устанавливаете переменную-флаг, а потом этот флаг обрабатываете в структуре проверки условия (if) которая размещается в теле функции главного цикла в самой левой позиции. А вот уж условие то, может включать, кроме проверки установленного флага, еще логически сложенное или умноженное (И/ИЛИ) проверку на совпадение значения переменной, в которой будет хранится значение, считанное предварительно функцией millis или micros...Ну это образно....
Так можно избавится от задержек в главном цикле.

Дядька-рыбомор

Не....я до сих пор в ХР....я этой операционкой доволен...
2014-04-02 добавлено 02/04/2014 21:04:28#1958303

Свой на Aqa.ru




1148 187
Ростов-на-Дону
2 дн. назад
Z0RS

Вопрос по вашему скетчу использования температурного датчика. Хотел бы, чтобы реле срабатывало не только при определенной температуре, но и в определенное время (к реле будут подключены кулеры, ночью не хочется слушать их песню). Вот такая конструкция кода, к примеру, возможна (разрешенный период работы кулеров с 8:00 до 22:00)?

void loop (){
if((temp > t0 + tGist/2) && (Utime >= 8*hr) && (Utime < 22*hr)){
digitalWrite(Ch3,HIGH);}
else if ((temp < t0 - tGist/2) && (Utime < 8*hr) && (Utime >= 22*hr)){
digitalWrite(Ch3,LOW);}
}

Собрал макет вашей схемы с несколькими диммируемыми драйверами, только вместо драйверов пока светодиоды через резистор 200 ом (драйверы идут с е-бей). Собрал воедино ваши коды универального мультитаймера и кусочек кода для рассвета-заката по ШИМ, только вместо одного ШИМ-выхода сделал два. Все на макете работает. Дальше ждем-с и потихоньку начинаю собирать все в "коробочку", т.е. в корпус.

Изменено 2.4.14 автор Дядька-рыбомор
2014-04-02 добавлено 02/04/2014 21:45:11#1958329

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
сообщение Дядька-рыбомор
Вот такая конструкция кода, к примеру, возможна ....?


У Вас есть конфликт условий в одном месте.
Когда время текущее (Кол-во секунд с начала суток) может удовлетворять вот этому кусочку в проверке условий?

(Utime < 8*hr) && (Utime >= 22*hr))
Это противоречит принципу непрерывности временного континуума...
Наверное необходимо что-то поменять?

Изменено 2.4.14 автор Z0RS
2014-04-02 добавлено 02/04/2014 22:31:12#1958349

Свой на Aqa.ru




1148 187
Ростов-на-Дону
2 дн. назад
сообщение Z0RS
(Utime < 8*hr) && (Utime >= 22*hr))
Это противоречит принципу непрерывности временного континуума...
Наверное необходимо что-то поменять?

А если поменять логически оператор с И на ИЛИ?
(Utime < 8*hr) || (Utime >= 22*hr))
2014-04-02 добавлено 02/04/2014 22:40:17#1958352

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
Дядька-рыбомор
А если поменять логически оператор с И на ИЛИ?


А это уже другое дело...

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

Изменено 2.4.14 автор Z0RS
2014-04-02 добавлено 02/04/2014 22:42:39#1958353

Свой на Aqa.ru




1148 187
Ростов-на-Дону
2 дн. назад
Z0RS

Вот так?
else if ((temp < t0 - tGist/2) || (Utime < 8*hr) || (Utime >= 22*hr))
2014-04-02 добавлено 02/04/2014 22:51:02#1958361

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
Дядька-рыбомор

Так то оно так. И работать наверное будет это код нормально.

Только вот давайте по-рассуждаем на качеством кода.
Когда мы собираем оператором И три условия во едино (т.е. все они выполняются) то вся строка условия будет = 1. А единица, истина (true) и HIGH - это синонимы, также как и 0, false, и LOW. Ни на какие мысли не наводят такие рассуждения?
2014-04-03 добавлено 02/04/2014 23:05:47#1958366

Свой на Aqa.ru




1148 187
Ростов-на-Дону
2 дн. назад
сообщение Z0RS
Когда мы собираем оператором И три условия во едино (т.е. все они выполняются) то вся строка условия будет = 1. А единица, истина (true) и HIGH - это синонимы, также как и 0, false, и LOW. Ни на какие мысли не наводят такие рассуждения?

Вы имеете в виду, что можно заменить else if (......){} на просто else {}, т.е. при невыполнении даже одного из трех обязательных условий действие (вкл реле) выполняться не будет? Я правильно понял?
2014-04-03 добавлено 02/04/2014 23:16:15#1958371

Завсегдатай




460 39
Москва
3 мес. назад
Имхо else if и все сравнение
тут излишни - достаточно простого else.

else if требуются, если будет что-то исключая первое условие (if) и второе, описанное в (elseif).
а у простого реле только 2 положения.

А я тут запарился с onewire - вернее с определением адреса термодатчика и корректного его применения.
Я один хочу сунуть в аквариум, а второй как раз на радиатор освещения. И использовать одну функцию, которая при аргументе 1 выдавала температуру с 1 датчика, а при аргументе 2 - со второго.
Причем надо как-то в настройках хранить где-какой. Иначе при замене датчика придется лезть в код и править. А по опыту эксплуатации подобных датчиков они любят выходить из строя - на даче за 5 лет из 4-х датчиков только два работают.

И еще вопросик. А как можно организовать управление 3-х контактным кулером? там не шим-сигнал управляющий, а напряжение
Так вот ночью не совсем отключать кулера в случае перегрева, а просто снижать обороты.
2014-04-03 добавлено 02/04/2014 23:20:43#1958372

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
Дядька-рыбомор
Я правильно понял?


Не..совсем...точее совсем не...

Я имел ввиду конструкцию типа:

digitalWrite(Ch3,((temp > t0 + tGist/2) && (Utime >= 8*hr) && (Utime < 22*hr)));

Ну, это для тех, кто "вкурил" философию языка СИ. И Вас хотел подвести к осознанию возможности такой конструкции, но не расстраивайтесь, что сразу не поняли...это пройдет, с некоторым количеством написанного самостоятельно кода.
2014-04-03 добавлено 02/04/2014 23:24:20#1958374

Свой на Aqa.ru




1148 187
Ростов-на-Дону
2 дн. назад
сообщение arch07
И еще вопросик. А как можно организовать управление 3-х контактным кулером? там не шим-сигнал управляющий, а напряжение
Так вот ночью не совсем отключать кулера в случае перегрева, а просто снижать обороты.

Аппаратное решение сразу приходит на ум: через реле. В одном положении (ВКЛ) на кулер подается, к примеру, 12 В, а в другом (ВЫКЛ) - 5 В. За программным решением - к топикастеру
2014-04-03 добавлено 02/04/2014 23:26:15#1958375

Свой на Aqa.ru




1148 187
Ростов-на-Дону
2 дн. назад
Z0RS

Да, сразу не подумал, так ведь тоже можно. Спасибо.
2014-04-03 добавлено 02/04/2014 23:29:48#1958376

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