Перелистывание с помощью кнопки на OLED Displey
- Войдите на сайт для отправки комментариев
Здравствуйте, перейду сразу к делу. На днях начал работать с 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;//
}
Valerkaaa, а зачем Вы дергаете дисплей на каждом проходе цикла?
Один раз нарисовали, что нужно, и хватит.
Очищать дисплей и перерисовывать следует только тогда, когда что-то реально изменилось.
Попробуте - не проверял
#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;// }Попробуте - не проверял
#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, а зачем Вы дергаете дисплей на каждом проходе цикла?
Один раз нарисовали, что нужно, и хватит.
Очищать дисплей и перерисовывать следует только тогда, когда что-то реально изменилось.
Спасибо за совет, хоть он мне сейчас и не пригодится, потому что vosara уже написал мне скетч, но все же в следующий раз, когда я буду писать код, мне поможет ваш совет.