使用raspberry樹莓派搭配homebridge接上你的ios homekit功能

2014年Apple在推出IOS8時就推了HomeKit(家庭)這個服務,簡單來說就是用ios/ipad搭配siri就可以操作物聯網。
不過要通過HomeKit認證需要費用,幸好後來有了Homebridge這個介接的服務,而Homebridge的技術是使用javascript/node.js達成。
於是在樹莓派上建置node.js環境,並安裝homebridge後,再搭配樹莓派的GPIO就可以做到跟手機整合的物聯網了。

相關資源:
2014 WWDC homekit介紹 https://developer.apple.com/videos/play/wwdc2014/213/
結合樹莓派的自動澆水系統 https://www.sharpoblunto.com/News/2016/01/31/it-gets-the-hose-again
樹莓派與homebridge的結合教學 https://github.com/nfarina/homebridge/wiki/Running-HomeBridge-on-a-Raspberry-Pi
打造Raspberry Pi 無線坦克車(PiTank) https://dotblogs.com.tw/bowwowxx/2015/06/10/151535
Node.js控制树莓派GPIO https://eliyar.biz/nodejs-raspberry-gpio/
樹莓派.使用Node.js控制GPIO https://hk.saowen.com/a/3bf3756deb7956495899f21631873f67ac9bdde4697effac203b0ff60a278aba
Blynk 物聯網平台: How to install Node.js library on Linux(control LED) http://agile.myds.me/2017/10/12/blynk-%E7%89%A9%E8%81%AF%E7%B6%B2%E5%B9%B3%E5%8F%B0%EF%BC%9A-install-node-js-library-linux%EF%BC%88control-led%EF%BC%89/
只管出一張嘴:用 Siri 控制家裡的老家電 http://benjenq.pixnet.net/blog/post/45202620-%E5%8F%AA%E7%AE%A1%E5%87%BA%E4%B8%80%E5%BC%B5%E5%98%B4%EF%BC%9A%E7%94%A8-siri-%E6%8E%A7%E5%88%B6%E5%AE%B6%E8%A3%A1%E7%9A%84%E8%80%81%E5%AE%B6%E9%9B%BB
Raspberry Pi 的應用 – Siri + HomeKit 讓我們的家電變自動也更智慧 http://blog.itist.tw/2017/11/how-to-building-apple-smart-home-solution-by-homebridge-on-raspberry-pi.html
玩转树莓派第一弹:HomeBridge控制LED灯 http://blog.mindcont.com/2018/01/03/raspberrypi-homebridge/

軟協的物聯網使用者介面設計工作坊心得

今天參加了一場由工業局主辦,中華民國資訊軟體協會協辦的「物聯網使用者介面設計工作坊」。

真的不失千里迢迢從台中殺到台北去,林久翔教授在第一節以較學術性的方式來探討UX的方法/原理/學說後,第二節就由他的學生陳宏仁博士,以實例的方式讓大家分組透過紙上雛型,再利用POP這個APP做成雛型後分組做優使性測試報告。

整堂課下來收穫很多,也覺得自己真的老了!旁邊都是還不到三十歲的PM或是新創團隊的年輕美眉/小伙子~

Arduino自動灌溉系統

作用: 一般的灑水系統是時間自動到時灑水,但與實際狀況不符。可以利用土壤溼度計偵測土壤的溼度再予以灌溉。
材料: Arduino *1 、麵包版*1、16*2 LCD*1 、土壤溼度計*1、溫溼度計*1、繼電器*1、太陽能電子板*1、抽水馬達*1
程式:
#include
#include
#define dht_dpin A1 // 溫濕度資料腳位
LiquidCrystal_I2C lcd(0x27, 16, 2); // 顯示器
byte bGlobalErr;
byte dht_dat[5];
int relay = 10; //繼電器腳位為10

void setup() {
InitDHT();
delay(300);
lcd.begin();
lcd.backlight();
lcd.print(“Lin Shou Shan”);
pinMode(relay,OUTPUT); //定義繼電器腳位10為輸出
}

void loop() {
ReadDHT();
lcd.clear();
switch (bGlobalErr){
case 0:
String TT,HH;
HH = String(dht_dat[0])+’.’+String(dht_dat[1]);
TT = String(dht_dat[2])+’.’+String(dht_dat[3]);
lcd.setCursor(0, 0);
lcd.print(“H:”+HH+” T:”+TT); // 第一行顯示空氣溼度/溫度
}
lcd.setCursor(0, 1);
int aa;
aa = analogRead(0);
lcd.print(“Value:”+String(analogRead(0))); // 第二行顯示土壤溼度值
if (aa < 300){ // 濕度小於範圍就啟動澆水 autowatering(); } delay(10000); // 10秒執行一次 } void autowatering(){ digitalWrite(relay,HIGH); //開啟馬達 delay(5000); // 抽水三秒 digitalWrite(relay,LOW); //關閉繼電器 delay(1000); } void InitDHT(){ // 初始化溫溼度計 pinMode(dht_dpin,OUTPUT); digitalWrite(dht_dpin,HIGH); } void ReadDHT(){ bGlobalErr=0; byte dht_in; byte i; digitalWrite(dht_dpin,LOW); delay(20); digitalWrite(dht_dpin,HIGH); delayMicroseconds(40); pinMode(dht_dpin,INPUT); dht_in=digitalRead(dht_dpin); if(dht_in){ bGlobalErr=1; return; } delayMicroseconds(80); dht_in=digitalRead(dht_dpin); if(!dht_in){ bGlobalErr=2; return; } delayMicroseconds(80); for (i=0; i<5; i++) dht_dat[i] = read_dht_dat(); pinMode(dht_dpin,OUTPUT); digitalWrite(dht_dpin,HIGH); byte dht_check_sum = dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3]; if(dht_dat[4]!= dht_check_sum) {bGlobalErr=3;} }; byte read_dht_dat(){ byte i = 0; byte result=0; for(i=0; i< 8; i++){ while(digitalRead(dht_dpin)==LOW); delayMicroseconds(30); if (digitalRead(dht_dpin)==HIGH) result |=(1<<(7-i)); while (digitalRead(dht_dpin)==HIGH); } return result; }

Delphi 10 Seattle隆重登場

很久沒更新近況了!最近Embarcadero出了Delphi 10 Seattle,主要是針對行動裝置/PC以及IOT物聯網。

到時候再來分享一下

1442335478407

另一件事在設計電子發票,當然圖片中少了CODE39的條碼啦XDD

11205488_10152975552941541_8585917734032493888_n

Arduino教學-使用ESP8266 wifi模組+DHT 溫溼度感測器上傳thingspeak

這是透過Arduino+ESP8266(wifi)+DHT(溫溼度感測器),實現每60秒上傳溫溼度到thingspeak網站的記錄。
一、上 Thingspeak 申請帳號,然後建立一個Channel後,然後取得Write API Key。(https://thingspeak.com)
二、DHT連線
DHT → Arduino
S → A0
+ → 5V (VCC)
– → GND
三、ESP8266
ESP8266 → Arduino
GND → GND
UTXD → RX(0)
CH_PD → 3.3V (VCC 注意:連接USB時不要接上,不然會抓不到,程式上傳後,直接用變壓器)
URXD → TX(1)
VCC → 3.3V (VCC)
四、USB轉TTL (作為監測用)
USBTTL → Arduino
TXD(綠)→ 2
RXD(白)→ 3
l_140820105419
腳位圖
20691_10152621979171541_6306184665770254413_n

11024717_10152621978966541_3990729037825987143_n

未命名 - 5
程式碼
[c]
#include <SoftwareSerial.h>
#define DEBUG
#define _baudrate 9600

// USB TTL 偵錯用
#define _rxpin 2
#define _txpin 3
SoftwareSerial debug( _rxpin, _txpin ); // RX, TX

// DHT溫溼度感測器
#define dht_dpin A0
byte bGlobalErr;
byte dht_dat[5];

// ESP8266 Wifi晶片
#define SSID "[無線分享器名稱]"
#define PASS "[無線分享器密碼]"
#define IP "184.106.153.149" // ThingSpeak的IP
// 使用 GET 傳送資料的格式
String GET = "GET /update?key=[Write API Key]";

void setup() {
InitDHT();
Serial.begin( _baudrate );
debug.begin( _baudrate );
delay(300);
sendDebug("AT");
delay(5000);
if(Serial.find("OK"))
{
debug.println("RECEIVED: OK\nData ready to sent!");
connectWiFi();
}
delay(700);
}

void loop() {
ReadDHT();
switch (bGlobalErr){
case 0:
String TT,HH;
HH = String(dht_dat[0])+’.’+String(dht_dat[1]);
TT = String(dht_dat[2])+’.’+String(dht_dat[3]);
updateDHT11( TT, HH );
#ifdef DEBUG
debug.print("Humidity: ");
debug.print( HH );
debug.print(" %\t");
debug.print("Temperature: ");
debug.print( TT );
debug.println(" *C\t");
#endif

}
delay(60000); // 一分鐘一次
}

void updateDHT11( String T, String H )
{
// 使用AT指令上傳
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += IP;
cmd += "\",80";
sendDebug(cmd);
delay(2000);
if( Serial.find( "Error" ) )
{
debug.print( "RECEIVED: Error\nExit1" );
return;
}

cmd = GET + "&field1=" + T + "&field2=" + H +"\r\n";
Serial.print( "AT+CIPSEND=" );
Serial.println( cmd.length() );
if(Serial.find( ">" ) )
{
debug.print(">");
debug.print(cmd);
Serial.print(cmd);
}
else
{
sendDebug( "AT+CIPCLOSE" );
}
if( Serial.find("OK") )
{
debug.println( "RECEIVED: OK" );
}
else
{
debug.println( "RECEIVED: Error\nExit2" );
}
}

void sendDebug(String cmd)
{
// 傳到 USB TTL
debug.print("SEND: ");
debug.println(cmd);
Serial.println(cmd);
}

boolean connectWiFi()
{
// 連線到Wifi
Serial.println("AT+CWMODE=1");
delay(2000);
String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
sendDebug(cmd);
delay(5000);
if(Serial.find("OK"))
{
debug.println("RECEIVED: OK");
return true;
}
else
{
debug.println("RECEIVED: Error");
return false;
}

cmd = "AT+CIPMUX=0";
sendDebug( cmd );
if( Serial.find( "Error") )
{
debug.print( "RECEIVED: Error" );
return false;
}
}
void InitDHT(){
// 初始化DHT
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,HIGH);
}

void ReadDHT(){
bGlobalErr=0;
byte dht_in;
byte i;
digitalWrite(dht_dpin,LOW);
delay(20);

digitalWrite(dht_dpin,HIGH);
delayMicroseconds(40);
pinMode(dht_dpin,INPUT);

dht_in=digitalRead(dht_dpin);

if(dht_in){
bGlobalErr=1;
return;
}
delayMicroseconds(80);
dht_in=digitalRead(dht_dpin);

if(!dht_in){
bGlobalErr=2;
return;
}
delayMicroseconds(80);
for (i=0; i<5; i++)
dht_dat[i] = read_dht_dat();
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,HIGH);
byte dht_check_sum =
dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
if(dht_dat[4]!= dht_check_sum)
{bGlobalErr=3;}
};

byte read_dht_dat(){
byte i = 0;
byte result=0;
for(i=0; i< 8; i++){
while(digitalRead(dht_dpin)==LOW);
delayMicroseconds(30);
if (digitalRead(dht_dpin)==HIGH)
result |=(1<<(7-i));
while (digitalRead(dht_dpin)==HIGH);
}
return result;
}

[/c]

【友情廣告】加盟連鎖展不可錯過的「全租王加盟連鎖」

3ce2b24be8ddac0eb1a279568f9ad025
2014/9/26~9/29在台北世貿館有2014台灣世界連鎖加盟大展,朋友也在那邊設了「全租王加盟連鎖與創新產品上市發表會」(攤位編位:D920)
大概說一下好了~整個全租王是架構上餐飲POS系統上的全方位整合方案,除了傳統的餐飲點餐系統外,也結合物聯網的概念開發出QRCall取票、叫號模式,並將傳統的DVR(Digital Video Record)系統結合,將POS結帳的畫面以及關鍵的資料一併錄製在系統上,避免舞弊。

Anyway~有機會到現場的朋友可以去看看就對了 🙂

漢偉科技有限公司
http://www.ehanway.com.tw/

 

pos-system (1)

9b1a3ba6bed2423dbb560c87dc588bb0 57c9eaa1fb98412391758043b707a058 117d36be789546869cf09711ddd55ccb cb6eddd18fd64d5abe3b90a4d8040312