реостат и срабатывание реле

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Ребят, доброго дня.

Подскажите пожалуйста. Что то не могу разобраться с MILLIS.

Есть реостат ,с него получаем данные от 0 до 127. переменная G

Далее ,очень хотелось бы сделать ,что бы рылюшка щелкала (вкл выкл) взависимости от значения G (типо 127 раз в минуту) или при 0 вообще выключена была (тоесть разорвала цепь).

есть функция DELEY () но она не подходит  -тормозит всю программу(реостатов 3 и реле три).

 

Помогите пожалуйста.

 

Matalkin
Offline
Зарегистрирован: 09.03.2014

Способ №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 не будет обрабатано.

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Matalkin пишет:

Способ №1 (без использования прерываний)

 

А второй вариант ? А то что то слишком умно -частоты какие то ?!!

Matalkin
Offline
Зарегистрирован: 09.03.2014

Gagarin74 пишет:

Matalkin пишет:

Способ №1 (без использования прерываний)

А второй вариант ? А то что то слишком умно -частоты какие то ?!!

 

В первом варианте ошибся: у вас G колич раз раз в минуту, а не в секунду. Переделайте время  T1 T2 T3 в 60 больше.

Второй вариант "заряжаете" таймер на  время T1 и срабатывания прерывания.

В прерывании  считываете значение реостата, перезаряжаете таймер на очередное прерывание и дергаете ножкой реле1

(количество таймеров мало, а желающих много) 

 

 

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Matalkin пишет:

Gagarin74 пишет:

Matalkin пишет:

Способ №1 (без использования прерываний)

А второй вариант ? А то что то слишком умно -частоты какие то ?!!

 

В первом варианте ошибся: у вас G колич раз раз в минуту, а не в секунду. Переделайте время  T1 T2 T3 в 60 больше.

Второй вариант "заряжаете" таймер на  время T1 и срабатывания прерывания.

В прерывании  считываете значение реостата, перезаряжаете таймер на очередное прерывание и дергаете ножкой реле1

(количество таймеров мало, а желающих много) 

 

 

В ножки кланиюсь!!!!!! Боюсь не осилю!!!! Мысль летает и улетает :(   Если не трудно можно живой код. Реально буду очень блогадарен. Хочу сделать дополнительное управление стеклоочистителей для машинки.

Matalkin
Offline
Зарегистрирован: 09.03.2014

Gagarin74 пишет:
В ножки кланиюсь!!!!!! Боюсь не осилю!!!! Мысль летает и улетает :(   Если не трудно можно живой код. Реально буду очень блогадарен. Хочу сделать дополнительное управление стеклоочистителей для машинки.
  попробуйте написать сюда

 

Gagarin74
Offline
Зарегистрирован: 24.08.2013
/* 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);
  }
}

 

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Спасибо, вроде нашел что нужно.

long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)   - именна та переменная которая мне нужна !!!!

oiyo
Offline
Зарегистрирован: 27.01.2014

Понятно, что есть желание сделать своими руками. Но может проще купить и поставить готовое решение?

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Я бы с удовольствием, но у меня на ардуинке не только это завязано. К сажелению ни один готовый девайс не заменит возможности и гибкости ардуинки :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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;
}  
  
}

 

Matalkin
Offline
Зарегистрирован: 09.03.2014

dimax пишет:
Gagarin74, не понял что у вас за реостат, и почему там 7 битное исчисление, ну да ладно, не суть. Вот набросал для одного канала, другие по аналогии.
зачем 3 канала для стеклоочистителя - лобовое, фары, заднее стекло?

Gagarin74
Offline
Зарегистрирован: 24.08.2013

ну типо того .

Gagarin74
Offline
Зарегистрирован: 24.08.2013

кстати , это у меня так глючит или у всех. При включение ардуинки релюха срабатывает один раз. Дальше все окейно.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Gagarin74, если это по тому скетчу, что я советовал -то там с 13 ноги нужно на другую перенести, на 13-й действительно при включении что-то происходит, в корни проблемы не вникал.

DunDun
Offline
Зарегистрирован: 09.03.2014

dimax пишет:

Gagarin74, если это по тому скетчу, что я советовал -то там с 13 ноги нужно на другую перенести, на 13-й действительно при включении что-то происходит, в корни проблемы не вникал.

бутлодырь на этапе загрузки управляет светодиодом

Gagarin74
Offline
Зарегистрирован: 24.08.2013

СПАСИБКИ!!!!!! а то я уж огорчился. Какие Вы умницы!!!!