Aplicación con Android Studio y Java
Diseño
Activity_main.xml
[Link]
[Link]
[Link]
Pruebas en emulador de Android studio
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<[Link]
xmlns:android="[Link]
xmlns:app="[Link]
android:padding="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvTitle"
android:text="Calculadora de Protecciones"
android:textSize="20sp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<Spinner
android:id="@+id/spnPhase"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:entries="@array/phase_options"
app:layout_constraintTop_toBottomOf="@id/tvTitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="12dp"/>
<EditText
android:id="@+id/etPower"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Potencia (W)"
android:inputType="numberDecimal"
app:layout_constraintTop_toBottomOf="@id/spnPhase"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="12dp"/>
<EditText
android:id="@+id/etVoltage"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Tensión (V)"
android:inputType="numberDecimal"
app:layout_constraintTop_toBottomOf="@id/etPower"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp"/>
<EditText
android:id="@+id/etPF"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Factor de potencia (0.8 por defecto)"
android:inputType="numberDecimal"
app:layout_constraintTop_toBottomOf="@id/etVoltage"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp"/>
<EditText
android:id="@+id/etDerating"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Factor corrección (ej. 1.25)"
android:inputType="numberDecimal"
app:layout_constraintTop_toBottomOf="@id/etPF"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp"/>
<Button
android:id="@+id/btnCalculate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Calcular"
app:layout_constraintTop_toBottomOf="@id/etDerating"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="12dp"/>
<TextView
android:id="@+id/tvResult"
android:layout_width="0dp"
android:layout_height="0dp"
android:text=""
app:layout_constraintTop_toBottomOf="@id/btnCalculate"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="12dp"
android:padding="8dp"/>
<ScrollView xmlns:android="[Link]
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<!-- Aquí van tus EditText, Spinner, Button y TextView -->
</ScrollView>
</[Link]>
MainActivity
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class MainActivity extends AppCompatActivity {
private Spinner spnPhase;
private EditText etPower, etVoltage, etPF, etDerating;
private Button btnCalculate;
private TextView tvResult;
private DecimalFormat df = new DecimalFormat("#.##");
@Override
protected void onCreate(Bundle savedInstanceState) {
[Link](savedInstanceState);
// Activa modo Edge-to-Edge (diseño moderno)
[Link](this);
setContentView([Link].activity_main);
// Ajusta márgenes automáticamente según las barras del sistema
[Link](findViewById([Link]), (v,
insets) -> {
Insets systemBars =
[Link]([Link]());
[Link]([Link], [Link], [Link],
[Link]);
return insets;
});
spnPhase = findViewById([Link]);
etPower = findViewById([Link]);
etVoltage = findViewById([Link]);
etPF = findViewById([Link]);
etDerating = findViewById([Link]);
btnCalculate = findViewById([Link]);
tvResult = findViewById([Link]);
// Valores por defecto
[Link]("0.8");
[Link]("1.25");
[Link]("220");
[Link](new [Link]() {
@Override
public void onClick(View view) {
calculateAndShow();
}
});
}
private void calculateAndShow() {
String sPower = [Link]().toString().trim();
String sVoltage = [Link]().toString().trim();
String sPF = [Link]().toString().trim();
String sDer = [Link]().toString().trim();
if ([Link]() || [Link]()) {
[Link](this, "Introduce potencia (W) y tensión (V).",
Toast.LENGTH_SHORT).show();
return;
}
double power = parseDoubleSafe(sPower, 0);
double voltage = parseDoubleSafe(sVoltage, 0);
double pf = parseDoubleSafe(sPF, 0.8);
double der = parseDoubleSafe(sDer, 1.25);
boolean isThreePhase =
[Link]().toString().toLowerCase().contains("trif");
if (voltage <= 0 || power <= 0) {
[Link](this, "Potencia y tensión deben ser mayores que 0.",
Toast.LENGTH_SHORT).show();
return;
}
double loadCurrent =
[Link](power, voltage, pf, isThreePhase);
double recommendedI =
[Link](loadCurrent, der);
int suggestedBreaker =
[Link]([Link](recommendedI));
StringBuilder sb = new StringBuilder();
[Link]("Carga calculada: ").append([Link](loadCurrent)).append(" A\
n");
[Link]("Corriente recomendada (con factor
").append([Link](der)).append("): ")
.append([Link](recommendedI)).append(" A\n");
[Link]("Interruptor/Fusible sugerido (talla estándar): ")
.append(suggestedBreaker).append(" A\n\n");
[Link]("Notas:\n");
[Link]("- Ajusta el factor de corrección según normativa local
(temperatura, agrupamiento, tipo de conductor).\n");
[Link]("- Este cálculo es orientativo; verifica con norma local (p.
ej. NEC, IEC, NB777/NB1089).\n");
[Link]([Link]());
}
private double parseDoubleSafe(String s, double def) {
try {
return [Link](s);
} catch (Exception e) {
return def;
}
}
}
ProtectionCalculator
package [Link];
public class ProtectionCalculator {
public static double calculateCurrentFromPower(double power, double voltage,
double pf, boolean isThreePhase) {
if (isThreePhase) {
// Fórmula trifásica: I = P / (√3 × V × PF)
return power / ([Link](3) * voltage * pf);
} else {
// Fórmula monofásica: I = P / (V × PF)
return power / (voltage * pf);
}
}
public static double recommendedBreakerCurrent(double loadCurrent, double
derating) {
return loadCurrent * derating;
}
public static int selectStandardBreaker(double current) {
int[] standards = {6, 10, 13, 16, 20, 25, 32, 40, 50, 63, 80, 100, 125,
160, 200};
for (int val : standards) {
if (val >= current) return val;
}
return standards[[Link] - 1];
}
}
[Link]
<resources>
<string name="app_name">Protecciones</string>
<string-array name="phase_options">
<item>Monofásico</item>
<item>Trifásico</item>
</string-array>
</resources>