Библиотека энкодера Encod_er.h

tokima
Offline
Зарегистрирован: 29.08.2015

Здравствуйте, при написании скетча столкнулся с проблеммой, не могу понять как вставить условие, точнее какой оператор применить. В 19 и 29 строках вместо вопросов? Этот скетч и библа взяты отсюда: http://mypractic.ru/urok-55-rabota-s-inkrementalnym-enkoderom-v-arduino-biblioteka-encod_er-h.html#comment-5255

#include <TimerOne.h>
#include <Encod_er.h>

Encod_er encoder( 11, 12, 4);

void setup() {
  Serial.begin(9600); // инициализируем порт, скорость 9600
  Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
}

void loop() {
  if(encoder.timeRight != 0) {
    Serial.print("R=");
    Serial.print(encoder.timeRight);
    Serial.print(" Pos=");
    
      if(encoder.read() >= 4095){
       ??? = 4095;
    }
    Serial.println(encoder.read()); // вывод текущего положения 
    encoder.timeRight= 0;
  }
  if(encoder.timeLeft != 0) {
    Serial.print("L=");
    Serial.print(encoder.timeLeft);
    Serial.print(" Pos=");
    if(encoder.read() <= 0){
    ??? = 0;
    }
    Serial.println(encoder.read()); // вывод текущего положения
    encoder.timeLeft= 0;
  }
}

// обработчик прерывания 250 мкс
void timerInterrupt() {
  encoder.scanState();
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Т.е. Вы скачали скетч и ... вставили туда точки ... ? Зачем? Что Вы ообще делаете и что должен делать этот скетч?

tokima
Offline
Зарегистрирован: 29.08.2015

Нет конечно.. Я испульзую этот скетч в своем проекте. Изначально 18-20 и 28-30 строк там нет . Мне нужно сделать ограничение что бы крутя энкодер я не опускался ниже нуля и не поднимался выше 4095. В тексте статьи написано  

"long  position – текущее положение энкодера. Может быть прочитано или записано.

long  read() – метод чтения положения энкодера. Возвращает переменную position."

Но я не пойму какой синтаксис оператора position. При эксперементировании я добавил в свой проект вот такие строки

int en = encoder.read()*5;
if(en <= 0){
  en = 0;
long position = 0;
}
else if(en >= 4095){
  en = 4095;
long position = 819;
}

Вообщем то получилось, но не совсем так как хотелось, действительно ограничивается 0 - 4095, но запоминается количество щелчков сверх лимита и приходится вертеть энкодер в обратную сторону столько раз сколько раз прокрутил лишка. Ранее я пользовался другой библой для энкодера, но сейчас приходится этой так как она нормально без проблемм заработала с другими устройствами у меня на I2C. Если необходимо я могу выложить и весь проек, он небольшой.

 

#include <TimerOne.h>
#include <Encod_er.h>



#include <Wire.h>
#include <Adafruit_ADS1015.h>
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <Adafruit_MCP4725.h>

Adafruit_MCP4725 dac;
Adafruit_ADS1115 ads(0x48); //Здесь указываем адрес устройства
float Voltage1 = 0.0;
float Voltage2 = 0.0;
float Voltage3 = 0.0;
float Voltage4 = 0.0;

#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A7 // Can alternately just connect to Arduino's reset pin

Encod_er encoder( 11, 12, 4);

// Assign human-readable names to some common 16-bit color values:
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define  WWWW   0x0004
#define NAVY    0x000F
#define REDD    0xFF00

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
//const int KEY = 12;

void setup(void) {
  Serial.begin(9600); // инициализируем порт, скорость 9600
  Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний


  dac.begin(0x62);
  tft.begin(0x9341);
  tft.reset();
  tft.cp437(true);
  tft.setRotation(1);
  tft.fillScreen(WWWW);
  //  tft.setCursor(100, 0);
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  // tft.println(utf8rus("Температура"));
  tft.setCursor(100, 0);
  tft.println(utf8rus("Напряжение"));
  tft.setTextColor(REDD);
  tft.setCursor(0, 40);
  tft.println(utf8rus("Вход1  "));
  tft.setCursor(0, 60);
  tft.println(utf8rus("Вход2  "));
  tft.setCursor(0, 80);
  tft.setTextColor(RED);
  tft.println(utf8rus("Вход3  "));
  tft.setCursor(0, 100);
  tft.println(utf8rus("Вход4  "));
  tft.setCursor(100, 140);
  tft.println(utf8rus("Энкодер"));



  ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV

  ads.begin();

}


void loop(void) {
  int16_t adc0, adc1, adc2, adc3;
  uint32_t counter_1;

  if (encoder.timeRight != 0) {
    Serial.print("R=");
    Serial.print(encoder.timeRight);
    Serial.print(" Pos=");
    Serial.println(encoder.read()); // вывод текущего положения
    encoder.timeRight = 0;
  }
  if (encoder.timeLeft != 0) {
    Serial.print("L=");
    Serial.print(encoder.timeLeft);
    Serial.print(" Pos=");
    Serial.println(encoder.read()); // вывод текущего положения
    encoder.timeLeft = 0;
  }
int en = encoder.read()*5;
if(en <= 0){
  en = 0;
long position = 0;
}
else if(en >= 4095){
  en = 4095;
long position = 819;
}
  adc0 = ads.readADC_SingleEnded(0) + 24;
  Voltage1 = (adc0 * 0.1875) / 1000;
  adc1 = ads.readADC_SingleEnded(1) + 24;
  Voltage2 = (adc1 * 0.1875) / 1000;
  adc2 = ads.readADC_SingleEnded(2);
  Voltage3 = (adc2 * 0.1875) / 1000;
  adc3 = ads.readADC_SingleEnded(3);
  Voltage4 = (adc3 * 0.1875) / 1000;

  //counter_1 = adc1 / 8;

  dac.setVoltage(en, false);

  tft.setTextColor(YELLOW, WWWW);
  tft.setCursor(70, 40);
  tft.print(adc0); tft.print("   ");
  tft.setCursor(170, 40);
  tft.print(Voltage1, 3); tft.print("   ");

  tft.setCursor(70, 60);
  tft.print(adc1); tft.print("   ");
  tft.setCursor(170, 60);
  tft.print(Voltage2, 3); tft.print("   ");

  tft.setCursor(70, 80);
  tft.print(adc2); tft.print("   ");
  tft.setCursor(170, 80);
  tft.print(Voltage3, 3); tft.print("   ");

  tft.setCursor(70, 100);
  tft.print(adc3); tft.print("   ");
  tft.setCursor(170, 100);
  tft.print(Voltage4, 3); tft.print("   ");

  tft.setCursor(150, 160);
  tft.print(encoder.read());

  tft.println(" ");

  // delay(1000);

}

/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB8;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}
// обработчик прерывания 250 мкс
void timerInterrupt() {
  encoder.scanState();
}

Arduino nano +TFT+ ADC +DAC+Encoder. Энкодер задатчик для ЦАП.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что Вы делаете в строках 110 и 114?

Думаю, там надо писать 

encoder.position = ....

tokima
Offline
Зарегистрирован: 29.08.2015

ЕвгенийП пишет:

...

encoder.position = ....

Пробовал, "Nano_TFT_Encoder:110: error: expected initializer before '.' token

 
 long encoder.position = 0;" при кампиляции
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понял, как Вы написали? Можно текст программы.

tokima
Offline
Зарегистрирован: 29.08.2015

ЕвгенийП пишет:

Не понял, как Вы написали? ..

Спасибо, првильно выраженное недоумение.. это и есть ответ. :-)

int en = encoder.read()*5;
if(en <= 0){
  en = 0;
 encoder.position = 0;
}
else if(en >= 4095){
  en = 4095;
 encoder.position = 819;

Так правильно работает. 

long encoder.position = 819; Так не правильно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Странный Вы человек. Я же Вам писал в посте №3 безо всякого long. Зачем Вы его добавили? :)

tokima
Offline
Зарегистрирован: 29.08.2015

Конец рабочего дня, пустой желудок.. , да еще долбанный ПЛК "Овен" глюканул остановил котельную..

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно, ну удачи Вам! Проблема кочилась? Всё нормально?

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

Уважаемый друг. Не могли бы вы поделиться со мной библиотекой encod_er.h . Мозг сломал. Не могу понять куда она делась. И найти нигде не могу..