Блок с датойБлок с временемБлок с возрастом сайта
Mr.ALB

    Анатолий Беляев (aka Mr.ALB). Персональный сайт

    Да пребудут с вами Силы СВЕТА!

     

    Ардуино (Arduino). #14

    Таймер

    Сделал небольшой генератор для катушки Мишина и мне понадобился таймер с фиксированными значениями времени. Для его реализации воспользовался Arduino Pro Mini. Таймер получился, в некотором роде, универсальным, его можно использовать не только для включения генератора для катушки Мишина, но и для управления разными нагрузками или устройствами, вплоть до нагрузок на ~220 В.

    Таймер
    Таймер

    Подразделы


     

    Описание

    Индикация времени осуществляется на четырёхразрядном семисегментном индикаторе.

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

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

     

    Схема Таймера

    Схема таймера представлена на картинке ниже. Не отображён блок питания, так как возможно использование любого подходящего блока питания на выходное напряжение 5 В и ток 150 мА.

    Pic 1

    Схема собрана на Arduino Pro Mini 328 (можно использовать любую: Arduino UNO, Arduino Nano и подобные им). Более оптимально советую применить Arduino Pro Mini 168, так как скетч использует всего 2190 байт. У меня такой под рукой не оказалось, использовал то, что было. Впоследствии заменю.

    Для индикации времени используется четырёх разрядный семисегментный индикатор SH5461AS с общим катодом. Управление этим индикатором осуществляется через сдвиговый регистр на микросхеме SN74HC595N, что позволяет уменьшить количество портов для управления индикатором. Индикация динамическая.

    К выходному порту OUT (Arduino pin 9; клема X7) подключается минус от генератора для катушки Мишина. Плюс питания генератора подключается к клеме X6. При пуске таймера на порте устанавливается низкий уровень, что включает генератор. При отключении – на порту устанавливается высокий потенциал и генератор выключается. К порту OUT так же подключен вход от модуля с реле, через его контакты X3 (NC), X4(COM), X5(NO) можно управлять внешними нагрузками, или более мощными нагрузками.

    Таймер запитывается от сети ~220 В через импульсный блок питания. В моём случае был под рукой блок на +9 В, поэтому после него установил линейный стабилизатор на микросхеме LM317T с выходным напряжением +5 В. Этим напряжением одновременно запитывается и Ардуино, и модуль с реле, и генератор для катушки Мишина. Оптимальным же вариантом является готовый блок питания на +5 В. Как такой прибудет по почте из Китая, то переделаю.

    Кнопки управления сенсорные. Использованы, чтобы убрать толкатели и лишний код программы на устранение дребезга. Кнопки TTP223 достаточно чувствительные и легко срабатывают через оргстекло толщиной в 4 мм.

     

    Скетч

    Ниже представлен скетч таймера. Файл со скетчем можно скачать в подразделе Приложение.

    /*********************************************************
     * Тренировка в программировании Ардуино
     * 2020-03-13 Mr.ALB начало v1.0
     *
     * Подключение 7 сегментного индикатора SH5461AS
     *
     * Общий катод:
     *  Dig.1 - pin12
     *  Dig.2 - pin9
     *  Dig.3 - pin8
     *  Dig.4 - pin6
     *
     * Аноды:
     *  A  - pin11
     *  B  - pin7
     *  C  - pin4
     *  D  - pin2
     *  E  - pin1
     *  F  - pin10
     *  G  - pin5
     *  DP - pin3
     *
     * Индикатор SH5461AS четыре 7 сегментных разряда
     * Подключение через сдвиговый регистр SN74HC595N
     *
     * Соответстивие контактов:
     * Ардуино - SN74HC595N (сдвиговый регистр)
     *    4    - DS  pin14
     *    3    - ST  pin12
     *    2    - SH  pin11
     *    
     * Ардуино - SH5461AS (индикатор 7 сегментный 4 разрядный)
     *    8    - DIG.1 pin12
     *    7    - DIG.2 pin9
     *    6    - DIG.3 pin8
     *    5    - DIG.4 pin6
     *
     * SN74HC595N - SH5461AS
     *    14      - 3
     *    1       - 11
     *    2       - 7
     *    3       - 4
     *    4       - 2
     *    5       - 1
     *    6       - 10
     *    7       - 5
     *    
     * 2020-03-15 Mr.ALB добавил две кнопки:
     *            ПУСК/СТОП и УСТАНОВКА + порт для выхода
     * 2020-03-17 Mr.ALB на Arduino Pro Mini
     *
    *********************************************************/
    
    // Контакты катодов разрядов
    #define DIG1      8
    #define DIG2      7
    #define DIG3      6
    #define DIG4      5
    
    // Управление SN74HC595N
    #define DS        4
    #define ST_CP     3
    #define SH_CP     2
    
    // Кнопки
    #define BT_SET    10
    #define BT_START  11
    
    // Выход и сигнал окончания
    #define OUT       9
    #define BUZZER    12// Активный!
    
    // Задержка подсветки разряда
    #define DIG_DELAY 4
    
    // Цифры 0...9, точка, минус 
    byte digits[12]=
    {
      B01111110,//0
      B00110000,//1
      B01101101,//2
      B01111001,//3
      B00110011,//4
      B01011011,//5
      B01011111,//6
      B01110000,//7
      B01111111,//8
      B01111011,//9
      B10000000,//10 DP
      B00000001 //11 Минус
    };
    
    /* Глобальные переменные для времени */
    uint16_t t1, dt;
    int sec_time=0;
    int min_time=0;
    byte i=2;
    
    // Время в секундах  
    long a_time[15]=
          {
            30,   //.5
            60,   //1 мин.
            120,  //2
            180,  //3
            300,  //5
            600,  //10
            900,  //15
            1200, //20
            1500, //25
            1800, //30
            2100, //35
            2400, //40
            2700, //45 мин.
            3000, //50
            3599  //60
          };
    long max_time=a_time[i];
    bool flag_run=false;
    
    /***********
    * ФУНКЦИИ
    ***********/
    
    /* Функция выбора разряда на индикаторе */
    void selectSection(byte section)
    {
      // Все секции гасим
      for(byte i=DIG4;i<=DIG1;i++) digitalWrite(i, HIGH);
      // Включаем заданную в section
      digitalWrite(section,LOW);
    }
    
    /* ФУНКЦИЯ: вывод цифры в разряде */
    void drawDigit(byte digit)
    {
        // Подготовка для передачи данных в микросхему
        digitalWrite(ST_CP, LOW);
        // Передача данных справа-налево
        shiftOut(DS, SH_CP, LSBFIRST, digits[digit]); 
        // Возвращение состояния защёлки
        digitalWrite(ST_CP, HIGH);
    }
    
    /* ФУНКЦИЯ:
     * Вывод времени в формате: mm.ss
     * Входной параметр - время в секундах
     */
    void printTime(long n)
    {
      min_time=n/60;          // Минуты
      sec_time=n-min_time*60; // Секунды
      byte  dig1=min_time/10,
            dig2=min_time%10,
            dig3=sec_time/10,
            dig4=sec_time%10;
    
      // Десятки минут
      // Если 0, то не используем
      if(dig1)
      {
        drawDigit(dig1);
        selectSection(DIG1);
        delay(DIG_DELAY);
      }
      
      // Единицы минут
      drawDigit(dig2);
      selectSection(DIG2);
      delay(DIG_DELAY);
    
      // DP точка 2-го разряда
      drawDigit(10);
      selectSection(DIG2);
      delay(DIG_DELAY);
    
      // Десятки секунд
      drawDigit(dig3);
      selectSection(DIG3);
      delay(DIG_DELAY);
    
      // Единицы секунд
      drawDigit(dig4);
      selectSection(DIG4);
      delay(DIG_DELAY);
    }
    
    /* Функция настройки */
    void setup()
    {
      // Настройка контактов на индикатор
      // и на управление SN74HC595N
      for(byte pin=SH_CP;pin<=DIG1;pin++)
      {
        pinMode(pin,OUTPUT);
        digitalWrite(pin,LOW);
      }
      pinMode(BT_SET,INPUT);    // Выбор времени
      pinMode(BT_START,INPUT);  // Запуск таймера
      pinMode(OUT,OUTPUT);      // Управляющий выход  
      digitalWrite(OUT,HIGH);   // Отключим выход
      pinMode(BUZZER,OUTPUT);   // Зуммер
      digitalWrite(BUZZER,HIGH);// Отключим выход
    }
    
    /* Рабочая программа */
    void loop()
    {
      t1=millis();  // Текущее время работы программы в мс
       
      // Было нажатие кнопки ПУСК
      if(digitalRead(BT_START)==HIGH)
      {
        delay(500);
        if(flag_run==false)
        {
          // Запуск таймера
          flag_run=true;
          // Уровень включения выхода - LOW
          digitalWrite(OUT,LOW);
          dt=t1;
        }
        else
        {
          // Остановим таймер на ПАУЗУ
          flag_run=false;
          digitalWrite(OUT,HIGH);
        }
      }
    
      // Установка времени таймера
      if(flag_run==false && digitalRead(BT_SET)==HIGH)
      {
        ++i;
        if(i>14)i=0;
        max_time=a_time[i];
        delay(500);
      }
    
      // Вывод текущего времени
      printTime(max_time);
    
      if(flag_run==true && (t1-dt)>=1000)
      {
        // Остановим таймер
        if(max_time==0)
        {
          flag_run=false;
          // Отключим выход
          digitalWrite(OUT,HIGH);
          // Сигнал окончания
          digitalWrite(BUZZER,LOW);
          delay(200);
          digitalWrite(BUZZER,HIGH);
          max_time=a_time[i]+1;
        }
        max_time--;
        dt=t1;
      }
    }
    

     

    Реализация

    Таймер выполнен в стиле Ардуино. Две пластины из оргстекла, скреплённых саморезами и стойками из пластиковых трубочек, определяют внутреннее пространство устройства. В этом пространстве размещены платы с: Ардуино, модулем индикации, модулем реле, модулем блока питания, сенсорными кнопками, клавишей включения и платой с генератором синусоидального сигнала для катушки Мишина. Общие размеры устройства: 100 * 63 * 42 мм.

    Вначале был изготовлен модуль индикации для четырёхразрядного семисегментного светодиодного индикатора типа SH5461AS, или ему подобного с общим катодом у разряда. На небольшой плате установлена панелька DIP16 под микросхему сдвигового регистра SN74HC595N. Сверху этой микросхемы в гнездовые панельные контакты вставляется сам светодиодный индикатор.

    Плата модуля индикации. Вид сверху
    Pic 2 Плата модуля индикации. Вид сверху

    На каждый сегмент у меня установлен ограничивающий резистор 1,2 кОм (можно от 220...1000 Ом) для уменьшения тока потребления. При этом яркость индикатора снижена, но в обстановке помещения вполне хорошо видно.

    Плата модуля индикации. Вид снизу
    Pic 3 Плата модуля индикации. Вид снизу

    Индикатор вставляется сверху. Для большей надёжности можно его запаять и тем самым снизить высоту модуля.

    Плата модуля индикации в сборе
    Pic 4 Плата модуля индикации в сборе

    Когда модуль индикации был готов, приступил к написанию программы. Вначале использовал Arduino UNO...

    Макетирование и отладка программы на Arduino UNO
    Pic 5 Макетирование и отладка программы на Arduino UNO

    ...но потом для уменьшения размеров устройства использовал Arduino Pro Mini. Используйте вариант на 16 кБ, что более экономно.

    Макетирование и отладка программы на Arduino Pro Mini
    Pic 6 Макетирование и отладка программы на Arduino Pro Mini

    Устройство таймера.

    Устройство таймера. Вид сверху
    Pic 7 Устройство таймера. Вид сверху
    Устройство таймера. Разные виды
    Pic 8 Устройство таймера. Разные виды

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

    Устройство таймера. Разные виды
    Pic 9 Устройство таймера. Разные виды
    Устройство таймера. Разные виды
    Pic 10 Устройство таймера. Разные виды

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

    Подключение генератора с катушкой Мишина
    Pic 11 Подключение генератора с катушкой Мишина

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

    Таймер
    Pic 12 Таймер
    Таймер с катушкой Мишина
    Pic 13 Таймер с катушкой Мишина

    При каждом касании сенсорной кнопки ВЫБОР происходит смена времени уставки таймера. Значения фиксированные. Заданы в массиве a_time[15] (см. скетч строчку 100). При касании сенсорной кнопки ПУСК/СТОП происходит запуск таймера, при повторном касании – останов. Максимальное значение времени 59 минут 59 секунд.

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

    2020-04-09
    Анатолий Беляев.

     

    Приложение

    Используемые библиотеки и программы:


    . Mr.ALB
    Предыдущая страница Страница 15