Знающие помогите, с продолжительностью импульса на реле
- Войдите на сайт для отправки комментариев
Чт, 09/02/2017 - 20:44
Здравствуйте Всем, прошу помощи по коду, видимо я еще очень далек от этого
Требуется подавать импульс на реле с кнопки при этом регулируя время импульса энкодером,
Код для примера
/* Энкодер */
enum { ENC_PIN1 = 2, ENC_PIN2 = 3 };
void setup()
{
pinMode(ENC_PIN1, INPUT);
pinMode(ENC_PIN2, INPUT);
Serial.begin(9600);
}
/* Функция декодирования кода Грея, взятая с Википедии.
* Принимает число в коде Грея, возвращает обычное его представление.
*/
unsigned graydecode(unsigned gray)
{
unsigned bin;
for (bin = 0; gray; gray >>= 1)
bin ^= gray;
return bin;
}
void loop()
{
static uint8_t previous_code = 0; // предыдущий считанный код
/* gray_code - считанное с энкодера значение
* code - декодированное значение
*/
uint8_t gray_code = digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1),
code = graydecode(gray_code);
/* Если считался нуль, значит был произведён щелчок ручкой энкодера */
if (code == 0)
{
/* Если переход к нулю был из состояния 3 - ручка вращалась
* по часовой стрелке, если из 1 - против.
*/
if (previous_code == 3)
Serial.println("->");
else if (previous_code == 1)
Serial.println("<-");
}
/* Сохраняем код и ждём 1 мс - вполне достаточно опрашивать энкодер
* не более 1000 раз в секунду.
*/
previous_code = code;
delay(1);
}
При повороте по часовой прибавлять время , а против Убавлять, Какая нужна переменная?
Также не пойму как кнопку вставить в программу
Ну лучше воспользоваться таким кодом. Скетч здесь. https://yadi.sk/d/aeYxE17v3Dhusf
Головной файл выкладываю сюда
А вот пример таймера на реле https://yadi.sk/d/WKaKvxrX3APTwN
Опять же Головной файл
Ну лучше воспользоваться таким кодом. Скетч здесь. https://yadi.sk/d/aeYxE17v3Dhusf
Головной файл выкладываю сюда
Воспользовался этим кодом, в какую сторону я бы не крутил энкодер Мониторинг порта показывает
Turn +
и редко проскакивает если аккуратно крутить Turn -
Может быть я схему собрал не правильно
Прикрепляю схему, на схеме за место энкодера изображен потенциометр , не обращайте внимание, и кнопку я вывел отдельно, резисторы 10кОм
А вот пример таймера на реле https://yadi.sk/d/WKaKvxrX3APTwN
Опять же Головной файл
Понимаете ли, код
void loop() { //#1 реле T_Relay1.loop(); //#2 кнопка Do_1.loop(& func); }вводит в ступор даже продвинутого человека, как бы вы в двух словах, объяснили это ТС ?
я понимаю, что это ваш стиль и т.д.
просто читал тут на форуме тему про два loop в скече, не от вас ли оно ?
какой то arduino wiring++ получается.
Ну понятно. У меня под модуль Encoder_KY_040 заточен. Там резисторы на CLK и DIR на питание висят.
просто читал тут на форуме тему про два loop в скече, не от вас ли оно ?
Есть программа FLProg, которая рисует код под Ардуино. Хотя он очень кривой, он работает. Да и писать для новичков с помощью него проще. В некотором смысле мой стиль это ответ на такое решение. Собирать программу из обычных рабочих модулей. Ну проще подкинуть в скетч пару классов и добавить модуль.loop(); и модуль.setup(); И все.
Но кто же может подумать, что народ делает подтяжку резистором к земле. Да так никто не делает. Это как правосторонее движение. Ведь физически можно ездить по левой стороне, хотя не рекомендуется, так как тогда можно врезаться во встречную машину.
Получается мне нужно попробовать подтянуть резистором к 5V ?
просто схема с подтяжкой к земле работала с кодом который я указал в первом посте
Посмотрель схему Encoder KY 040, я все понял
Соберу схему так, думаю все будет работать. Но к сожалению я так и не понял для чего нужна кнопка SW, какое действие она выполняет так и не понятно, или она просто прописана как пин ? ведь в коде нет, Пина на реле, и про время импульса тоже. Помогите пожалуйста как прописать это все.
FLProg открыл, и испугался, вообще все не понятно, нужно будет в свободное время изучать
Соберу схему так, думаю все будет работать. Но к сожалению я так и не понял для чего нужна кнопка SW, какое действие она выполняет так и не понятно, или она просто прописана как пин ? ведь в коде нет, Пина на реле, и про время импульса тоже. Помогите пожалуйста как прописать это все.
В Encoder KY 040 кнопка это просто надавить на ось и будет щелчок. Если у вас нет такого энкодера, то можно на тот пин подключить внешнюю кнопку. Просто земля-> кнопка -> пин. Подтяжка на+5 В программная.
FLProg открыл, и испугался, вообще все не понятно, нужно будет в свободное время изучать
Составляет программы на FLProg армянчик , там же он показавает как это делать. Разумеется немного не академическое объяснение, но хотя бы ход и методы понятны. Может и там найдете ваше решение. Вот только много у него видео.
https://www.youtube.com/channel/UCZ2a-GXoEFH8W34vq5ob7Kw
Скетч здесь https://yadi.sk/d/tI3tYixH3Dpk3H
головной файл выкладываю
Спасибо большое, вроде все понятно, А можно ли это код засунуть в FLProg и посмотреть как это выглядит?
FLProg не пользуюсь. Хотя там легче составлять скетчи для новичков, но там код ну очень тяжело читаем. Так что без меня.
Механические энкодеры как и обычные кнопки обладают дребезгом контактов, чтоб от него избавиться можно добавить между контакатами А, В и корпусом по конденсатору 100нФ(так же как и резисторы но к корпусу)
пример кода обработки энкодера, не помню где взял, на авторство не претендую
int pinA = A3; // номер вывода, подключенный к CLK енкодера int pinB = A2; // номер вывода контроллера, подключенный к DT енкодера int encoderPosCount = 0; int pinALast; int aVal; boolean bCW; void setup() { pinMode (pinA,INPUT); pinMode (pinB,INPUT); /* Считываем значение на выводе A и запоминаем его как последнее значение на этом выводе */ pinALast = digitalRead(pinA); Serial.begin (9600); } void loop() { aVal = digitalRead(pinA); if (aVal != pinALast){ // проверка на изменение значения на выводе А по сравнению с предыдущим запомненным, что означает, что вал повернулся // а чтобы определить направление вращения, нам понадобится вывод В. if (digitalRead(pinB) != aVal) { // Если вывод A изменился первым - вращение по часовой стрелке encoderPosCount ++; bCW = true; } else {// иначе B изменил свое состояние первым - вращение против часовой стрелки bCW = false; encoderPosCount--; } Serial.print ("clock: "); if (bCW){ Serial.println ("+"); }else{ Serial.println("-"); } Serial.print("pos: "); Serial.println(encoderPosCount); } pinALast = aVal; }PS: Если реле электромеханическое не используйте его в ШИМ режиме - просто угробите, используйте полевик
Скетч здесь https://yadi.sk/d/tI3tYixH3Dpk3H
головной файл выкладываю
Спасибо вам большое что уделили для меня время , что написали для меня пример, принцип я вроде как понял, пока юзаю, пробую два индикатора семисегментных, точнее пока думаю как можно прикрепить