ESP32 кнопку как подключить

Неожиданно легко игры написанные для уно запустились на есп32. Но кнопка все мозги снесла. Как её правильно включать в ЕСП? Мне удался один вариант - резистор к +3,3 В и на вход, кнопка вход и GND. На 4 выводе работает, на 2 нет (из-за светодиода встроенного?).
Сенсорные кнопки работают со сбоями.

Изумительная схема! Запишем её иголками в уголках глаз!
И программа тоже изумительна! Особенно строка 1

1 лайк
//игра птичка для ESP32
//графика массивы
const unsigned char ris_1[]PROGMEM = {//препятствие1 - портал 
0X78,0XFC,0XFC,0XFC,0XFC,0X78,0X30,0X30,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X30,0X30,0X78,0XFC,0XFC,0XFC,0XFC,0X78,

0X78,0XFC,0XFC,0XFC,0XFC,0X78,0X30,0X30,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,
0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,
0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,
0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X30,0X30,0X78,0XFC,0XFC,0XFC,0XFC,0X78
};
const unsigned char ris_11[]PROGMEM = {//препятствие2 
0X78,0XFC,0XFC,0XFC,0XFC,0X78,0X30,0X30,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X30,0X30,0X78,0XFC,0XFC,0XFC,0XFC,0X78,
  
0X78,0XFC,0XFC,0XFC,0XFC,0X78,0X30,0X30,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,
0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,
0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X30,0X30,0X78,0XFC,0XFC,0XFC,0XFC,0X78
};
const unsigned char ris_2[]PROGMEM = {//птичка
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0X00,0X03,0XFF,0X80,0X03,0XFC,0XC0,0X07,
0XF8,0X60,0X3F,0XF8,0XF0,0X41,0XF8,0X90,0X40,0XF8,0X90,0X40,0X7C,0X10,0X40,0X7F,
0XF8,0X60,0XFF,0XFC,0X23,0XFF,0XFC,0X1F,0XFF,0XF8,0X1F,0XFF,0XF8,0X07,0XFF,0XE0,
0X07,0XFC,0X00,0X01,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,

0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0X00,0X03,0XFF,0X80,0X03,0X8F,0XC0,0X04,
0X1F,0XE0,0X3E,0X1F,0XF0,0X7F,0X9F,0XF0,0X7F,0X9F,0XF0,0X7F,0XCF,0XF0,0X7F,0XC3,
0XF8,0X7F,0X8C,0X04,0X3F,0X9F,0XFC,0X1E,0X10,0X08,0X18,0X0F,0XF8,0X07,0X03,0XE0,
0X07,0XFC,0X00,0X01,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 
};
const unsigned char ris_22[]PROGMEM = {
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0X00,0X03,0XFF,0X80,0X07,0XFC,0XC0,0X0F,
0XF8,0X60,0X1F,0XF8,0XF0,0X3F,0XF8,0X90,0X40,0XF8,0X90,0X40,0X7C,0X10,0X7F,0XFF,
0XF8,0X7F,0XFF,0XFC,0X3F,0XFF,0XFC,0X1F,0XFF,0XF8,0X1F,0XFF,0XF8,0X07,0XFF,0XE0,
0X07,0XFC,0X00,0X01,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,

0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0X00,0X03,0XFF,0X80,0X07,0X8F,0XC0,0X08,
0X1F,0XE0,0X10,0X1F,0XF0,0X3F,0X1F,0XF0,0X7F,0X9F,0XF0,0X7F,0XCF,0XF0,0X7F,0XC3,
0XF8,0X40,0X0C,0X04,0X20,0X1F,0XFC,0X10,0X10,0X08,0X18,0X0F,0XF8,0X07,0X03,0XE0,
0X07,0XFC,0X00,0X01,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 
};
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#define TFT_CS     5
#define TFT_RST    16
#define TFT_DC     17
// TFT_SCL 18   
// TFT_SDA 23 
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);
bool flag=1;//
bool fl_kn=true;//
bool fl_2=false;//
bool fl_1=true;//
bool fl_pr=true;//
int y=0;// координата птички
int ypr=2;// 2 координата препятствия
int xpr=150;// 1 координата препятствия
int x=32;//
int ky=2;//шаг движения в пикселях
long Yy=0;//переменная хранения моментов времени
long Ykn=0;//переменная хранения моментов времени
long Yv=0;//переменная хранения моментов времени
long Ypr=0;//переменная хранения моментов времени
byte ty=27;//скорость птички
byte tpr=20;//скорость препятствий
byte rezultat_=0;//
void setup() {
  pinMode (4, INPUT);//игровая кнопка
  tft.initR(INITR_BLACKTAB);
  tft.cp437(true);//для правильного отображения русского алфавита
  tft.setRotation(1);
  tft.fillScreen(tft.Color565(0,255,255));
 drawBitmap_(20, y, ris_2, 24, 20,1 ); 
delay(1000);  
}
void loop() {
 // 
 if(millis()-Yy>ty){//двигаем птичку вверх-вниз
 Yy=millis(); flag=!flag;
 if(flag){ drawBitmap_(20, y, ris_2, 24, 20,1 );}// 
 else{drawBitmap_(20, y, ris_22, 24, 20,1 );}//
 y=y+ky;if(y>102){y=102;}if(y<0){y=0;}  
 }
 //
if(digitalRead(4)==LOW&&fl_kn==true){//по нажатию кнопки меняем направление движения птички
fl_kn=false;Ykn=millis();fl_2=!fl_2;
if(fl_2){ky=-2;}else{ky=2;}   
}
if(millis()-Ykn>200){fl_kn=true;}
//
if(millis()-Ypr>tpr){//движение препятствия и земли-травы
Ypr=millis();xpr=xpr-2;
if(xpr==0){ypr=2+10*random(0,6);xpr=150;tft.fillRect(0,0,16,122,tft.Color565(0,255,255));rezultat_++;fl_pr=random(0,2);}
if(fl_pr){drawBitmap_(xpr, ypr, ris_1, 8, 64,1);}
else{drawBitmap_(xpr, ypr, ris_11, 8, 48,2);}

//
if(fl_1){  
tft.fillRect(x,123,2,5,tft.Color565(0,100,0));
tft.fillRect(x+32,123,2,5,tft.Color565(0,200,0));
tft.fillRect(x+64,123,2,5,tft.Color565(0,100,0));
tft.fillRect(x+96,123,2,5,tft.Color565(0,200,0));
tft.fillRect(x+128,123,2,5,tft.Color565(0,100,0));
 }
else{
tft.fillRect(x,123,2,5,tft.Color565(0,200,0));
tft.fillRect(x+32,123,2,5,tft.Color565(0,100,0));
tft.fillRect(x+64,123,2,5,tft.Color565(0,200,0));
tft.fillRect(x+96,123,2,5,tft.Color565(0,100,0));
tft.fillRect(x+128,123,2,5,tft.Color565(0,200,0));  
}
x=x-2;if(x==0){x=32;fl_1=!fl_1;}
}
//
if(xpr>20&&xpr<44&&fl_pr){//условия промаха птички мимо портала, итоги игры
if(y<ypr||y+20>ypr+64){
tft.setCursor(50,50); tft.setTextSize(2); tft.setTextColor(ST7735_RED);tft.println(utf8rus("РЕЗУЛЬТАТ"));
tft.setTextSize(3);tft.setCursor(90,80);tft.println(rezultat_);rezultat_=0;  
delay(500);
while(digitalRead(4)==HIGH){}//пока не нажали кнопку для перехода к повтору игры
tft.fillScreen(tft.Color565(0,255,255));
xpr=150;//   
}
}
//
if(xpr>20&&xpr<44&&!fl_pr){//условия столкновения птички с препятствием, итоги игры
if(y+20>ypr&&y<ypr+48){
tft.setCursor(50,50); tft.setTextSize(2); tft.setTextColor(ST7735_RED);tft.println(utf8rus("РЕЗУЛЬТАТ"));
tft.setTextSize(3);tft.setCursor(90,80);tft.println(rezultat_);rezultat_=0;  
delay(1000);
while(digitalRead(4)==HIGH){}//пока не нажали кнопку для перехода к повтору игры
tft.fillScreen(tft.Color565(0,255,255));
xpr=150;//   
}
}
//
}
/////////////////////////////////////////////////////////////////
void drawBitmap_(int x,int y, const uint8_t *bitmap,int w,int h,byte pal) {//функция вывода 4-х цветного рисунка по координатам, заданного размера и выбранной палитры
if(x<0||x+w>160||y<0||y+h>128){return;} 
 tft.setAddrWindow(x,y,x+w-1,y+h-1);
 int i, j, byteWidth = (w + 7) / 8;
  uint8_t byte_r;uint8_t byte_g;uint8_t byte_b;
   //
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW); 
 for(j=0; j<h; j++) {
    for(i=0; i<w; i++) {
      if(i & 7) {byte_r <<= 1;byte_g <<= 1;}
      else     { byte_r = pgm_read_byte(bitmap + j * byteWidth + i / 8);byte_g = pgm_read_byte(bitmap + (j+h) * byteWidth + i / 8);}
      if((byte_r&0x80)&&(byte_g&0x80))
      {if(pal==1){SPI.transfer(tft.Color565(0,0,0)>>8);SPI.transfer(tft.Color565(0,0,0));}if(pal==2){SPI.transfer(tft.Color565(0,100,0)>>8);SPI.transfer(tft.Color565(0,100,0));}}//контур
      if(!(byte_r&0x80)&&!(byte_g&0x80))
      {if(pal==1){SPI.transfer(tft.Color565(0,255,255)>>8);SPI.transfer(tft.Color565(0,255,255));}if(pal==2){SPI.transfer(tft.Color565(0,255,255)>>8);SPI.transfer(tft.Color565(0,255,255));}}//фон
      if((byte_r&0x80)&&!(byte_g&0x80))
      {if(pal==1){SPI.transfer(tft.Color565(255,150,0)>>8);SPI.transfer(tft.Color565(255,150,0));}if(pal==2){SPI.transfer(tft.Color565(0,255,0)>>8);SPI.transfer(tft.Color565(0,255,0));}}//цвет 1
      if(!(byte_r&0x80)&&(byte_g&0x80))
      {if(pal==1){SPI.transfer(tft.Color565(255,255,255)>>8);SPI.transfer(tft.Color565(255,255,255));}if(pal==2){SPI.transfer(tft.Color565(0,100,255)>>8);SPI.transfer(tft.Color565(0,100,255));}}//цвет 2
      
    }
  }
  digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction();
 ///  
}
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
/* Функция перекодировки русских букв из UTF-8 в Win-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;
}
////////////////////////////////////////////////////////////////////

сх

А оно у Вас компилируется?
У меня нет. Возможно не те библиотеки
Adafruit_ST7735 какая?

Для ESP точно так же, как и для ATMega328, можно использовать INPUT_PULLUP. Но не на все GPIO допускается вешать перефирию.

Библиотека у меня явно старая, я и думал, что с есп не заработает, а она заработала, причём с минимумом исправлений - только пинов.

С этим пуллар заработала, только на 4 пине. На 2, 36, 39 нет. Как узнать где будет работать?

16…33 используй смело, 34…39 внутренних пуллапов не имеют, нужен внешний.
Ну и, конечно, если на модуле они уже чем-то не заняты.

Еще, как показала практика, в зависимости от выбранной платы в IDE, GPIO может вести себя немного неожиданно.

Читать, читать и еще раз читать доки. Там вообще черт ногу сломит с этими выводами.
ЗЫ: на ESP8266 кнопка запустилась без проблем, но такое ощущение, что миллис при работающем WiFI там живет сам по себе. Потому как антидребезг практически не отрабатывается. Пришлось родной Ticker подключать

Вот опять она у меня двоякие “чюйства” вызывает. Позавчера в лоб залил скетч УНО для матрицы ws2812 8*32 - заработало, но с бликами хаотичными. И выводы менял и уровень с 3,3 до 5 поднимал - всё равно пестрят 5-10 светодиодов по диагонали. Просто в прогмем теперь можно совать картинки в настоящем цвете. Правда не знаю сколько ресурса. В ОЗУ написано 500 Кб, пишут не больше 300 можно взять. А на флеш?

Fastled?

Адафрукт неопиксель. Пробовал транзистор по схеме с эмиттерным повторителем.

Это потому что ты дисплей на VSPI подключил

static const uint8_t SS    = 5;
static const uint8_t MOSI  = 23;
static const uint8_t MISO  = 19;
static const uint8_t SCK   = 18;

Я подключил не от большого ума, так было у автора тетриса в скетче. Я только свои игры пересадил на его пины. А на другом SPI также будет?

Отнюдь, HSPI в ядре не прописан, я запускал под SOFT SPI, на удивление не конфликтуют, хотя там (на HSPI) висят еще два интерфейса, 0 и 1, через них идёт общение с флэшем, наш аж второй

Не могу оторваться от чтения! :wink: :wink: :wink:

Это не предел ещё!
Сделал вывод 16 битных пикселей.

//вывод фотокартинок
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include "ris_.h"//файл хранения массивов фотокартинок
#define TFT_CS     5
#define TFT_RST    16
#define TFT_DC     17
// TFT_SCL 18   
// TFT_SDA 23 
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

void setup() {
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(0);
  }
void loop() {
drawFoto(0,0,ris_1,128,160);delay(1000);//
drawFoto(0,0,ris_2,128,160);delay(1000);//  
}
/////////////////////////////////////////////////////////////////
void drawFoto(int x,int y, const uint8_t *bitmap,int w,int h) {//функция вывода 
if(x<0||x+w>128||y<0||y+h>160){return;} 
 tft.setAddrWindow(x,y,x+w-1,y+h-1);
 SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW); 
 for(int j=0; j<h; j++) {
    for(int i=0; i<2*w; i=i+2) {
   // SPI.transfer(bitmap[i+1+j*2*w]);SPI.transfer(bitmap[i+j*2*w]);
   SPI.transfer(pgm_read_byte(bitmap+i+1+j*2*w));SPI.transfer(pgm_read_byte(bitmap+i+j*2*w)); 
    }
  }
  digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction();
 ///  
}
////////////////////////////////////////////////////////////////////

Строки 30 и 31 работают одинаково.

А что, должны по-разному?

Я думал одна из ОЗУ берёт данные, другая с флеш.