По итогу решил проблему иначе: вместо объявления программного UART через SoftwareSerial использовал уже существующий аппаратный Serial1 (те же пины, что я пытался использовать в первоначальной программе). Если честно, до сих пор не понимаю почему одно работает, а другое нет, когда результат должен быть одинаковый (я имею ввиду результат объявления Serial1 и объявления через SoftwareSerial, используя те же пины). Если вдруг кто знает, расскажите, пожалуйста.
Рабочий код выглядит вот так:
#define esp Serial1
void setup()
{
Serial.begin(9600);
esp.begin(115200);
}
void loop()
{
if (esp.available()) {
Serial.write(esp.read());
}
if (Serial.available()) {
esp.write(Serial.read());
}
}
P.S. Первоначальный вариант не работает, даже если поменять скорость ESP на 9600, как советовали другие ответившие.