The locate button uses the getCurrentPosition function of the Geolocation api. getCurrentPosition tries to get the location answer for you as quickly as possible and in some cases this means that it will return IP location or wifi instead of the device gps. You can try setting the enableHighAccuracy geolocation option to true. If this doesn't work you'll want to create your own button that uses the geolocation api with the watchPostion function. watchPosition will provide an updated location if the device moves or if more accurate information becomes available.
To enable high accuracy specify it as a geolocation option when creating the button. For details on how the geolocation options work view the Geolocation API Specification.
var locateButton = new esri.dijit.LocateButton({
map: map,
geolocationOptions:{
enableHighAccuracy: true
}
},"locateDiv");
Setting enableHighAccuracy to true tells the browser to try and find the most accurate location. So if a device GPS is available it would theoretically use that.
You can't switch the locate button to using watch position so if you'd like to use that option you'll need to write your own code to do so.