автоматическая кормушка для аквариума

Тема в разделе "Arduino & Shields", создана пользователем Алексей Схоменко, 18 ноя 2013.

  1. помогите пожалуйста написать код. я хотел чтоб кнопкой задавалось число кормлений одно или два
    и число кормлений отображалось числом за жженых светодиодов а на 3-ий выход подавался импульс заданной длины для того чтоб кормушка подала корм один или 2 раза после включения света в аквариуме. помогите пожалуйста. заранее благодарю!
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Сперва определитесь с алгоритмом работы, схемой устройства. Формализуйте задачу.
     
  3. схему я уже собрал, да и алгоритм всех действий представляю. я просто хотел пример программы остальное худо бедно я сам сделаю мне только эта часть не понятна.
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Пример КАКОЙ программы? Опишите нормально, что должна программа делать.
    Устройство само должно включить свет в аквариуме или определить это событие по датчику? Задали число кормлений и устройство сразу начало сыпать корм, если свет горит? Сразу оба раза или с интервалом? Вообще время как-то учитывается или нет?
    Распишите алгоритм детально. А еще лучше - нарисуйте блок-схему.
     

  5. есть микроконтроллер ATMega328 он и будет за все отвечать, то есть к нему подключаю фоторезистор, выставляю значение на контроллер при котором должен начаться весь процесс т.е. плавно в течении 3 минут разгореться свет, затем через 3-5 минуты провести подачу корма, спустя еще 10 минут должен включиться фильтр, а потом примерно через час компрессор и работать часа 4, после этого должно произвести отключение фильтра и компрессора и опять подача корма, после чего через 20 минут свет должен плавно погаснуть (7 мин) если значение датчика меньше заданного если нет то включиться компрессор и работать до тех пор пока значение датчика не упадет ниже заданного. это если кормление производилось 2 раза а если 1 то включить плавно свет покормить 1 раз включить в той же последовательности фильтр и компрессор а потом если значение с датчика ниже заданного выключить оборудование и в течении 10 минут плавно погасить свет.
     
  6. вот как то так.
     
  7. а еще на кормушку надо просто подать напряжение некоторое время которое прописываться в программе.
    кормушка самодельная!
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    А фоторезистор какую роль играет во всем этом процессе?
    Весь процесс должен начинаться по нажатию кнопки или происходить периодически (раз в сутки, например)?
     
  9. периодически
    . кнопкой просто задается число кормлений. а фоторезистор играет роль датчика освещения для определения момента когда начать и закончить все действия
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

    А зачем определять наличие света датчиком, если свет и так включается контроллером?
    Часы реального времени участвуют в проекте или время считается только по внутреннему таймеру?
     
  11. по датчику определяется освещение в помещении
     
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    Допустим, начался процесс кормления. В этот момент нажали кнопку и изменили число кормлений.
    Как должна вести себя программа при этом? Отменить или добавить повторное кормление или запомнить новую настройку до следующего раза?

    Пока понимаю задачу так:

    Код (Text):
    если стало светло
    {
      - плавно зажечь свет
      - подождать 3-5 минут
      - насыпать корм
      - подождать 10 минут
      - включить фильтр
      - подождать 1 час
      - включить компрессор
      - подождать 4 часа
      - выключить фильтр и компрессор
      - если надо покормить 2 раза:
        {
          - насыпать корм второй раз
          - подождать 20 минут
        }
    }

    если стало темно
    {
      - плавно выключить свет
      - выключить фильтр и компрессор
    }
    Внесите исправления в алгоритм в таком же виде, иначе непонятно ничего.
     

  13. вы все поняли правильно только в конце программа должна просто выключить плавно свет а фильтр и компрессор должны выключиться до кормления мин за 5.
     
  14. набросок подключений
     

    Вложения:

    • IMAG1115.jpg
      IMAG1115.jpg
      Размер файла:
      964,1 КБ
      Просмотров:
      556
  15. Megakoteyka

    Megakoteyka Оракул Модератор

    Внесите эти исправления в алгоритм и держите его под рукой.
    Хорошо, когда проект есть в голове, но еще лучше, когда он есть на бумаге или на экране.

    Каждое действие программы можно сделать отдельным шагом алгоритма. На каждом шаге можно проверять какое-то условие и переходить к нужному шагу. Таким образом можно пропустить второе кормление. Каждому шагу нужно дать имя и уникальное значение.
    Например:
    Код (Text):
    #define STEP1 1
    #define STEP2 2
    #define STEP3 3

    int step = STEP1;

    void loop()
    {
        switch(step)
        {
            case STEP1:
                step = STEP2;
                break;
            case STEP2:
                step = STEP3;
                break;
            case STEP3:
                step = STEP1;
                break;
        }
    }
    В соответствующих ветках switch нужно делать действия, соответствующие каждому шагу. Затем записываем в переменную step шаг, который нужно выполнить следующим.
    Например, в первом шаге нужно сделать переход на второй шаг только в том случае, если с фотодиода прочитали значение в желаемом диапазоне. Пока не прочитали - продолжаем крутиться в первом шаге.
    Во втором шаге производим первое кормление. В третьем шаге проверяем число кормлений. Если 2 - переходим к четвертому, в котором кормим второй раз. Если 1 - переходим к пятому, в котором завершаем работу.
    Спрашивайте, если что-то непонятно.
     
  16. то есть этот элемент надо поместить в программу и дальше в void loop() после
    switch(step)
    {
    case STEP1:
    step = STEP2;
    break;
    case STEP2:
    step = STEP3;
    break;
    case STEP3:
    step = STEP1;
    break;
    }
    расписать что делает каждый шаг? (STEP1 ....). а как прописать в программе переключение с 1 кормления на 2 мне это больше всего не понятно.
     
  17. Megakoteyka

    Megakoteyka Оракул Модератор

    Это как раз проще всего. Заведите переменную для хранения количества кормлений.
    Сделайте опрос кнопки. Если кнопка нажата - меняйте значение переменной на противоположное.

    Код (Text):
    #include "bounce.h"

    Bounce button = Bounce(BUTTON_PIN, 40);

    boolean korm2 = false;

    void loop()
    {
      button.update();
      if(button.read() == HIGH)
      {
        korm2 = !korm2;
      }
      ...
      if(korm2 == true)
      {
        // покормить второй раз
      }
    }
     
  18. Megakoteyka

    Megakoteyka Оракул Модератор

    Не после, а внутри.

    Код (Text):
    case STEP1:
      // включить свет
      step = STEP2;
      break;
     
    Откройте любую книжку по С/С++ и почитайте, как работает оператор switch.
     
  19. спасибо большое!
     
  20. Unixon

    Unixon Оракул Модератор

    Еще лучше будет воспользоваться enum.
    Код (Text):

    enum TState { stFirst, stSecond, stThird, stCount };
    TState state = stFirst;
     
    Вместо First, Second, Third - названия состояний, а stCount - не обязательно нужно, это только для определения количества элементов enum.