ESP8266 + VGA + кнопка
- Войдите на сайт для отправки комментариев
Ср, 01/09/2021 - 22:33
Добрый день. Я новичек в программировании, помогите пожалуйста.
Есть 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;
}
}
}
Укажите на ошибку.
Укажите на ошибку.
На какую? Этот код что-то не так делает? Вы забыли про это написать.
Опишите. что этот код должен делать, что он делает в реальности и чем первое отличается от второго.
Хочу сделать так что бы переключался вывод текста одной кнопкой, т.е. я нажимаю на кнопку, показывается на дисплее текст1, еще раз нажимаю - текст2 и т.д.
В текущем варианте это работает не правильно, отображение текста есть, но оно постоянно переключается и при нажатии на кнопку останавливается. При повторном нажатии более ничего не происходит.
Рисуйте схему (подключения кнопки, питание и т.д.).
По линии плюса забыл указать резистор на кнопку.
Что делает строка 28?
По линии плюса забыл указать резистор на кнопку.
перерисуйте схему без ошибок, это важно. Так, как нарисовано сейчас, кнопка работать не может - при нажатии будет КЗ
vga:delay(1000); - это задержка от библиотеки, обычный delay, как я понял, нельзя использовать с этой библиотекой.
vga:delay(1000); - это задержка от библиотеки, обычный delay, как я понял, нельзя использовать с этой библиотекой.
Никакого отношения к библиотеке это не имеет.
В строке
vga - это просто метка (для goto). А далее вызывается самый обыкновенный delay.
И это, нарисуйте нормально кнопку (не забывая резисторы и показав что и как размыкается). А то я по-прежнему жду и не хочу высказывать своих предположений, пока не увижу схемы.
Вот такая схема.
По твоей схеме, как ты думаешь, какой потенциал будет на GPIO12 когда ты нажмешь на кнопку?
Понятно всё с кнопкой. Подумайте над вопросом из #11.
Следующая ошибка описана в #9, сразу исправляйте.
Убрал задержку, кнопку переделал - ситуация не изменилась.
Задержку надо не убирать, а делать правильно. Она там нужна, иначе дребезг кнопки будет ложные сигналы выдавать.
Уберите уж заодно и нахрен не нужный цикл в строке №23 (вместе с его закрывающей скобкой, разумеется) и выложите получившийся код, чтобы на него можно было посмотреть.
Вопросов больше не имею.
Все исправил, переключения с кнопки нету. Вывод текста меняется автоматически как раз с задержкой указанной в 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; } }А почему Вы не пользуетесь отладкой?
Выведите после 27 строки значения buttonState и Program в монитор и смотрите, что там.
Действительно, сейчас сделаю.
Скорее всего подлянку делает 28 строка. Задержку лучше поставить перед опросом кнопки. В начале лупа. Опрос кнопки длится очень малое время и в него нужно попасть. А все остальное программа висит на задержке.
Но все равно странно, чаще должен быть "0". Может быть резистор в обрыве, или слишком большой? Или как вариант дорожка до микросхемы в обрыве, а через неотмытый флюс на вход единица пролазит.
у есп8266 номер пина ардуино и номер GPIO на плате не имеют друг к другу никакого отношения.
судя по этой картинке, у ESP07 пин GPIO12 - это пин 6 в ардуино
Значит схема не такая, как Вы нарисовали. Кстати, номинал резистора Вы не указали каков?
у есп8266 номер пина ардуино и номер GPIO на плате не имеют друг к другу никакого отношения.
судя по этой картинке, у ESP07 пин GPIO12 - это пин 6 в ардуино
Ну, вот и подтверждение.
Задержку лучше поставить перед опросом кнопки.
Нельзя. Очень велика вероятность проспать нажатие.
Как раз после нажатия задержка "съест" дребезг - это правильно.
ТС. И сделайте правильный вызов библиотечного delay. Вы правильно сказали, обычный лучше не использовать. Вы же сейчас обычный вставили.
Я вот по этой смотрел.
Резистор 10кОм
Я вот по этой смотрел.
проще экспериментально проверить. Отключите пин от кнопки, опишите пин 12 в скетче как OUTPUT и подайте на него сначала логическую единицу, а потом ноль. Проверьте мультиметром, реально ли именно на этом пине меняется напряжение
вариант 2, аппаратный - непропай или замыкание на плате, пережгли пин когда паяли и тд
проверил через OUTPUT HIGH - 3,1В
OUTPUT LOW - 0,03
на кнопке 4 пина, две пары попарно всегда замкнуты. может вы просто повернули кнопку и припаялись не к тем пинам?
Проверил еще раз - все правильно подключено. Подключил от пина до минуса резистор на 10ком - все заработало нужным образом.
Оказывается макетная плата похоже с браком.
Подключил от пина до минуса резистор на 10ком - все заработало нужным образом.
Так у Вас это уже было по схеме из сообщения №13.
Да, только делалось это на макетной плате, и в этом участке резистор не имел контакта макеткой и соответственно с кнопкой...
Такие дела, всем спасибо!
Так Вы же ещё утром говорили, что так подключили!
Не зря я писал Вам в #22, что раз не работает, значит схема не такая, как нарисовано.
Разберитесь с задержкой. Нужна именно из библиотеки, как Вы и хотели. Только сделать надо правильно. Сейчас у Вас обычная задержка - она мешает жить библиотеке.
vga:delay(1000); - это задержка от библиотеки, обычный delay, как я понял, нельзя использовать с этой библиотекой.
Тогда или vga.delay(1000); или ESPVGAX::delay(1000);
#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; } }