智能宿舍

前言

最近太忙了,好久没更博客了,主要是想想做做弄了个智能宿舍项目,电控、物联网层面我都做好了,可能还缺少一个工程的大佬帮我部署到寝室里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。

明天考六级的我,表示....去体验一波先吧,好久没学英语了,下次一定好好学🤪下次一定

还打算去报名飞思卡尔智能车比赛,我是写算法那个。萌新,可能要肝一段时间了,而且还有实验室的项目做做咯。

posted @ 2020-12-11 21:25  你好我叫郑某人  阅读(1176)  评论(0编辑  收藏  举报