Помощь с проектом

Тема в разделе "Arduino & Shields", создана пользователем Timuridze, 14 фев 2015.

  1. Timuridze

    Timuridze Нуб

    Здравствуйте. Задумал автоматизировать освежитель воздуха air wick . [​IMG]

    В оригинале не нравится то что интервал очень мал и по сути большую часть времени вонючка пшикает зря. В сети нашел несколько проектов в основном attiny13, что наверно разумнее с точки зрения энергопотребления и цены, ардуино явно избыточен, но не подходило для меня ввиду сложности и желания все таки сделать на ардуино ввиду наличия оного, кроме этого можно расширить возможности освежителя, например реализовав отключение света в туалете если он горит более 15 минут, с помощью модулей на 433 мгц, другой ардуины и реле.

    Что имеем.
    Air wick и балон к нему
    Ардуино про мини -1шт
    фоторезистор -1шт
    транзистор -1шт
    моторчик air wick им и управляем.
    2 резистора 10 кОм и 220 Ом
    аккумулятор 18650 -1шт
    DC-DC преобразователь XTW-SY-8 для повышения до 5в -1шт


    Алгоритм работы следующий.
    Ардуино спит, каждые 8 сек просыпаемся смотрим если свет горит начинаем работу
    Ждем пока свет погаснет. Проверяем сколько горел свет
    Если меньше скажем 5 минут, то ничего не делаем снова засыпаем.
    Если больше 30 минут, то считаем что забыли выключить свет и соответственно ничего не делаем тоже, ну можно свет отключить или послать куда уведомление.
    Если же больше 5 минут но меньше 30 то пшикаем в сортир.
    Все дальше снова засыпем с целью экономии энергии.

    Железная часть все просто, подсказал добрый человек с easyelectronics.
    что касается двигателя
    один резистор на 1-10K и один транзистор наподобие BC847, я взял 2N3904. (Резистор с одной стороны на ножку контроллера(пин 13), с другой на базу транзистора. Транзистор - Эмиттер на землю, Коллектор к движку. Движок - свободным концом к плюсу).

    Фоторезистор подключил к (пин 0) через резистор на 220 Ом


    Теперь сама логика, вот с этим беда в прораммировании я полный 0 и есть вопросы.

    Как лучше организовать проверку наличия света и таймеры? Как уменьшить энергопотребление и реализовать режим сна.
     
  2. vvr

    vvr Инженерище

    Стандартный пример
    Код (Text):
    /* Blink without Delay
    2005
    by David A. Mellis
    modified 8 Feb 2010
    by Paul Stoffregen
    */

    const int ledPin =  13;           // номер выхода, подключенного к светодиоду
    int ledState = LOW;              // этой переменной устанавливаем состояние светодиода
    long previousMillis = 0;        // храним время последнего переключения светодиода
    long interval = 1000;            // интервал между включение/выключением светодиода (1 секунда)

    void setup()
    {
      pinMode(ledPin, OUTPUT);    
    }

    void loop()
    {
      // здесь будет код, который будет работать постоянно
      // и который не должен останавливаться на время между переключениями свето
      unsigned long currentMillis = millis();     //проверяем не прошел ли нужный интервал, если прошел то
      if(currentMillis - previousMillis > interval)
     {  
        previousMillis = currentMillis;             // сохраняем время последнего переключения
        if (ledState == LOW)                           // если светодиод не горит, то зажигаем, и наоборот
          ledState = HIGH;
        else
          ledState = LOW;

        // устанавливаем состояния выхода, чтобы включить или выключить светодиод
        digitalWrite(ledPin, ledState);
      }
    }
    на его основе и делаете свой код
     
    Timuridze нравится это.
  3. vvr

    vvr Инженерище

    Timuridze нравится это.
  4. Timuridze

    Timuridze Нуб

    Спасибо. К сожалению долгое время заниматься проектом не было. Сейчас кое что пытаюсь сделать.
    Код (Text):
    const int led =  13;          // номер выхода, подключенного к двигателю
    int ledState = LOW;
    long previousMillis = 0;        // храним время последнего переключения светодиода
    long interval = 5000;

    int ldr = 0; //и фоторезистора

    void setup() //процедура setup

    {

    pinMode(led, OUTPUT); //указываем, что двиг - выход

    }


    void loop() //процедура loop

    {

    if (analogRead(ldr) > 2)
    {
            unsigned long currentMillis = millis();
            if(currentMillis - previousMillis > interval)  // если прошло меньше 5 сек то выходим.
    {
        previousMillis = currentMillis;    // сохраняем время последнего переключения
     
        if (analogRead(ldr) < 2)    // Ждем погас ли свет, если погас то пшикаем
          {
            digitalWrite(led, HIGH);  //Пшикаем 3 сек
            delay(3000);
            digitalWrite(led, LOW);
          }
        }
      }
    }
     
    Не могу понять где ошибка и почему код не работает.
     
  5. X-Dron

    X-Dron Гик

    analogRead(ldr) не может быть одновременно "> 2" и "< 2".
    По коду второе условие стоит внутри первого.
     
  6. Timuridze

    Timuridze Нуб

    А , я как пытался сделать, если свет горит отсчитываем 5 секунд, проверяем свет погас, да пшикаем, нет ждем пока не погаснет.
     
  7. Timuridze

    Timuridze Нуб

    Бред какой то написал. Как организовать внутри условия цикл, пока свет не погаснет...
     
  8. X-Dron

    X-Dron Гик

    Через внешнюю триггерную переменную. И не внутри, а снаружи.
    Я в ближайшее время (1.5 дня) смогу только читать. Подробно отвечать с телефона не удобно.
    Код на самом деле очень простой. Используя мою библиотеку можно написать в 3-4 строчки в основном цикле.
    http://forum.amperka.ru/threads/Таймеры-и-программный-антидребезг-входов.4280/
     
  9. vvr

    vvr Инженерище

    сначала точно определись с алгоритмом работы
     
  10. X-Dron

    X-Dron Гик

    Я ошибся в Loop только 2 строчки кода и нет триггерных переменных.
    Как-то так
    Код (Text):
    #include <Timer_P.h>

    long Delay = 5000;
    Timer_P Delay_T, Pulse_T;
    const int ldr = A0;
    const int led = 13;

    void setup()
    {
      pinMode(led, OUTPUT);
    }

    void loop()
    {
      //выход таймера Delay_T.Q0() будет повторять условие analogRead(ldr) > 2 с задержкой = Delay.
      //если analogRead(ldr) > 2 == false, Delay_T.Q0() тоже false.
      Delay_T.TimerV(analogRead(ldr) > 2, 0, 2, Delay);
      //как только пропдает Delay_T.Q0() даем импульс на 1.5 сек.
      digitalWrite(led, Pulse_T.Timer(!Delay_T.Q0(), 0, 1, 1500));
    }
    библиотека с Timer_P.h здесь
    https://github.com/X-Dron/X-Dron_lib/archive/master.zip
    Но это все без спящего режима и экономии энергии.
    Насколько я понимаю, для экономии режима нужен не аналоговый датчик освещенности, а дискретный, который вещается на входа с поддержкой прерываний.
     
    Последнее редактирование: 24 фев 2015
  11. Timuridze

    Timuridze Нуб

    Ошибка при компиляции.

    sketch_feb23a.ino: In function ‘void loop()’:
    sketch_feb23a.ino:18:11: error: ‘class Timer_P’ has no member named ‘TimerV’
    sketch_feb23a.ino:20:44: error: ‘class Timer_P’ has no member named ‘Q0’
     
  12. X-Dron

    X-Dron Гик

    Обнови библиотеку. Странно, что локально внесенные 23 дня назад изменения не были синхронизованы с сервером.
    Подправил скетч. Вторая строка в loop должна быть такая.
    digitalWrite(led, Pulse_T.Timer(!Delay_T.Q0(), 0, 1, 1500));
     

    Вложения:

  13. Timuridze

    Timuridze Нуб

    Ага спасибо отлично, откомпилировалось. Но заметил.
    Фоторезистор закрыт.
    Открываю фоторезистор(то есть свет в туалете включили) через 5 сек, пшик в любом случае. Если закрыть в течении этих 5 сек, то пшика не будет.

    Хотя планировал как. Свет включили ждем пока свет выключится, если прошло больше 5 минут(в примере для удобства пока 5 сек) с момента включения света то пшикаем, но только после того как свет выключили, если менее то не пшикаем.
     
  14. X-Dron

    X-Dron Гик

    Да, режим первого таймера не тот поставил.
    Так должно работать
    Delay_T.TimerV(analogRead(ldr) > 2, 0, 2, Delay);
    Не удивляйся, что при первом включении тоже будет "пшикать". Чтобы от этого избавиться, нужно во втором таймере вместо !Delay_T.Q0() поставить изменение этого сигнала с 1 на 0. Т.е. завести еще одну переменную, в которую будет записываться предыдущее состояние Delay_T.Q0().
     
  15. Timuridze

    Timuridze Нуб

    Да все работает....Но теперь что то с железной частью...
    Решил протестировать проект непосредственно на освежителе. Возникла проблема. Просто двигатель крутиться, но при подсоединении редукторов мощности не хватает чтобы крутануть двигатель, думаю что маловато тока на мотор выходит с транзистора. Потому что при подкючении моторчика напрямую он урчит намного бодрее чем при подключении через транзистор. Пробовал варьировать резистор ставил 1 Ком и 10кОм...не помогает.