ARDUINO Энкодер вместо кнопок.

Driver

✩✩✩✩✩✩✩
14 Май 2019
8
1
Энкодер вместо кнопок.
Всем привет, нужна помощь новичку. Пытаюсь написать простой скетч, энкодер вместо кнопок, в этой теме совсем зеленый, на Com-порт все пишет, а вот на выходы сигнал не подает.

C++:
#define CLK 2

#define DT 3

#define SW 4



#include "GyverEncoder.h"

Encoder enc1(CLK, DT, SW);



void setup() {

pinMode(11,OUTPUT);

pinMode(12,OUTPUT);

enc1.setType(TYPE1);

}

void loop() {

enc1.tick();

if (enc1.isLeft()) digitalWrite (11,LOW);

if (enc1.isRight()) digitalWrite (12,LOW);

}
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
Если код поместить вот так, как текст, то движок сайта вполне может обрезать, видоизменить его. Поэтому оформалять надо в виде специального тега, он доступен всем и выглядит как косая черта в между знаками меньше и больше. И подсказка есть - "КОД"

А по коду сейчас сказать могу одно, изменений не будет никаких. Обычное состояние пинов - низкий уровень. Энкодер переводит пины 11 и 12 тоже в низкий уровень. В высокий не переводит ничего. И непонятно что за предпоследняя строчка на вторую проверку поворота а право.
 
  • Лойс +1
Реакции: Driver

Driver

✩✩✩✩✩✩✩
14 Май 2019
8
1
@Старик Похабыч, спасибо за подсказку. Последняя строчка случайно зацепилась из блокнот а подсказок. Попробую переподключить и переписать на подачу высокого сигнала. И ещё раз проверю работу.
Просто через com-порт один поворот энкодера соответствует написанию одной строчки в зависимости от направления.
Хотелось бы получить единовременный сигнал (клик) на выходе при повороте энкодера на один шаг.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
В примере нет никакого написания одной строчки.
И скорее всего программа работает , и энкодер свое дело делает. Только увидеть это нельзя, т.к. программист видимо не понимает что хочет получить. Такое бывает по неопытности.
 

Driver

✩✩✩✩✩✩✩
14 Май 2019
8
1
@Старик Похабыч, хочу увидеть мигание светодиода при повороте энкодера. Не хватает времени задержки сигнала на выходе A1, A2, диод просто не успевает среагировать.Com порт передает верные значения.

C++:
#define CLK 2
#define DT 3
#define SW 4

#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);

void setup() {
Serial.begin (9600);

pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
enc1.setType(TYPE1);

}


void loop() {
enc1.tick();

if (enc1.isLeft()) Serial.println("right");
if (enc1.isRight())Serial.println("Left");

if (enc1.isLeft())
digitalWrite (A1,LOW);
else digitalWrite (A1, 1);
if (enc1.isRight())
digitalWrite (A2,LOW);
else digitalWrite (A2, 1);

}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
Так ничего видно конечно не будет, потому что вы выключаете светодиод сразу после включения. И даже если не включаете то все равно выключаете. Это раз.
Второе. Первая проверка на поворот. так, что выводит сообщение на экран, очищает состояние энкоедра после тика, вы НИКОГДА не переключите А1 и А2 в состояние LOW

Для начала плсде тика все стереть к такой то бабушке и попробовать вот такой код. Он будет включать энкодер при повороте в одну сторону, и выключать при повороте в другую.
C++:
if (enc1.isLeft()) digitalWrite (A1,0);
if (enc1.isRight()) digitalWrite (A1,1);
Если же обязательно надо что бы 2 светодиода включался и выключался при повороте в соотв. сторону, то следует
при повороте и только ! включить его и запомнить время включения. Может быть выключить другой светодиод, который не надо включать.
Далее по коду проверять время и как только с момента включения прошел нужный интервал , то выключить светодиод. Для упрощения задачи - выключить оба.
 

Driver

✩✩✩✩✩✩✩
14 Май 2019
8
1
@Старик Похабыч, по вашему коду он работает как выключатель (загрузил, проверил), при повороте в одну сторону зажигает светодиод, в другую тушит. А задача стоит отработать сигнал с энкодера, так что бы при повороте на один щелчок диод загорался на секунду и тух. Функция таймера на удержание команды или как так, не могу такую найти, так как не могу правильно изложить мысль.
Как пример при повороте энкодера диод загорался на (условные) 10 минут, а затем самостоятельно отключался.
Пытался добавить delay (2000), но в таком случае команда зависает именно на вводе сигнала, а не на выводе.

C++:
if (enc1.isLeft()) digitalWrite (A1,1);
else digitalWrite (A1, 0);
delay (2000);
if (enc1.isRight()) digitalWrite (A2,1);
else digitalWrite (A2, 0);
 

Driver

✩✩✩✩✩✩✩
14 Май 2019
8
1
Удержание сигнала digitalWrite (A1,1) на несколько секунд в положении 1, а затем выполнение команды digitalWrite (A1,0)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
Да, именно так и работает - для проверки.
А абзац после кода как раз относится к вашему случаю.
Задержка в 2000 секунд полностью убивает работу библиотеки энкодера.
Я вашу мысль понял и лично мне изобразить ее не составит труда, но чем это поможет в изучении вам ? Вот для сведения:
uint32_t tmp1; - так можно определить переменную для текущего запоминания времени
tmr1=millis(); -запомнить время в миллисекундах, время отсчитывается от включения мк.
 

Driver

✩✩✩✩✩✩✩
14 Май 2019
8
1
@Старик Похабыч, спасибо, попробую добавить команду задержки или таймер в код.
В данном случае это не обучение, а вынужденная мера в написании самостоятельного кода при отсутствии готовых решений.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
Тогда скажу честно: ваших знаний маловато для написания этого простого кода. Т.к. код простой, то добить нужные знания вполне реально, но на это потребуется некоторое время.

Дам еще одно пояснение про этот кусок коджа

C++:
if (enc1.isLeft()) digitalWrite (A1,1);
else digitalWrite (A1, 0);
Пустой цикл loop крутиться в МК со скорость примерно 200 000 циклов в секунду. Пусть код что то еще делает и пусть будет 100 000 , для работы энкодера этого выше крыши,
Проверяем условие на поворот в лево. Был поворот ? Пусть да записал 1 в порт А1. и уже через 1/100 000 секунды проверка повториться. И ответ будет НЕТ! А так же нет будет если энкодер нажать, если повернуть в другую сторону, если вообще ничего не делать.
Это я к тому, что выключение светодиода должно происходить по другому событию, н возможно даже не связанному с энкодером.


Во, вспомнил про симулятор благодаря посту Алекса Гайвера в телеге:
 
Изменено:

Driver

✩✩✩✩✩✩✩
14 Май 2019
8
1

@Старик Похабыч, спасибо за подсказку, все заработало, как и было задумано! Вот теперь можно заняться обучением и доработкой кода, на дублирующем устройстве. Основное уходит в работу по назначению!

C++:
#define CLK 2
#define DT 3
#define SW 4

#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);

void setup() {
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
enc1.setType(TYPE1);

digitalWrite (A1,1);
digitalWrite (A2,1);
}

void loop() {
static uint32_t tmr = 0;
if (millis () - tmr >= 250) {
tmr = millis (); digitalWrite (A1,1); digitalWrite (A2,1); 
}
 
{
enc1.tick();
if (enc1.isLeft()) digitalWrite (A1,LOW);
if (enc1.isRight()) digitalWrite (A2,LOW);
}
}
 
  • Лойс +1
Реакции: Sevan