Как сделать несколько действий на определённое время в if
- Войдите на сайт для отправки комментариев
Пнд, 21/03/2016 - 12:18
Всем доброго времени суток!
Нужна помощ. Решил собрать вентиляцию для гаража . Чтобы включались два вентилятора через 2 РЕЛЕ при превышении загазованасти воздуха выше 150, на 3 минуты. И при этом срабатывал звукавой зумер и мигал светодиод .Светодиод и зумер должен включатся при условии что показания выше 150 и выключатся ниже 150. Ну с эттим я справился.
Но как обяснить двум реле (RELE1, RELE2) включатся при показании выше 150 на 3 минуты ???
#define AIn A0 //Вход датчика газа #define alarm 4 //Зумер #define RELE1 2 // Реле1 #define RELE2 3 // Реле2 #define LED 5 //светодиод void setup() { pinMode(AIn, INPUT); //аналоговый А0 он же AIn будет работать как вход Serial.begin(9600); //Серийный порт скорость 9600 pinMode(alarm, OUTPUT); pinMode(RELE1, OUTPUT); pinMode(RELE2, OUTPUT); pinMode(LED, OUTPUT); } void loop() { Serial.println(analogRead(AIn)); int SensorData = analogRead(AIn); if (SensorData > 150 and SensorData < 1023) // Показания газа { digitalWrite(alarm, HIGH); // включили зумер digitalWrite(LED, HIGH); // Включили светодиод диод delay (100); //Задержка 100 мсек digitalWrite(alarm, LOW);//Выключим зумер digitalWrite(LED, LOW); // Включили светодиод } }
класс титановый велосипед для delay без delay().
да уж для новичка это сложновато :(
а какогото решения по проще я так понял несуществует, да?
А где взять библеотеку? я создал папку class_noDELAY
потом создал текстовый фаил с названием class_noDELAY.h
но что в него записать нужно???
Вот это
vde69, не вводи людей в заблуждение, должно быть так:
Ребят я теперь совсем запутался. Как мне теперь туда превязать 2 реле со светодиодом и зумером, ведь они все должны срабатывать только при условии что с датчика приходит значение от 150 до 1023.
Куда вписать условия включения всего механизма?
И теперь я так понял delay использовать нельзя? Но как в таком случае светодиод и зумер будут мигать и звинеть? Как их прерывать на 100 мсек не мешая двум реле??
взять пример BlinkWithoutDelay и на его основе сделать конечные автоматы:
Хотя у меня есть такое подозрение, что если взять Велосипед от Клапауция и вникнуть в те абстракции, задачу можно реализовать более изящно.
Спасибо друг, буду пробовать...
Попробовал внести свои параметры пока не стал добавлять вторую реле.
Но при кампиляцыи выходит ошибка в трёх строчках (68,69,70)
Это видимо данные об ошибке: 69:62: warning: integer overflow in expression [-Woverflow]
не пойму что конкретно там не так?
Попрбовал ваш код - скомпелировался и залился без каких либо ошибок (Ардуино 1.6.8)
А у меня вот что пишет красным после компелирования (1.6.8):
В строках 9-11 добавь UL к 180: 180UL
Спасибо всё получилось. Буду проверять скеч на деле ;)
А что означает это UL после 180 секунд?
Литерал UL == unsigned long
http://mycpp.ru/cpp/book/c03_1.html
Эхх только обрадовался но появилась новая проблема ((
Теперь после запуска значение датчика резко подпрыгивает гдето от 149-150 до 230-240.
Думал датчик накрылся, но когда заливаю обычный скеч без реле и временных настроек, то паказывает нормально значение около 50.
Вот старый скеч на котором данные датчика правельные(просто для примера):
А вот нужный скеч на котором датчик врет. И почемуто раз уж значение сразу выше 150 получаются то должно по задумке включится реле. А оно щелкнит один раз и зумер также, и всё на этом. А значения датчика так и висит 230-240...
Думал датчик накрылся, но когда заливаю обычный скеч без реле и временных настроек, то паказывает нормально значение около 50.
#define AIn A0 - в первом
#define SENSOR_PIN A1 - во втором
Да действительно, так глупо прозивал )). Заменил A1 на A0 и датчик стал показывать нормально.
Но почемуто всё наоборот. При запуске реле сразуже включается хоть значения датчика и около 50. А после того как значения подымаются выше 150 оно выключается. Ну и по прошествию 3 минут оно пытается включится, но вместо этого немного моргнёт и зависает монитор порта и вместе с ним я так понимаю сама ардуина.
Я уже подумал что нужно поменять местами (HIGH и LOW) в 12-ой и 13-ой строчке. Но это не помагло, работало точно также...
Нписал простенький скеч для проверки реле работает (выше 150 ВКЛ; а ниже 150 ВЫКЛ).
Что тогда заставляет её сразуже включится при нормальных показаниях не превышающих условие ???
замени строку 73 на
У тебя инверсные реле, включаются по уровню LOW.
P.S. строки 12-13 можно выкинуть, они не используются.
Спасибо, оно теперь хоть включатся при старте перестало. :)
При достижении значения сенсора 150 реле включается но на одну секунду, затем выключается, монитор порта зависает и ардуина. ((
А где взять библеотеку? я создал папку class_noDELAY
потом создал текстовый фаил с названием class_noDELAY.h
#23
Извиняюсь я не понял, так в моём случае был нужен class BUTTON.h или class_noDELAY.h ??
там же вроде разные библиотеки или это одно и то же?
И ещё вопрос по решению которое предложил ув.Tomasina
Как доработать этот вариант, так как он для моего "огромного" опыта :) немного понятнее ? А то я чтото в тупике. Вроде понял как работает эта система с тремя счетчиками. Но немагу найти почему она не срабатывает как надо (через сикунду после включения реле оно выключается и ардуино зависает, светодиод не мигает и бузер молчит).
Какой раз перечитываю скеч, ну всё вроде сходится. Но ведь такого же небывает. Или у меня опыта маловато и я чтото пропускаю мимо глаз.
У меня уже даже газ в зажигалке для опытов кончился. )))
Только что проверено на макетке, все работает корректно, при превышении порога начинает истерично моргать LED на плате (остальное не подключено), через 10 секунд моргать перестает (если значение ниже 150). В порт сообщения выводятся постоянно, т.е. ничего не висит.
Попробуй физически отключить реле (может от него идет помеха) и проверить этот код:
убрал 36 строчку вывод на серийный порт. Ардуино перестал зависать. Но реле включается и выключается каждую секунду, до тех пор пока значение не упадёт ниже 150( это я уже в слепую определил). Хотя указано что должно быть включенным 180 секунд. И светодиод с бузером по прежнему молчат...
Спасибо!! Ну ты ЧЕЛОВЕЧИЩЕ! Какой раз выручаеш! Вот такой должен быть настоящий друг! Я твой должник. Без тебя бы еще месяц этот скеч перечитывал. )) Если что может и я тебе прегожусь. Нуууууу... конечно програмист из меня пока некудышный ))) ну может что по железу подсказать нужно будет или дампом каким поделится. В общем считай что у тебя на одного друга больше ... :)
Светодиод заработал, Реле работает как написано на 10 секунд. Им просто на двоих питания не хвотало вот реле и отключалось (потамучто слишком много жрет :))) ) питание проседало и дуино зависало. Кинул внешнее питание на реле и проблема исчезла! Осталась тока проблема с бузером. Молчит саббака. Может его заменить попробовать?? Вроде был рабочий...
зуммер на какое напряжение? Они разные бывают.
http://www.pighixxx.com/test/portfolio-items/connect-a-buzzer-with-trans...
Плюс они есть с внутренним генератором (сам пищит при подаче напряжения) или без (надо программно формировать ШИМ).
Извиняюсь я не понял, так в моём случае был нужен class BUTTON.h или class_noDELAY.h ??
там же вроде разные библиотеки или это одно и то же?
а сам ты как думаешь, что тебе нужно подключить - класс для кнопки или для генерации событий?
Клапауций 322
Ну я собственно так и подумал ;)
Tomasina
Да обычный с материнки напряжение щас не скажу... Но он у меня работал в другом скече ему хватало, но не пещал а просто щелкал с интервалом 100мсек наверное вольт на 5, а щас не хочет. Так что думаю без встроенного генератора )... Да и програмно формировать шим наверно много заморочек?
Клапауций 322
Ну я собственно так и подумал ;)
ок. ещё раз прочитай и подумай:
подключение кода класса как библиотеки #186
Клапауций 322
Спасибо, я ещё вернусь к этой теме в будущем и обязательно её изучу.
Обещаю :)
Значит без генератора.
Формировать сигнал - пара строчек: http://arduino.ru/Reference/Tone