๐ ํ๋ก์ ํธ ํฌ์คํ ์
๊ฐ์ธ ์ ์ํ ํ๋ก์ ํธ๋ฅผ ๋ฆฌ๋ทฐํ๊ณ ํ ๋ฒ ์ ๋ฆฌํ๋ ํฌ์คํ ์ ๋๋ค.
์ด๋ฒ์ ์งํํ ํ๋ก์ ํธ๋
์๋์ด๋ ธ์ 3D ํ๋ฆฐํฐ๋ฅผ ์ด์ฉํ์ฌ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ฅผ ์ ์ํ๊ณ ,
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๋ก ์๋ฒ๋ฅผ ๋ง๋ค์ด์ ๋ชจ๋ํฐ๋ง์ด ๊ฐ๋ฅํ ์์คํ ์ ๊ตฌํํ์์ต๋๋ค.
์ฌ์ฉ ๋ฌผํ
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 4 B ๋ชจ๋ธ |
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด LCD ํจ๋ |
ESP-01 Wifi module |
ESP-01 Wifi module adapter |
์๋์ด๋ ธ ์ฐ๋ ธ |
์๋์ด๋ ธ ํฌ |
์๋์ด๋ ธ LDC ํจ๋ |
์๋์ด๋ ธ ๋๋ ธ๋ณด๋ |
์๋์ด๋ ธ ๋ฆด๋ ์ด ๋ชจ๋ |
์ํ ํํฐ |
์ ์ฌ์ง์ ์ ์ฒด์ ์ธ ์ธ๊ด ์ฌ์ง์ ๋๋ค.
์๋จ๋ถ์ ํ๋จ๋ถ๋ก ๋๋์ด ์ค๊ณํ์์ต๋๋ค.
์๋จ๋ถ์๋ ํฌ๊ณผ ํํฐ๋ก ๊ตฌ์ฑํ์์ผ๋ฉฐ,
ํ๋จ๋ถ์๋ ์ผ์๋ค์ ์๋์ด๋ ธ ๋๋ ธ๋ณด๋๋ฅผ ํตํด์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ฏธ์ธ๋จผ์ง ์ธก์ ๊ฐ์ ๋ณด์ฌ์ฃผ๋ ์๋์ด๋ ธ LCD ํจ๋๊ณผ
๋ฏธ์ธ๋จผ์ง ๊ฐ์ ์ธก์ ํ๋ ๋ฏธ์ธ๋จผ์ง ์ผ์,
์ผ์๊ฐ์ ์๋ฒ๋ก ์ ์กํ Wifi ํต์ ๋ชจ๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
๋ํ ์๋์ด๋ ธ ๋๋ ธ ๋ณด๋์ ๋ฆด๋ ์ด ๋ชจ๋์ ์ค์นํ์ฌ
ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๊ฒฝ์ฐ์๋ ๋ฆด๋ ์ด ๋ชจ๋์ด ์๋๋์ด
์๋จ๋ถ์ ํฌ์ด ํ์ ํ๋๋ก ์ค๊ณํ์์ต๋๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ฏธ์ธ๋จผ์ง ์ธก์ ์ผ์์์
ํน์ ์์ค ์ด์์ ๊ฐ์ด ์ธก์ ๋ ๊ฒฝ์ฐ
ํฌ์ด ๋์ํ์ฌ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ์ญํ ์ ์ํํ๊ฒ ๋ฉ๋๋ค.
๋์ ์์
๋ํ
์ผ์๊ฐ์ ์๋ฒ๋ก ์ค์๊ฐ์ผ๋ก ์ ์กํ๋ฉฐ,
ํ์ฌ ์ธก์ ๋๊ณ ์๋ ์ต์ ๊ฐ๊ณผ ๊ทธ ๋ณํ๋์ ์ต๋ 7์ผ๊น์ง
๋ณผ ์ ์๋๋ก ์๋ฒ๋ฅผ ๊ตฌ์ถ ํ์์ต๋๋ค.
์๋ฒ ์ธก ์ฝ๋ฉ
<?php
// ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ JS ํจ์์ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ <div> ํ๊ทธ๋ฅผ ์์ฑํ๋ ์ฌ์ฉ์ ์ ์ ํจ์์ ๋ง๋ญ๋๋ค.
function makeChartParts($data, $options, $type)
{
static $index = 1;
$package = 'corechart';
$special_type = array('GeoChart', 'AnnotatedTimeLine','TreeMap', 'OrgChart',
'Gauge', 'Table', 'TimeLine', 'GeoMap', 'MotionChart');
if (in_array($type, $special_type)) {
$package = strtolower($type);
}
$load = 'google.charts.load("current", {"packages":"' . $package . '"});';
$jsData = json_encode($data);
$jsonOptions = json_encode($options);
// ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ JS ํจ์๋ฅผ ์์ฑํฉ๋๋ค.
$chart = <<<CHART_FUNC
{$load}
google.charts.setOnLoadCallback(drawChart{$index});
function drawChart{$index}() {
var data = {$jsData};
var chartData = new google.visualization.arrayToDataTable(data);
var options = {$jsonOptions};
var chartDiv = document.getElementById('chart{$index}');
var chart = new google.visualization.{$type}(chartDiv);
chart.draw(chartData, options);
}\n
CHART_FUNC;
// ๊ทธ๋ํ๋ฅผ ํ์ํ๋ <div> ํ๊ทธ๋ฅผ ์์ฑํฉ๋๋ค.
$div = '<div id="chart' . $index . '"></div>';
$index++;
return array($chart, $div);
}
?>
----------------------
<?php
// ๋ค๋ฅธ ํ์ผ์ ์ฌ์ฉ์ ์ ์ ํจ์ "makeChartParts ()"๋ฅผ ์ฝ์ด๋ค์
๋๋ค.
require_once './example/make_chart_parts.php';
$con=mysqli_connect("localhost","sensor_admin","kApRympaUfsSlA*B","all_sensor_data");
if(mysqli_connect_error()){echo "Failed to MySQL:".mysqli_connect_error();}
$data = array( array('', 'ํ๊ท ์ด์ฐํํ์'),);
for($count = 15; $count > 0; $count--){
$temp = mysqli_query($con, "SELECT AVG(CO2_D) FROM `quality_meter` WHERE DATE_FORMAT(Time, '%Y-%m-%d') = CURDATE() - INTERVAL {$count} DAY");
$temp_row = mysqli_fetch_array($temp);
$arr = array(date('d', strtotime($day."-$count day")).'์ผ',(int)$temp_row['AVG(CO2_D)']);
array_push($data,$arr);
}
// ๊ทธ๋ํ ์ต์
$options = array(
'title' => 'ํ๊ท ์ด์ฐํํ์ ๊ทธ๋ํ ('.(date('m').'์)'), // ๊ทธ๋ํ ์ ๋ชฉ
'titleTextStyle' => array('fontSize' => 16), // ์ ๋ชฉ ์คํ์ผ
'vAxes' => array(0 => array('title' => 'ํ๊ท ์ด์ฐํํ์๏ผPPM๏ผ', // ์ธ๋ก์ถ ์ผ์ชฝ
'minValue' => 0, 'minValue' => 2100)),
'width' => 1200, 'height' => 500, // ํญ, ๋์ด
'chartArea' => array('width' => 900, 'height' => 240), // ์ฐจํธ ์์ญ
'legend' => array('position' => 'bottom', 'alignment' => 'start')); // ๋ฒ๋ก
// ๊ทธ๋ํ ์ ํ (์ ๊ทธ๋ํ)
$type = 'LineChart';
// ๊ทธ๋ํ ๊ทธ๋ฆผ์ JavaScript ํจ์, ํ์ํ <div> ํ๊ทธ์ ์์ฑ
list($chart, $chart_div) = makeChartParts($data, $options, $type);
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>๊บพ์ ์ ๊ทธ๋ํ</title>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script>
// ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ ํจ์๋ฅผ ํ์ํฉ๋๋ค.
<?php
echo $chart;
echo 'console.log('.json_encode($data).')';
?>
</script>
</head>
<body>
<!-- ์ฐจํธ๋ฅผ ํ์ ํ <div> ํ๊ทธ๋ฅผ ์ ๋นํ ์์น์ ๋ฐฐ์น -->
<div>
<?php echo $chart_div; ?>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="" />
<meta name="author" content="" />
<title>Dashboard - SB Admin</title>
<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" />
<link href="css/styles.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
</head>
<body class="sb-nav-fixed">
<nav class="sb-topnav navbar navbar-expand navbar-dark bg-dark">
<!-- Navbar Brand-->
<a class="navbar-brand ps-3"> ACO </a>
</nav>
<div>
<div>
<main>
<div class="container-fluid px-12">
<br>
<br>
<br>
<h5>๋ฏธ์ธ๋จผ์ง ๋ณํ๋ ์ธก์ </h5>
<div class="row">
<div class="col-12">
<?php
$jb_conn = mysqli_connect( 'localhost', 'aco_admin', '20184138', 'Sensor');
$jb_sql = "SELECT * FROM Sensor LIMIT 3;";
$jb_result = mysqli_query( $jb_conn, $jb_sql );
while( $jb_row = mysqli_fetch_array( $jb_result ) ) {
echo '<p>' . $jb_row[ 'id' ] . $jb_row[ 'dust_D' ] . $jb_row[ 'time' ] .'</p>';
}
?>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card mb-4">
<div class="card-header">
<i class="fas fa-chart-area me-1"></i>
๋ฏธ์ธ๋จผ์ง ๋ณํ๋ ๊ทธ๋ํ
</div>
<div class="card-body"><canvas id="myAreaChart" width="100%" height="40"></canvas></div>
</div>
</div>
</div>
</div>
</main>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
<script src="js/scripts.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
<script src="assets/demo/chart-area-demo.js"></script>
<script src="assets/demo/chart-bar-demo.js"></script>
<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" crossorigin="anonymous"></script>
<script src="js/datatables-simple-demo.js"></script>
</body>
</html>
'Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Django๋ฅผ ์ด์ฉํ์ฌ ์น ํ๋ซํผ ๋ง๋ค๊ธฐ (0) | 2023.05.31 |
---|---|
๊ณต๊ธฐ์ง ๋ชจ๋ํฐ๋ง ์์คํ (2) | 2023.05.19 |
Python ๊ธฐ๋ฐ์ ํ IoT ๊ตฌํ (2) | 2023.05.10 |