Перелистывание с помощью кнопки на OLED Displey

Valerkaaa
Valerkaaa аватар
Offline
Зарегистрирован: 08.09.2017

Здравствуйте, перейду сразу к делу. На днях начал работать с Oled Displey (128x64 SH1106)  использую под него библиотеку "MicroLCD" (ссылка на скачивание: https://github.com/stanleyhuangyc/MultiLCD). И мне для скетча понадобилось выводить на экран (при включение) одну переменную с 1-ого потенциометра, а при нажатие кнопки выводить другую переменную со 2-ого потенциометра (уже без первой), вроде бы легко, но я наткнулся в интернете, лишь на меню, которые мне не подходят. Также я пробовал написать скетч, но есть проблемма, на экране появляются помехи из-за "lcd.clear();" - эта функция очищает дисплей, она просто не обходима для скетча, ведь без нее экран просто не будет очищатся, а без очищения при нажатие кнопки будет выводится сразу две переменные (чего не должно быть), но с ней проблема, экран постоянно моргает, как бы очищается, и я не знаю, что мне с этим делать,так же для отображения 2-ой переменной кнопку надо удерживать, а по задумке в скетче ее надо нажать один раз.

Надеюсь тут мне помогут одаренные умы,зарание благодарю за поддержку.

Ниже приведен мой скетч, если кто-то решит его подправить и сказать мне, почему же у меня ничего не получается:

#include <Wire.h>
#include <MicroLCD.h>
#include <Arduino.h>

boolean buttonWasUp = true;  // была ли кнопка отпущена?

LCD_SH1106 lcd; //настройка моего экрана, есть и второй (он указан в примере этой библиотеке)

int y;        //1-ая переменная
int x;        //2-ая переменная 
int butn1 = 3;//кнопка на входе 3

void setup() {
  lcd.begin();//запускаем экран
  lcd.clear();//очищаем его

  pinMode(butn1, OUTPUT);//кнопку на выход
  Serial.begin(9600);
 }

void loop() {
   // определить момент «клика» несколько сложнее, чем факт того,
  // что кнопка сейчас просто нажата. Для определения клика мы
  // сначала понимаем, отпущена ли кнопка прямо сейчас... 
  boolean buttonIsUp = digitalRead(butn1);

  x = map(analogRead(A0),0,1023,0,255);
  y = map(analogRead(A1),0,1023,0,255);  


    if (buttonWasUp && !buttonIsUp) { //
    // ...может это «клик», а может и ложный сигнал (дребезг),
    // возникающий в момент замыкания/размыкания пластин кнопки,
    // поэтому даём кнопке полностью «успокоиться»...
    delay(10);// 

    buttonIsUp = digitalRead(butn1); } //считываем сигнал снова

if (!buttonIsUp) { // если она всё ещё нажата...
   lcd.clear();   //очищаем его

  lcd.setCursor(1, 1);  //выбираем место
  lcd.setFontSize(FONT_SIZE_MEDIUM);//ставим средний шрифт
  lcd.println("X");//пишем Х
  
  lcd.setCursor(25,1);  
  lcd.setFontSize(FONT_SIZE_MEDIUM);
  lcd.println(x);//пишем 1-ую переменную

Serial.print("\t");  
Serial.print(x);//и отображаем ее в монитор порта
}
else { // если нет, то...

  lcd.clear();
  
  lcd.setCursor(65, 1);  
  lcd.setFontSize(FONT_SIZE_MEDIUM);
  lcd.println("Y");

  lcd.setCursor(85,1);   
  lcd.setFontSize(FONT_SIZE_MEDIUM);
  lcd.println(y); 
   

}
    // запоминаем последнее состояние кнопки для новой итерации
    buttonWasUp = buttonIsUp;//


}


 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Valerkaaa, а зачем Вы дергаете дисплей на каждом проходе цикла?

Один раз нарисовали, что нужно, и хватит.

Очищать дисплей и перерисовывать следует только тогда, когда что-то реально изменилось.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуте - не проверял

#include <Wire.h>
#include <MicroLCD.h>
#include <Arduino.h>

boolean buttonWasUp = true;  // была ли кнопка отпущена?
bool image1; //Понажатию кнопки 1й раз = х, 2й раз = у и т.д.  
bool f_x;

LCD_SH1106 lcd; //настройка моего экрана, есть и второй (он указан в примере этой библиотеке)

int y;        //1-ая переменная
int temp_y;   //Предыдущее у
int x;        //2-ая переменная
int temp_x;   //Предыдущее х
int butn1 = 3;//кнопка на входе 3

void setup() {
  lcd.begin();//запускаем экран
  lcd.clear();//очищаем его

  pinMode(butn1, OUTPUT);//кнопку на выход
  Serial.begin(9600);
}

void loop() {
  // определить момент «клика» несколько сложнее, чем факт того,
  // что кнопка сейчас просто нажата. Для определения клика мы
  // сначала понимаем, отпущена ли кнопка прямо сейчас...
  boolean buttonIsUp = digitalRead(butn1);

  x = map(analogRead(A0), 0, 1023, 0, 255);
  y = map(analogRead(A1), 0, 1023, 0, 255);


  if (!buttonWasUp && buttonIsUp) { //
    // ...может это «клик», а может и ложный сигнал (дребезг),
    // возникающий в момент замыкания/размыкания пластин кнопки,
    // поэтому даём кнопке полностью «успокоиться»...
    image1 = !image1;
    delay(10);//
    //buttonIsUp = digitalRead(butn1);
  }

  if (image1) { // если она всё ещё нажата...
    if (temp_x != x) {
      lcd.clear();   //очищаем его

      lcd.setCursor(1, 1);  //выбираем место
      lcd.setFontSize(FONT_SIZE_MEDIUM);//ставим средний шрифт
      lcd.println("X");//пишем Х

      lcd.setCursor(25, 1);
      lcd.setFontSize(FONT_SIZE_MEDIUM);
      lcd.println(x);//пишем 1-ую переменную
      temp_x = x; //Запоминаем
      f_x = 1;
    }

    Serial.print("\t");
    Serial.print(x);//и отображаем ее в монитор порта
  }
  else { // если нет, то...

    if (temp_y != y || f_x) {
      lcd.clear();

      lcd.setCursor(65, 1);
      lcd.setFontSize(FONT_SIZE_MEDIUM);
      lcd.println("Y");

      lcd.setCursor(85, 1);
      lcd.setFontSize(FONT_SIZE_MEDIUM);
      lcd.println(y);
      temp_y = y; //Запоминаем
      f_x = 0;
    }
  }
  // запоминаем последнее состояние кнопки для новой итерации
  buttonWasUp = buttonIsUp;//


}

 

Valerkaaa
Valerkaaa аватар
Offline
Зарегистрирован: 08.09.2017

vosara пишет:

Попробуте - не проверял

#include <Wire.h>
#include <MicroLCD.h>
#include <Arduino.h>

boolean buttonWasUp = true;  // была ли кнопка отпущена?
bool image1; //Понажатию кнопки 1й раз = х, 2й раз = у и т.д.  
bool f_x;

LCD_SH1106 lcd; //настройка моего экрана, есть и второй (он указан в примере этой библиотеке)

int y;        //1-ая переменная
int temp_y;   //Предыдущее у
int x;        //2-ая переменная
int temp_x;   //Предыдущее х
int butn1 = 3;//кнопка на входе 3

void setup() {
  lcd.begin();//запускаем экран
  lcd.clear();//очищаем его

  pinMode(butn1, OUTPUT);//кнопку на выход
  Serial.begin(9600);
}

void loop() {
  // определить момент «клика» несколько сложнее, чем факт того,
  // что кнопка сейчас просто нажата. Для определения клика мы
  // сначала понимаем, отпущена ли кнопка прямо сейчас...
  boolean buttonIsUp = digitalRead(butn1);

  x = map(analogRead(A0), 0, 1023, 0, 255);
  y = map(analogRead(A1), 0, 1023, 0, 255);


  if (!buttonWasUp && buttonIsUp) { //
    // ...может это «клик», а может и ложный сигнал (дребезг),
    // возникающий в момент замыкания/размыкания пластин кнопки,
    // поэтому даём кнопке полностью «успокоиться»...
    image1 = !image1;
    delay(10);//
    //buttonIsUp = digitalRead(butn1);
  }

  if (image1) { // если она всё ещё нажата...
    if (temp_x != x) {
      lcd.clear();   //очищаем его

      lcd.setCursor(1, 1);  //выбираем место
      lcd.setFontSize(FONT_SIZE_MEDIUM);//ставим средний шрифт
      lcd.println("X");//пишем Х

      lcd.setCursor(25, 1);
      lcd.setFontSize(FONT_SIZE_MEDIUM);
      lcd.println(x);//пишем 1-ую переменную
      temp_x = x; //Запоминаем
      f_x = 1;
    }

    Serial.print("\t");
    Serial.print(x);//и отображаем ее в монитор порта
  }
  else { // если нет, то...

    if (temp_y != y || f_x) {
      lcd.clear();

      lcd.setCursor(65, 1);
      lcd.setFontSize(FONT_SIZE_MEDIUM);
      lcd.println("Y");

      lcd.setCursor(85, 1);
      lcd.setFontSize(FONT_SIZE_MEDIUM);
      lcd.println(y);
      temp_y = y; //Запоминаем
      f_x = 0;
    }
  }
  // запоминаем последнее состояние кнопки для новой итерации
  buttonWasUp = buttonIsUp;//


}

 

Благодарю, скетч прекрасно работает, примите мою искренную благодарность, за свою проделаную работу!

Valerkaaa
Valerkaaa аватар
Offline
Зарегистрирован: 08.09.2017

andriano пишет:

Valerkaaa, а зачем Вы дергаете дисплей на каждом проходе цикла?

Один раз нарисовали, что нужно, и хватит.

Очищать дисплей и перерисовывать следует только тогда, когда что-то реально изменилось.

Спасибо за совет, хоть он мне сейчас и не пригодится, потому что vosara уже написал мне скетч, но все же в следующий раз, когда я буду писать код, мне поможет ваш совет.