Rumah cepat rumah pintar

Kami terus berbagi solusi berdasarkan modul Master Kit :
“Sebagai percobaan, saya memutuskan di sini untuk mencoba membuat semacam“ rumah pintar ”dengan cepat dan dengan biaya minimal. Ada banyak pelaku bisnis perhotelan: cahaya, ventilasi, jendela, air, dan kontrol IR untuk peralatan listrik. Pada awalnya, saya memutuskan untuk membatasi diri pada tugas minimum: ventilasi dan pencahayaan di dalam ruangan.



Sistem ini didasarkan pada Arduino Uno, dengan kemampuan untuk mengontrol empat pin secara terpisah satu sama lain, dan beberapa modul kontrol nirkabel dari Master Kit: single-channel dan dua-channel MP3328 dan relay MP3330 mengambil peran sebagai perangkat eksekutif , dan sinyal ditransmisikan kepada mereka menggunakan pemancar delapan saluran. MP3329 pada frekuensi 433 MHz.





Pada MP3330 saya menutup kontrol dua strip LED di atas sofa, - lampu latar yang nyaman untuk membaca malam hari, - dan pada MP3328 - kontrol mesin servo untuk membuka / menutup jendela.

Saya membangun struktur penggerak dari bahan improvisasi, yaitu, dari bagian-bagian perancang LEGO.



Yah, dan, tentu saja, kontrol radio sederhana tidak cukup bagi saya: Saya membutuhkan akses ke seluruh sistem melalui antarmuka web dan pemantauan status waktu-nyata.

Sebagai sumber daya penyimpanan, saya mengambil MySQL standar, di mana saya membuat tabel dengan pengidentifikasi pengendali, pin dan nilai status masing-masing, untuk tujuan keamanan, mengikat pengidentifikasi sistem umum untuk masing-masing. Juga, saya memasang kabel kemampuan untuk mengatur timer tetap untuk mengubah keadaan, dan bidang juga disediakan untuk ini.



Ketika bekerja dengan soket web, Arduino agak buggy, dan tidak ada waktu untuk mencari tahu alasannya, oleh karena itu, saya membuat sketsa dengan cara sederhana: dengan permintaan ajax setiap 100ms. Ini, tentu saja, adalah bencana bagi lalu lintas (hampir 30MB per hari), tetapi untuk apartemen dengan internet tanpa batas untuk pertama kalinya, itu sudah cukup.

Antarmuka web paling sederhana: 4 tombol, satu untuk setiap pin. Satu tekan mengubah status, dan tekan lama mengatur timer (saya punya 3 menit sejauh ini) untuk mengubahnya.



Akibatnya, versi logik yang disederhanakan adalah sebagai berikut:

Antarmuka web mengakses server dan memeriksa status pengontrol, setelah itu menampilkan antarmuka untuk bekerja dengan sistem: 4 tombol dalam keadaan yang sesuai:

Skrip
$.ajax({
			url: 'engine/ajax.php',
			type: 'POST',
			dataType: 'json',
			data: {action: 'getStates'},
		})
		.done(function(data) {
			for (key in data.success){
				var controller = data.success[key];
				if($('.btn#btn_' + controller.id).length === 0){
					html = '';
					html += '<div ';
					if (controller.timer_switch > 0){
						var seconds = 60  - (controller.timer_switch % 60)
						html += 'seconds="' + seconds + '"';
					}
					html += 'id="btn_' + controller.id + '" class="btn" state="' + controller.state + '"><div class="btn_timer"></div></div>';
					$('#btn_placer').append(html);
				} else {
					if (controller.state == 1){
						$('.btn#btn_' + controller.id).removeClass('btn_off').addClass('btn_on');
					} else if (controller.state == 0){
						$('.btn#btn_' + controller.id).removeClass('btn_on').addClass('btn_off');
					}
					if (controller.timer_switch > 0){
						var seconds = 60 - controller.timer_switch % 60;
						var minutes = Math.floor(controller.timer_switch / 60);
						$('.btn#btn_' + controller.id).addClass('seconds').css('background-position', (-seconds * 100) + 'px 0px').find('.btn_timer').text(minutes + 'M');
					} else {
						$('.btn#btn_' + controller.id).css('background-position', '0px 0px').removeClass('seconds').find('.btn_timer').text('');
					}
				}
			}
			setTimeout(function(){
				getStates();
			}, 1000);
		})
		.fail(function(data) {
			console.log('error');
		});



function getStates($sql){
	$result = $sql->query("SELECT * FROM `controllers` WHERE `home_id` = '1' ORDER BY `order`");
	if (isset($result->rows)){
		$result = $result->rows;
		foreach ($result as $key => $value) {
			if (strtotime($result[$key]['timer']) > -62169990000){
				// echo strtotime($result[$key]['timer']);
				$timer_switch = strtotime($result[$key]['timer']) - strtotime(date("Y-m-d H:i:s"));
				$result[$key]['timer_switch'] = $timer_switch;
				if ($timer_switch < 0){
					$sql->query("UPDATE `controllers` SET `state` = '".$result[$key]['timer_state']."', `timer` = '0000-00-00 00:00:00', `timer_state` = '' WHERE `id` = '".$result[$key]['id']."'");
				}
			}
		}
		$res['success'] = $result;
	} else {
		$res['error'] = ' ';
	}
	return $res;
}




Ketika tombol yang sesuai ditekan, permintaan POST dikirim ke file ajax.php:

Javascript
$(document).on('mousedown', '.btn', function(event){
			event.preventDefault();
			var id = parseInt($(this).attr('id').replace('btn_', ''));
			click_wait = false;
			mousetimer = setTimeout(function(){
				click_wait = true;
				setTimer(id);	
			}, 2000);
		});

		$(document).on('mouseup', '.btn', function(){
			clearTimeout(mousetimer);
			if (!click_wait){
				var id = parseInt($(this).attr('id').replace('btn_', ''));
				switchController(id);
				console.log('click !!!');
				click_wait = false;
			}
		});
	function switchController(id){
		var el = $('.btn#btn_' + id);
		var state = parseInt($(el).attr('state'));
		var need_state;
		if (state == 0){
			need_state = 1;
		} else if (state == 1){
			need_state = 0;
		}
		$(el).addClass('waiting');
		$.ajax({
			url: 'engine/ajax.php',
			type: 'POST',
			dataType: 'json',
			data: {action: 'setState', id: id, state: state, need_state: need_state},
		})
		.done(function(data) {
			if (data.success == 'ok'){
				$(el).attr('state', need_state);
				$(el).removeClass('waiting').removeClass('btn_on').removeClass('btn_off');
				if(need_state == 1){
					$(el).addClass('btn_on');
				} else if(need_state == 0){
					$(el).addClass('btn_off');
				}
			}
		})
		.fail(function(data) {
			console.log('error');
		});
	}
	function setTimer(id){
		var el = $('.btn#btn_' + id);
		var state = parseInt($(el).attr('state'));
		var need_state;
		if (state == 0){
			need_state = 1;
		} else if (state == 1){
			need_state = 0;
		}
		$(el).attr('seconds', 0);
		$(el).addClass('seconds');
		$.ajax({
			url: 'engine/ajax.php',
			type: 'POST',
			dataType: 'json',
			data: {action: 'setTimer', id: id, state: state, need_state: need_state},
		})
		.done(function(data) {
		})
		.fail(function(data) {
			console.log('error');
		});
	}




Dalam id variabel, kami melewati pengidentifikasi controller, dan dalam status variabel, nilai statusnya. Dalam file ajax.php, kami mendapatkan permintaan POST dan memasukkan data baru ke nilai rekaman id terkait.

Php
function setState($sql){
	$need_state = (int)$_POST['need_state'];
	$state = (int)$_POST['state'];
	$id = (int)$_POST['id'];

	$result = $sql->query("UPDATE `controllers` SET `state` = '".$need_state."', `timer` = '0000-00-00 00:00:00' WHERE `id` = '".$id."'");
	//   Arduino
	$result = $sql->query("SELECT `state` FROM `controllers` WHERE `id` = '".$id."'");
	if ($need_state == $result->row['state']){
		$res['success'] = 'ok';
	} else {
		$res['success'] = 'err';
	}
	return $res;
}

function setTimer($sql){
	$need_state = (int)$_POST['need_state'];
	$state = (int)$_POST['state'];
	$id = (int)$_POST['id'];

	$result = $sql->query("UPDATE `controllers` SET `timer` = NOW() + INTERVAL 3 MINUTE, `timer_state` = '".$need_state."' WHERE `id` = '".$id."'");
	//   Arduino
	$result = $sql->query("SELECT `state` FROM `controllers` WHERE `id` = '".$id."'");
	if ($need_state == $result->row['state']){
		$res['success'] = 'ok';
	} else {
		$res['success'] = 'err';
	}
	return $res;
}




Arduino, pada gilirannya, mengakses server web melalui Ethernet, memeriksa kunci sistem yang unik, nilai-nilai pengontrol, mem-parsing string yang diterima dan mengganti nilai pin.

Php
if (isset($_GET['key']) && $_GET['key'] !== ''){
		$key = $_GET['key'];
	} else {
		die;
	}
	
$key = $sql->escape($key);
	$result = $sql->query("SELECT * FROM `controllers` WHERE `home_id` = '1' AND `key` = '".$key."' ORDER BY `order`");
	foreach ($result->rows as $key => $value) {
		if ($value['id'] == '1'){
			if ($value['state'] == '1'){
				$ar .= 'Q';
			} else if ($value['state'] == '0') {
				$ar .= 'q';
			}
		}
		if ($value['id'] == '2'){
			if ($value['state'] == '1'){
				$ar .= 'W';
			} else if ($value['state'] == '0') {
				$ar .= 'w';
			}
		}
		if ($value['id'] == '3'){
			if ($value['state'] == '1'){
				$ar .= 'E';
			} else if ($value['state'] == '0') {
				$ar .= 'e';
			}
		}
	}




Setelah itu, garis bentuk "% qUerTY" ditransfer ke sketsa di mana ia diuraikan, tergantung pada aturan kabel: setiap huruf sesuai dengan nomor pinnya, dan register bertanggung jawab untuk nilai akhir: modal - 1, huruf kecil - 0.

Arduino
void readData(){
  if (led_connect){
    digitalWrite(6, HIGH);
  } else {
    digitalWrite(6, LOW);
  }
  digitalWrite(4, LOW);
  previousMillis = currentMillis;
  
  led_connect = !led_connect;
    while (client.available()){      
      switch (char c = client.read()) {
        case 'Q':
          digitalWrite(9, HIGH);
          break;
        case 'q':
          digitalWrite(9, LOW);
          break;
        case 'W':
          digitalWrite(8, HIGH);
          break;
        case 'w':
          digitalWrite(8, LOW);
          break;
        case 'E':
          digitalWrite(7, HIGH);
          myservo.write(0);
          break;
        case 'e':
          digitalWrite(7, LOW);
          myservo.write(180);
          break;
      }
    }
}



Anda dapat mentransfer nilai dari 0 hingga 180 (derajat rotasi) ke pin yang bertanggung jawab untuk mesin servo, dan, katakanlah, ke dimmer - hingga 255. Saya masih memiliki dua nilai: 0 atau 1.





Tidak ada masalah menghubungkan modul: keduanya relay dipasangkan dengan pemancar satu kali, tanpa perlu mengikat kembali, dan melakukan tugasnya dengan sempurna.





Tetapi dengan kekuatan mesin servo, saya salah perhitungan sedikit: saya mengambil 6 kg, - yang, secara umum, cukup untuk menutupi dan melepaskan selempang jendela, yang dibuka dengan beratnya sendiri - tetapi lebih baik untuk mengambil sesuatu yang lebih kuat, di kasus angin kencang atau angin kencang.

Secara umum, ruang lingkup kreativitas tidak terbatas: misalnya, Anda dapat menghubungkan sensor, misalnya, CO2 atau suhu, dan membuka / menutup jendela ketika indikator tertentu tercapai.
Yah, tentu saja, saya berencana untuk menulis ulang seluruh sistem di soket web, membuat permintaan lebih mudah - dan membuat transfer dan penguraian nilai parameter lebih fleksibel.

Sketsa untuk arduino

Video kecil

Kerja backlight


Pembukaan jendela


Dmitry Kuznetsov "

Source: https://habr.com/ru/post/id383679/


All Articles