学了浙大的慕课<<DIY智慧小屋—带你玩转物联网>>,虽然得了一个不错的分数,但是由于材料买的晚,到期末考试的时候还没有实现其中的任何一个功能,所以加分为0,好尴尬!后来有空了就搞一点,陆陆续续,拖拖塔塔的到最近才搞完,并在原版的基础之上,结合自身想法,有所改进。
话不多说,先上个图。
改进之处
1.BME280另外读取了室内湿度、海拔高度和大气压强,并在web界面显示,物尽其用嘛!
2.将可燃气体传感器替换为MQ-135空气质量传感器,MQ-135主要检测氨气、氮氧化合物、硫化物,同时也具有一定的有机气体检测能力,这样对于空气监测能力将进一步增强。
3.增加7位WS2812串行5050全彩LED模块,用以室内照明。
4.增加PAJ7620U2手势识别传感器,用以手势调控全彩LED的发光。
5.增加MFRC-522 RC522 RFID 射频识别模块,用以门禁控制,同时增加了一个步进电机来驱动开门关门。
6.将空调替换为风扇,因为那种空调的作用范围实在有限,效果不明显。
7.增加了一个12864LCD显示器,用于在室内显示温度、空气污染物浓度、室内光线强度、土壤湿度。
8.业务服务里面增加了对于开门、关门的钉钉机器人警报推送功能。
9.增加了5个信号提示LED灯,用于在BME280初始化、PAJ7620U2初始化、RFID初始化、WiFi初始化和连接云端成功后进行提示。
Arduino代码
/*
@author 卍卍卍,beased on MOOC lesson demo codes.
*/
#include <Wire.h>//IIC驱动库
#include <U8glib.h>//12864LCD驱动库
#include <SPI.h>//SPI驱动库
#include <MFRC522.h>//RFID射频模块驱动库
#include <Stepper28BYJ48.h>//步进电机驱动库
#include <Adafruit_Sensor.h>//通用传感器驱动库
#include <Adafruit_BME280.h>//BME280驱动库
#include <Adafruit_NeoPixel.h>//WS2812全彩LED驱动库
#include <DFRobot_PAJ7620U2.h>//PAJ7620U2手势识别传感器库
//WIFI、设备三元组等数据定义
#define wifi_ssid "***"
#define wifi_psw "**********"
#define clientIDstr "example"
#define timestamp "999"
#define ProductKey "*********"
#define DeviceName "*******"
#define DeviceSecret "kdlafaksgnljklseirgnelOqjxja5"
#define password "2c7da8jglsglnvrgion,svrjkgnvbe229f1a90515d2b"
#define SEALEVELPRESSURE_HPA 1013.25
//特定值定义
#define OFF 0
#define ON 1
#define MUTE 2
#define KEEP_OFF 2
#define KEEP_ON 3
//空调开关定义
#define AC_ON digitalWrite(ACPin,HIGH)
#define AC_OFF digitalWrite(ACPin,LOW)
//风扇开关定义
#define Fan_ON digitalWrite(FanPin,HIGH)
#define Fan_OFF digitalWrite(FanPin,LOW)
//蜂鸣器开关定义
#define Buzzer_ON digitalWrite(BuzzerPin,HIGH)
#define Buzzer_OFF digitalWrite(BuzzerPin,LOW)
//水泵开关定义
#define Pump_ON digitalWrite(PumpPin,HIGH)
#define Pump_OFF digitalWrite(PumpPin,LOW)
//阈值触发定义
#define AC_ON_val (28.00)
#define AC_OFF_val (25.00)
#define Gas_ON_val 500
#define Gas_OFF_val 200
#define Light_ON_val 700
#define Light_OFF_val 200
#define Pump_ON_val 900
#define Pump_OFF_val 500
//设备状态、读数初始化
float RoomTemp;
float RoomPres;
float RoomAlti;
float RoomHumi;
int AC = OFF;
int Buzzer = OFF;
int GasDetector = 0;
int Fan = OFF;
int LightDetector = 0;
int LED = OFF;
int Curtain = ON;
int SoilHumi = 0;
int Pump = OFF;
int door=OFF;
const int stepsPerRevolution = 4096;
//卡片UID定义
String UID1="5d634d9f";
String UID2="eb6d9422";
//EMW3080AT指令定义
#define AT "AT\r"
#define AT_OK "OK"
#define AT_REBOOT "AT+REBOOT\r"
#define AT_ECHO_OFF "AT+UARTE=OFF\r"
#define AT_MSG_ON "AT+WEVENT=ON\r"
#define AT_WIFI_START "AT+WJAP=%s,%s\r"
#define AT_WIFI_START_SUCC "+WEVENT:STATION_UP"
#define AT_MQTT_AUTH "AT+MQTTAUTH=%s&%s,%s\r"
#define AT_MQTT_CID "AT+MQTTCID=%s|securemode=3\\,signmethod=hmacsha1\\,timestamp=%s|\r"
#define AT_MQTT_FINDCID_RES "+MQTTCID:example|securemode=3,signmethod=hmacsha1,timestamp=999|"
#define AT_MQTT_SOCK "AT+MQTTSOCK=%s.iot-as-mqtt.cn-shanghai.aliyuncs.com,1883\r"
#define AT_MQTT_AUTOSTART_OFF "AT+MQTTAUTOSTART=OFF\r"
#define AT_MQTT_ALIVE "AT+MQTTKEEPALIVE=500\r"
#define AT_MQTT_START "AT+MQTTSTART\r"
#define AT_MQTT_START_SUCC "+MQTTEVENT:CONNECT,SUCCESS"
#define AT_MQTT_PUB_SET "AT+MQTTPUB=/sys/%s/%s/thing/event/property/post,1\r"
#define AT_MQTT_PUB_ALARM_SET "AT+MQTTPUB=/sys/%s/%s/thing/event/AirWaring/post,1\r"
#define AT_MQTT_PUB_DATA "AT+MQTTSEND=%d\r"
//数据包定义
#define JSON_DATA_PACK "{\"id\":\"100\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":{\"AC\":%d,\"Fan\":%d,\"Buzzer\":%d,\"GasDetector\":%d,\"door\":%d}}\r"
#define JSON_DATA_PACK_2 "{\"id\":\"110\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":{\"LightDetector\":%d,\"Curtain\":%d,\"LED\":%d,\"SoilHumi\":%d,\"Pump\":%d}}\r"
#define JSON_DATA_PACK_3 "{\"id\":\"120\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":{\"RoomTemp\":%d.%02d,\"RoomPres\":%d.%02d,\"RoomAlti\":%d.%02d,\"RoomHumi\":%d.%02d}}\r"
#define JSON_DATA_PACK_ALARM "{\"id\":\"130\",\"version\":\"1.0\",\"method\":\"thing.event.AirWaring.post\",\"params\":{\"GasDetector\":%d}}\r"
#define AT_MQTT_PUB_DATA_SUCC "+MQTTEVENT:PUBLISH,SUCCESS"
#define AT_MQTT_UNSUB "AT+MQTTUNSUB=2\r"
#define AT_MQTT_SUB "AT+MQTTSUB=2,/sys/%s/%s/thing/service/property/set,1\r"
#define AT_MQTT_SUB_SUCC "+MQTTEVENT:2,SUBSCRIBE,SUCCESS"
//
#define AT_BUZZER_MUTE "\"Buzzer\":2"
//元件数字引脚定义
#define ACPin 2
#define BuzzerPin 3
#define PumpPin 4
#define CurtainOpenPin 5
#define CurtainClosePin 6
#define LEDPin 29
#define FanPin 11
#define led1 31
#define led2 33
#define led3 35
#define led4 37
#define led5 39
#define step1 41
#define step2 43
#define step3 45
#define step4 47
#define RST_PIN 49
#define SS_PIN 48
//元件模拟引脚定义
#define GasPin A0
#define SoilHumiPin A1
#define LightPin A2
//
#define DEFAULT_TIMEOUT 10
#define BUF_LEN 100
#define BUF_LEN_DATA 190
//定义发送数据的数组
char ATcmd[BUF_LEN];
char ATbuffer[BUF_LEN];
char ATdata[BUF_LEN_DATA];
//BME280对象声明
Adafruit_BME280 bme;
//LED对象声明并初始化引脚
Adafruit_NeoPixel strip = Adafruit_NeoPixel(7, LEDPin, NEO_GRB + NEO_KHZ800);
//手势传感器对象声明
DFRobot_PAJ7620U2 paj;
//12864初始化引脚
U8GLIB_ST7920_128X64_4X u8g(52, 51, 53);
//步进电机对象声明并初始化引脚
Stepper myStepper(stepsPerRevolution, step1,step2,step3,step4);
//RFID对象声明并初始化引脚
MFRC522 mfrc522(SS_PIN, RST_PIN);
//Arduino初始化函数
void setup() {
//串口比特率设置
Serial3.begin(115200);
Serial.begin(115200);
//调用引脚初始化函数
Pin_init();
//BME280初始
while(1){
if(!bme.begin(0x76)){
Serial.println("BME280 ERROR!");
continue;
}
else{
Serial.println("BME280 PASS!");
BEEP(1);
led1Signal();
break;
}
}
//LED初始
strip.begin();
strip.show();
//手势识别传感器初始
while(1){
if(paj.begin()){
Serial.println("PAJ7620U2 ERROR!");
continue;
}
else{
Serial.println("PAJ7620U2 PASS!");
paj.setGestureHighRate(true);
BEEP(1);
led2Signal();
colorWipe(strip.Color(0, 0, 0), 50);
break;
}
}
//SPI总线通信初始
SPI.begin();
//RFID初始
mfrc522.PCD_Init();
delay(4);
mfrc522.PCD_DumpVersionToSerial();
Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
myStepper.setSpeed(10);
BEEP(1);
led5Signal();
//调用WIFI初始化函数
while (1)
{
if (!WiFi_init()){
Serial.println("WiFi ERROR!");
continue;
}
else{
Serial.println("WiFi PASS!");
BEEP(1);
led3Signal();
break;
}
}
//调用连接云端函数
while(1){
Ali_connect();
Serial.println("Cloud PASS!");
BEEP(1);
led4Signal();
break;
}
}
//Arduino主循环
void loop() {
//调用LED手势控制函数
ledControl();
//调用12864绘制函数
u8g.firstPage();
do {
draw();
}
while(u8g.nextPage());
//BME280读取温度、压强、海拔、湿度的数值
RoomTemp=bme.readTemperature();
RoomPres=bme.readPressure()/100.0;
RoomAlti=bme.readAltitude(SEALEVELPRESSURE_HPA);
RoomHumi=bme.readHumidity();
//MQ-135空气质量传感器读取数值
GasDetector = analogRead(GasPin);
//光线传感器读取数值
LightDetector = analogRead(LightPin);
//土壤湿度传感器读取数值
SoilHumi = analogRead(SoilHumiPin);
//温度升高空调开启
if ((RoomTemp > AC_ON_val) && (AC == OFF))
{
AC = ON;
AC_ON;
}
//温度降低空调关闭
if ((RoomTemp < AC_OFF_val) && (AC == ON))
{
RoomTemp = bme.readTemperature();
if (RoomTemp < AC_OFF_val)
{
AC = OFF;
AC_OFF;
}
}
//污染物浓度升高风扇开启
if ((GasDetector > Gas_ON_val)&& (Fan == OFF))
{
Fan = ON;
Fan_ON;
}
//污染物浓度升高蜂鸣器开启
if ((GasDetector > Gas_ON_val) && (Buzzer == OFF))
{
Buzzer = ON;
Buzzer_ON;
//当前污染物浓度读数的数据发送
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_PUB_ALARM_SET, ProductKey, DeviceName);
bool mainflag = check_send_cmd(ATcmd, AT_OK, DEFAULT_TIMEOUT);
cleanBuffer(ATdata, BUF_LEN_DATA);
int mainlen = snprintf(ATdata, BUF_LEN_DATA, JSON_DATA_PACK_ALARM, GasDetector);
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_PUB_DATA, mainlen - 1);
mainflag = check_send_cmd(ATcmd, ">", DEFAULT_TIMEOUT);
if (mainflag) mainflag = check_send_cmd(ATdata, AT_MQTT_PUB_DATA_SUCC, 20);
}
//污染物浓度下降蜂鸣器关闭
if ((GasDetector < Gas_OFF_val) && (Buzzer != OFF))
{
Buzzer = OFF;
Buzzer_OFF;
}
//污染物浓度下降风扇关闭
if ((GasDetector < Gas_OFF_val)&& (Fan == ON))
{
Fan = OFF;
Fan_OFF;
}
//光线强度升高窗帘关闭
if ((LightDetector > Light_ON_val) && (Curtain == ON))
{
Curtain = OFF;
Curtain_OFF();
LED=ON;
}
//光线强度下降窗帘开启
if ((LightDetector < Light_OFF_val) && (Curtain == OFF))
{
Curtain = ON;
Curtain_ON();
LED=OFF;
colorWipe(strip.Color(0, 0, 0), 50);
}
//土壤湿度升高水泵关闭
if ((SoilHumi > Pump_ON_val) && (Pump == OFF))
{
Pump = ON;
Pump_ON;
}
//土壤湿度下降水泵开启
if ((SoilHumi < Pump_OFF_val) && (Pump == ON))
{
Pump = OFF;
Pump_OFF;
}
//找卡
mfrc522.PICC_IsNewCardPresent();
mfrc522.PICC_ReadCardSerial();
//匹配卡1门打开
if(UID1==getUid()&&door==OFF){
Serial.println(door);
Serial.println("Opened the door!");
door=ON;
myStepper.step(4096);
Serial.println(door);
}
//匹配卡2门关闭
if(UID2==getUid()&&door==ON){
Serial.println(door);
Serial.println("Close the door!");
door=OFF;
myStepper.step(-4096);
Serial.println(door);
}
//调用数据上传函数
Upload();
//检查是否收到云端下发的蜂鸣器静音指令
if (check_send_cmd(AT, AT_BUZZER_MUTE, 20))Buzzer_mute();
}
//数据上传函数定义
bool Upload()
{
bool flag;
int inte1, frac1,inte2, frac2,inte3, frac3,inte4, frac4;
int len;
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_PUB_SET, ProductKey, DeviceName);
flag = check_send_cmd(ATcmd, AT_OK, DEFAULT_TIMEOUT);
cleanBuffer(ATdata, BUF_LEN_DATA);
inte1 = (int)(RoomTemp);
frac1 = (RoomTemp - inte1) * 100;
inte2 = (int)(RoomPres);
frac2 = (RoomPres - inte2) * 100;
inte3 = (int)(RoomAlti);
frac3 = (RoomAlti - inte3) * 100;
inte4 = (int)(RoomHumi);
frac4 = (RoomHumi - inte4) * 100;
len = snprintf(ATdata, BUF_LEN_DATA, JSON_DATA_PACK_3, inte1, frac1, inte2, frac2,inte3, frac3,inte4, frac4);
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_PUB_DATA, len - 1);
flag = check_send_cmd(ATcmd, ">", DEFAULT_TIMEOUT);
if (flag) flag = check_send_cmd(ATdata, AT_MQTT_PUB_DATA_SUCC, 20);
delay(500);
cleanBuffer(ATdata, BUF_LEN_DATA);
len = snprintf(ATdata, BUF_LEN_DATA, JSON_DATA_PACK, AC, Fan, Buzzer, GasDetector);
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_PUB_DATA, len - 1);
flag = check_send_cmd(ATcmd, ">", DEFAULT_TIMEOUT);
if (flag) flag = check_send_cmd(ATdata, AT_MQTT_PUB_DATA_SUCC, 20);
delay(500);
cleanBuffer(ATdata, BUF_LEN_DATA);
len = snprintf(ATdata, BUF_LEN_DATA, JSON_DATA_PACK_2, LightDetector, Curtain, LED, SoilHumi, Pump);
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_PUB_DATA, len - 1);
flag = check_send_cmd(ATcmd, ">", DEFAULT_TIMEOUT);
if (flag) flag = check_send_cmd(ATdata, AT_MQTT_PUB_DATA_SUCC, 20);
return flag;
}
//连接云端函数定义
void Ali_connect()
{
bool flag;
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_AUTH, DeviceName, ProductKey, password);
flag = check_send_cmd(ATcmd, AT_OK, DEFAULT_TIMEOUT);
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_CID, clientIDstr, timestamp);
flag = check_send_cmd(ATcmd, AT_OK, DEFAULT_TIMEOUT);
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_SOCK, ProductKey);
flag = check_send_cmd(ATcmd, AT_OK, DEFAULT_TIMEOUT);
flag = check_send_cmd(AT_MQTT_AUTOSTART_OFF, AT_OK, DEFAULT_TIMEOUT);
flag = check_send_cmd(AT_MQTT_ALIVE, AT_OK, DEFAULT_TIMEOUT);
flag = check_send_cmd(AT_MQTT_START, AT_MQTT_START_SUCC, 20);
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_PUB_SET, ProductKey, DeviceName);
flag = check_send_cmd(ATcmd, AT_OK, DEFAULT_TIMEOUT);
flag = check_send_cmd(AT_MQTT_UNSUB,AT_OK,DEFAULT_TIMEOUT);
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_MQTT_SUB, ProductKey, DeviceName);
flag = check_send_cmd(ATcmd, AT_MQTT_SUB_SUCC, DEFAULT_TIMEOUT);
}
//WiFi初始化函数定义
bool WiFi_init()
{
bool flag;
flag = check_send_cmd(AT, AT_OK, DEFAULT_TIMEOUT);
if (!flag)return false;
flag = check_send_cmd(AT_REBOOT, AT_OK, 20);
if (!flag)return false;
delay(2000);
flag = check_send_cmd(AT_ECHO_OFF, AT_OK, DEFAULT_TIMEOUT);
if (!flag)return false;
flag = check_send_cmd(AT_MSG_ON, AT_OK, DEFAULT_TIMEOUT);
if (!flag)return false;
cleanBuffer(ATcmd, BUF_LEN);
snprintf(ATcmd, BUF_LEN, AT_WIFI_START, wifi_ssid, wifi_psw);
flag = check_send_cmd(ATcmd, AT_WIFI_START_SUCC, 20);
return flag;
}
//数据发送并检查指令响应函数定义
bool check_send_cmd(const char* cmd, const char* resp, unsigned int timeout)
{
int i = 0;
unsigned long timeStart;
timeStart = millis();
cleanBuffer(ATbuffer, BUF_LEN);
Serial3.print(cmd);
Serial3.flush();
while (1)
{
while (Serial3.available())
{
ATbuffer[i++] = Serial3.read();
if (i >= BUF_LEN)i = 0;
}
if (NULL != strstr(ATbuffer, resp))break;
if ((unsigned long)(millis() - timeStart > timeout * 1000)) break;
}
if (NULL != strstr(ATbuffer, resp))return true;
return false;
}
//数组置空函数定义
void cleanBuffer(char *buf, int len)
{
for (int i = 0; i < len; i++)
{
buf[i] = '\0';
}
}
//引脚初始化函数定义
void Pin_init()
{
pinMode(ACPin, OUTPUT);
digitalWrite(ACPin, LOW);
pinMode(BuzzerPin, OUTPUT);
digitalWrite(BuzzerPin, LOW);
pinMode(PumpPin, OUTPUT);
digitalWrite(PumpPin, LOW);
pinMode(CurtainOpenPin, OUTPUT);
digitalWrite(CurtainOpenPin, LOW);
pinMode(CurtainClosePin, OUTPUT);
digitalWrite(CurtainClosePin, LOW);
pinMode(led1,OUTPUT);
digitalWrite(led1,LOW);
pinMode(led2,OUTPUT);
digitalWrite(led2,LOW);
pinMode(led3,OUTPUT);
digitalWrite(led3,LOW);
pinMode(led4,OUTPUT);
digitalWrite(led4,LOW);
pinMode(FanPin, OUTPUT);
digitalWrite(FanPin, LOW);
Curtain_ON();
}
//蜂鸣器发声定义
void BEEP(int b_time)
{
for (int i = 1; i <= b_time; i++)
{
digitalWrite(BuzzerPin, HIGH);
delay(1000);
digitalWrite(BuzzerPin, LOW);
delay(1000);
}
}
//蜂鸣器静音函数定义
void Buzzer_mute()
{
Buzzer_OFF;
Buzzer = MUTE;
}
//窗帘开启函数定义
void Curtain_ON()
{
digitalWrite(CurtainOpenPin, HIGH);
delay(200);
digitalWrite(CurtainOpenPin, LOW);
}
//窗帘关闭函数定义
void Curtain_OFF()
{
digitalWrite(CurtainClosePin, HIGH);
delay(200);
digitalWrite(CurtainClosePin, LOW);
}
//LED灯手势控制函数定义
void ledControl(){
DFRobot_PAJ7620U2::eGesture_t gesture = paj.getGesture();
String desprition=paj.gestureDescription(gesture);
if(desprition=="Up"&&LED==ON){
colorWipe(strip.Color(255,0, 0), 50); // Red
Serial.println("Red");
}
if(desprition=="Down"&&LED==ON){
colorWipe(strip.Color(0, 255, 0), 50); // Green
Serial.println("Green");
}
if(desprition=="Left"&&LED==ON){
colorWipe(strip.Color(0, 0, 255), 50); // Blue
Serial.println("Blue");
}
if(desprition=="Right"&&LED==ON){
rainbow(20);
Serial.println("RainBow");
}
if(desprition=="Forward"){
colorWipe(strip.Color(255,255,255), 50);
Serial.println("White");
}
}
//信号灯1定义
void led1Signal(){
digitalWrite(led1,HIGH);
delay(1000);
digitalWrite(led1,LOW);
delay(1000);
}
//信号灯1定义
void led2Signal(){
digitalWrite(led2,HIGH);
delay(1000);
digitalWrite(led2,LOW);
delay(1000);
}
//信号灯2定义
void led3Signal(){
digitalWrite(led3,HIGH);
delay(1000);
digitalWrite(led3,LOW);
delay(1000);
}
//信号灯3定义
void led4Signal(){
digitalWrite(led4,HIGH);
delay(1000);
digitalWrite(led4,LOW);
delay(1000);
}
//信号灯4定义
void led5Signal(){
digitalWrite(led5,HIGH);
delay(1000);
digitalWrite(led5,LOW);
delay(1000);
}
//LED显示颜色函数定义
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
//LED显示彩虹色函数定义
void rainbow(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256; j++) {
for(i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i+j) & 255));
}
strip.show();
delay(wait);
}
}
//LED流动显示颜色函数定义
uint32_t Wheel(byte WheelPos) {
if(WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
//12864显示函数定义
void draw() {
u8g.setFont(u8g_font_unifont);
u8g.drawStr(3,15,"Tempture:");
u8g.drawStr(3,30,"GasValue:");
u8g.drawStr(3,45,"LightVal:");
u8g.drawStr(3,60,"SoilValu:");
u8g.drawHLine(2,2,124); //水平线
u8g.drawHLine(2,17,124);
u8g.drawHLine(2,32,124);
u8g.drawHLine(2,47,124);
u8g.drawHLine(2,62,124);
u8g.drawVLine(2,2,60);//垂直线
u8g.drawVLine(73,2,60);
u8g.drawVLine(126,2,60);
String str1=(String)RoomTemp;
String str2=(String)GasDetector;
String str3=(String)LightDetector;
String str4=(String)SoilHumi;
u8g.setPrintPos(75,15);
u8g.print(str1);
u8g.setPrintPos(75,30);
u8g.print(str2);
u8g.setPrintPos(75,45);
u8g.print(str3);
u8g.setPrintPos(75,60);
u8g.print(str4);
}
//获取卡片UID函数定义
String getUid(){
String uid="";
uid+=String(mfrc522.uid.uidByte[0],HEX);
uid+=String(mfrc522.uid.uidByte[1],HEX);
uid+=String(mfrc522.uid.uidByte[2],HEX);
uid+=String(mfrc522.uid.uidByte[3],HEX);
return uid;
}
云端数据页面及业务服务设置
web APP配置页面及数据可视化页面
未来可改进的地方
1.阿里云IOT的移动APP开发功能还在维护中,暂时不能使用,可以考虑使用MIT App Inventor制作Android APP,App Inventor也有相应的MQTT组件。
2.利用树莓派的强大媒体处理能力增加室内监控功能。树莓派摄像头采集图像,使用OpenCV等库处理后,给Arduino下发指令,Arduino执行动作。
结束语
虽然这个项目耗费了我很多的时间,但是也积累了一定的经验。