There are no values for which the ordinate is exactly 0.5 in your list, so you will have to decide for yourself how close is close enough:
For instance, if a tolerance of 0.01 is sufficiently close, then:
Cases[data, {x_, y_} /; Round[y, 0.01] == 0.5 :> x]
(* Out: {0.52, 2.62, 6.81, 8.9, 13.09, 15.18, 15.19} *)
If you want a stricter tolerance, e.g. 0.001, then:
Cases[data, {x_, y_} /; Round[y, 0.001] == 0.5 :> x]
(* Out: {13.09} *)
We can put this together in a function:
ClearAll[selector]
selector[data_, desiredVal_, tolerance_] :=
Cases[data, {x_, y_} /; Round[y, tolerance] == desiredVal :> x]
selector[data, 0.5, 0.01]
(* Out: {0.52, 2.62, 6.81, 8.9, 13.09, 15.18, 15.19} *)
If, on the other hand, you would like to use an interpolation to determine the value of x (perhaps not present in your dataset, but obtained by interpolation from it) for which $y=0.5$ exactly, you could use the following method to find all zeros of a function over a range I've learned on this site (but currently can't find a link for, will update):
int = Interpolation[data];
First@Last@
Reap@
NDSolve[
{f'[x] == int'[x], f[0] == int[0], WhenEvent[f[x] == 0.5, Sow[x]]},
f, Evaluate@{x, MinMax[ data[[All, 1]] ]}
]
(* Out: {0.523599, 2.61799, 6.80678, 8.90118, 13.09, 15.1844} *)