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

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


Гость Роман

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

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

Являюсь владельцем 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
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

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

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

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

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

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

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

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

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

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

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

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

кстати нашел и библиотеки для 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 пользователей онлайн

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