УЦИ (управления цифровой индикации)

dim@n78
Offline
Зарегистрирован: 28.11.2014


Помогите нубу в написании скеча! Есть два энкодера,мега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]
Radjah
Offline
Зарегистрирован: 06.08.2014

Ну тут тебе надо два прерывания: энкодры и кнопка.

> detachInterrupt(1);

> attachInterrupt(1, encoder, RISING);

Зачем это переподключение?

Для считывания состояний рекомендую Cyberlib

Ловишь прерывания, считаешь оимпульсы в глобальные переменные.

Ловишь прерывания от кнопки.

Раз в секунду выводишь значение переменной на экран

dim@n78
Offline
Зарегистрирован: 28.11.2014

спасибо что откликнулся на мой стопор, а если есть возможность и время можно все пополочкам я в этом деле как то не очень можно сказать (честно) полный новичок просто у меня есть небольшой станочек хочу на него уци поставить.

dim@n78
Offline
Зарегистрирован: 28.11.2014
На разных оборотах двигателя счет сбивается 
[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);
Radjah
Offline
Зарегистрирован: 06.08.2014

И для кого я писал про прерывания?

dim@n78
Offline
Зарегистрирован: 28.11.2014

ДА Я вас просил  поподробней а не умнячать!

rico
Offline
Зарегистрирован: 26.08.2014

dim@n78 пишет:
ДА Я вас просил  поподробней а не умнячать!
С такого рода заявлениями Вы рискуете больше вообще никаких ответов на свои вопросы не получить.

dim@n78
Offline
Зарегистрирован: 28.11.2014

Да просто когда ты новичек и люди более понимающие, начинают кидаться терминами и короткими фразами

они понимают о чем речь и становится немного обидно ,просто хотелось бы когда пишут что новичек тоже

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

[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]

 

rico
Offline
Зарегистрирован: 26.08.2014

Вы забываете о том, что это форум и, в сущности, никто и ничем Вам не обязан. Если кто-то делится своими знаниями, то он делает это по доброй воле. Направление для поиска Вам дали, на эту тему написано вполне достаточно, нужно только пользоваться поиском, как по форуму, так и глобально. Не Вы первый новичок, не Вы - последний. Разжевывать никто не будет, разбираться придется самостоятельно. Или идти на платные курсы.

dim@n78
Offline
Зарегистрирован: 28.11.2014
[code]
const int buttonPin = 5;
int buttonState = 0;

 pinMode(buttonPin, INPUT);

 buttonState = digitalRead(buttonPin);
    if (buttonState == HIGH) {
     digitalWrite

 
 
dim@n78
Offline
Зарегистрирован: 28.11.2014

а дальше что делать приравнивать к нулю а что именно?

Radjah
Offline
Зарегистрирован: 06.08.2014

Читать до полного просветления http://arduino.ru/Reference/AttachInterrupt

dim@n78
Offline
Зарегистрирован: 28.11.2014

Я так понимаю на прерывании ничего не получется т.к. (2,3)(18,19) это два энкодера а (20,21) шина I2c lcd16/2

Вопрос: что делать ? 

Натолкните где просветится!!!!!!!!!!!!!!!!!!!!!

 

dim@n78
Offline
Зарегистрирован: 28.11.2014

контакты спрерыванием кончились твои предложения

нужна альтернатива или нет?

Radjah
Offline
Зарегистрирован: 06.08.2014

Межушный ганглий юзать. Я вот знаю способ, как на два прерывания повесит примерно штук 6 энкодеров, но тебе не скажу.

dim@n78
Offline
Зарегистрирован: 28.11.2014

спасибо

 

dim@n78
Offline
Зарегистрирован: 28.11.2014

Я на этом форуме недавно и вижу что люди не склоны к общению и помощи,я например на автофоруме Ниссан вишу уже 8 лет ,все стараются помочь кто чем может,но и там бывают люди которые кричат едь на сервис ,а 90 случаях из 100 помогают!

Radjah
Offline
Зарегистрирован: 06.08.2014

Ну вот и вали на тот форум со своими проблемами. Тут тебе код писать никто не будет.

Нужно готовое? Есть раздел "Ищу исполнителя", там тебе за вознаграждение и в пупок поцелуют и в задницу подуют.

axill
Offline
Зарегистрирован: 05.09.2011

Во первых энкодер можно и опрособ обрабатывать, не обязательно в прерываниях

во вторых плох тот солдат, который не мечтает стать генералом...ну в смысле любой начинающий ардуинщик рано или поздно должен начать читать даташит на atmega328pa. Когда начнет узнает, что прерывание у этого МК можно настроить на любую ногу, только это будет не система прерываний INT0/1 с которой справляется attacheInterrupt, а система PCINT, настроить которую способны только достойные джидаи

dim@n78
Offline
Зарегистрирован: 28.11.2014

опросом не получается, пробовал, вращение двигателя на катором энкодер стоит 1100 об.мин начинаются пропуски что неприемлимо в моей ситуации последний код меня полностью устраивает работает как часы,

просто с обнулением типерь связаится не могу вбиваю библиотеку на button 

if (digitalRead(clearButton) == LOW )  {
58     positionRight = 0;

и не какого эфекта

dim@n78
Offline
Зарегистрирован: 28.11.2014

Ну вот и вали на тот форум со своими проблемами. Тут тебе код писать никто не будет.

Нужно готовое? Есть раздел "Ищу исполнителя", там тебе за вознаграждение и в пупок поцелуют и в задницу подуют.

----------------------------------------------------------------------------------------------------------------------------------------

Поэтому поводу тебе я могу сказать одно, счетчик импульсов на 2 оси б/у по 1т.р. полный интернет ,а мне хочется самому сделать и понять принцип ,а форумы для этого существуют чтобы обсуждать( форум – это такое место в Интернете, где собираются люди, которых объединяет одно увлечение или идея, и общаются на интересующую их тему. Они помогают друг другу советами и подсказками, обмениваются жизненным опытом, поддерживают друг друга.)

Radjah
Offline
Зарегистрирован: 06.08.2014

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

vdk
Offline
Зарегистрирован: 14.04.2013

Примеры:

http://easyelectronics.ru/avr-uchebnyj-kurs-inkrementalnyj-enkoder.html

http://www.compcar.ru/forum/showthread.php?t=5148

Разбираться и адаптировать под себя

dim@n78
Offline
Зарегистрирован: 28.11.2014

Спасибо буду просвящаться и экспериминтировать.

dim@n78
Offline
Зарегистрирован: 28.11.2014

 ((((((((((((((((((((Если хочешь, чтобы тебе код написали, то за этим в друго раздел.))))))))))))))))))))))))

Я так понимаю что ты с того раздела и есть.

Radjah
Offline
Зарегистрирован: 06.08.2014

Нет, ну угадал.

dim@n78
Offline
Зарегистрирован: 28.11.2014
#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