Кнопки не работают в скетче-сборке

Делаю сборку TFT+SD+DFPlayer. Собственно функционала из примеров более чем хватает. TFT и SD работают нормально, но вот DFPlayer в общей сборке запускается но не управляется кнопками ( next, pause, previous). Причем если загрузить код из примера для плеера, то в общей сборке на макетке плеер управляется кнопками. Прошу подсказать почему при работе с нижеприведенным кодом плеер не управляется кнопками.

#include <Adafruit_GFX.h>    // include Adafruit graphics library
#include <Adafruit_ST7735.h> // include Adafruit ST7735 display library
#include <SPI.h>             // include Arduino SPI library
#include <SD.h>              // include Arduino SD library
#include "DFRobotDFPlayerMini.h"
#include <SoftwareSerial.h>
 // define ST7735 TFT display connections
#define TFT_RST  5   // reset line (optional, pass -1 if not used)
#define TFT_CS   6   // chip select line
#define TFT_DC   7   // data/command line
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX для плеера DFPlayer Mini 
DFRobotDFPlayerMini myDFPlayer;
int buttonNext = 2; // кнопка следующий трек
int buttonPrevious = 3;  // кнопка предыдущий трек 
int buttonPause = 8;  // кнопка пауза/ пуск
boolean isPlaying = false; // статус воспроизведения/пауза
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 4;
 // initialize Adafruit ST7735 TFT library
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
 void setup(void) {
  pinMode(TFT_CS, OUTPUT);
  digitalWrite(TFT_CS, HIGH);
  pinMode(buttonPause, INPUT_PULLUP); 
  pinMode(buttonNext, INPUT_PULLUP);
  pinMode(buttonPrevious, INPUT_PULLUP);
  delay(1000);
  mySoftwareSerial.begin(9600); 
  Serial.begin(9600);
  Serial.println();
  Serial.println("DFPlayer Mini Demo");
  Serial.println("Initializing DFPlayer...");
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(15); //Set volume value (0~30).
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
  myDFPlayer.play(1); //Воспроизведение первого mp3
  isPlaying = true; // воспроизводим
 
  tft.initR(INITR_144GREENTAB);
  tft.setRotation(0);
  tft.fillScreen(ST77XX_BLUE);
   Serial.print("Initializing SD card...");
  if (!SD.begin(4)) {
    Serial.println("failed!");
    while(1);  // stay here
  }
  Serial.println("OK!");
   File root = SD.open("/");  // open SD card main root
  printDirectory(root, 0);   // print all files names and sizes
  root.close();              // close the opened root
}
 void loop() {
   if (digitalRead(buttonPause) == LOW) {
    if (isPlaying) { // если было воспроизведение трека
      myDFPlayer.pause(); // пауза
      isPlaying = false; // пауза
      Serial.println("Paused..");
    } else {        // иначе
      isPlaying = true; // воспроизводим
      myDFPlayer.start(); //запускаем mp3 с паузы
    }
    delay(500);
  }
if (digitalRead(buttonNext) == LOW) {
    if (isPlaying) {
      myDFPlayer.next(); //Next Song
      Serial.println("Next Song..");
    }
    delay(500);
  }
  if (digitalRead(buttonPrevious) == LOW) {
    if (isPlaying) {
      myDFPlayer.previous(); //Previous Song
      Serial.println("Previous Song..");
    }
    delay(500);
  }
  File root = SD.open("/");  // open SD card main root
   while (true) {
    File entry =  root.openNextFile();  // open file
     if (! entry) {
      // no more files
      root.close();
      return;
    }
 
    uint8_t nameSize = String(entry.name()).length();  // get file name size
    String str1 = String(entry.name()).substring( nameSize - 4 );  // save the last 4 characters (file extension)
 
    if ( str1.equalsIgnoreCase(".bmp") )  // if the file has '.bmp' extension
 bmpDraw(entry.name(), 0, 0);        // draw it
     entry.close();  // close the file
     delay(500);
    while( digitalRead(buttonNext) ) ;  // wait for button press
  }
}
 #define BUFFPIXEL 20
void bmpDraw(char *filename, uint8_t x, uint16_t y) {
   File     bmpFile;
  int      bmpWidth, bmpHeight;   // W+H in pixels
  uint8_t  bmpDepth;              // Bit depth (currently must be 24)
  uint32_t bmpImageoffset;        // Start of image data in file
  uint32_t rowSize;               // Not always = bmpWidth; may have padding
  uint8_t  sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel)
  uint8_t  buffidx = sizeof(sdbuffer); // Current position in sdbuffer
  boolean  goodBmp = false;       // Set to true on valid header parse
  boolean  flip    = true;        // BMP is stored bottom-to-top
 int      w, h, row, col;
  uint8_t  r, g, b;
  uint32_t pos = 0, startTime = millis();
   if((x >= tft.width()) || (y >= tft.height())) return;
   Serial.println();
  Serial.print(F("Loading image '"));
  Serial.print(filename);
  Serial.println('\'');
   // Open requested file on SD card
  if ((bmpFile = SD.open(filename)) == NULL) {
    Serial.print(F("File not found"));
    return;
  }
   // Parse BMP header
  if(read16(bmpFile) == 0x4D42) { // BMP signature
    Serial.print(F("File size: ")); Serial.println(read32(bmpFile));
    (void)read32(bmpFile); // Read & ignore
//creator bytes
    bmpImageoffset = read32(bmpFile); // Start of image data
    Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
    // Read DIB header
    Serial.print(F("Header size: ")); Serial.println(read32(bmpFile));
    bmpWidth  = read32(bmpFile);
    bmpHeight = read32(bmpFile);
    if(read16(bmpFile) == 1) { // # planes -- must be '1'
      bmpDepth = read16(bmpFile); // bits per pixel
      Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth);
      if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
         goodBmp = true;
 //Supported BMP format -- proceed!
        Serial.print(F("Image size: "));
        Serial.print(bmpWidth);
        Serial.print('x');
        Serial.println(bmpHeight);
         // BMP rows are padded (if needed) to 4-byte boundary
        rowSize = (bmpWidth * 3 + 3) & ~3;
         // If bmpHeight is negative, image is in top-down order.
        // This is not canon but has been observed in the wild.
        if(bmpHeight < 0) {
          bmpHeight = -bmpHeight;
          flip      = false;
 }
         // Crop area to be loaded
        w = bmpWidth;
        h = bmpHeight;
        if((x+w-1) >= tft.width())  w = tft.width()  - x;
        if((y+h-1) >= tft.height()) h = tft.height() - y;
         // Set TFT address window to clipped image bounds
        tft.startWrite();
        tft.setAddrWindow(x, y, w, h);
         for (row=0; row<h; row++) { // For each scanline...
         if(flip)
            pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
          else     // Bitmap is stored top-to-bottom
            pos =
bmpImageoffset + row * rowSize;
          if(bmpFile.position() != pos) { // Need seek?
            tft.endWrite();
            bmpFile.seek(pos);
            buffidx = sizeof(sdbuffer); // Force buffer reload
          }
           for (col=0; col<w; col++) { // For each pixel...
            // Time to read more pixel data?
            if (buffidx >= sizeof(sdbuffer)) { // Indeed
              bmpFile.read(sdbuffer, sizeof(sdbuffer));
              buffidx = 0; // Set index to beginning
 tft.startWrite();
            }
             // Convert pixel from BMP to TFT format, push to display
            b = sdbuffer[buffidx++];
            g = sdbuffer[buffidx++];
            r = sdbuffer[buffidx++];
            tft.pushColor(tft.color565(r,g,b));
          } // end pixel
        } // end scanline
        tft.endWrite();
        Serial.print(F("Loaded in "));
        Serial.print(millis() - startTime);
        Serial.println(" ms");
      } // end goodBmp
    }
  }
 bmpFile.close();
  if(!goodBmp) Serial.println(F("BMP format not recognized."));
}
uint16_t read16(File f) {
  uint16_t result;
  ((uint8_t *)&result)[0] = f.read(); // LSB
  ((uint8_t *)&result)[1] = f.read(); // MSB
  return result;
}
 uint32_t read32(File f) {
  uint32_t result;
  ((uint8_t *)&result)[0] = f.read(); // LSB
  ((uint8_t *)&result)[1] = f.read();
  ((uint8_t *)&result)[2] = f.read();
  ((uint8_t *)&result)[3] = f.read(); // MSB
  return result;
}
 void printDirectory(File dir, int numTabs) {
  while (true) {
     File entry =  dir.openNextFile();
    if (! entry) {
      // no more files
      break;
    }
    for (uint8_t i = 0; i < numTabs; i++) {
      Serial.print('\t');
    }
    Serial.print(entry.name());
    if (entry.isDirectory()) {
      Serial.println("/");
      printDirectory(entry, numTabs + 1);
    } else {
      // files have sizes, directories do not
      Serial.print("\t\t");
      Serial.println(entry.size(), DEC);
    }
    entry.close();
  }
}
 

С начала проверить, как “подтянуты” кнопки в обоих случаях, к GND или VCC.

По приведённой схеме ошибка - 11 пин :slight_smile:

иНтересно, куда дисплей подключен, параллельно что ли

Все кнопки подтянуты к GND 1к резисторами.

Delete

Строки 26-28 что там?

Значит через встроеный резистор.

Просто нужно понять , что есть верх, а что низ и что у вас в результате

Ульри, где у него кнопка схема?
PS это как раз тот случай когда без схемы не о чем разговаривать

1 лайк

Ещё и резисторы в кнопках чудят?

Сейчас сделаю.


не нашел такого же экрана TFT 1.44 взял похожий.

А для чего стоят резисторы между кнопками и GND?

Остались со времен битвы с шумами от плеера. Подтяжка кнопок была одним из методов.

Раз кнопки работают как надо со скетчем примером от плеера, но не работают в общем скетче, а только с sd и экраном, возможно проблема с RX\TX?

Вы услышали, что я сказал?

Кнопки можно подключить двумя способами: с подтяжкой к VCC(активным будет низкий лог. уроень) и с подтяжкой к GND
(активный высокий лог.уровень). Это надо учитывать при написании программы, иначе кнопки работать не будут.

А в чем конкретно проблема с 11 пином? что он задействован в SPI и UART? Тогда подскажите, пожалуйста, как развести верно.

На первый взгляд должно было погореть, но не факт. А так переназначить пины.