2011-12-17 8 views
7

Próbuję zakodować bardzo podstawową aplikację światłomierza do użytku z moimi starymi aparatami 35 mm, używając mojego Galaxy S2 jako czujnika.Kod czujnika światła powracającego ograniczony zakres wartości

Należy przede wszystkim zaznaczyć, że na tym telefonie dostępny jest ukryty/testowy tryb wybierania, wpisując gwiaździstą mieszankę zero gwiazdki hash, na klawiaturze dialllera, a następnie wybierając "czujnik". Zapewnia to dostęp do czujnika światła, który pokazuje zakres wartości Lux wahających się od 5 do ponad 2000 w krokach co 5, ponieważ zmieniam poziom oświetlenia.

Bardzo prosty kod koncepcyjny, który napisałem, pokaże mi tylko trzy wartości, mianowicie 10, 100 i 1000 w tym samym zakresie warunków oświetlenia. Mój kod to:

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]); 

     } 
    } 
} 

Czy ktoś może zasugerować, dlaczego tak się dzieje?

Widziałem pytanie Light sensor on Nexus One returns only two distinct values , które nie pomogło w ogóle. Nie mogę zrozumieć, jak wbudowany tryb testowy może zobaczyć pełny zakres, a mój kod nie.

+0

Aren 50 troszkę mniej za tak skomplikowane pytanie? : p – poitroae

+0

@Michael: Zmarnowałeś swój czas, prawda? Jeśli uważasz, że taka postawa sprawi, że będziesz popularny w Stack Overflow, jesteś bardzo w błędzie. – NickT

Odpowiedz

4

I tylko przetestowane na Galaxy S2, ale tylko w ten sposób mogę zobaczyć prawdziwą wartość było dostać bezpośrednio plik urządzenia System:

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

lub w Java:

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

To faktycznie działa! Dziękuję Ci. Myślałem, że będzie potrzebować uprawnień roota, ale tak nie jest. – NickT

0

Być może jest inny czujnik światła, który jest domyślnie używany przez system. Napisałem aplikację, która po prostu wyprowadza informacje o czujnikach:

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); 
} 

Możesz przetestować swoje urządzenie. Biorąc pod uwagę kilka wartości na Nexusie One. Przetestowałem twoją aplikację na Nexus One i na początku otrzymałem tylko dwie wartości 10 i 225. Ale potem podłożyłem telefon pod lampę i otrzymałem wiele wartości. Ale zbiór wartości jest ograniczony, a rozdzielczość czujnika wynosi 1f. Nie wiem, dlaczego tak się dzieje.

+0

Telefon ma tylko jeden czujnik światła, który jest czujnikiem światła CM3663 produkowanym przez Capella Microsystems, Inc. Tego można się spodziewać, ponieważ nie ma powodu, dla którego urządzenie miałoby dwa lub więcej takich czujników. – NickT

+0

W dokumentacji stwierdziłem, że w urządzeniu może być kilka czujników. getDefaultSensor może zwrócić tylko pierwszy czujnik lub może wykonać fałszywy czujnik, który pobierze średnio kilka rzeczywistych czujników. Jednak spróbuj umieścić telefon pod lampą, a także sprawdź maksymalny zasięg czujnika. – Yury

+0

Mam już listę czujników typu Sensor.TYPE_LIGHT. Był jeden wpis w opisany sposób. Maksymalny zasięg to 3000,0. Oczywiście wkładam telefon pod jasne światło. Odczytano 1000,0. – NickT

Powiązane problemy