Здравствуйте. Задумал автоматизировать освежитель воздуха air wick . В оригинале не нравится то что интервал очень мал и по сути большую часть времени вонючка пшикает зря. В сети нашел несколько проектов в основном 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 и есть вопросы. Как лучше организовать проверку наличия света и таймеры? Как уменьшить энергопотребление и реализовать режим сна.
Стандартный пример Код (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); } } на его основе и делаете свой код
Спасибо. К сожалению долгое время заниматься проектом не было. Сейчас кое что пытаюсь сделать. Код (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); } } } } Не могу понять где ошибка и почему код не работает.
analogRead(ldr) не может быть одновременно "> 2" и "< 2". По коду второе условие стоит внутри первого.
А , я как пытался сделать, если свет горит отсчитываем 5 секунд, проверяем свет погас, да пшикаем, нет ждем пока не погаснет.
Через внешнюю триггерную переменную. И не внутри, а снаружи. Я в ближайшее время (1.5 дня) смогу только читать. Подробно отвечать с телефона не удобно. Код на самом деле очень простой. Используя мою библиотеку можно написать в 3-4 строчки в основном цикле. http://forum.amperka.ru/threads/Таймеры-и-программный-антидребезг-входов.4280/
Я ошибся в 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 Но это все без спящего режима и экономии энергии. Насколько я понимаю, для экономии режима нужен не аналоговый датчик освещенности, а дискретный, который вещается на входа с поддержкой прерываний.
Ошибка при компиляции. 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’
Обнови библиотеку. Странно, что локально внесенные 23 дня назад изменения не были синхронизованы с сервером. Подправил скетч. Вторая строка в loop должна быть такая. digitalWrite(led, Pulse_T.Timer(!Delay_T.Q0(), 0, 1, 1500));
Ага спасибо отлично, откомпилировалось. Но заметил. Фоторезистор закрыт. Открываю фоторезистор(то есть свет в туалете включили) через 5 сек, пшик в любом случае. Если закрыть в течении этих 5 сек, то пшика не будет. Хотя планировал как. Свет включили ждем пока свет выключится, если прошло больше 5 минут(в примере для удобства пока 5 сек) с момента включения света то пшикаем, но только после того как свет выключили, если менее то не пшикаем.
Да, режим первого таймера не тот поставил. Так должно работать Delay_T.TimerV(analogRead(ldr) > 2, 0, 2, Delay); Не удивляйся, что при первом включении тоже будет "пшикать". Чтобы от этого избавиться, нужно во втором таймере вместо !Delay_T.Q0() поставить изменение этого сигнала с 1 на 0. Т.е. завести еще одну переменную, в которую будет записываться предыдущее состояние Delay_T.Q0().
Да все работает....Но теперь что то с железной частью... Решил протестировать проект непосредственно на освежителе. Возникла проблема. Просто двигатель крутиться, но при подсоединении редукторов мощности не хватает чтобы крутануть двигатель, думаю что маловато тока на мотор выходит с транзистора. Потому что при подкючении моторчика напрямую он урчит намного бодрее чем при подключении через транзистор. Пробовал варьировать резистор ставил 1 Ком и 10кОм...не помогает.