Hoy tratando de iniciar un nuevo proyectito, me ha surgido la necesidad de realizar operaciones lógicas y aritméticas para calcular una serie de porcentajes ( Nada complejo ). Para ser más exactos la operación que deseo realizar es la siguiente:
Con esta operación mi intención es calcular el porcentaje de luz actual, obteniendo los datos relativos de un Fotosensor. El proyecto es domestico pero no debería tener mayor complejidad que la lectura de un puerto analógico, adjunto imagen del proyecto:
Todo ese armatoste al final es un receptor Bluetooth que controlo con una app que desarrollé en Android Studio:
¿Cuál es el problema?
Al tratar de hacer una división entera ( DevolverLuz()/1022 ), donde el procedimiento DevolverLuz es ( En la captura devuelve un int pero lo tengo actualmente como float):
Concretamente en la casuística de (Dividendo < Divisor, en mi ejemplo 526/1022) la operación de división, siempre me devuelve 0.
Adjunto evidencia del terminal serial con función debug ( Esta función es básicamente un printf dónde el primer valor 0 es el resultado del debug(op) y el segundo valor 100 es el resultado de PorcentajelUX() ):
¿Es un bug de mi placa ( No es Arduino UNO oficial)?
En programación el cociente entre números enteros es otro numero entero. Tal como decís vos 999 / 1000 da 0.
Pero si uno es fraccionario el resultado también, entonces o agrega un factor 1.0 al inicio, o mas simple al divisor hacelo 1022.0. La cuenta anterior es 999 / 1000.0 da 0.999.
Ah, en cuanto a placas no oficiales seguramente tiene el mismo microcontrolador (que es el que hace las cuentas). Y si tiene uno parecido no creo que cambie nada de este tema.
Lo que si puede variar un poco de una placa oficial a las que no es en los valores eléctricos, máximos admitidos, tolerancias.
Tienes que definir devolverluz como float, no como int. Una operación matemática, debe hacerse siempre con variables o números del mismo tipo. Y en el float, cambia el 1022 por 1022.0 ya que si no, se considera int.
Disculpad el error en las capturas pero ambos valores estån declarados como decimales ( En las capturas definidos como enteros ) y sigo teniendo el mismo problema es por ello que os comento si pudiera ser un error del microcontrolador.
carmeloco:
Tienes que definir devolverluz como float, no como int. Una operación matemática, debe hacerse siempre con variables o números del mismo tipo. Y en el float, cambia el 1022 por 1022.0 ya que si no, se considera int.
Cierto, el problema era sencillamente el error más básico de todos los errores al indicarle el 1022 tal y como dices lo interpreta como entero ( lógico puesto que es un entero :(), he hecho un cast al mismo número y ha funcionado.
Muchas gracias por todo! Editó el título del post a SOLUCIONADO.