jbl
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11

Тема: Делаем контроллер для аквариума сами

  1. #1
    Опытный аквариумист СКЛИК УкраинаХарьковский клуб аквариумистов Аватар для gus33
    Регистрация
    24.08.2016
    Сообщений
    495
    Поблагодарил(а)
    5
    Благодарностей: 81 (сообщений: 66)
    Вес репутации
    5

    Делаем контроллер для аквариума сами

    Всем наверно хочется сделать свой контроллер и желательно за не очень большие деньги, а еще желательней именно под себя и как можно с большим функционалом.
    На это напоролся и я.
    Долго выяснял как и что лучше. Но я не программист, я простой электронщик-железячник.
    Решено было, после долгих раздумий, читания форумов, блогов и различных сайтов остановиться на платформе Arduino.
    Мой выбор пал на Arduino UNO. Это средняя плата из линейки Arduino.
    Но Ардуинка сама по себе ничто! Следовательно под нее пришлось купить экранчик. Сразу взял 4 строки по 20 символов. Платка часов просто необходима. Ну и блочок питания. Вернее не сам блок питания, импульсный стабилизатор с регулировкой по выходу, т.е. выставляете сколько нужно получить на выходе, а на вход подаете столько, сколько есть, но не более 30 вольт.

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

  2. 2 пользователей сказали cпасибо gus33 за это полезное сообщение:

    Frontozavr (03.12.2016),Ланевский Олег (04.05.2017)

  3. # ADS
    Рекламный Бот
    Регистрация
    Давно
    Сообщений
    Много

     

  4. #2
    Опытный аквариумист СКЛИК УкраинаХарьковский клуб аквариумистов Аватар для gus33
    Регистрация
    24.08.2016
    Сообщений
    495
    Поблагодарил(а)
    5
    Благодарностей: 81 (сообщений: 66)
    Вес репутации
    5

    Re: Делаем контроллер для аквариума сами

    Как я и обещал, публикую фото.

    Сама плата Arduino UNO
    Стабилизатор питания

    Экран 4 строки по 20 символов в каждой

    Для экономии контактов на самой Ардуие и для ускорения работы Ардуино с экраном куплен переходник I2C


    Исполнительный блок или блок реле. Они могут управлять нагрузкой 220 Вольт 3 Ампера



    Вместо отдельной платы часов, которую я сделал самостоятельно, был куплен совмещенный модуль часов и SD-карты.



    А вот так выглядит этот набор в сборе. Ардуино - это конструктор, который позволяет сделать все что угодно и с любой конфигурацией.



    Есть еще вот такая макетная плата


    На ней можно собрать что-то самому для работы с платой Ардуино.

  5. #3
    Опытный аквариумист СКЛИК УкраинаХарьковский клуб аквариумистов Аватар для gus33
    Регистрация
    24.08.2016
    Сообщений
    495
    Поблагодарил(а)
    5
    Благодарностей: 81 (сообщений: 66)
    Вес репутации
    5

    Re: Делаем контроллер для аквариума сами

    Начнем подключать экран.
    Сам экран подключается к Ардуино так:


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

  6. #4
    Опытный аквариумист СКЛИК УкраинаХарьковский клуб аквариумистов Аватар для gus33
    Регистрация
    24.08.2016
    Сообщений
    495
    Поблагодарил(а)
    5
    Благодарностей: 81 (сообщений: 66)
    Вес репутации
    5

    Re: Делаем контроллер для аквариума сами

    Для уменьшения количества соединений платы Ардуино и экрана применяется переходник.


    Следует учесть что шина I2C достаточно интересна тем, что на эту шину можно повесить до 120 устройств без занятия портов самой платы Ардуино.
    Но об этом чуть дальше.

  7. 1 пользователь сказал cпасибо gus33 за это полезное сообщение::

    Frontozavr (08.12.2016)

  8. #5
    Опытный аквариумист СКЛИК УкраинаХарьковский клуб аквариумистов Аватар для gus33
    Регистрация
    24.08.2016
    Сообщений
    495
    Поблагодарил(а)
    5
    Благодарностей: 81 (сообщений: 66)
    Вес репутации
    5

    Re: Делаем контроллер для аквариума сами

    Так же еще для экспериментов были закуплены:
    Платка часов.

    Радио модуль. Может быть когда нибудь подключу.


    Небольшой экранчик.


    Модуль реле на 1 устройство. Ранее я показывал модуль реле на 4 устройства. Так же еще существуют на 2, 8, 16 устройств.

  9. #6
    Опытный аквариумист СКЛИК УкраинаХарьковский клуб аквариумистов Аватар для gus33
    Регистрация
    24.08.2016
    Сообщений
    495
    Поблагодарил(а)
    5
    Благодарностей: 81 (сообщений: 66)
    Вес репутации
    5

    Re: Делаем контроллер для аквариума сами

    Подключаем плату часов к плате Ардуино. Следует учесть, что микросхем часов существует несколько видов. У меня, к примеру, они на микросхеме DS1307. Остальные микросхемы могут подключаться по другому.

    RTC DS1307 Arduino UNO
    GND GND
    VCC +5V
    SDA A4
    SCL A5

    Как видно из таблицы - часы так-же подключены к шине I2C.

  10. #7
    Опытный аквариумист СКЛИК УкраинаХарьковский клуб аквариумистов Аватар для gus33
    Регистрация
    24.08.2016
    Сообщений
    495
    Поблагодарил(а)
    5
    Благодарностей: 81 (сообщений: 66)
    Вес репутации
    5

    Re: Делаем контроллер для аквариума сами

    Для программирования плат Arduino существует программа Arduino IDE.
    Arduino программируется на языке Wiring, которого на самом деле не существует, как и не существует и компилятора Wiring – написанные на Wiring программы преобразуются (с минимальными изменениям) в программу на языке C/C++, и затем компилируются компилятором AVR-GCC. Так что, фактически, используется специализированный для микроконтроллеров AVR вариант C/C++.

    Программа для Arduino состоит из 2-х функций: setup() и loop().
    Функция setup() запускается один раз, после каждого включения питания или сброса платы Arduino. Она используется для инициализации переменных, установки режимов работы цифровых портов, и т.д.

    Пример:

    void setup()// начальные установки
    {
    Serial.begin(9600);// установка скорости работы серийного порта на 9600 бит/сек
    pinMode
    (3, INPUT);// установка 3-его порта на ввод данных
    }


    Функция loop() в бесконечном цикле последовательно исполняет команды, которые описаны в ее теле. Т.е. после завершения функции снова произойдет ее вызов и исполнение команд начнется с самого начала.

    Пример:

    void loop()// тело программы
    {
    if(digitalRead(3)== HIGH)// условие на опрос 3-го порта
    Serial.print('H');// отправка сообщения в виде буквы «Н» на COM-порт
    else
    Serial.print('L');// отправка сообщения в виде буквы «L» на COM-порт
    delay
    (1000);// задержка 1 сек.
    }


    В итоге наша программа приймет такой вид:

    void setup()// начальные установки
    {
    Serial.begin(9600);// установка скорости работы серийного порта на 9600 бит/сек
    pinMode
    (3, INPUT);// установка 3-его порта на ввод данных
    }

    // Программа проверяет 3-й порт на наличие на нём сигнала и посылает ответ в
    // виде текстового сообщения на последовательный порт компьютера
    void loop()// тело программы
    {
    if(digitalRead(3)== HIGH)// условие на опрос 3-го порта
    Serial.print('H');// отправка сообщения в виде буквы «Н» на COM-порт
    else
    Serial.print('L');// отправка сообщения в виде буквы «L» на COM-порт
    delay
    (1000);// задержка 1 сек.
    }


    При чтении или записи к цифровому порту применимо только 2 возможных значения - Порт может быть установлен как HIGH (высокий уровень) или LOW (низкий уровень).

    Уровень HIGH соответствует 5 вольтам на выходе. При чтении значения на цифровом порте, начиная с 3 вольт и выше (до напряжения питания), микропроцессор воспринимает это напряжение как HIGH. Это константа представляется числом 1.
    Уровень LOW соответствует 0 вольтам на выходе порта. При чтении значения на цифровом порте, начиная с 2 вольт и меньше (до 0 Вольт), микропроцессор воспринимает это напряжение как LOW. Эта константа представлена целым числом 0.

    Таким образом, оба следующих вызова будут аналогичны:

    digitalWrite(13, HIGH);// можно так,
    digitalWrite
    (13,1);// а можно и так


    Цифровые порты могут использоваться на ввод или вывод сигналов.
    Изменение порта с ввода на вывод производится при помощи функции pinMode().

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

    Порты, сконфигурированные на вывод сигналов, имеют малое выходное сопротивление. Это означает, что такие порты могут обеспечивать подключенные к ним элементы электроэнергией. В этом состоянии порты поддерживают положительное или отрицательное направление тока до 40 мА (миллиампер) на другие устройства или схемы. Это позволяет подключить к ним какую-либо нагрузку, например светодиод (через ограничивающий ток резистор).
    Порты, сконфигурированные как выводы, могут быть повреждены, если их замкнуть накоротко на "землю" (общая шина питания), на источник питания +5 Вольт, или подсоединить к мощной нагрузке с малым входным сопротивлением.

    Пример:
    pinMode(13, OUTPUT);// 13й вывод будет выходом
    pinMode
    (12, INPUT);// а 12й – входом



  11. 1 пользователь сказал cпасибо gus33 за это полезное сообщение::

    Frontozavr (06.12.2016)

  12. #8
    Опытный аквариумист СКЛИК УкраинаХарьковский клуб аквариумистов Аватар для gus33
    Регистрация
    24.08.2016
    Сообщений
    495
    Поблагодарил(а)
    5
    Благодарностей: 81 (сообщений: 66)
    Вес репутации
    5

    Re: Делаем контроллер для аквариума сами

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

    #include <Wire.h>
    #include <EEPROM.h>
    #include "RTClib.h"
    #include <LiquidCrystal_I2C.h>
    Подключаем библиотеки, нужные для работы программы

    LiquidCrystal_I2C lcd(0x27,20,4);
    #define DS1307_I2C_ADDRESS 0x50
    Устанавливаем адреса экрана и часов на шине I2C

    const byte outPin = 7; // выход управления нагрузки
    Определяем какой выход Ардуино будет управлять нагрузкой.

    byte setMinClockOn; //
    byte setHorClockOn;
    byte setMinClockOff; //
    byte setHorClockOff;
    Определяем переменные для включения и выключения таймера. Отдельно на минуты и часы (включение) и минуты и часы (выключение).

    byte key(){ //// для кнопок ЛСДшилда
    int val = analogRead(0);
    if (val < 680) return 6;
    else if (val < 720) return 5;
    else if (val < 780) return 3;
    else if (val < 860) return 4;
    else if (val < 930) return 2;
    else if (val < 1024) return 1;
    else return 0;
    }
    Инициализируем аналоговый вход А0 для клавиатуры и определяем при каких условиях плате Ардуино считать что данная кнопка нажата.

    /////////// часы ..
    byte decToBcd(byte val){
    return ( (val/10*16) + (val%10) );
    }
    Преобразование нормальных десятичных чисел в двоично-десятичный код



    byte bcdToDec(byte val){
    return ( (val/16*10) + (val%16) );
    }
    Преобразование двоично-десятичного кода в десятичные числа.


    void setDateDs1307(byte second, // 0-59
    byte minute, // 0-59
    byte hour, // 1-23
    byte dayOfWeek, // 1-7
    byte dayOfMonth, // 1-28/29/30/31
    byte month, // 1-12
    byte year) // 0-99
    {
    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.write(decToBcd(second));
    Wire.write(decToBcd(minute));
    Wire.write(decToBcd(hour));
    Wire.write(decToBcd(dayOfWeek));
    Wire.write(decToBcd(dayOfMonth));
    Wire.write(decToBcd(month));
    Wire.write(decToBcd(year));
    Wire.endTransmission();
    }


    void getDateDs1307(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {


    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.endTransmission();


    Wire.requestFrom(DS1307_I2C_ADDRESS, 7);


    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f);
    *dayOfWeek = bcdToDec(Wire.read());
    *dayOfMonth = bcdToDec(Wire.read());
    *month = bcdToDec(Wire.read());
    *year = bcdToDec(Wire.read());
    }
    ////
    void setClock(){ // установка часов
    byte pos = 1;
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
    Определяем работу часов


    lcd.home();
    lcd.clear();
    lcd.blink();


    while(key() != 1){ // крутим цикл
    byte KEY = key(); // читаем состояние кнопок
    delay(200);
    lcd.setCursor(1, 1);
    lcd.print("set to save");
    lcd.setCursor(0, 0); // выводим инфу
    if (hour < 10) lcd.print("0");
    lcd.print(hour);
    lcd.print(":");
    if (minute < 10) lcd.print("0");
    lcd.print(minute);
    lcd.print(" ");
    if (dayOfMonth < 10) lcd.print("0");
    lcd.print(dayOfMonth);
    lcd.print("/");
    if (month < 10) lcd.print("0");
    lcd.print(month);
    lcd.print("/");
    if (year < 10) lcd.print("0");
    lcd.print(year);

    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции

    if (KEY == 5 && pos < 13) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 1) pos -= 3;

    else if (pos == 1 && KEY == 3) hour++; // крутим значения
    else if (pos == 1 && KEY == 4) hour--;
    else if (pos == 4 && KEY == 3) minute++;
    else if (pos == 4 && KEY == 4) minute--;
    else if (pos == 7 && KEY == 3) dayOfMonth++;
    else if (pos == 7 && KEY == 4) dayOfMonth--;
    else if (pos == 10 && KEY == 3) month++;
    else if (pos == 10 && KEY == 4) month--;
    else if (pos == 13 && KEY == 3) year++;
    else if (pos == 13 && KEY == 4) year--;

    if (hour > 23) hour = 0;
    else if (minute > 59) minute = 0;
    else if (dayOfMonth > 31) dayOfMonth = 0;
    else if (month > 12) month = 1;
    else if (year > 99) year = 0;
    }// конец цикла
    Определяем работу экрана и клавиатуры.


    setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
    lcd.noBlink();
    lcd.clear();
    lcd.print(" Saved");
    delay(1500);
    }///


    void setOnOff(){
    byte pos = 0;
    lcd.clear();
    lcd.blink();


    while(key() != 1){ // крутим цикл
    byte KEY = key(); // читаем состояние кнопок
    delay(200);
    lcd.setCursor(1, 1);
    lcd.print("set to save");
    lcd.setCursor(0, 0); // выводим инфу
    if (setHorClockOn < 10) lcd.print("0");
    lcd.print(setHorClockOn);
    lcd.print(":");
    if (setMinClockOn < 10) lcd.print("0");
    lcd.print(setMinClockOn);
    lcd.print(" ");
    if (setHorClockOff < 10) lcd.print("0");
    lcd.print(setHorClockOff);
    lcd.print(":");
    if (setMinClockOff < 10) lcd.print("0");
    lcd.print(setMinClockOff);

    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции

    if (KEY == 5 && pos < 9) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 1) pos -= 3;

    else if (pos == 0 && KEY == 3) setHorClockOn++; // крутим значения
    else if (pos == 0 && KEY == 4) setHorClockOn--;
    else if (pos == 3 && KEY == 3) setMinClockOn++;
    else if (pos == 3 && KEY == 4) setMinClockOn--;
    else if (pos == 6 && KEY == 3) setHorClockOff++;
    else if (pos == 6 && KEY == 4) setHorClockOff--;
    else if (pos == 9 && KEY == 3) setMinClockOff++;
    else if (pos == 9 && KEY == 4) setMinClockOff--;


    if (setHorClockOn > 23) setHorClockOn = 0;
    else if (setMinClockOn > 59) setMinClockOn = 0;
    else if (setHorClockOff > 23) setHorClockOff = 0;
    else if (setMinClockOff > 59) setMinClockOff = 0;

    }// конец цикла
    lcd.noBlink();
    lcd.clear();


    EEPROM.write(0, setMinClockOn);
    EEPROM.write(1, setHorClockOn);
    EEPROM.write(3, setMinClockOff);
    EEPROM.write(4, setHorClockOff);


    lcd.print(" Saved");
    delay(1500);
    }///

    void menu(){
    lcd.clear();
    char menuTxt[2][14] = {"set ON/OFF >>", "set clock >>"};
    byte pos = 0;

    while(1){
    delay(200);
    byte KEY = key();

    lcd.setCursor(0, 0);
    lcd.print(pos+1);
    lcd.print(".");
    lcd.print(menuTxt[pos]);

    if (KEY == 3 && pos != 0) pos--;
    else if (KEY == 4 && pos < 1) pos++;

    if (KEY == 5 && pos == 0) setOnOff();
    else if (KEY == 5 && pos == 1) setClock();
    }
    }
    Закончили определение начальных установок нашего будущего таймера.

  13. #9
    Опытный аквариумист СКЛИК УкраинаХарьковский клуб аквариумистов Аватар для gus33
    Регистрация
    24.08.2016
    Сообщений
    495
    Поблагодарил(а)
    5
    Благодарностей: 81 (сообщений: 66)
    Вес репутации
    5

    Re: Делаем контроллер для аквариума сами

    Продолжим делать таймер.
    Функция void setup():

    void setup(){
    Wire.begin();
    lcd.init(); //инициализируем экран
    lcd.backlight(); //включаем подсветку экрана
    lcd.begin(16, 2);
    lcd.clear();
    Поработали с экраном. Инициализация, включение подсветки, очистка того что могло в нем быть.

    pinMode(outPin, OUTPUT);
    digitalWrite(outPin, LOW);
    Определили выходы и перевели цифровой выход в высокий уровень.

    setMinClockOn = EEPROM.read(0);
    setHorClockOn = EEPROM.read(1);
    setMinClockOff = EEPROM.read(3);
    setHorClockOff = EEPROM.read(4);
    }
    Определили в памяти ячейки для записи часов.

  14. 1 пользователь сказал cпасибо gus33 за это полезное сообщение::

    Frontozavr (08.12.2016)

  15. #10
    Опытный аквариумист СКЛИК УкраинаХарьковский клуб аквариумистов Аватар для gus33
    Регистрация
    24.08.2016
    Сообщений
    495
    Поблагодарил(а)
    5
    Благодарностей: 81 (сообщений: 66)
    Вес репутации
    5

    Re: Делаем контроллер для аквариума сами

    Функция void loop():

    void loop()
    {
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

    // обработка кнопок
    if (key() == 1) menu(); // если нажата селект
    else if (key() == 3) digitalWrite(outPin, HIGH);
    else if (key() == 4) digitalWrite(outPin, LOW);
    Опросили кнопки....

    // сравниваем время и управляем выходом//
    if (setMinClockOff == minute && setHorClockOff == hour
    && second == 0) digitalWrite(outPin, LOW);
    if (setMinClockOn == minute && setHorClockOn == hour
    && second == 0) digitalWrite(outPin, HIGH);
    Ну тут в пояснениях все сказано.

    // lcd.clear();
    lcd.setCursor(0, 0);
    if (hour < 10) lcd.print("0");
    lcd.print(hour);
    lcd.print(":");
    if (minute < 10) lcd.print("0");
    lcd.print(minute);
    // lcd.print(":");
    // if (second < 10) lcd.print("0");
    // lcd.print(second);
    // lcd.setCursor(8, 0);
    // lcd.print(" ");
    lcd.setCursor(0, 1);
    if (dayOfMonth < 10) lcd.print("0");
    lcd.print(dayOfMonth);
    lcd.print("/");
    if (month < 10) lcd.print("0");
    lcd.print(month);
    lcd.print("/");
    if (year < 10) lcd.print("0");
    lcd.print(year);
    //
    lcd.setCursor(11, 0);
    if (setHorClockOn < 10) lcd.print("0");
    lcd.print(setHorClockOn);
    lcd.print(":");
    if (setMinClockOn < 10) lcd.print("0");
    lcd.print(setMinClockOn);

    lcd.setCursor(11, 1);
    if (setHorClockOff < 10) lcd.print("0");
    lcd.print(setHorClockOff);
    lcd.print(":");
    if (setMinClockOff < 10) lcd.print("0");
    lcd.print(setMinClockOff);

    lcd.setCursor(7, 0);
    if (digitalRead(outPin)) lcd.print("ON ");
    else lcd.print("Off");

    delay(200); // нужно для нармальной работы кнопок
    }
    Ну и вывели полученный результат на экран.

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

  16. 1 пользователь сказал cпасибо gus33 за это полезное сообщение::

    Frontozavr (08.12.2016)

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
PostMan By Cultural Forum | کیلینیک کلینیک | raports