Умный освежитель воздуха

iVasiliy

✩✩✩✩✩✩✩
23 Окт 2018
2
1
Дано: все современные автоматические освежители воздуха типа air wick, glade и прочее весьма тупые, из настроек только интервал времени 5-30мин и все.
Задача: сделать их более умными, поставить Arduino, датчик света и прочее.
-Настроить ночные режимы когда они не активны
-по датчику света определять количество необходимого освежителя, пример свет горит менее 1 мин, след-но воздух особо не испортили и можно брызнуть 1 раз или не брызгать совсем, посидели более 3 минут след-но кто то перестарался и надо освежить воздух посильнее:)
- задержка на срабатывание, чтобы он применялся не когда клиент еще на троне, а например через 1 мин после того как выключат свет
- вел статистику на сколько хватает баллона освежителя и при следующей его замены предупреждал о предстоящей замене
- ручное или звуковое управление (по хлопку в ладоши например) при необходимости освежить воздух принудительно
- при грамотном использовании алгоритмов срабатывания, баллона будет хватать не на 1 мес., а думаю на 6 точно.
 
  • Лойс +1
Реакции: Swarm

Kulibin7

✩✩✩✩✩✩✩
6 Мар 2019
1
2
Домодедово
Привет.
Я не программист, но мне кажется алгоритм ардуино должен быть такой:
СТОИТ ФОТОРЕЗИСТОР. ПРИ ЕГО СРАБАТЫВАНИИ (ВКЛЮЧИЛИ СВЕТ В ТУАЛЕТЕ) начинает таймер отсчитывать время. например 5 мин. Если свет погасили раньше, то таймер остановился и ничего не происходит, т.к. предыдущая строка кода-условия была не выполнена. Ну а если время прошло более 5 минут, то ардуино ждёт следующего выполнения условий - выключения света (вы ушли из туалета) после того как свет погаснет, запускается второй таймер и через минуту происходит распыление. Я не программист, но думаю написать подобный скейтч будет не сложно.
и по железу не хлопотно. Ардуинка-нано, серво и фоторезистор.
 
  • Лойс +1
Реакции: Тоха

Kort

✩✩✩✩✩✩✩
31 Янв 2019
23
7
Опрос датчика света, как только свет включили сидим считаем время до выключения. Выключиили через минуты распыляем освежитель. В зависимости от того сколько времени был включен свет можно замутить разное количество распылений.
Безымянный.jpg
Я у мамы фотошопер :)

Ну в начале сброс распылений на 0 чтоб не пшыкало просто так ну и таймер в 1 минуту который прибавляет количество распылений это число эмпирическое :)
 
Изменено:

Дмитpий

✩✩✩✩✩✩✩
15 Мар 2021
0
0
Здравствуйте!
Пытаюсь с начальным знанием Arduino (тяжело мне даётся эта логика C++) набрать код для срабатывания движка. Пока тренируюсь на светодиоде. Готового решения в сети к сожалению не нашёл. На англ. сайтах искать не умею.
Код, который я интуитивно собрал, к сожалению не работает. Прошу помощи.
C++:
#define PIN_LED 13
#define PIN_PHOTO_SENSOR A0

void setup() {
  Serial.begin(9600);
  pinMode(PIN_LED, OUTPUT);
}

void loop() {
  int val = analogRead(PIN_PHOTO_SENSOR);
  Serial.println(val);
  if (val < 800) 
  {
    delay(3000); // выдерживаем паузу
  }
  if (val < 800) //после паузы проверяем включен ли свет
  {
    digitalWrite(PIN_LED, HIGH);
    delay(500);
  }
    digitalWrite(PIN_LED, LOW); //светодиод выключен
    delay(60000);
}
 

Старик Похабыч

★★★★★★✩
14 Авг 2019
2,869
796
Москва
То, что тренируетесь на светодиоде - правильно.
То, что используете делай - плохо.
Ошибка: Между 2-мя проверками if (val<800) val не меняет свое значение. Что бы значение поменялось надо 2-ой раз сделать чтение входа.
C++:
if (val < 800) 
  {
    delay(3000); // выдерживаем паузу
  }

  if (val < 800) //после паузы проверяем включен ли свет
Ну и по коду светодиод будет гореть максимум 0.5 секунды в минуту
 

Дмитpий

✩✩✩✩✩✩✩
15 Мар 2021
0
0
Да и мне и нужно примерно пол секунды (время срабатывания движка освежителя). И с ваших слов я, увы, ничего не понял. Нужно добавить analogRead(PIN_PHOTO_SENSOR); на пятую строчку? Пробовал, без изменений:)
У меня ардуино не читает строчку про паузу и сразу выполняет последнюю команду delay, как-будто loop начал с неё.

А насчёт delay...ну простите. На микрос и милис я смотрю, как на НЛО ))
 

Старик Похабыч

★★★★★★✩
14 Авг 2019
2,869
796
Москва
а значение val какое ?
Что будет если оно больше или равно 800 ? А будет пауза в минуту и выключенным светодиодом.
По скольку управление идет линейно - плюнем на delay
 

Дмитpий

✩✩✩✩✩✩✩
15 Мар 2021
0
0
@Старик Похабыч, т.е. нужно добавить условие else? Я добавил, и теперь первая delay учитывается, но к второй задержке ещё добавляется первая
C++:
if (val < 800) 
  {
    delay(3000); // выдерживаем паузу
  }
  else 
  {
    digitalWrite(PIN_LED, LOW);
  }
  if (val < 800) //после паузы проверяем включен ли свет
  {
    digitalWrite(PIN_LED, HIGH);
    delay(500);
  }
  else 
  {
    digitalWrite(PIN_LED, LOW);}
    digitalWrite(PIN_LED, LOW); //светодиод выключен
    delay(6000);
}
Я же говорил, что я дилетант и с полуслова пока не понимаю😔
 

Старик Похабыч

★★★★★★✩
14 Авг 2019
2,869
796
Москва
А я вот не понимаю что Вы хотите получить от устройства.. это то же пИчалька.. Я увидел несуразности в коде..
Попробуйте русским по белому написать , что вы хотите получить.

И к объяснению добавьте как у Вас фоторезистор подключен и что выводит в монитор порта вот эта команда: Serial.println(val);

Угадывать и добавлять else конечно можно, но вариантов очень много, что бы попасть куда следует.
 

Дмитpий

✩✩✩✩✩✩✩
15 Мар 2021
0
0
@Старик Похабыч, спасибо что отвечаете🤗
Идея, как у автора сабжа в самом простом её исполнении:
1)В "комнате для допросов" загорается свет и попадает на датчик (фоторезистор);
2)Ардуинка считывает сопротивление с датчика и если оно больше чем 800ед., то запускает отсчёт времени ( 2 минуты)
3)После выдержки паузы, если свет ещё горит, контролер подаёт напряжение на моторчик, который через редуктор давит на впрыск баллона
4)После срабатывания контролер ждёт ещё некоторое время и завершает цикл. Затем цикл повторяется.

ДО меня сейчас только дошло, что условие - то выполнено!
А Serial.println(val) это я не задумываясь вставил с другого скетча, а сейчас понимаю, что эта строчка нужна для мониторинга работы датчика, что мне в принципе не нужно.
завтра соберу Франкиштейна и покажу что получилось (или не получилось😁)
 

Старик Похабыч

★★★★★★✩
14 Авг 2019
2,869
796
Москва
ок.
Тогда примерно так:
Код:
если свет загорелся то
{
  ждем 2 минуты;
  если свет горит то
  {
    давим на газ
    ждем склько надо до завершения цикла
  }
}
у Вас ошибка была в расстановке скобок условий скорее всего. Вы делали следующее условие ВНЕ предыдущего, а надо было ВНУТРИ.
 

Дмитpий

✩✩✩✩✩✩✩
15 Мар 2021
0
0
@Старик Похабыч, спасибо. К сожалению даже на 3 вольтовый двигатель не хватило мощности. Т.е. надо как минимум ставить ещё мосфет. А их надо ещё купить. И по питанию я не определился. Вобщем решил отказаться от этой "умной" затей. Буду колхозить через мосфет и солнечной панельки, как тут расписано.