智能宿舍
前言
最近太忙了,好久没更博客了,主要是想想做做弄了个智能宿舍项目,电控、物联网层面我都做好了,可能还缺少一个工程的大佬帮我部署到寝室里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。
明天考六级的我,表示....去体验一波先吧,好久没学英语了,下次一定好好学🤪下次一定
还打算去报名飞思卡尔智能车比赛,我是写算法那个。萌新,可能要肝一段时间了,而且还有实验室的项目做做咯。