реостат и срабатывание реле
- Войдите на сайт для отправки комментариев
Вс, 09/03/2014 - 14:53
Ребят, доброго дня.
Подскажите пожалуйста. Что то не могу разобраться с MILLIS.
Есть реостат ,с него получаем данные от 0 до 127. переменная G
Далее ,очень хотелось бы сделать ,что бы рылюшка щелкала (вкл выкл) взависимости от значения G (типо 127 раз в минуту) или при 0 вообще выключена была (тоесть разорвала цепь).
есть функция DELEY () но она не подходит -тормозит всю программу(реостатов 3 и реле три).
Помогите пожалуйста.
Способ №1 (без использования прерываний)
Исходя из напряжения на реостате рассчитать три частоты для трех каналов, например 100, 50 и 20 Гц и т определить периоды:
T1=1/100 (10 мсек)
T2=1/50 (20 мсек)
T3=1/20 (50 мсек)
запомнить t1=t2=t3=millis();
в цикле
ct=millis();
по условию (ct-t1) >= T1 передернуть реле 1, запомнить новое t1=millis() и вычислить новое T1; аналогично для каналов 2 и 3
и не забывать про отдаленное переполнение millis() :-)
при этом надо понимать, что изменение положения реостата до окончания очередного периода t1 t2 t3 не будет обрабатано.
Способ №1 (без использования прерываний)
А второй вариант ? А то что то слишком умно -частоты какие то ?!!
Способ №1 (без использования прерываний)
А второй вариант ? А то что то слишком умно -частоты какие то ?!!
В первом варианте ошибся: у вас G колич раз раз в минуту, а не в секунду. Переделайте время T1 T2 T3 в 60 больше.
Второй вариант "заряжаете" таймер на время T1 и срабатывания прерывания.
В прерывании считываете значение реостата, перезаряжаете таймер на очередное прерывание и дергаете ножкой реле1
(количество таймеров мало, а желающих много)
Способ №1 (без использования прерываний)
А второй вариант ? А то что то слишком умно -частоты какие то ?!!
В первом варианте ошибся: у вас G колич раз раз в минуту, а не в секунду. Переделайте время T1 T2 T3 в 60 больше.
Второй вариант "заряжаете" таймер на время T1 и срабатывания прерывания.
В прерывании считываете значение реостата, перезаряжаете таймер на очередное прерывание и дергаете ножкой реле1
(количество таймеров мало, а желающих много)
В ножки кланиюсь!!!!!! Боюсь не осилю!!!! Мысль летает и улетает :( Если не трудно можно живой код. Реально буду очень блогадарен. Хочу сделать дополнительное управление стеклоочистителей для машинки.
/* Blink without Delay 2005 by David A. Mellis modified 8 Feb 2010 by Paul Stoffregen */ const int ledPin = 13; // номер выхода, подключенного к светодиоду // Variables will change: 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); } }Спасибо, вроде нашел что нужно.
longinterval = 1000;// интервал между включение/выключением светодиода (1 секунда) - именна та переменная которая мне нужна !!!!Понятно, что есть желание сделать своими руками. Но может проще купить и поставить готовое решение?
Я бы с удовольствием, но у меня на ардуинке не только это завязано. К сажелению ни один готовый девайс не заменит возможности и гибкости ардуинки :)
Gagarin74, не понял что у вас за реостат, и почему там 7 битное исчисление, ну да ладно, не суть. Вот набросал для одного канала, другие по аналогии.
#define wt 100 // задержка перед отключением реле, миллисекунд #define min_t 500 //самый частый ход раз в полсекунды #define max_t 10000 // самый редкий ход 1 раз в 10 секунд unsigned long prevmillis_1=0; boolean rele_1_on = false; void setup() { Serial.begin(9600); pinMode (13, OUTPUT); } void loop() { int aread1=analogRead(A5); // читаем вход if (aread1 !=0) { //если на входе не 0, то.. int timerele_1 = map(aread1, 1,1023, max_t,min_t); // перевели попугаев АЦП в нужные промежутки времени //Вкючение первого реле if (millis()-prevmillis_1 >= timerele_1) { digitalWrite (13, HIGH); prevmillis_1 = millis(); rele_1_on = true; } } //отключение первого реле if (millis()-prevmillis_1 >= wt && rele_1_on==true ){ digitalWrite (13, LOW); rele_1_on = false; } }ну типо того .
кстати , это у меня так глючит или у всех. При включение ардуинки релюха срабатывает один раз. Дальше все окейно.
Gagarin74, если это по тому скетчу, что я советовал -то там с 13 ноги нужно на другую перенести, на 13-й действительно при включении что-то происходит, в корни проблемы не вникал.
Gagarin74, если это по тому скетчу, что я советовал -то там с 13 ноги нужно на другую перенести, на 13-й действительно при включении что-то происходит, в корни проблемы не вникал.
бутлодырь на этапе загрузки управляет светодиодом
СПАСИБКИ!!!!!! а то я уж огорчился. Какие Вы умницы!!!!