УЦИ (управления цифровой индикации)
- Войдите на сайт для отправки комментариев
Пт, 28/11/2014 - 12:29
Помогите нубу в написании скеча! Есть два энкодера,мега2560,i2c/lcd16*2,две кнопки,задача:вывод на экран показаний с каждего энкодера+кнопка обнуления для каждего показания энкодера обе независимых друг от друга.
Вот дошел до этого написания и тупик не хватает опыта с праграмированием одна линия работает норм снимает показания и выводит Line X .
[code]
//DFRobot.com
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
volatile int encoder_register = 0;
void setup() {
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
attachInterrupt(1, encoder, RISING);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Llne X");
lcd.setCursor(0,1);
lcd.print("Llne Z");
}
void loop() {
lcd.setCursor(7, 0);
lcd.print(encoder_register);
lcd.print(" ");
}
void encoder() {
detachInterrupt(1);
delay(10);
if (digitalRead(3)){
if(digitalRead(2)) ++encoder_register;
else --encoder_register;
}
attachInterrupt(1, encoder, RISING);
}
[/code]

Ну тут тебе надо два прерывания: энкодры и кнопка.
> detachInterrupt(1);
> attachInterrupt(1, encoder, RISING);
Зачем это переподключение?
Для считывания состояний рекомендую Cyberlib
Ловишь прерывания, считаешь оимпульсы в глобальные переменные.
Ловишь прерывания от кнопки.
Раз в секунду выводишь значение переменной на экран
спасибо что откликнулся на мой стопор, а если есть возможность и время можно все пополочкам я в этом деле как то не очень можно сказать (честно) полный новичок просто у меня есть небольшой станочек хочу на него уци поставить.
И для кого я писал про прерывания?
ДА Я вас просил поподробней а не умнячать!
Да просто когда ты новичек и люди более понимающие, начинают кидаться терминами и короткими фразами
они понимают о чем речь и становится немного обидно ,просто хотелось бы когда пишут что новичек тоже
относились с пониманием , а за прерывание спасиб но с кнопками беда полная помогите !
[code] #include <Encoder.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> Encoder knobLeft(2, 3); Encoder knobRight(18, 19); LiquidCrystal_I2C lcd(0x27,16,2); void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(0,0); } long positionLeft = -9999999; long positionRight = -9999999; void loop() { long newLeft, newRight; newLeft = knobLeft.read(); newRight = knobRight.read(); if (newLeft != positionLeft || newRight != positionRight) { lcd.setCursor(0, 0); lcd.print("Llne X: "); lcd.print(newLeft); lcd.setCursor(0, 1); lcd.print("Llne Z: "); lcd.print(newRight); positionLeft = newLeft; positionRight = newRight; } if (Serial.available()) { Serial.read(); lcd.println("Reset both knobs to zero"); knobLeft.write(0); knobRight.write(0); } } [/code]Вы забываете о том, что это форум и, в сущности, никто и ничем Вам не обязан. Если кто-то делится своими знаниями, то он делает это по доброй воле. Направление для поиска Вам дали, на эту тему написано вполне достаточно, нужно только пользоваться поиском, как по форуму, так и глобально. Не Вы первый новичок, не Вы - последний. Разжевывать никто не будет, разбираться придется самостоятельно. Или идти на платные курсы.
[code] const int buttonPin = 5; int buttonState = 0; pinMode(buttonPin, INPUT); buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { digitalWriteа дальше что делать приравнивать к нулю а что именно?
Читать до полного просветления http://arduino.ru/Reference/AttachInterrupt
Я так понимаю на прерывании ничего не получется т.к. (2,3)(18,19) это два энкодера а (20,21) шина I2c lcd16/2
Вопрос: что делать ?
Натолкните где просветится!!!!!!!!!!!!!!!!!!!!!
контакты спрерыванием кончились твои предложения
нужна альтернатива или нет?
Межушный ганглий юзать. Я вот знаю способ, как на два прерывания повесит примерно штук 6 энкодеров, но тебе не скажу.
спасибо
Я на этом форуме недавно и вижу что люди не склоны к общению и помощи,я например на автофоруме Ниссан вишу уже 8 лет ,все стараются помочь кто чем может,но и там бывают люди которые кричат едь на сервис ,а 90 случаях из 100 помогают!
Ну вот и вали на тот форум со своими проблемами. Тут тебе код писать никто не будет.
Нужно готовое? Есть раздел "Ищу исполнителя", там тебе за вознаграждение и в пупок поцелуют и в задницу подуют.
Во первых энкодер можно и опрособ обрабатывать, не обязательно в прерываниях
во вторых плох тот солдат, который не мечтает стать генералом...ну в смысле любой начинающий ардуинщик рано или поздно должен начать читать даташит на atmega328pa. Когда начнет узнает, что прерывание у этого МК можно настроить на любую ногу, только это будет не система прерываний INT0/1 с которой справляется attacheInterrupt, а система PCINT, настроить которую способны только достойные джидаи
опросом не получается, пробовал, вращение двигателя на катором энкодер стоит 1100 об.мин начинаются пропуски что неприемлимо в моей ситуации последний код меня полностью устраивает работает как часы,
просто с обнулением типерь связаится не могу вбиваю библиотеку на button
if(digitalRead(clearButton) == LOW ) {58positionRight = 0;и не какого эфекта
Ну вот и вали на тот форум со своими проблемами. Тут тебе код писать никто не будет.
Нужно готовое? Есть раздел "Ищу исполнителя", там тебе за вознаграждение и в пупок поцелуют и в задницу подуют.
----------------------------------------------------------------------------------------------------------------------------------------
Поэтому поводу тебе я могу сказать одно, счетчик импульсов на 2 оси б/у по 1т.р. полный интернет ,а мне хочется самому сделать и понять принцип ,а форумы для этого существуют чтобы обсуждать( форум – это такое место в Интернете, где собираются люди, которых объединяет одно увлечение или идея, и общаются на интересующую их тему. Они помогают друг другу советами и подсказками, обмениваются жизненным опытом, поддерживают друг друга.)
Ну так делай, я тебе направление дал. Если хочешь, чтобы тебе код написали, то за этим в друго раздел.
Примеры:
http://easyelectronics.ru/avr-uchebnyj-kurs-inkrementalnyj-enkoder.html
http://www.compcar.ru/forum/showthread.php?t=5148
Разбираться и адаптировать под себя
Спасибо буду просвящаться и экспериминтировать.
((((((((((((((((((((Если хочешь, чтобы тебе код написали, то за этим в друго раздел.))))))))))))))))))))))))
Я так понимаю что ты с того раздела и есть.
Нет, ну угадал.
#define encoder0PinA 2 #define encoder0PinB 3 volatile long encoder0Pos; #define encoder2PinA 19 #define encoder2PinB 18 volatile long encoder2Pos; #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); const int button1Pin = 5; int button1State = 0; const int button2Pin = 8; int button2State = 0; void setup () { lcd.init(); lcd.backlight(); lcd.home(); pinMode(encoder0PinA, INPUT); pinMode(encoder0PinB, INPUT); attachInterrupt(0, encoder0PinChangeA, CHANGE); attachInterrupt(1, encoder0PinChangeB, CHANGE); encoder0Pos = 0; pinMode(encoder2PinA, INPUT); pinMode(encoder2PinB, INPUT); attachInterrupt(4, encoder2PinChangeA, CHANGE); attachInterrupt(5, encoder2PinChangeB, CHANGE); encoder2Pos = 0; pinMode(button1Pin, INPUT); pinMode(button2Pin, INPUT); } void loop() { button1State = digitalRead(button1Pin); if (button1State == HIGH) { encoder0Pos = 0; } button2State = digitalRead(button2Pin); if (button2State == HIGH) { encoder2Pos = 0; } lcd.setCursor(0, 0); lcd.print("Line X "); lcd.print(encoder0Pos); lcd.print(" "); lcd.setCursor(0, 1 ); lcd.print("Line Z "); lcd.print(encoder2Pos); lcd.println(" "); } void encoder0PinChangeA() { if (digitalRead(encoder0PinA) == HIGH) { if (digitalRead(encoder0PinB) == LOW) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } else { if (digitalRead(encoder0PinB) == HIGH) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } } void encoder0PinChangeB() { if (digitalRead(encoder0PinB) == HIGH) { if (digitalRead(encoder0PinA) == HIGH) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } else { if (digitalRead(encoder0PinA) == LOW) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } } void encoder2PinChangeA() { if (digitalRead(encoder2PinA) == HIGH) { if (digitalRead(encoder2PinB) == LOW) { encoder2Pos = encoder2Pos + 1; // CW } else { encoder2Pos = encoder2Pos - 1; // CCW } } else { if (digitalRead(encoder2PinB) == HIGH) { encoder2Pos = encoder2Pos + 1; // CW } else { encoder2Pos = encoder2Pos - 1; // CCW } } } void encoder2PinChangeB() { if (digitalRead(encoder2PinB) == HIGH) { if (digitalRead(encoder2PinA) == HIGH) { encoder2Pos = encoder2Pos + 1; // CW } else { encoder2Pos = encoder2Pos - 1; // CCW } } else { if (digitalRead(encoder2PinA) == LOW) { encoder2Pos = encoder2Pos + 1; // CW } else { encoder2Pos = encoder2Pos - 1; // CCW } } }а как сократить показания 10:1