Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Sistem Rumah Pintar: Membuat Setup Raspberry Pi & MediaTek Linkit Biaya Rendah

Komponen dan Perlengkapan

Raspberry Pi 2 Model B 1
Xbee 1
Arduino UNO 1

Aplikasi dan Layanan Online

Microsoft Azure

Tentang Proyek Ini

Pendahuluan

Mari kita lihat apa yang kita butuhkan untuk menyiapkan sistem rumah pintar menggunakan MediaTek Linkit. Karena ada banyak ahli di sini untuk memandu Anda dalam pemasangan perangkat keras untuk membaca data sensor, saya akan berfokus pada pembuatan API dan penyiapan server lokal biaya ultra rendah $15 untuk menangkap semua data sensor Anda. Secara opsional, saya mencatat data ke Azure.

Setup

Sensor mengirim data mereka melalui sinyal radio menggunakan xbee atau transceiver biaya rendah lainnya ke MediaTek LinkIt. MediaTek linkIt menerima semua data sensor mentah, memaketkannya menjadi objek JSON menggunakan pustaka adruinojson dan membuat permintaan POST ke server lokal. Server lokal kemudian meng-host aplikasi web nodejs dan menerima semua data sensor sebagai objek JSON.

Server lokal digunakan sebagai pre-prosesor dan menambahkan waktu UTC dan tanda tangan. Validasi data, konversi, dan filtrasi dapat diproses di sini. Server lokal mencatat semua data ke layanan cloud dalam hal ini layanan penyimpanan Azure. Secara alternatif, MediaTek linkIt dapat langsung memposting objek JSON ke layanan penyimpanan Azure. Saya menyiapkan server lokal hanya untuk membuktikan bahwa PC $15 dapat cukup kuat untuk menangani data kami. Kami dapat mencatat data ke database no-sql apa pun bahkan di server lokal kami sepenuhnya menghilangkan kebutuhan penyimpanan cloud eksternal. Saya serahkan semuanya ini kepada Anda.

Demo

Prasyarat

Saya mengasumsikan Anda tahu cara membaca data sensor menggunakan sensor dan mikrokontroler seperti Arduino atau mediaTek. Untuk membatasi cakupan proyek ini, saya akan mengasumsikan bahwa data sensor tersedia untuk MediaTek Link It. Anda dapat menggunakan transceiver radio biaya rendah atau Xbee untuk mentransmisi dan menerima sinyal radio dari sensor yang ditempatkan pada mikrokontroler seperti MediaTek. Pemula dapat menggunakan starter kit groove MediaTek linkIt untuk membaca data lingkungan eksternal seperti suhu, kelembaban, cahaya, dll.

Json Json Json

Json telah menjadi standar de facto untuk IoT dan telah banyak diadopsi. Setelah mengatakan tentang prasyarat, mari kita mulai dengan memodelkan data sensor kami. Tujuan utamanya adalah untuk menangkap sebanyak mungkin data yang Anda miliki dan melewatkannya ke server. Server dapat melakukan semua pekerjaan pemrosesan berat seperti analitik, konversi data, pembelajaran mesin, dll.

Objek JSON 'yang diinginkan' akan menjadi keadaan yang diinginkan dari data sensor. Misalnya saat kita mencatat suhu, nilai yang diinginkan 24 berarti kita perlu menyinkronkan nilai ke cloud dengan nilai 24. Klien kami seperti aplikasi web atau aplikasi seluler akan diperbarui ke nilai ini.

Ketika kita ingin menyalakan lampu kita bilang, keadaan yang diinginkan adalah on. Ini berarti lampu menyala atau akan menyala. Semua aplikasi klien kami akan menggunakan keadaan ini untuk mencerminkan perubahan kepada pengguna. Maksud saya, ikon di aplikasi web kami akan menyala atau mati.

Ini bukan standar internasional, saya baru saja membuatnya. Jadi, silakan gunakan format yang Anda sukai sendiri.

MediaTek - Penerima

Silakan lihat file ino yang dilampirkan di bagian perangkat lunak untuk mencatat data ke server lokal. Data sensor disimulasikan, Anda dapat melewati pembacaan aktual ke objek JSON yang sesuai.

Server Lokal

Server lokal menambahkan overhead namun akan sangat berguna dalam banyak hal. Kita dapat menggunakan server lokal sebagai pre-prosesor untuk data IoT kita. Data dapat difilter, diberi stempel waktu dan ditandatangani.

PC kecil dan nodejs adalah pilihan yang sangat baik untuk server lokal. Kami dapat memilih PC kecil apa pun seperti raspberry pi, odriod, banana pi, beagle bone, dll. Saya memilih orange pi ($15) untuk proyek ini.

Setup

Raspberry pi 2 atau Orange Pi dengan variasi OS Linux apa pun yang mendukung nodejs 5. Saya memilih orange pi dengan arch linux untuk arm7. Instal nodejs dan npm. Unduh aplikasi IoT saya dari github dan navigasikan ke /your/local/path/iotapp dan jalankan npm install. Aplikasi expressjs dasar mulai mendengarkan pada port 3000 Anda.

Buka ke your-local-ip:3000 untuk memeriksa apakah tampilan default expressjs dirender. Saya telah membuat API ini untuk memposting data sensor:

Untuk menyiapkan server lokal. Kloning kode sumber iotapp dari github saya. Ubah index.js untuk menempatkan alamat IP cloud atau nama domain Anda di mana aplikasi aspnet5 dihosting di Azure.

Server Jarak Jauh

Penerbitan data ke cloud telah menjadi populer saat ini. Kami dapat membeli langganan dari penyedia data IoT seperti amazon, azure, spark fun, pubnub, initial state dan banyak lagi. Saya memilih Azure untuk demo ini. Analitik data, penambangan data dan algoritma pembelajaran mesin dapat dikembangkan untuk memproses data kami.

Unduh iotwebapp dari github saya. Saya membuatnya menggunakan visual studio 2015 yang menargetkan asp.net5. API ini telah ditetapkan untuk memposting data IoT. API mencatat IoT di tabel penyimpanan Azure.

Parameter deviceid dapat diatur untuk mengidentifikasi lokasi sensor.

API ini telah ditetapkan:

Untuk menyiapkan server jarak jauh. Kloning kode sumber iotwebapp dari github saya. Buat tabel penyimpanan Azure. Ubah IoTController.cs dan masukkan nama akun dan kunci tabel penyimpanan Azure Anda. Gunakan nama domain atau IP ini di server lokal.

Kesimpulan

Ada banyak area yang perlu difaktorkan ulang dalam kode. Silakan modifikasi dan beri tahu saya jika Anda mengalami kendala.

Kode

MediaTekRx
/* Web client Sketch ini terhubung ke situs web menggunakan fungsi Wi-Fi pada platform MediaTek LinkIt. Ubah makro WIFI_AP, WIFI_PASSWORD, WIFI_AUTH dan SITE_URL sesuai. dibuat 13 Juli 2010 oleh dlf (Metodo2 srl) dimodifikasi 31 Mei 2012 oleh Tom Igoe dimodifikasi 20 Agu 2014 oleh MediaTek Inc. */ #include <LTask.h> #include <LWiFi.h> #include <LWiFiClient.h> #include <ArduinoJson.h> #define WIFI_AP "your ap" #define WIFI_PASSWORD "your password" #define WIFI_AUTH LWIFI_WPA // pilih dari LWIFI_OPEN, LWIFI_WPA, atau LWIFI_WEP. #define SITE_URL "your ip" // alamat IP atau nama domain nodejs atau Azure Anda LWiFiClient c; void setup() { LWiFi.begin(); Serial.begin(115200); // coba terus sampai terhubung ke AP Serial.println("Connecting to AP"); while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD))) { delay(1000); } // coba terus sampai terhubung ke situs web Serial.println("Connecting to WebSite"); while (0 == c.connect(SITE_URL, 3000)) { Serial.println("Re-Connecting to WebSite"); delay(1000); } } boolean disconnectedMsg = false; void loop() { // Pastikan kita terhubung, dan buang konten respons ke Serial while (!c) { Serial.println(" Server disconnected.."); // coba terus sampai terhubung ke situs web Serial.println("Connecting to WebSite"); while (0 == c.connect(SITE_URL, 3000)) { Serial.println("Re-Connecting to WebSite"); delay(1000); } } Serial.println(" Reading temperature.."); updateTemperature(); delay(3000); Serial.println("Detecting sound.."); updateSound(); delay(3000); Serial.println("Detecting person movement.."); updatePIR(); delay(3000); Serial.println("Detecting obstacle.."); updateDistance(); delay(3000); Serial.println("Updating device location.."); updateGPSTracker(); delay(3000); Serial.println("Calculating soil moisture.."); updateMoisture(); delay(3000); Serial.println("Detecting gas leakage.."); updateGasLeak(); delay(3000); Serial.println("Recording light intensity.."); updateLightIntensity(); delay(3000); updateLivingroomAttributes(); delay(3000); updateBedroomAttributes(); delay(3000); } void writeToConsole() { // Pastikan kita terhubung, dan buang konten respons ke Serial while (c) { int v = c.read(); if (v != -1) { Serial.print((char)v); } } Serial.println(); Serial.println(" Server disconnected.."); // coba terus sampai terhubung ke situs web Serial.println("Connecting to WebSite"); while (0 == c.connect(SITE_URL, 3000)) { Serial.println("Re-Connecting to WebSite"); delay(1000); } } void updatePIR() { long unsigned int s; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); root["deviceid"] = "/iot/myhome/livingroom/pir"; //asumsikan satuan default ms desired["motionstart"] = String(random(0,1000)); desired["motionend"]= String(random(1000,10000)); String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom/pir HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); //logika untuk mendeteksi respons server lambat dan memposting permintaan lagi tanpa menunggu respons mati s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateDistance() { long unsigned int s; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); root["deviceid"] = "/iot/myhome/livingroom/distancesensor"; //asumsikan satuan default cm desired["obstacle"]=String(random(50,450)); String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom/distance HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateGPSTracker() { long unsigned int s; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); root["deviceid"] = "/iot/mydevice"; desired["lat"] =String(random(20,25)); desired["long"]=String(random(22,27)); String len = String(root.measureLength()); c.println("POST /iot/mydevice/location HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateMoisture() { long unsigned int s; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); root["deviceid"] = "/iot/myhome/garden/moisture"; //asumsikan satuan default desired["moisture"] = String(random(40,60)); String len = String(root.measureLength()); c.println("POST /iot/myhome/garden/moisture HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateGasLeak() { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); desired["leak"] = "no"; root["deviceid"] = "/iot/myhome/kitchen/gas"; long unsigned int s; String len = String(root.measureLength()); c.println("POST /iot/myhome/kitchen/gas HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateLightIntensity() { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); desired["intensity"] = "80"; root["deviceid"] = "/iot/myhome/livingroom/light"; long unsigned int s; String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom/light HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateLivingroomAttributes() { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); root["deviceid"] = "/iot/myhome/livingroom"; JsonObject& desired = root.createNestedObject("desired"); //API alternatif untuk mencatat atribut ruang tamu sekaligus desired["window"] = "open"; desired["door"] = "closed"; desired["ac"] = "off"; desired["temperature"] = String(random(24,28)); desired["humidity"] = String(random(60,65)); long unsigned int s; String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateBedroomAttributes() { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); root["deviceid"] = "/iot/myhome/bedroom"; JsonObject& desired = root.createNestedObject("desired"); //API alternatif untuk mencatat atribut kamar tidur sekaligus desired["window"] = "open"; desired["door"] = "closed"; desired["ac"] = "off"; desired["temperature"] = String(random(22,23)); desired["humidity"] = String(random(75,80)); long unsigned int s; String len = String(root.measureLength()); c.println("POST /iot/myhome/bedroom HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateSound() { long unsigned int s; long unsigned int e; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); desired["intensity"] = String(random(40,80)); root["deviceid"] = "/iot/myhome/livingroom/mic"; root["timeutc"] = ""; root["signedby"]=""; String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom/mic HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateTemperature() { long unsigned int s; long unsigned int e; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); desired["temperature"] = String(random(20,40)); desired["humidity"]= String(random(60,80)); root["deviceid"] = "/iot/myhome/livingroom/thermostat"; root["timeutc"] = ""; root["signedby"]=""; String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom/thermostat HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } 
nodejs - server lokal
var express = require('express'); var router = express.Router(); var buf = require('buffer'); var request = require("request"); //ganti your-ip-or-domain-name dengan alamat IP atau nama domain sebenarnya Anda //contoh iot.azurewebsites.com //contoh yourdomainname.com //contoh 47.12.67.16 // terima permintaan POST di halaman utama router.post('/iot/myhome/livingroom/thermostat', function (req, res) { var state = req.body; state.timeutc = new Date(); state.signedby = "orangepi"; console.log(state); var options = { method: 'POST', url: 'https://your-ip-or-domain-name/api/iot/myhome/livingroom/thermostat', headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' }, body:state, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); }); res.send('Living room temperature recorded'); }); // terima permintaan POST mikrofon router.post('/iot/myhome/livingroom/mic', function (req, res) { var state = req.body; state.timeutc = new Date(); state.signedby = "orangepi"; console.log(state); var options = { method: 'POST', url: 'https://your-ip-or-domain-name/api/iot/myhome/livingroom/microphone', headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' }, body:state, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); }); res.send('Living room sound intensity recorded'); }); // terima permintaan POST PIR router.post('/iot/myhome/livingroom/pir', function (req, res) { var state = req.body; state.timeutc = new Date(); state.signedby = "orangepi"; console.log(state); var options = { method: 'POST', url: 'https://your-ip-or-domain-name/api/iot/myhome/livingroom/pir', headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' }, body:state, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); }); res.send('Living room pir movement recorded'); }); // terima permintaan POST jarak router.post('/iot/myhome/livingroom/distance', function (req, res) { var state = req.body; state.timeutc = new Date(); state.signedby = "orangepi"; console.log(state); var options = { method: 'POST', url: 'https://your-ip-or-domain-name/api/iot/myhome/livingroom/distance', headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' }, body:state, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); }); res.send('Living room obstacle recorded'); }); // terima permintaan POST GPS router.post('/iot/mydevice/location', function (req, res) { var state = req.body; state.timeutc = new Date(); state.signedby = "orangepi"; console.log(state); var options = { method: 'POST', url: 'https://your-ip-or-domain-name/api/iot/mydevice/location/gps', headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' }, body:state, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); }); res.send('device location recorded'); }); // terima permintaan POST kelembaban tanah router.post('/iot/myhome/garden/moisture', function (req, res) { var state = req.body; state.timeutc = new Date(); state.signedby = "orangepi"; console.log(state); var options = { method: 'POST', url: 'https://your-ip-or-domain-name/api/iot/myhome/garden/moisture', headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' }, body:state, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); }); res.send('Garden moisture level recorded'); }); // terima permintaan POST gas router.post('/iot/myhome/kitchen/gas', function (req, res) { var state = req.body; state.timeutc = new Date(); state.signedby = "orangepi"; console.log(state); var options = { method: 'POST', url: 'https://your-ip-or-domain-name/api/iot/myhome/kitchen/gas', headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' }, body:state, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); }); res.send('Gas leak information recorded'); }); // terima permintaan POST cahaya router.post('/iot/myhome/livingroom/light', function (req, res) { var state = req.body; state.timeutc = new Date(); state.signedby = "orangepi"; console.log(state); var options = { method: 'POST', url: 'https://your-ip-or-domain-name/api/iot/myhome/livingroom/light', headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' }, body:state, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); }); res.send('Light intensity recorded'); }); // terima permintaan POST ruang tamu router.post('/iot/myhome/livingroom', function (req, res) { var state = req.body; state.timeutc = new Date(); state.signedby = "orangepi"; console.log(state); var options = { method: 'POST', url: 'https://your-ip-or-domain-name/api/iot/myhome/room/livingroom', headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' }, body:state, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); }); res.send('Livingroom attributes recorded'); }); // terima permintaan POST kamar tidur router.post('/iot/myhome/bedroom', function (req, res) { var state = req.body; state.timeutc = new Date(); state.signedby = "orangepi"; console.log(state); var options = { method: 'POST', url: 'https://your-ip-or-domain-name/api/iot/myhome/room/bedroom', headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' }, body:state, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); }); res.send('Bedroom attributes recorded'); }); // terima permintaan PUT di /user router.put('/user', function (req, res) { res.send('Got a PUT request at /user'); }); // terima permintaan DELETE di /user //router.delete('/user', function (req, res) { // res.send('Got a DELETE request at /user'); //}); /* GET halaman utama. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); module.exports = router; 

Skematis

Mentransmisikan sinyal radio dari arduinoSistem Rumah Pintar: Membuat Setup Raspberry Pi & MediaTek Linkit Biaya RendahMentransmisikan sinyal radio melalui Xbee dari arduino tanpa shieldSistem Rumah Pintar: Membuat Setup Raspberry Pi & MediaTek Linkit Biaya RendahMentransmisikan sinyal radio dari arduinoSistem Rumah Pintar: Membuat Setup Raspberry Pi & MediaTek Linkit Biaya Rendah

Proses manufaktur

  1. Data Cerdas: Menavigasi Perintis Baru IoT dan Big Data
  2. Membangun Kontroler Rumah Cerdas 433 MHz dengan Sensorflare dan Raspberry Pi
  3. Bangun Sistem Otomatisasi Rumah Berbasis Raspberry Pi untuk Kontrol Jarak Jauh
  4. Bartender Cerdas: Bangun Stasiun Koktail Berbasis Raspberry Pi Sendiri
  5. Rumah Sakit Cerdas Masa Depan: Peran Krusial Perangkat Lunak Cerdas
  6. Menyelesaikan Kesenjakan Keterampilan Rumah Cerdas: Mengapa Inggris Ketinggalan dari Eropa
  7. Bagaimana Interkonektivitas Mendorong Efisiensi, Keselamatan, dan Berkelanjutan di Tempat Kerja Modern
  8. Evolusi Rumah Pintar: Apa yang Diholdi Masa Depan untuk Hidup Terkoneksi
  9. Pabrik Cerdas: Dari Visi ke Kenyataan—Mengapa Sebagian Besar Bisnis Inggris Masih Melewatkan Sasaran
  10. Konektivitas Rumah Pintar: 3 Langkah Teruji untuk Mengatasi Hambatan Utama