Вытяжка в ванную.... помогите!!!
- Войдите на сайт для отправки комментариев
Втр, 18/12/2018 - 13:08
Всем првиет!!!
Решил сделать вытяжку в ванной, но что б при нажатии кнопки (возвратная) вытяжка включалась на 15 минут, но когда она работает нажимаешь кнопку и вытяжку принудительно можно было отключить...
Просмотрел много тем на форуме, и ничего не получилось... Помогите...
Нарботок совсем нет. Знания в Си оч слабые.
Всем заранее спасибо!!!
Ничего не получилось или ничего не делал?
int BUTTON=0; void setup () { pinMode(13,OUTPUT); pinMode(12,OUTPUT); pinMode(9,INPUT); pinMode(8,INPUT); Serial.begin (9600); } void loop () { Serial.println (BUTTON); if(digitalRead(8)==HIGH&&BUTTON==0)//если кнопка нажата // и перемення "BUTTON" равна 0 , то ... { delay(50);//защита от дребезга BUTTON++;//пишем 1 в переменную кнопка //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие digitalWrite(13, !digitalRead(13));//меняем значение порта на противоположное } if(digitalRead(8)==LOW&&BUTTON==1)//если кнопка НЕ нажата //и переменная knopka равна - 1 ,то ... { BUTTON=0; } }получалось както коряво все. вот сейчас сдела что одной кнопкой включает и выключается
вот надо сюда как то доабвить что б 10 минут работала
5 минут разгоняется...
почему бы не поискать "Таймер Ноотехника для санузлов БЗТ-300-СУ"?
из минусов цена (530 руб) и вреря раьоты вытяжки (5 мин),
из плюсов - уже все готово.
Ну, если уж городить огород, то думаю, нужно сделать следующее:
1. Определение наличия напряжения в сети на лампу освещения:
http://arduino.ru/forum/apparatnye-voprosy/nuzhno-otslezhivat-nalichie-220-volt-na-linii#comment-237580
http://arduino.ru/forum/apparatnye-voprosy/nuzhno-otslezhivat-nalichie-220-volt-na-linii#comment-237805
2. для управления вентилятором можно использовать:
1. Механическое реле
Ссылку не даю, мне не интересно так как счелкает громко.
2. Твердотельное реле.
Можно такую:
https://ru.aliexpress.com/item/SSR-40AA-H-40A-Solid-State-Relay-Module-80-280V-AC-90-480V-Aluminum-Heat-Sink/32820082177.html?spm=a2g0v.search0604.3.16.4b5537cczFmWmp&ws_ab_test=searchweb0_0,searchweb201602_1_10065_10068_5730211_319_317_5729711_10696_453_10084_454_10083_10618_10307_10301_538_537_536_10059_10884_10889_10887_100031_321_322_10915_10103_10914_10911_10910-10889,searchweb201603_51,ppcSwitch_0&algo_expid=6964e733-674b-430d-8e3a-7f5cd7fb2fbe-2&algo_pvid=6964e733-674b-430d-8e3a-7f5cd7fb2fbe
Или вот такую. Эта мне больше нравится тем, что она меньше. Но стоит ли заморачиваться на размерах.
https://ru.aliexpress.com/item/5PCS-Relay-Module-G3MB-202P-G3MB-202P-DC-AC-PCB-SSR-In-5V-DC-Out-240V/32827372038.html?spm=a2g0v.search0604.3.2.4e8858caIeWKQg&ws_ab_test=searchweb0_0,searchweb201602_1_10065_10068_5730211_319_317_5729711_10696_453_10084_454_10083_10618_10307_10301_538_537_536_10059_10884_10889_10887_100031_321_322_10915_10103_10914_10911_10910-10889,searchweb201603_51,ppcSwitch_0&algo_expid=f2ff5be7-8b19-4119-a32d-96bcc763e03b-0&algo_pvid=f2ff5be7-8b19-4119-a32d-96bcc763e03b
https://ru.aliexpress.com/item/5V-700mA-3-5W-AC-DC-Precision-Buck-Converter-AC-220v-to-5v-DC-step-down/32649591757.html?spm=a2g0v.search0604.3.199.35042aa1pjiVlw&ws_ab_test=searchweb0_0,searchweb201602_1_10065_10068_5730211_319_317_5729711_10696_453_10084_454_10083_10618_10307_10301_538_537_536_10059_10884_10889_10887_100031_321_322_10915_10103_10914_10911_10910,searchweb201603_51,ppcSwitch_0&algo_expid=0fdf16f8-2c8e-4465-ac69-6f039b92b22e-28&algo_pvid=0fdf16f8-2c8e-4465-ac69-6f039b92b22e
Да, в 530 рубликов пожалуй не уложиться
время не столько критично. главно саму идею релизовать
железо у меня все есть.. мне скетч надо написать...
железо у меня все есть.. мне скетч надо написать...
либо книшки читай из песочницы, если сам хочешь сделать, либо в "Ищу исполнителя" за деньги, либо забей.
либо ознакомиться
http://lurkmore.to/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE%D0%BB%D1%8E%D0%B1%D0%B...
и идти...
либо ознакомиться
http://lurkmore.to/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE%D0%BB%D1%8E%D0%B1%D0%B...
и идти...
Если даже эта ссылка не открывается, то у вас очень мало шансов дойти до финала.
ссылку банит реалком
вот вам другая ссылка http://arduino.ru/forum
в верху пишите в строке поика слово "вытяжка", выдаст кучу готовых проектов
На этапе постановки задачи - никаких знаний с++ не требуется. Надо просто, человеческими словами, описать шаг за шагом действия, которых Вы ожидаете от программы.
Что-то типа:
* нажали кнопку: - проверяем, был ли включен вентилятор до этого: если был - то выключаем его если не был - включаемспасибо. алгоритм я умею составлять
спасибо. алгоритм я умею составлять
Странно, а в чем тогда проблема, перевести правильно составленный алгоритм в машинный язык?
Правильный алгоритм - 80% написания программы. Осталось человеческие термины заменить на языковые конструкции понятные компилятору. ИМХО.
Ну вот приблизительно так. За основу взят Ваш код, внесены правки. Проверено - работает.
// Вытяжка в ванную.... помогите!!! // Подразумевается, что нажатая кнопка - это HIGH // на самом деле лучше использовать внутреннюю подтяжку пина: pinMode(8, INPUT_PULLUP); // в этом случае несколько проще схемотехническое решение получается. И логика в программе немножко изменится: // нажатие кнопки будет LOW int BUTTON = 0; boolean lPressed = false; // флажок нажатия кнопки boolean lON = false; // включить/выключить механизьму void setup () { pinMode(13, OUTPUT); pinMode(12, OUTPUT); // Это где используем? pinMode(9, INPUT); // Это где используем? pinMode(8, INPUT); Serial.begin (9600); } void loop () { Serial.println (BUTTON); // Выводим в порт количество обработанных нажатий кнопки - чисто для информации //if (digitalRead(8) == HIGH && BUTTON == 0) //если кнопка нажата if (digitalRead(8) == HIGH && !lPressed) { //если кнопка нажата и нажатие еще не обрабатывалось ( !lPressed) // и переменная "BUTTON" равна 0 , то ... delay(50); //защита от дребезга if (digitalRead(8) == HIGH) // снова проверяем состояние кнопки и если она все еще нажата - считаем, что нажатие состоялось успешно { lPressed = true; // запомним, что кнопка нажата lON = !lON; // изменим выполняемое действие BUTTON++; //пишем 1 в переменную кнопка - УВЕЛИЧИВАЕМ НА ЕДИНИЦУ!!! //digitalWrite(13, !digitalRead(13)); // меняем значение порта на противоположное digitalWrite(13, lON); // Выполняем нужное действо } } // Теперь ловим, когда кнопка отожмется // Поскольку мы договорились, что нажатая кнопка - это HIGH, то удобно делать это, просто считывая состояние порта lPressed = digitalRead(8); /* if (digitalRead(8) == LOW && BUTTON == 1) //если кнопка НЕ нажата //и переменная knopka равна - 1 ,то ... { BUTTON = 0; } */ }Ну вот приблизительно так. За основу взят Ваш код, внесены правки. Проверено - работает.
// Вытяжка в ванную.... помогите!!! // Подразумевается, что нажатая кнопка - это HIGH // на самом деле лучше использовать внутреннюю подтяжку пина: pinMode(8, INPUT_PULLUP); // в этом случае несколько проще схемотехническое решение получается. И логика в программе немножко изменится: // нажатие кнопки будет LOW int BUTTON = 0; boolean lPressed = false; // флажок нажатия кнопки boolean lON = false; // включить/выключить механизьму void setup () { pinMode(13, OUTPUT); pinMode(12, OUTPUT); // Это где используем? pinMode(9, INPUT); // Это где используем? pinMode(8, INPUT); Serial.begin (9600); } void loop () { Serial.println (BUTTON); // Выводим в порт количество обработанных нажатий кнопки - чисто для информации //if (digitalRead(8) == HIGH && BUTTON == 0) //если кнопка нажата if (digitalRead(8) == HIGH && !lPressed) { //если кнопка нажата и нажатие еще не обрабатывалось ( !lPressed) // и переменная "BUTTON" равна 0 , то ... delay(50); //защита от дребезга if (digitalRead(8) == HIGH) // снова проверяем состояние кнопки и если она все еще нажата - считаем, что нажатие состоялось успешно { lPressed = true; // запомним, что кнопка нажата lON = !lON; // изменим выполняемое действие BUTTON++; //пишем 1 в переменную кнопка - УВЕЛИЧИВАЕМ НА ЕДИНИЦУ!!! //digitalWrite(13, !digitalRead(13)); // меняем значение порта на противоположное digitalWrite(13, lON); // Выполняем нужное действо } } // Теперь ловим, когда кнопка отожмется // Поскольку мы договорились, что нажатая кнопка - это HIGH, то удобно делать это, просто считывая состояние порта lPressed = digitalRead(8); /* if (digitalRead(8) == LOW && BUTTON == 1) //если кнопка НЕ нажата //и переменная knopka равна - 1 ,то ... { BUTTON = 0; } */ }а как сделать что бы определенное время работала?
А, точно, забыл, что нужно делать выдержку. Ща соображу, погоди.
Вот с контролем времени. Лишнее подчистил.
// Вытяжка в ванную.... помогите!!! // Подразумевается, что нажатая кнопка - это HIGH // на самом деле лучше использовать внутреннюю подтяжку пина: pinMode(8, INPUT_PULLUP); // в этом случае несколько проще схемотехническое решение получается. И логика в программе немножко изменится: // нажатие кнопки будет LOW #define LIGHT_TIME 900000L // 15 * 60 * 1000 миллисекунд int BUTTON = 0; boolean lPressed = false; // флажок нажатия кнопки boolean lON = false; // включить/выключить механизьму long start_ON_Time = 0; // время включения (мсек) void setup () { pinMode(13, OUTPUT); pinMode(12, OUTPUT); // Это где используем? pinMode(9, INPUT); // Это где используем? pinMode(8, INPUT); Serial.begin (9600); } void loop () { Serial.println (BUTTON); // Выводим в порт количество обработанных нажатий кнопки - чисто для информации if (digitalRead(8) == HIGH && !lPressed) { //если кнопка нажата и нажатие еще не обрабатывалось ( !lPressed) delay(50); //защита от дребезга if (digitalRead(8) == HIGH) // снова проверяем состояние кнопки и если она все еще нажата - // считаем, что нажатие состоялось успешно { lPressed = true; // запомним, что кнопка нажата lON = !lON; // изменим выполняемое действие BUTTON++; // УВЕЛИЧИВАЕМ НА ЕДИНИЦУ!!! digitalWrite(13, lON); // Выполняем нужное действо if (lON) start_ON_Time = millis(); // Засекаем время включения } } // Теперь ловим, когда кнопка отожмется // Поскольку мы договорились, что нажатая кнопка - это HIGH, // то удобно делать это, просто считывая состояние порта lPressed = digitalRead(8); // Проверяем, а не пора ли сушить весла if (lON && (millis() - start_ON_Time > LIGHT_TIME)) { // условие выполняется только если свет включен и прошло много времени. // на самом деле, тут нужна немного более сложная проверка, потому что раз в ~2 суток счетчик миллисекунд // переполняется и начинает отсчет с нуля. Поэтому, если включение произошло менее, чем за 15 минут до этого // переполнения - есть риск, что свет сам не выключится никогда :) lON = false; digitalWrite(13, lON); // Выполняем нужное действо } }Вот с контролем времени. Лишнее подчистил.
// Вытяжка в ванную.... помогите!!! // Подразумевается, что нажатая кнопка - это HIGH // на самом деле лучше использовать внутреннюю подтяжку пина: pinMode(8, INPUT_PULLUP); // в этом случае несколько проще схемотехническое решение получается. И логика в программе немножко изменится: // нажатие кнопки будет LOW #define LIGHT_TIME 900000L // 15 * 60 * 1000 миллисекунд int BUTTON = 0; boolean lPressed = false; // флажок нажатия кнопки boolean lON = false; // включить/выключить механизьму long start_ON_Time = 0; // время включения (мсек) void setup () { pinMode(13, OUTPUT); pinMode(12, OUTPUT); // Это где используем? pinMode(9, INPUT); // Это где используем? pinMode(8, INPUT); Serial.begin (9600); } void loop () { Serial.println (BUTTON); // Выводим в порт количество обработанных нажатий кнопки - чисто для информации if (digitalRead(8) == HIGH && !lPressed) { //если кнопка нажата и нажатие еще не обрабатывалось ( !lPressed) delay(50); //защита от дребезга if (digitalRead(8) == HIGH) // снова проверяем состояние кнопки и если она все еще нажата - // считаем, что нажатие состоялось успешно { lPressed = true; // запомним, что кнопка нажата lON = !lON; // изменим выполняемое действие BUTTON++; // УВЕЛИЧИВАЕМ НА ЕДИНИЦУ!!! digitalWrite(13, lON); // Выполняем нужное действо if (lON) start_ON_Time = millis(); // Засекаем время включения } } // Теперь ловим, когда кнопка отожмется // Поскольку мы договорились, что нажатая кнопка - это HIGH, // то удобно делать это, просто считывая состояние порта lPressed = digitalRead(8); // Проверяем, а не пора ли сушить весла if (lON && (millis() - start_ON_Time > LIGHT_TIME)) { // условие выполняется только если свет включен и прошло много времени. // на самом деле, тут нужна немного более сложная проверка, потому что раз в ~2 суток счетчик миллисекунд // переполняется и начинает отсчет с нуля. Поэтому, если включение произошло менее, чем за 15 минут до этого // переполнения - есть риск, что свет сам не выключится никогда :) lON = false; digitalWrite(13, lON); // Выполняем нужное действо } }залил... чет по времени не отключается:(((
Может так
bool BUTTON = 0; uint32_t time; bool f_run=0; void setup () { pinMode(13,OUTPUT); pinMode(12,OUTPUT); pinMode(9,INPUT); pinMode(8,INPUT); Serial.begin (9600); } void loop () { Serial.println (BUTTON); if(digitalRead(8)==HIGH && !f_run)//если кнопка нажата // и перемення "BUTTON" равна 0 , то ... { delay(50);//защита от дребезга if(digitalRead(8)){ f_run=1; time = millis(); BUTTON=1; } } if(BUTTON && millis()-time >= 10000)//Стоит 10 секунд - { digitalWrite(13, LOW); BUTTON = 0; f_run = 0; } if (digitalRead(8) && f_run) { delay(50); if(digitalRead(8)){ f_run=0; BUTTON=0; } } digitalWrite(13, BUTTON);//Должно, я проверял. Попробуй уменьшить время в дефайне, чтобы быстрее срабатывало отключение, например
/**/ enum state_t {sOFF = 0, sON} state; void stand (state_t s) { state = s; switch (state) { case sOFF: break; case sON: break; } } //----------------------------- void setup() { } void loop() { switch (state) { case sOFF: break; case sON: break; } }Автомат не только меняет состояние но и вкл(выкл) лампу
/**/ const byte LedPin =/*пин лампы*/13; enum state_t {sOFF = 0, sON} state; void stand (state_t s) { state = s; switch (state) { case sOFF: break; digitalWrite(LedPin, LOW); case sON: break; digitalWrite(LedPin, HIGH); } } //----------------------------- void setup() { pinMode(LedPin, OUTPUT); stand(sOFF); } void loop() { switch (state) { case sOFF: break; case sON: break; } }Теперь подлючим кнопку, что бы вкл и выключало.
/**/ const byte LedPin =/*пин лампы*/13; const byte btnPin =/*пин кнопки*/2; bool btn;/**/ enum state_t {sOFF = 0, sON}; state_t state; void stand(state_t s) { state = s; switch (state) { case sOFF: digitalWrite(LedPin, LOW); break; case sON: digitalWrite(LedPin, HIGH); break; } } //----------------------------- void setup() { pinMode(LedPin, OUTPUT); stand(sOFF); pinMode(btnPin, INPUT_PULLUP); btn=digitalRead(btnPin); } void loop() { switch (state) { case sOFF: break; case sON: break; } switch (digitalRead(btnPin)) { case 0: if (btn) { btn = 0; delay(50); if (state == sOFF) stand(sON);/*если темно вкл*/ else stand(sOFF);/*если темно отключить*/ } break; case 1: if (!btn) { btn = 1; delay(50); } break; } }Ну и наконец добавим время отключения при горящем свете.
/**/ const byte LedPin =/*пин лампы*/13; const byte btnPin =/*пин кнопки*/2; const unsigned long time5s = 5000; /*время 5 секунд*/ unsigned long past; enum state_t {sOFF = 0, sON}; state_t state; void stand(state_t s) { state = s; past = millis(); switch (state) { case sOFF: digitalWrite(LedPin, LOW); break; case sON: digitalWrite(LedPin, HIGH); break; } } bool btn;/*состояние кнопки*/ bool readBtn() { return digitalRead(btnPin); } //----------------------------- void setup() { pinMode(LedPin, OUTPUT); stand(sOFF); pinMode(btnPin, INPUT_PULLUP); btn = readBtn(); } void loop() { switch (state) { case sOFF: break; case sON:/*если включно*/ if (millis() - past >= time5s)/*и горит больше 5 секунд*/ stand(sOFF);/*то выключить*/ break; } bool tmp = readBtn(); if (!tmp && btn) {/*если кнопка нажата*/ delay(50); btn = tmp; if (state == sOFF) stand(sON);/*если темно вкл*/ else stand(sOFF);/*если темно отключить*/ } if (tmp && !btn) {/*если кнопка отжата*/ delay(50); btn = tmp; } }ПС: Убрал ошибки , какие сказаны в посте снизу.
Можно и так. Пару комментариев к коду:
а) состояние нажатой кнопки - LOW, вроде бы
б) и, походу, строки 13 и 14 местами поменять.
И еще: я бы ввсе-таки добавил проверку состояния кнопки после delay(). А то мало ли - муха пролетала, кнопочку нажала.
Ну и наконец добавим время отключения при горящем свете.
/**/ const byte LedPin =/*пин лампы*/13; const byte btnPin =/*пин кнопки*/2; const unsigned long time5s = 5000; /*время 5 секунд*/ unsigned long past; enum state_t {sOFF = 0, sON}; state_t state; void stand(state_t s) { state = s; past = millis(); switch (state) { case sOFF: digitalWrite(LedPin, LOW); break; case sON: digitalWrite(LedPin, HIGH); break; } } bool btn;/*состояние кнопки*/ bool readBtn() { return digitalRead(btnPin); } //----------------------------- void setup() { pinMode(LedPin, OUTPUT); stand(sOFF); pinMode(btnPin, INPUT_PULLUP); btn = readBtn(); } void loop() { switch (state) { case sOFF: break; case sON:/*если включно*/ if (millis() - past >= time5s)/*и горит больше 5 секунд*/ stand(sOFF);/*то выключить*/ break; } bool tmp = readBtn(); if (!tmp && btn) {/*если кнопка нажата*/ delay(50); btn = tmp; if (state == sOFF) stand(sON);/*если темно вкл*/ else stand(sOFF);/*если темно отключить*/ } if (tmp && !btn) {/*если кнопка отжата*/ delay(50); btn = tmp; } }ПС: Убрал ошибки , какие сказаны в посте снизу.
ВОООООО!!!! работает как надо!!! То что хотел..... Огромное спасибо!!!!!!!!!
Игорь и тебе спасибо за помощь!!!
Вот как все получилось:) Всем спасибо