Перейти к содержанию

Аквариумный контроллер


Гость Роман

Рекомендуемые сообщения

Добрый всем день!

Являюсь владельцем 2х аквариумов, в одном взрослые рыбы в другом мальки, и решил сделать автоматический свет + охлаждение аквариума. Для этого купил в adruino nano 3, 2 шт термодатчика влагозащищенных DS18B20, модуль часов Ds3231 AT24C32 IIC, дисплей 0.96 " I2C IIC 128*64, и 8 канальное реле.

что получилось это настроить 6 каналов на управление светом в зависимости от времени суток,

не получается прописать 2 термодатчика для управления 7м и 8м каналом, каждый датчик подключается к 3 и 4 ножкам контроллера,

кто подскажет как это сделать?

после как все заработает выложу все суда и картинками и готовым скетчем

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

это цифровые датчики, вешаются на шину I2C, которая занята вашим дисплеем, возьмите термопары и посадите их на АЦП

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

это цифровые датчики, вешаются на шину I2C, которая занята вашим дисплеем, возьмите термопары и посадите их на АЦП

Если вы не знали, на I2C можно до 127 устройств подключить. И это все на всего два провода!

DS18B20 использует протокол 1-wire и ни какой i2c. Все подключается вообще на 1 провод! (на один пин)

Аппаратной поддержки протокола 1 wire в вашей микросхеме нет, в апноутах атмела описывается как можно для управления 1-wire приладить аппаратный uart. Даже либы есть

Изменено пользователем mixan23
Ссылка на комментарий
Поделиться на другие сайты

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

АVR не имеет на борту 1-wire, или ее пишут программно, или используют I2C.

и если я не ошибаюсь именно I2C пришло на замену 1-wire

сначала был 1-wire потом вырос до 2-wire(TWI, TWSI) он же I2C

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Тренды и лучшие решения для разработки зарядных станций в России

К 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

и если я не ошибаюсь именно I2C пришло на замену 1-wire

Ошибаетесь, как раз всё наоборот...

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

Секреты депассивации литиевых батареек FANSO EVE Energy

Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

нашел))) верно все.

кстати нашел и библиотеки для 18в20, можно на любой вывод вешать, только в либе указать на какой

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

//----------ИМПОРТ БИБЛИОТЕК-------------------------
#include <OneWire.h>							 //Подключаем библиотеку для использования однопроводного интерфейса, Температурного датчика DS18B20
#include <Wire.h>								 //Подключаем библиотеку для использования I2C интерфейса с модулем RTC, который также испольует I2C
#include <DS1307.h>								 // Подключение библиотеки для часового модуля
DS1307 rtc(A0, A1);
//---------------------------------------------------
int TSensorPin1 = 3;							 //Определяем порт шины OneWire (IC) для температурного датчика DS18B20 1
int TSensorPin2 = 4;							 //Определяем порт шины OneWire (IC) для температурного датчика DS18B20 2
OneWire ds1(TSensorPin1);						 //Создаем соответсвующий объект 1 термодатчик
OneWire ds2(TSensorPin2);						 //Создаем соответсвующий объект 2 термодатчик
#include <OLED_I2C.h>							 // Подключение библиотеки для дисплея
OLED myOLED(SDA, SCL, 8);
//----------Объявляем разные переменные--------------
const int RelayChn7 = 11;						 //Используем цифровой ПОРТ 8 для 7 канала релейного модуля
const int RelayChn8 = 12;						 //Используем цифровой ПОРТ 8 для 8 канала релейного модуля
//----------Терморегуляторы
//----------Седьмой КАНАЛ----------------------------
float t0 = 26.0;									 //Уставка температуры для 7 канала релейного модуля 1 аквариум
float tGistrsis = 0.7;							 //Уставка гистерезиса - т.е отклонения от темп-ры уставки
												 //т.е. в данном случае 0,7 = плюс минус 0,35 градуса
//----------Восьмой КАНАЛ----------------------------
float t1 = 26.0;									 //Уставка температуры для 8 канала релейного модуля 2 аквариум
float tGistrsis = 0.7;							 //Уставка гистерезиса - т.е отклонения от темп-ры уставки
												 //т.е. в данном случае 0,7 = плюс минус 0,35 градуса
//----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях)
void setup(){
pinMode(RelayChn7,OUTPUT);					 //Инициализируем порт для 7 канала как ВЫХОД
pinMode(RelayChn8,OUTPUT);					 //Инициализируем порт для 8 канала как ВЫХОД

digitalWrite(RelayChn7,HIGH);				 //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
digitalWrite(RelayChn8,HIGH);				 //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой					
Wire.begin();								 //Инициируем I2C интерфейс
myOLED.begin();
rtc.halt(false);
// rtc.setDOW(SUNDAY);							 // Настройка дня недели
// rtc.setTime(12, 0, 0);						 // Настройка времени
// rtc.setDate(10, 05, 2015);					 // Настройка даты
}												 // КОНЕЦ ИНИЦИАЛИЗАЦИИ
//--------------------------------------------------
void loop()										 // ПРОГРАММЫй безусловный ЦИКЛ
{
DateTime myTime = RTC.now();					 //Читаем данные времени из RTC

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

//----------Вывод температуры на ЖК--------------
float temp = getTemp();						 //Читаем температуру с датчика (как тут указать 2ой термодатчик)
lcd.setCursor(11, 0);						 // тут для ОЛЕД экрана переделаю
lcd.print(temp);
//------------КАНАЛ 7 Контроль температуры -------
if (temp < t0-tGistrsis/2)
 {
 digitalWrite(RelayChn7,LOW);				 //Устанавливаем на 7 входе релейного модуля НИЗКИЙ уровень - реле срабатывает
 }	
else if (temp > t0+tGistrsis/2)
 {
 digitalWrite(RelayChn7,HIGH);			 //Устанавливаем на 7 входе релейного модуля ВЫСОКИЙ уровень - реле выключается
 }	
 //------------КАНАЛ 8 Контроль температуры -------
if (temp < t1-tGistrsis/2)
 {
 digitalWrite(RelayChn8,LOW);				 //Устанавливаем на 8 входе релейного модуля НИЗКИЙ уровень - реле срабатывает

 }	
else if (temp > t1+tGistrsis/2)
 {
 digitalWrite(RelayChn8,HIGH);			 //Устанавливаем на 8 входе релейного модуля ВЫСОКИЙ уровень - реле выключается

 }	


}//------------Конец ЦИКЛА-----------------------------
//*****************************************************
//-------------Объявления и реализация функций---------
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;
}

Вот нашел код под 1 термодатчик, добавил что смог, так же понимаю что нижнюю часть нужно повторить и вместо ds добавить ds1,

вопросы имеено в этим частям кода

float temp = getTemp(); //Читаем температуру с датчика (как тут указать 2ой термодатчик) где указано что именно с 1ого он будет брать температуру а не со второго?

---------------------------------------------------------

float getTemp(){ //функция чтения значения температуры с датчика DS18B20 по шине OneWire аналогично как 2ой прописать

byte data[12]; // ЧТО это за адреса?????

byte addr[8]; // ЧТО это за адреса?????

Ссылка на комментарий
Поделиться на другие сайты

byte data[12]; // ЧТО это за адреса?????

byte addr[8]; // ЧТО это за адреса?????

data - это массив байт, куда размещается то, что считано с датчика.

addr - аналогично, но здесь должен указываться адрес конкретного датчика.

Т.е. правильная функция должна иметь вид

float getTemp(Address)

т.е. возвращается температура конкретного датчика.

Приложил библу, посмотрите пример Multiple.pde.

Можно вывести адреса всех подключённых датчиков и обратиться к определённому по его адресу.

Аттач - DallasTemperature.zip

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

#include <OneWire.h>

#include <DallasTemperature.h>

#include <LiquidCrystal.h>

OneWire oneWire(15); // вход датчиков 18b20

DallasTemperature ds(&oneWire);

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

DeviceAddress sensor1 = {0x28, 0xA8, 0x3E, 0xF9, 0x05, 0x0, 0x0, 0x12};

DeviceAddress sensor2 = {0x28, 0xE6, 0xBD, 0x3B, 0x05, 0x0, 0x0, 0xCF};

void setup() {

// Serial.begin(9600);

ds.begin();

lcd.begin(16, 2);

lcd.clear();

}

void loop() {

ds.requestTemperatures(); // считываем температуру с датчиков

lcd.setCursor(0, 0);

lcd.print("Sensor 1: ");

lcd.print(ds.getTempC(sensor1)); // отправляем температуру

lcd.print("C");

lcd.setCursor(0, 1);

lcd.print("Sensor 2: ");

lcd.print(ds.getTempC(sensor2));

lcd.print("C");

}

Спасибо, сейчас буду доделывать проект)

Ссылка на комментарий
Поделиться на другие сайты

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

Фтопку ардуину с её библами. Делайте всё на чистом Си и, как уже советовали выше, без всяких бутлоадеров.

PS:

Сейчас, ради интереса, погуглил что стоит в этой ардуине и глянул параметры этого МК. И был просто поражён - как вообще можно такой простой задачей забить 32К флеши ? Это же надо ещё умудриться это сделать :crazy:

Ссылка на комментарий
Поделиться на другие сайты

Вот чуть чуть по другому сделал, загружается на экране отображается но проблема не могу вывести на экран значение температур и банальное время

Final01-09-2015.ino

Ссылка на комментарий
Поделиться на другие сайты

на экране отображается
но проблема не могу вывести на экран
Это как ?

Всё-таки отображается у вас, или проблема с выводом на экран ?

Поконкретнее вопросы надо задавать.

Ссылка на комментарий
Поделиться на другие сайты

RTC.adjust(DateTime(__DATE__, __TIME__)); я так понима это срока для задания времяни и даты текущей? вопрос ее так и надо заливать 1 раз без изменений или вместо __DATE__, __TIME__ нужно прописать текущюю дату и время? если прописать то в каком формате? провбовал 01.09.2015 и 18.01 не проходит,

myOLED.print(myTime.minute(), 15, 30); думал что так выводится время, но не проходит( для lcd.setCursor(4, 0); и lcd.print(myTime.minute(), работает а для Oled Нет не подскажете как его вывести?

и с температурой не так все просто myOLED.print(temp2),0,12); Тоже не работает.

Что работает так это вывод на экран статистической информации о том что какой канал сейчас включен а какой выключен...осталось добавить информацию о текущей температуре и контроллер готов

Final01-09-2015.ino

libraries.rar

Ссылка на комментарий
Поделиться на другие сайты

myOLED.print(myTime.minute(), 15, 30); думал что так выводится время
Для начала, узнайте какой тип принимает эта функция. Потом нужную информацию необходимо привести к этому типу и послать в функцию.
myOLED.print(temp2),0,12); Тоже не работает
А Вам не кажется, что тут количество открывающихся скобок не совпадает с количеством закрывающихся ? Или для ардуины это пофиг ? Компиль всё глотает подряд ?

Вообще, нормальные компиляторы должны сообщать об ошибках. Либо Вы их не читаете, либо для ардуинов компили ненормальные...

Ссылка на комментарий
Поделиться на другие сайты

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

ну и в сами функции вывода принимали такие значения как размер шрифта, координаты курсора, и в какой системе исчисления вывод осуществлять, ну и сама инфа соответственно. Выкиньте Вы эту среду разработки, поставте Studio 6.2 и ваш код будет работать на ура и занимать отсилы 3-4 кило, а то и меньше

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

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

Ну и совет ТС'у. Пусть забудет о таких фразах, как "не прокатывает", "не работает" и им подобным. Тут технический форум, а не экстрасенсорный.

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

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Представляю Вам свою версию простого акваконтроллера

Дано:

1 шт. Arduino nano v3.

1 шт. Oled дисплей 128 X 64 I2C 0,96".

2 шт. Водонепроницаемых DS18B20 температурных датчика.

1 шт. DS3231 модуль часов реального времени.

1 шт. 8 канальный релейный модуль

Итого:

Управление 2мя аквариумами

1 аквариум 4 таймера света + 1 канал на охлаждение (включение вентилятора)

2 аквариум 2 таймера света + 1 канал на охлаждение (включение вентилятора)

Вывод на дисплей:

Температуру с 2х датчиков

Статус каналов освещения, охлаждения (включено выключено)

Время контроллера (нужно настроить отображение "0" в скетче код имеется)

Пример информации с дисплея (датчики температуры не подключены)

post-41119-0-22249600-1443415374_thumb.jpg

Скетч и библиотеки:

Arduino 8 каналов (6 свет, 2 охлаждение).zip

Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Да он скорее всего поторопился.  Долго изготавливал? Как то пытался тоже,но не срослось
    • Здраствуйте,собрал липина из первого поста,все отлично заработал без танцев с бубном,первое включение через латр смотря за сколом на коллекторе нижнего ключа,далее на балласте и на сварку варил замечательно,но включил его через несколько дней ключи тихо умерли,заменил запускаю через латр подымаю потихоньку напряжение все отлично,в первый раз подумал что частота уплыла и ключики из-за этого стрельнули но нет частота как была 38-39 кГц так и осталась полка так же есть только думаю она завышена на половину амплитуды регулировал ее путем подбора сопротивления на дед тайм,так вот через латр все отлично запускается подымаю до 310 на ключе,но дежурка подключена отдельно так вот когда отключаеш ключи в этот момент как я понял стреляют,даже в сборе когда дежурка запитана от основного питания как по схеме при включении сразу в сеть начало стрелять,думал может когда устанавливал крышку трансформатор повредил,нет же индуктивность проверил 3900 мкГн первичка,ток намагничивания насколько помню 0.7…0.8 ампер Снабера по ключам в норме проверял C метром,1 мкФ пленка по питанию около ключей в норме Осцилка приведу позже, сейчас на работе Возможно ли быть такое что после выключения от сети сигнал с затвора пропадает ,и он повисает в воздухе,хотя в принципе по схеме он подтянут резистором к эммитеру,да и работало же как-то да и у всех работает
    • Неверный ход мыслей. Резонатором внутренний объём становится начиная не от входного сечения,а от того места, которое ты обозначил стрелкой, являющегося по сути некоторой разновидностью компрессионной камеры, в которой как раз и формируется пучок звуковых волн, направленных в сторону входного сечения, а на самом деле выходного отверстия, порта свёрнутого рупора, резонансное усиление которых, как у простого открытого рупора формируется по всей длине конструкции вплоть до самого выходного сечения.
    • Название микры написано в заголовке. 8051 - совместимый универсальный МК.  На этом наши полномочия - всё.
    • @Boris U, у тебя что ли такие же "колонки" на 10ГДГДШ-1-4? При Qts 0,8 и выше ФИ подобным динамикам противопоказан. Банально потому, что рано или поздно от их ППУ-подвесов останутся одни лохмотья и дыры. Не зря же их на заводе ставили в различной формы ЗЯ.  В середине 80-ых я пытался повторить проект акустической системы высокой верности А. Голунчикова. Полгода с упорством носорога пыхтел над динамиками и собирал одну, а потом как только не пытался настроить её, так чтобы, как описано в статье журнала Радио'10, 83г, чтобы работал а "в полку" не смог добиться желаемого результата. И только когда измерил АЧХ тех своих 10ГД-36К и прикинул какова их добротность, понял, что все мои попытки тщетны, и почти готовый корпус пошёл на дрова, а для 10ГД36К вылепил из папье маше пару шаров объёмом около 8 литров. Для тех динамиков такое решение было оптимальным. 
    • Не буду спорить. Для меня это скорее "дело тёмное и непонятное". Вот до сих пор для меня загадка, считать ли внутренний объём этого резонатора частью внутреннего объёма колонки? Ведь начиная со своего входного сечения он же уже резонатор. Если это четвертьволновый разомкнутый на конце резонатор, то по определению его входное сопротивление на резонансной частоте близко к нулю (КЗ), и значит для динамика никак не может являться объёмом (нагрузкой)... А вот в таких конструкциях мучаюсь вопросом, как считать вот этот объём и его форму. Почему это - не резонатор, если у него, причём на довольно высокой частоте, есть прилично выраженный резонанс? Так что просто читаю с интересом и иногда задаю глупые вопросы.
    • Лучше поздно, чем некогда. Нашел время отыскать схемку аткель можно взять ограничение тока с синхрона. Сам же преобразователь будет представлять собой две синхронные понижайки на драйверах 2104, 2184 работающие в противофазе от двухтактного контроллера. Меньше пульсации с двух дросселей и четырех транзисторов от материнок, они лучше под синхрон заточены в плане быстроты бодидиодов.  Проще 494. На один операционник подать ОСН с выхода, на второй с интегратора измеряющего через диоды напряжение открытого нижнего ключа. На словах для понимания описание принципа в несколько измененном варианте. При открывании ключа управляющее напряжение на его затвор через резистор заряжает конденсатор интегратора, а через диод со стока разряжает пропорционально току через ключ с поправкой на его температуру. Через второй диод и резистор во втором такте. Напряжение с интегратора сравниваем с предустановкой тока. Вообщем кто захочет разберется. Практически вся инфа есть в теме по ссылке и ссылках в ней. Удачи!  
  • Похожий контент

×
×
  • Создать...