智慧宿舍
前言
最近太忙了,好久沒更部落格了,主要是想想做做弄了個智慧宿舍項目,電控、物聯網層面我都做好了,可能還缺少一個工程的大佬幫我部署到寢室里hhhhhhh鄙人能力有限
來,先上方案的構想。
emmm,這是一開始的構想,後面有稍微一點點的改動,且聽我慢慢道來。
項目拆分實現
其實不管多大多複雜的項目,我們都應該把它拆分成一個個的小塊去實現。
另外這裡感謝酷基的方案,連接的是點燈平台,雲服務用的應該是阿里雲家的。
一、開燈
原來想著,用esp01(比8266廉價方便),再加個繼電器,然後做成這個樣子(理想型)。
這個用燈控制的比較簡單,然後實現的效果是這樣的。本人第一次投稿b站影片:物聯網燈
UI做的也挺乾淨整潔的
這個源碼比較簡單,我就不上傳了。上傳一個後續的方案,當我看到這個設計:用舵機實現開關燈。
那麼我們就來解析一下這個舵機開燈的源程式碼吧(esp01)
#define BLINKER_WIFI
#include <Blinker.h>
#include<Servo.h>
Servo myservo;
char auth[] = "你的物聯網密鑰";
char ssid[] = "WIFI帳號";
char pswd[] = "WIFI密碼";
BlinkerButton Button1("btn-on"); //定義按鈕數據
BlinkerButton Button2("btn-off");
BlinkerButton Button3("btn-aaa");
bool oState = false;
int counter = 0;
void dataRead(const String & data) // 如果未綁定的組件被觸發,則會執行其中內容
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
uint32_t BlinkerTime = millis();
Blinker.print("millis", BlinkerTime);
}
// 按下按鍵即會執行該函數
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
delay(500);
myservo.write(60);
delay(2000);
myservo.write(90);
delay(500);
}
void button2_callback(const String & state) //點燈app內控制按鍵觸發
{
BLINKER_LOG("get button state: ", state);
delay(500);
myservo.write(-60);
delay(2000);
myservo.write(90);
delay(500);
}
void button3_callback(const String & state) //點燈app內控制按鍵觸發
{
BLINKER_LOG("get button state:on", state);
Blinker.print(state);
if(state=="on"){
digitalWrite(0,LOW);
// Button3.print("on");
}else if(state =="off"){
digitalWrite(0,HIGH);
// Button3.print("off");
}
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化舵機
myservo.attach(0);
// 90為停
myservo.write(90);
digitalWrite(0,HIGH);
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
Button3.attach(button3_callback);
}
void loop()
{
Blinker.run();
}
注釋基本都打好了,要注意的是,要自己寫按鍵在點燈科技里,舵機的庫函數myservo.write()中參數,90代表停止,0和180分別表示往一邊一直轉。
還有一個功能定時器觸發的,其實在點燈APP上稍微設置一下就行了,沒什麼難點。
然後剩下的就是部署在寢室了,工程大佬幫幫我🙃
二、開門
esp8266 + 舵機(淘寶馴龍者MG995拉動門夠了)
還贈送溫濕度+OLED顯示功能,這裡的功能可以去參考這篇部落格:傳送門
APP的UI設計
功能實物圖(原諒我忘記拍影片了,只有一些雜亂的接線)其實就是手機上按下開門,然後舵機響應轉起來,就這麼簡單
源碼(DHT11+OLED+舵機):
#define BLINKER_WIFI
#include <Blinker.h>
#include<Servo.h>
Servo myservo;
char auth[] = "你的點燈KEY";
char ssid[] = "WIFI_NAME";
char pswd[] = "WIFI_PSWD";
// dht_oled
BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");
BlinkerText TEXT1("tex-s");
// door
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
int counter = 0;
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#define DHTPIN 14
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
uint32_t read_time = 0;
float humi_read, temp_read;
//dht_oled
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
uint32_t BlinkerTime = millis();
Blinker.print("millis", BlinkerTime);
BLINKER_LOG("Blinker readString: ", data);
counter++;
Number1.print(counter);
}
void dataStorage()
{
Blinker.dataStorage("cha-temp", temp_read);
Blinker.dataStorage("cha-humi", humi_read);
}
String rts()//計算運行時間
{
int rt =Blinker.runTime();
int r,e,f,s;
String fh;
Blinker.delay(100);
if(rt >= 86400)//天數
{r = rt / 86400;
e = rt / 3600 - r*24;
f = rt / 60 - r*1440 - e*60;
s = rt - r*86400 - e*3600 - f*60;}
else if(rt >= 3600)
{r = 0;
e = rt / 3600;
f = rt / 60 - e*60;
s = rt - e*3600 - f*60;}
else
{r = 0;
e = 0;
f = rt / 60;
s = rt - f*60;}
//BLINKER_LOG(r," ",e," ",f," ",s);//輸出數據測試
if(f==0 & e==0 & r==0)
{fh = String("")+ s +"秒";}
else if(r == 0 & e == 0 )
{fh = String("")+ f + "分" + s +"秒";}
else if(r == 0)
{fh = String("")+ e + "時" + f + "分" + s +"秒"; }
else
{fh = String("")+ r + "天" + e + "時" + f + "分" + s +"秒";}
return(fh);
}
void heartbeat()//心跳
{
HUMI.print(humi_read);
TEMP.print(temp_read);
TEXT1.print(rts());
}
// door
// 按下按鍵即會執行該函數
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
delay(500);
myservo.write(172);
delay(2000);
myservo.write(90);
delay(500);
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial); // door
// 初始化舵機
myservo.attach(12);
// 90為停
myservo.write(90);
// dht_oled
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Blinker.attachHeartbeat(heartbeat);//附加心跳
Blinker.attachDataStorage(dataStorage);//附加數據存儲
Button1.attach(button1_callback);
dht.begin();
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
Blinker.delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
}
void loop()
{
Blinker.run();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t))
{
BLINKER_LOG("Failed to read from DHT sensor!");
}
else
{
// BLINKER_LOG("Humidity: ", h, " %");
//BLINKER_LOG("Temperature: ", t, " *C");
humi_read = h;
temp_read = t;
float hic = dht.computeHeatIndex(t, h, false);
// 顯示
display.clearDisplay();
// 顯示溫度
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temp: ");
display.setTextSize(2);
display.setCursor(0,10);
display.print(t);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
// 顯示濕度
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Humi: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(h);
display.print(" %");
//刷新顯示
display.display();
}
Blinker.delay(60000);
}
還是那句話,在點燈APP里設置好按鍵。
引腳圖
元件 | 腳 | 8266腳 |
---|---|---|
舵機 | DATA | D6 |
OLED | SCL | D1 |
OLED | SDA | D2 |
DHT11 | DATA | D5 |
舵機那塊兒記得去共地。
前面這兩個項目,還可以接入小愛同學,打算等我的小米手環5NFC到了再去調戲這個功能hhhhhhh】
三、門禁系統
RFID/NFC,整一個NFC讀取設備,然後自己做一張卡,寫一下,就好了。
說起來簡單,做起來難咯哈哈哈哈哈哈
這個本人暫時還沒做,以後有機會再更咯~
然後呢,最近學會了畫PCB,對網上一些奇奇怪怪的東西也頗有興趣。
這裡推薦一個立創EDA開源名片,真的挺不錯的。
不過被我的導師說成:沒有去實現一個真正的功能hhhhhh
沒事沒事,先玩玩嘛。
我是打算做個焊盤,然後把白卡中間那個晶片焊到名片上去,去實現一個門禁。
結尾
其實最近還學習去寫了些py腳本,還挺有意思的。挺推薦有點py基礎的人玩的,因為做出來一個,就有點成就感,然後就能正向激勵學習了嘛hhhhh。
明天考六級的我,表示….去體驗一波先吧,好久沒學英語了,下次一定好好學🤪下次一定
還打算去報名飛思卡爾智慧車比賽,我是寫演算法那個。萌新,可能要肝一段時間了,而且還有實驗室的項目做做咯。