203 lines
8.8 KiB
PHP
203 lines
8.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Services\FuzzyLogicService;
|
|
use App\Models\Calculation;
|
|
use Illuminate\Support\Facades\Http;
|
|
|
|
class FuzzyController extends Controller
|
|
{
|
|
public static function round_float2($value) {
|
|
return round((float)$value);
|
|
}
|
|
|
|
// Definisi fungsi round_float di dalam kelas FuzzyLogicService
|
|
public static function round_float($value) {
|
|
return number_format((float)$value, 2, '.', '');
|
|
}
|
|
|
|
public function index() {
|
|
// Ambil nilai tinggi air dari ThingSpeak
|
|
$api_key_thingspeak = 'ZU8Y7353QGPEE7HA'; // Ganti dengan API Key ThingSpeak Anda
|
|
$channel_id = '2462195'; // Ganti dengan ID saluran ThingSpeak Anda
|
|
|
|
$response = Http::get("https://api.thingspeak.com/channels/$channel_id/feeds.json", [
|
|
'api_key' => $api_key_thingspeak,
|
|
'results' => 1, // Ambil 1 hasil terbaru
|
|
]);
|
|
|
|
$tinggi_air_thingspeak = null;
|
|
if ($response->ok()) {
|
|
$data = $response->json();
|
|
if (!empty($data['feeds'])) {
|
|
$tinggi_air_thingspeak = $data['feeds'][0]['field5']; // Mengambil nilai tinggi air dari 'field5'
|
|
}
|
|
}
|
|
|
|
// Gunakan nilai tinggi air dari ThingSpeak sebagai input
|
|
if ($tinggi_air_thingspeak !== null) {
|
|
$tinggi_air = $tinggi_air_thingspeak;
|
|
}
|
|
// $tinggi_air = self::round_float($tinggi_air);
|
|
$tinggi_air = self::round_float2($tinggi_air);
|
|
|
|
return view('pages.fuzzy', [
|
|
'tinggi_air' => $tinggi_air, // Kirim nilai tinggi air ke view
|
|
]);
|
|
}
|
|
|
|
public function calculateFuzzyLogic(Request $request)
|
|
{
|
|
// Salin seluruh kode dari fungsi-fungsi dan logika yang ingin Anda pindahkan ke sini
|
|
// Pastikan untuk mengubah variabel-variabel yang digunakan dalam fungsi-fungsi Anda menjadi input dari request
|
|
|
|
// Contoh:
|
|
$usia_tanaman = $request->input('usia_tanaman');
|
|
$tinggi_air = $request->input('tinggi_air');
|
|
$luas_lahan = $request->input('luas_lahan');
|
|
|
|
$tinggi_air_rounded = self::round_float($tinggi_air);
|
|
|
|
// Fuzzifikasi
|
|
$usia_tanaman_membership = FuzzyLogicService::fuzzifikasi_usia_tanaman($usia_tanaman);
|
|
$tinggi_air_membership = FuzzyLogicService::fuzzifikasi_tinggi_air($tinggi_air_rounded);
|
|
$luas_lahan_membership = FuzzyLogicService::fuzzifikasi_luas_lahan($luas_lahan);
|
|
|
|
// Rule Evaluation
|
|
$rule_activations = FuzzyLogicService::rule_evaluation($usia_tanaman_membership, $tinggi_air_membership, $luas_lahan_membership);
|
|
|
|
// Aggregation
|
|
$aggregated_output = FuzzyLogicService::aggregation($rule_activations);
|
|
|
|
// Ambil nilai agregasi maksimum
|
|
$max_activations = $aggregated_output['max_activations'];
|
|
// Ambil aturan dengan nilai aktivasi maksimum
|
|
$max_activation_rules = $aggregated_output['max_activation_rules'];
|
|
|
|
$data = [
|
|
'rule_activations' => $rule_activations,
|
|
'max_activations' => $max_activations,
|
|
'aggregated_output' => $aggregated_output['aggregated_output'],
|
|
'max_activation_rules' => $max_activation_rules // Pastikan ini ditambahkan
|
|
];
|
|
|
|
$intersection_points = FuzzyLogicService::calculate_intersection_points($aggregated_output);
|
|
|
|
// Hitung integral
|
|
$integral_result = FuzzyLogicService::integrate($rule_activations);
|
|
$integral_result2 = FuzzyLogicService::integrate2($rule_activations);
|
|
$integral_result3 = FuzzyLogicService::integrate3($rule_activations);
|
|
$integral_result4 = FuzzyLogicService::integrate4($rule_activations);
|
|
$integral_result5 = FuzzyLogicService::integrate5($rule_activations);
|
|
$integral_result6 = FuzzyLogicService::integrate6($rule_activations);
|
|
|
|
// Menambahkan hasil integral ke dalam array data
|
|
$dataFiks['integral_result'] = $integral_result;
|
|
$dataFiks2['integral_result2'] = $integral_result2;
|
|
$dataFiks3['integral_result3'] = $integral_result3;
|
|
$dataFiks4['integral_result4'] = $integral_result4;
|
|
$dataFiks5['integral_result5'] = $integral_result5;
|
|
$dataFiks6['integral_result6'] = $integral_result6;
|
|
|
|
// Cara menggunakan display dan menampilkan hasilnya
|
|
// Hitung total M dan total A
|
|
$total_M = $dataFiks + $dataFiks2 + $dataFiks3;
|
|
$total_A = $dataFiks4 + $dataFiks5 + $dataFiks6;
|
|
|
|
$total_M_sum = array_sum($total_M);
|
|
$total_A_sum = array_sum($total_A);
|
|
|
|
// Check if $total_A_sum is not zero to avoid division by zero error
|
|
if ($total_A_sum != 0) {
|
|
// Calculate the final result
|
|
$result = $total_M_sum / $total_A_sum;
|
|
$result = self::round_float($result);
|
|
} else {
|
|
// Handle division by zero error
|
|
$result = "Division by zero error!";
|
|
}
|
|
|
|
// $max_activation_rules_json = json_encode($max_activation_rules);
|
|
|
|
// Simpan data ke database menggunakan model Calculation
|
|
$calculation = new Calculation();
|
|
$calculation->usia_tanaman = $usia_tanaman;
|
|
$calculation->tinggi_air = $tinggi_air;
|
|
$calculation->luas_lahan = $luas_lahan;
|
|
$calculation->usia_tanaman_muda = $usia_tanaman_membership['muda'];
|
|
$calculation->usia_tanaman_dewasa = $usia_tanaman_membership['dewasa'];
|
|
$calculation->usia_tanaman_tua = $usia_tanaman_membership['tua'];
|
|
$calculation->luas_lahan_kecil = $luas_lahan_membership['kecil'];
|
|
$calculation->luas_lahan_sedang = $luas_lahan_membership['sedang'];
|
|
$calculation->luas_lahan_besar = $luas_lahan_membership['besar'];
|
|
$calculation->tinggi_air_rendah = $tinggi_air_membership['rendah'];
|
|
$calculation->tinggi_air_sedang = $tinggi_air_membership['sedang'];
|
|
$calculation->tinggi_air_tinggi = $tinggi_air_membership['tinggi'];
|
|
$calculation->rule_rendah = $max_activation_rules['rendah']['rule'];
|
|
$calculation->value_rule_rendah = $max_activation_rules['rendah']['activation'];
|
|
$calculation->rule_tinggi = $max_activation_rules['tinggi']['rule'];
|
|
$calculation->value_rule_tinggi = $max_activation_rules['tinggi']['activation'];
|
|
$calculation->titik_perpotongan1 = $intersection_points['t1'];
|
|
$calculation->titik_perpotongan2 = $intersection_points['t2'];
|
|
$calculation->momen_1 = $dataFiks['integral_result'];
|
|
$calculation->momen_2 = $dataFiks2['integral_result2'];
|
|
$calculation->momen_3 = $dataFiks3['integral_result3'];
|
|
$calculation->luas_1 = $dataFiks4['integral_result4'];
|
|
$calculation->luas_2 = $dataFiks5['integral_result5'];
|
|
$calculation->luas_3 = $dataFiks6['integral_result6'];
|
|
$calculation->jumlah_momen = $total_M_sum;
|
|
$calculation->jumlah_luas = $total_A_sum;
|
|
$calculation->hasil_perhitungan = $result;
|
|
$calculation->save();
|
|
|
|
// Data yang ingin Anda kirim ke ThingSpeak
|
|
$hasil_perhitungan = $result; // Ganti dengan nilai hasil perhitungan Anda
|
|
$api_key = '84DPP86EQWKYKI1X'; // Ganti dengan API Key ThingSpeak Anda
|
|
|
|
// URL untuk mengirim data ke ThingSpeak
|
|
$url = 'https://api.thingspeak.com/update?api_key=' . $api_key . '&field1=' . $hasil_perhitungan;
|
|
|
|
// Buat permintaan HTTP POST
|
|
$ch = curl_init($url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
$response = curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
// // Periksa respon
|
|
// if ($response === false) {
|
|
// echo 'Gagal mengirim data ke ThingSpeak';
|
|
// } else {
|
|
// echo 'Data berhasil dikirim ke ThingSpeak';
|
|
// }
|
|
|
|
// Display results
|
|
return view('pages.result', [
|
|
'usia_tanaman_membership' => $usia_tanaman_membership,
|
|
'tinggi_air_membership' => $tinggi_air_membership,
|
|
'luas_lahan_membership' => $luas_lahan_membership,
|
|
'rule_activations' => $rule_activations,
|
|
'aggregated_output' => $aggregated_output,
|
|
'usia_tanaman' => $usia_tanaman,
|
|
'tinggi_air' => $tinggi_air,
|
|
'luas_lahan' => $luas_lahan,
|
|
'max_activations' => $max_activations,
|
|
'max_activation_rules' => $max_activation_rules,
|
|
'data' => $data,
|
|
'intersection_points' => $intersection_points,
|
|
'dataFiks' => $dataFiks,
|
|
'dataFiks2' => $dataFiks2,
|
|
'dataFiks3' => $dataFiks3,
|
|
'dataFiks4' => $dataFiks4,
|
|
'dataFiks5' => $dataFiks5,
|
|
'dataFiks6' => $dataFiks6,
|
|
'total_M' => $total_M,
|
|
'total_A' => $total_A,
|
|
'total_M_sum' => $total_M_sum, // Pass the sum of $total_M to the view
|
|
'total_A_sum' => $total_A_sum, // Pass the sum of $total_A to the view
|
|
'result' => $result,
|
|
]);
|
|
}
|
|
}
|