Categories
DIY

RasPiESP+C

Уже довольно длительное время работает Wi-Fi включалка света (она же выключалка). Так как она сама по себе – это довольно скучно и банально, но вот если туда прикрутить дополнительные датчики, то жить становится лучше, жить становится веселей.

Маразм крепчал, а кони дико ржали.

Народная мудрость

Да что уж там. Важней всего – погода в доме.

 

Уже довольно длительное время работает Wi-Fi включалка света (она же выключалка). Так как она сама по себе – это довольно скучно и банально, но вот если туда прикрутить дополнительные датчики, то жить становится лучше, жить становится веселей.

В силу того, что компоненты наличиствовали компоненты, по некоторому магическому стечению обстоятельств, реализация не заняла много времени.

Что нужно для тех, кто хочет собирать статистику по Погоде в доме, для дальнейшей адаптации к своим задачам. Да, собственно, ничего.

  1. ESP8266 – подкупили CloudWitty тем, что не нужно ничего паять, но тут все уже зависит от вашего желания.
  2. OMRON . Они бесшумные, но работают только либо для переменного того, либо же только для постоянного. Почему именно они? Они работают от 3.3 Вольта, но, эмпирическим путем было установлено, что механические релюхи тоже срабатывают, хотя они и должны работать от 5 Вольт. Ну, в общем, на вашей усмотрение.
  3. Температурные датчики. Тут вариантов множество. Дорого, не очень дорого, ну и т.д. Общий перечень:
    1. DHT11, DHT22 – Классика. Датчики влажности и температуры, первый брешет больше чем второй, вот и все разница.
    2. BMP180 – Датчик температуры и давления. Хороший и удобный.
    3. DS18B20  – Прекрасный температурный датчик на шнурке. Очень себе подойдет для использования за окном.
  4. RaspberryPi. Вместо него можно использовать и компьютер, или же что-то еще. Но подкупает он возможностью того, что и на него можно датчиков прикрепить. В нашем случае будет использоваться как веб и DB сервер. Apache + MySQL.

 Принципиальная схема нарисована выше. Теперь словами, как это все работает, и возможные варианты развития.

 ESP с датчиками цепляются по WiFi. Данные забираются с помощью http запросов. Думаю, что правильный подход будет использовать MQTT протокола, ну или подобных протоколов, ориентированных на IoT устройства. Очевидно, что это сделает всю систему безопаснее, ну, и, пожалуй, надежнее.

Серверная часть дергает php скрипт, который забирает данные с датчиков и пишет их в БД. Скрипт выполняется по расписанию.

Клиентская морда состоит из html шаблона с JS, который, в свою очередь читает данные о температуре и влажности из БД, ну и включает и выключает свет, аналогичным методом.

Собственно,  вот как это должно работать:

  1. C код для ESP. С инструкцией, как это можно запустить.
ESP
  1. PHP код для подключения к БД.
<?php 
$servername = "config.ini"; 
$username = "config.ini"; 
$password = "config.ini"; 
$dbname = "config.ini";  
$tbad = exec('sudo ..temperature.py'); 
$hbad = exec('sudo ..humidity.py');  
$corridortemp = file_get_contents('http://192.168.0.182/temp'); 
$tcor = preg_replace( '/[^0-9]/', '', $corridortemp );  
$corridorhum = file_get_contents('http://192.168.0.182/humidity'); 
$hcor = preg_replace( '/[^0-9]/', '', $corridorhum );  
$kitchentemp = file_get_contents('http://192.168.0.180/temp'); 
$tkit = preg_replace( '/[^0-9]/', '', $kitchentemp );  
$kitchenhum = file_get_contents('http://192.168.0.180/temp'); 
$hkit = preg_replace( '/[^0-9]/', '', $kitchenhum );  
$livingroomtemp = file_get_contents('http://192.168.0.181/temp'); 
$tliv = preg_replace( '/[^0-9]/', '', $livingroomtemp );  
$livingroomhum = file_get_contents('http://192.168.0.181/temp'); 
$hliv = preg_replace( '/[^0-9]/', '', $livingroomhum );  

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 

// Check connection 
if ($conn->connect_error) 

{     die("Connection failed: " . $conn->connect_error); }  

$sql = "INSERT INTO SensorsTemp (CorridorTemp, KitchenTemp, BedroomTemp, LivingRoomTemp, CorridorHum, KitchenHum, BedroomHum, LivingRoomHum  ) VALUES ($tcor, $tkit, $tbad, $tliv, $hcor, $hkit, $hbad, $hliv)";  

if ($conn->query($sql) === TRUE) {     echo "New record created successfully"; } else {     echo "Error: " . $sql . "<br>" . $conn->error; }  $conn->close(); 

?>
  1. Веб-интерфейс
	<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script>
	<script type = "text/javascript">
		function PowerButton (url) {
					$.ajax( { type : 'POST',
          			data : { },
          			url  : url,              
          			success: function ( ) {
 		          },
         		 error: function ( xhr ) {
            alert( "error" );
          }
        });
}
    </script>
	
	</head>
	<body onload="startTime()">
			<div id="page-wrapper">

			<div id="wrapper">
					<section class="panel banner left">
						
					<div class="content color1 span-3-75">
					<h1 class="major"><b></b>
					<div id="txt"></div>
					<br>
	<head>
					<style>
				table, th, td {
				    border-collapse: collapse;
				text-align: center;
						}
				th, td {
				    padding: 0px;
					}
				tr {
				    text-align: center;
				}
							
				</style>
				</head>
				<table style="width:100%">
				<tr>
				<ul class="actions">
				<form method="get" action="scripts/lightenable.php">
					<th><h3>Bedroom</h3><br></th>
					 <th>
					 <input type="submit" value="ON" name="on">
					 <input type="submit" value="OFF" name="off"></th>
				</form>
				<th>
					<script type="text/javascript">
					jQuery(document).ready(function(){
					setInterval("jQuery('#timeC').load('# span#timeD');",10000);
					});
					</script>
					<span id="timeC"><span id="timeD">
				 <?php
			    $config = parse_ini_file('../config.ini'); 
				$conn = new mysqli($config['servername'],$config['username'],$config['password'],$config['dbname']);
			if ($conn->connect_error) {
				die("Connection failed: " . $conn->connect_error);
						}
									
		$sql = "SELECT * FROM `SensorsTemp` ORDER BY Time DESC LIMIT 1 ";
		$result = $conn->query($sql);
										
		if ($result->num_rows > 0) {
				while($row = $result->fetch_assoc()) {
				echo "Temperature: " . $row["BedroomTemp"]. " C", "<br>". "Humidity: " . $row["BedroomHum"]. " %", "<br>";
					}
					} else {
				echo "0 results";
					}
				$conn->close();
				 ?> 
		</span></span>
		</th>
		</tr>
		<tr>
		<th>
		<h3>Kitchen</h3><br></th>
		 <th>
    		<button onclick="PowerButton('http://192.168.0.180/?stat=1')">ON</button>
    		<button onclick="PowerButton('http://192.168.0.180/?stat=0')">OFF</button>
		 </th>
		</form>
		<th>
		<script type="text/javascript">
			jQuery(document).ready(function(){
			setInterval("jQuery('#timeE').load('# span#timeF');",10000);
			});
		</script>
		<span id="timeE"><span id="timeF">
		<?php
		$config = parse_ini_file('../config.ini'); 
                            $conn = new mysqli($config['servername'],$config['username'],$config['password'],$config['dbname']);
				if ($conn->connect_error) {
				die("Connection failed: " . $conn->connect_error);
				}
													
		$sql = "SELECT * FROM `SensorsTemp` ORDER BY Time DESC LIMIT 1 ";
		$result = $conn->query($sql);
										
		if ($result->num_rows > 0) {
		while($row = $result->fetch_assoc()) {
		echo "Temperature: " . $row["KitchenTemp"]. " C", "<br>", "Humidity: " . $row["KitchenHum"]. " %", "<br>";
				}
			} else {
			echo "0 results";
			}
			$conn->close();
		?>
		</span></span>		
		</th>
		</tr>
		<tr>
											
		<th><h3>Living Room</h3><br></th>
		<th>
    			<button onclick="PowerButton('http://192.168.0.181/?stat=1')">ON</button>
    			<button onclick="PowerButton('http://192.168.0.181/?stat=0')">OFF</button>
		</th>
		</form>
																						<th>
		<script type="text/javascript">
		jQuery(document).ready(function(){
		setInterval("jQuery('#time1').load('# span#time2');",10000);
		});
		</script>
		<span id="time1"><span id="time2">
		<?php
		 $config = parse_ini_file('../config.ini'); 
		$conn = new mysqli($config['servername'],$config['username'],$config['password'],$config['dbname']);
		if ($conn->connect_error) {
			die("Connection failed: " . $conn->connect_error);
		}
													
		$sql = "SELECT * FROM `SensorsTemp` ORDER BY Time DESC LIMIT 1 ";
			$result = $conn->query($sql);
                            if ($result->num_rows > 0) {
		while($row = $result->fetch_assoc()) {
		echo "Temperature: " . $row["LivingRoomTemp"]. " C", "<br>". "Humidity: " . $row["LivingRoomHum"]. " %", "<br>";
		}
			} else {
			echo "0 results";
			}
		$conn->close();
		?>
		</span></span>		
		</th>
		</th>
		</tr>
		<tr>
		<th><h3>Corridor</h3><br></th>
		<th>
    		<button onclick="PowerButton('http://192.168.0.182/?stat=1')">ON</button>
    		<button onclick="PowerButton('http://192.168.0.182/?stat=0')">OFF</button>
			</th>
			</form>
			<th>
			<script type="text/javascript">
					jQuery(document).ready(function(){
					setInterval("jQuery('#timeA').load('# span#timeB');",10000);
					});
					</script>
					<span id="timeA"><span id="timeB">
						<?php
						$config = parse_ini_file('../config.ini'); 
						$conn = new mysqli($config['servername'],$config['username'],$config['password'],$config['dbname']);
							if ($conn->connect_error) {
							die("Connection failed: " . $conn->connect_error);
							}
						$sql = "SELECT * FROM `SensorsTemp` ORDER BY Time DESC LIMIT 1 ";
						$result = $conn->query($sql);
						
	                                                                                       if ($result->num_rows > 0) {
					while($row = $result->fetch_assoc()) {
			echo "Temperature: ", "<b>" . $row["CorridorTemp"]. " C", "</b>", "<br>". "Humidity: ", "<b>" . $row["CorridorHum"]. " %", "</b>", "<br>";
					}
					} else {
					echo "0 results";
					}
						$conn->close();
						?>
			</span></span>	

Ну вот как-то так оно и работает.

By khabradmin

Зачем это здесь? Почему это здесь? Кто это читает? Автор этого бложека задает себе те же самые вопросы. Ответ прост: потому что. В силу того, что khabradmin причастен к IT, домен пародирует habr.ru. В силу того, что автор много фотографирует, контент совершенно иного свойства. Суть писанины в том, что хочется писать. А вот писать в соц. сетях утомительно и глупо, поэтому комментариев тут нет. Приятного чтения, если получится

One reply on “RasPiESP+C”

Leave a Reply

Your email address will not be published. Required fields are marked *