ESP8266 + VGA + кнопка

oldbim
Offline
Зарегистрирован: 01.09.2021

Добрый день. Я новичек в программировании, помогите пожалуйста.

Есть ESP07, нашел библиотеку вывода текста на VGA монитор - https://github.com/smaffer/espvgax/.

Проблема в том что не знаю как сделать переключение текса(по типу меню) с одной кнопки.

Ниже мой скетч.

 

#include <ESPVGAX.h>
#include <fonts/monodos12.h>
ESPVGAX vga;
int buttonState = 0;
int Program = 0;
static const ESPVGAX_ALIGN32 char str0[] PROGMEM="\
\n\
. text1"; //текст №1

static const ESPVGAX_ALIGN32 char str1[] PROGMEM="\
\n\
. text2"; //текст №2

static const ESPVGAX_ALIGN32 char str2[] PROGMEM="\
\n\
. text3"; //текст №3

void setup() {
vga.begin();
pinMode(12,INPUT);
}
void loop() {
while (1) {
buttonState = digitalRead(12);

if(buttonState == HIGH)
{Program+=1;
vga:delay(1000);}

if(Program>=3)
{Program=0;}

switch (Program) {
case 0:

vga.setBitmapFont((uint8_t*)img_monodos12_data, 12);
vga.print_P(str0, 0, 0, true);
break;
case 1:

vga.setBitmapFont((uint8_t*)img_monodos12_data, 12);
vga.print_P(str1, 0, 0, true);
break;
case 2:

vga.setBitmapFont((uint8_t*)img_monodos12_data, 12);
vga.print_P(str2, 0, 0, true);
break;
}
}
}

Укажите на ошибку.

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

oldbim пишет:

Укажите на ошибку.

На какую? Этот код что-то не так делает? Вы забыли про это написать.

Опишите. что этот код должен делать, что он делает в реальности и чем первое отличается от второго.

oldbim
Offline
Зарегистрирован: 01.09.2021

Хочу сделать так что бы переключался вывод текста одной кнопкой, т.е. я нажимаю на кнопку, показывается на дисплее текст1, еще раз нажимаю - текст2 и т.д.

В текущем варианте это работает не правильно, отображение текста есть, но оно постоянно переключается и при нажатии на кнопку останавливается. При повторном нажатии более ничего не происходит. 

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

Рисуйте схему (подключения кнопки, питание и т.д.).

oldbim
Offline
Зарегистрирован: 01.09.2021

По линии плюса забыл указать резистор на кнопку.

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Что делает строка 28?

b707
Offline
Зарегистрирован: 26.05.2017

oldbim пишет:

По линии плюса забыл указать резистор на кнопку.

перерисуйте схему без ошибок, это важно. Так, как нарисовано сейчас, кнопка работать не может - при нажатии будет КЗ

oldbim
Offline
Зарегистрирован: 01.09.2021

oldbim
Offline
Зарегистрирован: 01.09.2021

vga:delay(1000); - это задержка от библиотеки, обычный delay, как я понял, нельзя использовать с этой библиотекой.

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

oldbim пишет:

vga:delay(1000); - это задержка от библиотеки, обычный delay, как я понял, нельзя использовать с этой библиотекой.

Никакого отношения к библиотеке это не имеет.

В строке

vga:delay(1000);

vga - это просто метка (для goto). А далее вызывается самый обыкновенный delay.

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

oldbim
Offline
Зарегистрирован: 01.09.2021

 

Вот такая схема.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

По твоей схеме, как ты думаешь, какой потенциал будет на GPIO12 когда ты нажмешь на кнопку?

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

Понятно всё с кнопкой. Подумайте над вопросом из #11.

Следующая ошибка описана в #9, сразу исправляйте.

oldbim
Offline
Зарегистрирован: 01.09.2021

Убрал задержку, кнопку переделал - ситуация не изменилась.

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

Задержку надо не убирать, а делать правильно. Она там нужна, иначе дребезг кнопки будет ложные сигналы выдавать.

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вопросов больше не имею. 

oldbim
Offline
Зарегистрирован: 01.09.2021

Все исправил, переключения с кнопки нету. Вывод текста меняется автоматически как раз с задержкой указанной в delay.

#include <ESPVGAX.h>
#include <fonts/monodos12.h>
const int buttonPin = 12;
int buttonState = 0;         // current state of the button
int Program = 0;
ESPVGAX vga;

static const ESPVGAX_ALIGN32 char str0[] PROGMEM = "\
\n\
text1";
static const ESPVGAX_ALIGN32 char str1[] PROGMEM = "\
\n\
text2";
static const ESPVGAX_ALIGN32 char str2[] PROGMEM = "\
\n\
text3";

void setup() {
  vga.begin();
  pinMode(buttonPin, INPUT);
}

void loop() {

  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH)
  { Program += 1;
    delay(1000);
  }

  if (Program >= 3)
  {
    Program = 0;
  }

  switch (Program) {
    case 0:
      vga.setBitmapFont((uint8_t*)img_monodos12_data, 12);
      vga.print_P(str0, 0, 0, true);
      break;
      
    case 1:
      vga.setBitmapFont((uint8_t*)img_monodos12_data, 12);
      vga.print_P(str1, 0, 0, true);
      break;
      
    case 2:
      vga.setBitmapFont((uint8_t*)img_monodos12_data, 12);
      vga.print_P(str2, 0, 0, true);
      break;
  }

}





 

svm
Offline
Зарегистрирован: 06.11.2016

А почему Вы не пользуетесь отладкой?

Выведите после 27 строки значения buttonState и Program в монитор и смотрите, что там.

oldbim
Offline
Зарегистрирован: 01.09.2021

Действительно, сейчас сделаю.

oldbim
Offline
Зарегистрирован: 01.09.2021
11:38:51.865 -> buttonState:1
11:38:51.865 -> Program:1
11:38:52.865 -> buttonState:1
11:38:52.865 -> Program:2
11:38:58.711 -> buttonState:1
11:38:58.758 -> Program:3
11:38:59.755 -> buttonState:1
11:38:59.755 -> Program:1
 
получается на выходе кнопки всегда высокий потенциал - отсюда и переключения. На нажатия не реагирует. Мультиметром мерил на пине - 3,2 только при нажатии кнопки.
svm
Offline
Зарегистрирован: 06.11.2016

Скорее всего подлянку делает 28 строка. Задержку лучше поставить перед опросом кнопки. В начале лупа. Опрос кнопки длится очень малое время и в него нужно попасть. А все остальное программа висит на задержке.

Но все равно странно, чаще должен быть "0". Может быть резистор в обрыве, или слишком большой? Или как вариант дорожка до микросхемы в обрыве, а через неотмытый флюс на вход единица пролазит.

b707
Offline
Зарегистрирован: 26.05.2017

у есп8266 номер пина ардуино и номер GPIO на плате не имеют друг к другу никакого отношения.

судя по этой картинке, у ESP07 пин GPIO12 - это пин 6 в ардуино

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

oldbim пишет:

получается на выходе кнопки всегда высокий потенциал

Значит схема не такая, как Вы нарисовали. Кстати, номинал резистора Вы не указали каков?

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

b707 пишет:

у есп8266 номер пина ардуино и номер GPIO на плате не имеют друг к другу никакого отношения.

судя по этой картинке, у ESP07 пин GPIO12 - это пин 6 в ардуино

 

Ну, вот и подтверждение.

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

svm пишет:

Задержку лучше поставить перед опросом кнопки.

Нельзя. Очень велика вероятность проспать нажатие.

Как раз после нажатия задержка "съест" дребезг - это правильно.

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

ТС. И сделайте правильный вызов библиотечного delay. Вы правильно сказали, обычный лучше не использовать. Вы же сейчас обычный вставили.

oldbim
Offline
Зарегистрирован: 01.09.2021

 

Я вот по этой смотрел.

Резистор 10кОм

b707
Offline
Зарегистрирован: 26.05.2017

oldbim пишет:

Я вот по этой смотрел.

проще экспериментально проверить. Отключите пин от кнопки, опишите пин 12 в скетче как OUTPUT и подайте на него сначала логическую единицу, а потом ноль. Проверьте мультиметром, реально ли именно на этом пине меняется напряжение

 

вариант 2, аппаратный  - непропай или замыкание на плате, пережгли пин когда паяли и тд

oldbim
Offline
Зарегистрирован: 01.09.2021

проверил через OUTPUT HIGH - 3,1В

OUTPUT LOW - 0,03

oldbim
Offline
Зарегистрирован: 01.09.2021
void loop() {
  vga.delay(1000);
  digitalWrite(buttonPin, HIGH);
  vga.delay(1000);
  digitalWrite(buttonPin, LOW);
}
 
Поморгал подключенным светодиодом - значит порт работает.
b707
Offline
Зарегистрирован: 26.05.2017

на кнопке 4 пина, две пары попарно всегда замкнуты. может вы просто повернули кнопку и припаялись не к тем пинам?

oldbim
Offline
Зарегистрирован: 01.09.2021

Проверил еще раз - все правильно подключено. Подключил от пина до минуса резистор на 10ком - все заработало нужным образом.

Оказывается макетная плата похоже с браком.

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

oldbim пишет:

Подключил от пина до минуса резистор на 10ком - все заработало нужным образом.

Так у Вас это уже было по схеме из сообщения №13.

oldbim
Offline
Зарегистрирован: 01.09.2021

Да, только делалось это на макетной плате, и в этом участке резистор не имел контакта макеткой и соответственно с кнопкой...

 

Такие дела, всем спасибо!

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

oldbim пишет:
Подключил от пина до минуса резистор на 10ком - все заработало нужным образом.

Так Вы же ещё утром говорили, что так подключили!

Не зря я писал Вам в #22, что раз не работает, значит схема не такая, как нарисовано.

Разберитесь с задержкой. Нужна именно из библиотеки, как Вы и хотели. Только сделать надо правильно. Сейчас у Вас обычная задержка - она мешает жить библиотеке.

kalapanga
Offline
Зарегистрирован: 23.10.2016

oldbim пишет:

vga:delay(1000); - это задержка от библиотеки, обычный delay, как я понял, нельзя использовать с этой библиотекой.

Тогда или vga.delay(1000); или ESPVGAX::delay(1000);

oldbim
Offline
Зарегистрирован: 01.09.2021
#include <ESPVGAX.h>
#include <fonts/monodos12.h>
const int buttonPin = 12;
int buttonState = 0;        
int Program = 0;
ESPVGAX vga;

static const ESPVGAX_ALIGN32 char str0[] PROGMEM = "\
\n\
text1";
static const ESPVGAX_ALIGN32 char str1[] PROGMEM = "\
\n\
text2";
static const ESPVGAX_ALIGN32 char str2[] PROGMEM = "\
\n\
text3";

void setup() {
  vga.begin();
  pinMode(buttonPin, INPUT);
}

void loop() {

  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH)
  { Program += 1;
    vga.delay(100);
  }

  if (Program >= 3)
  {
    Program = 0;
  }

  switch (Program) {
    case 0:
      vga.setBitmapFont((uint8_t*)img_monodos12_data, 12);
      vga.print_P(str0, 0, 0, true);
      vga.delay(100);
      break;

    case 1:
      vga.setBitmapFont((uint8_t*)img_monodos12_data, 12);
      vga.print_P(str1, 0, 0, true);
      vga.delay(100);
      break;

    case 2:
      vga.setBitmapFont((uint8_t*)img_monodos12_data, 12);
      vga.print_P(str2, 0, 0, true);
      vga.delay(100);
      break;
  }

}