Время сработки реле по энкодеру
- Войдите на сайт для отправки комментариев
Ср, 09/03/2016 - 17:45
Всем добрый!.
Проблема с временем сработки реле. Требуется изменять время сработки реле с помощью энкодера. Время сработки меняю энкодером. Цыфры исправно выводятся на LCD. Но не могу реле упросить работать с этими цыфрами. Реле не срабатывает. Где ошибка?
/*Уставка времени сработки реле энкодером используя датчик касания и выставляя время сработки энкодером */ #define relay (6)//цепляем реле #define sens (2) // сенсор int pinA = 3; // Pin CLK энкодера KY-040 int pinB = 4; // Pin DT энкодера KY-040 int encoderPosCount = 0; int pinALast; int aVal; boolean bCW; #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // установка LCD unsigned long currentTime; unsigned long loopTime; void setup() { pinMode(2,INPUT_PULLUP); pinMode(6,OUTPUT); pinMode (pinA,INPUT); pinMode (pinB,INPUT); // читаем Pin A pinALast = digitalRead(pinA); lcd.init(); // Инициализируем lcd currentTime = millis(); // считываем время, прошедшее с момента запуска программы loopTime = currentTime; } void loop() { aVal = digitalRead(pinA); if (aVal != pinALast){ // Для определения направления вращения считываем pinВ if (digitalRead(pinB) != aVal) { // Значит правое вращение encoderPosCount ++; bCW = true; } else { bCW = false; encoderPosCount--; } if(digitalRead(2)==LOW)//если сенсор сработал ... { digitalWrite(relay, HIGH);//включаем реле if(currentTime >= (loopTime + encoderPosCount*1000)) { // сравниваем текущий таймер с переменной loopTime + время на энкодере в милисек. digitalWrite(relay, LOW); // выключаем реле loopTime = currentTime; } delay(4000);//пауза } /*if(digitalRead(2)==LOW)//если сенсор сработал ... { digitalWrite(relay, HIGH);//включаем реле delay(encoderPosCount*1000);//реле включено n сек. digitalWrite(relay, LOW); //выключаем реле delay(4000);//пауза } */ lcd.setCursor(0, 0); lcd.print("BPEMA "); lcd.print(encoderPosCount); lcd.print(" Cek "); lcd.setCursor(0, 1);// вывод второй строки lcd.print("Chegonibud pishem"); } pinALast = aVal; }
А что за сенсор на пине 2? Реле выключается только если на пине 2 Low + прошло время. Так и задумано?
когда на сенсоре LOW(pin2) - должно сработать реле. и отработать время заданное энкодером
Повторю вопрос: и выключается когда на пине 2 Low + прошло время. Так и задумано?
Если нет, то вынесите выключение реле из If digitalread(2){}
В таком виде?
Если работает так как Вы задумывали, то да :)
пока ни как :)
Нет сигнала на реле при LOW на pin2
В таком виде срабатывает, но не отключается.
Ну давайте думать, чему равно значение переменной CurrentTime при первом проходе? а при втором и далее?
Повторю вопрос: и выключается когда на пине 2 Low + прошло время. Так и задумано?
Если нет, то вынесите выключение реле из If digitalread(2){}
Ради вселенской справедливости хочу заметить, что есть реле, которые включаются по низкому уровню, поэтому ваш код такие реле будет не включать на строчке "включаем реле", а выключать ;) Причём реле, включающихся по низкому уровню - в природе больше ;)
Ради вселенской справедливости хочу заметить
:)))) Не путайте его, он и так совсем запутался :)
Нет. реле высоко уровня. Это сенсор при касании дает LOW
Нет. реле высоко уровня. Это сенсор при касании дает LOW
Не отвлекатесь. Вы разобрались с CurrentTime?
переписал, заработало как надо.:)
Нет с CurrentTime не разобрался
А зачем Вам переменная CurrentTime? Ну да ладно. Главное что работает.
Ну давайте думать, чему равно значение переменной CurrentTime при первом проходе? а при втором и далее?
always !
хватает же у вас терпения :)
CurrentTime тикает и тикает. При втором заходе
loopTime = currentTime
и при третьем так же. Или что то не так?CurrentTime тикает и тикает.
А покажите нам, в какой строке оно тикает?
в 39ой пост8
И сколько раз оно там тикнет?
не понял. разжуйте
это же на внутренних таймерах?
Из setup в loop перенесите эту строку чтоб тикало.
millis тикает. а CurrentTime - это переменная значение которой Вы присваете в 39 строке один раз.
Перенес. Реле срабатывает от сигнала и не выключается
Да. это работает :)
Во тонкость, не туда строку вбил ... Спасибо!
Ну во те на, а уже пивка взял...
ctrl+T в среде нажимайте почаще, а то код уже нечитаемый становится.
Куда рыбки прислать? :)
О! Это лучше xDriver-у. У него вон пиво есть!
Во тонкость, не туда строку вбил ... Спасибо!
Ничего себе, действительно че там, туда строку воткну или сюда...
Это не тонкость, а эллементарная невнимательность или непонимание что делает ваш код.
Ну судя по тому что вы считаете что присвоив переменой значение функции millis(), она сама потом будет инкременироваться, то это второе.
Вот когда вы столкнетесь с настоящими тонкостями, это будете вспоминать как детский лепет.
Удачи.
Всем спасибо! Приятных снов!