智慧宿舍

前言

最近太忙了,好久沒更部落格了,主要是想想做做弄了個智慧宿舍項目,電控、物聯網層面我都做好了,可能還缺少一個工程的大佬幫我部署到寢室里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代表停止,0180分別表示往一邊一直轉。
還有一個功能定時器觸發的,其實在點燈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。

明天考六級的我,表示….去體驗一波先吧,好久沒學英語了,下次一定好好學🤪下次一定

還打算去報名飛思卡爾智慧車比賽,我是寫演算法那個。萌新,可能要肝一段時間了,而且還有實驗室的項目做做咯。