2011-12-17 24 views
7

Tôi đang cố mã hóa ứng dụng đồng hồ đo ánh sáng cơ bản để sử dụng với máy ảnh 35mm cũ sử dụng Galaxy S2 làm cảm biến.Mã cảm biến ánh sáng trả lại phạm vi giá trị giới hạn

Tôi nên chỉ ra trước hết rằng có chế độ ẩn/kiểm tra khả dụng trên điện thoại này được chọn bằng cách nhập băm sao không băm sao, trên bàn phím dialller rồi chọn 'cảm biến'. Điều này làm cho có sẵn cảm biến ánh sáng cho thấy một loạt các giá trị Lux khác nhau giữa 5 và hơn 2000 trong các bước của 5 khi tôi thay đổi mức độ ánh sáng.

Bằng chứng đơn giản về mã khái niệm tôi đã viết sẽ chỉ hiển thị cho tôi ba giá trị, cụ thể là 10, 100 và 1000 trên cùng một phạm vi điều chỉnh ánh sáng. Mã của tôi là:

public class LightMeterActivity extends Activity implements SensorEventListener { 

    private SensorManager mSensorManager; 
    private Sensor mLightSensor; 
    private float mLux = 0.0f; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mSensorManager.registerListener(this, mLightSensor, 
       SensorManager.SENSOR_DELAY_FASTEST); 
    } 

    @Override 
    protected void onPause() { 
     mSensorManager.unregisterListener(this); 
     super.onPause(); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor arg0, int arg1) {} 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if (event.sensor.getType() == Sensor.TYPE_LIGHT) { 
      mLux = event.values[0]; 
      String luxStr = String.valueOf(mLux); 
      TextView tv = (TextView) findViewById(R.id.textView1); 
      tv.setText(luxStr); 
      Log.d("LUXTAG", "Lux value: " + event.values[0]); 

     } 
    } 
} 

Ai có thể đề xuất tại sao điều này có thể là?

Tôi đã xem câu hỏi Light sensor on Nexus One returns only two distinct values không có ích gì cả. Tôi không thể hiểu cách chế độ thử nghiệm được tích hợp có thể thấy phạm vi đầy đủ và mã của tôi không thể.

+0

Aren 't 50 đại diện một chút ít hơn cho một câu hỏi phức tạp như vậy? : p – poitroae

+0

@Michael: Bạn lãng phí thời gian của bạn sau đó phải không? Nếu bạn nghĩ rằng loại thái độ đó sẽ làm cho bạn nổi tiếng trên Stack Overflow, bạn đang nhầm lẫn. – NickT

Trả lời

4

tôi chỉ thử nghiệm này trên Galaxy S2 nhưng cách duy nhất tôi có thể thấy giá trị thực sự là để có được nó trực tiếp các tập tin thiết bị hệ thống:

#cat "/sys/devices/virtual/lightsensor/switch_cmd/lightsensor_file_state" 

hoặc trong java:

Scanner st = new Scanner(new File("/sys/devices/virtual/lightsensor/switch_cmd/lightsensor_file_state")); 
int lux = st.nextInt(); 
st.close(); 
+0

Điều này thực sự hoạt động! Cảm ơn bạn. Tôi nghĩ rằng nó sẽ cần quyền root, nhưng nó không. – NickT

0

Có thể có một cảm biến ánh sáng khác được hệ thống của bạn sử dụng theo mặc định. Tôi đã viết một ứng dụng đơn giản đưa ra thông tin về các cảm biến:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 

    mLightSensorList = mSensorManager.getSensorList(Sensor.TYPE_LIGHT); 
    tvSensorList = (TextView) findViewById(R.id.tvSensorList); 
    StringBuilder sensorInfo = new StringBuilder(""); 
    if (mLightSensorList != null) { 
     Log.d("Yury", mLightSensorList.toString()); 
     for (Sensor s : mLightSensorList) { 
      sensorInfo.append("Sensor name: "); 
      sensorInfo.append(s.getName()); 
      sensorInfo.append(" vendor: "); 
      sensorInfo.append(s.getVendor()); 
      sensorInfo.append(" ver.: "); 
      sensorInfo.append(s.getVersion()); 
      sensorInfo.append(" resolution: "); 
      sensorInfo.append(s.getResolution()); 
      sensorInfo.append(" maxRange: "); 
      sensorInfo.append(s.getMaximumRange()); 
      sensorInfo.append("\n"); 
     } 
     tvSensorList.setText(sensorInfo.toString()); 
    } 



    mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); 
} 

Bạn có thể kiểm tra thiết bị của mình. Xem xét một số giá trị trên Nexus One. Tôi đã thử nghiệm ứng dụng của bạn trên Nexus One và lúc đầu tôi chỉ nhận được hai giá trị 10 và 225. Nhưng sau đó tôi đặt điện thoại dưới đèn và nhận được rất nhiều giá trị. Nhưng tập hợp các giá trị bị giới hạn trong khi độ phân giải của cảm biến là 1f. Tôi không biết tại sao điều này xảy ra.

+0

Điện thoại chỉ có một cảm biến ánh sáng, là cảm biến ánh sáng CM3663 được sản xuất bởi Capella Microsystems, Inc. Điều này chỉ được mong đợi, vì tôi không thể biết được lý do tại sao thiết bị có hai hoặc nhiều cảm biến như vậy. – NickT

+0

Trong tài liệu tôi thấy rằng có thể có một số cảm biến trong thiết bị. getDefaultSensor chỉ có thể trả về cảm biến đầu tiên, hoặc có thể tạo ra một cảm biến giả sẽ lấy trung bình một số cảm biến thực. Tuy nhiên, hãy thử đặt điện thoại của bạn dưới đèn, và cũng kiểm tra maxRange của cảm biến của bạn. – Yury

+0

Tôi đã có danh sách các cảm biến loại Sensor.TYPE_LIGHT. Có một mục trong đó như được mô tả. Phạm vi tối đa của nó là 3000.0. Tất nhiên tôi đặt điện thoại dưới ánh sáng. Nó đọc 1000.0. – NickT

Các vấn đề liên quan