学了浙大的慕课<<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); // RedSerial.println("Red");}if(desprition=="Down"&&LED==ON){colorWipe(strip.Color(0, 255, 0), 50); // GreenSerial.println("Green");}if(desprition=="Left"&&LED==ON){colorWipe(strip.Color(0, 0, 255), 50); // BlueSerial.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执行动作。

结束语
虽然这个项目耗费了我很多的时间,但是也积累了一定的经验。

智慧小屋改进版(Arduino基于开源MQTT接入阿里云IOT)相关推荐

  1. C# 基于开源MQTT自主接入阿里云IoT平台

    1. 准备工作 1.1 注册阿里云账号 使用淘宝账号或手机号,开通阿里云账号,并通过实名认证(可以用支付宝认证) 1.2 免费开通IoT物联网套件 产品官网 https://www.aliyun.co ...

  2. 移远EC600S-CN (4) - MQTT接入阿里云

    MQTT是一种基于 发布/订阅 模式的轻量级通信协议.MQTT专门针对 物联网设备 开发,是一种 低开销.低带宽占用的即时通讯协议.该协议构建于 TCP/IP 上,旨在为低带宽和不稳定网络环境中的物联 ...

  3. 修改串口设备名ttymxc1_ESP8266接入阿里云——基于官方SDK接入阿里云串口获取云下发数据...

    作者:电子快递哥 日期:于2020年3月18日 有态度,有温度,欢迎关注电子快递哥,转载请注明出处, ESP8266接入阿里云 --之一基于官方SDK接入阿里云串口获取云下发数据 一.获取阿里云IoT ...

  4. esp8266 阿里云 arduino_ESP8266接入阿里云——基于官方SDK接入阿里云串口获取云下发数据...

    作者:电子快递哥 日期:于2020年3月18日 有态度,有温度,欢迎关注电子快递哥,转载请注明出处, ESP8266接入阿里云 --之一基于官方SDK接入阿里云串口获取云下发数据 一.获取阿里云IoT ...

  5. Python模拟智能开关设备MQTT接入阿里云物联网平台 - PyCharm paho.mqtt

    概要 Python 使用 paho.mqtt 库,利用阿里云物联网平台的设备证书:productKey.deviceName.deviceSecret,自动合成 userName.passWord.以 ...

  6. MQTT.fx客户端MQTT接入阿里云物联网平台,登录、订阅、发布消息

    目录 1. 准备 2. MQTT.fx 设置登录名.密码 3. MQTT.fx 接入阿里云,订阅Topic 4. 阿里云下发数据给 MQTT.fx 5. MQTT.fx 发布消息给服务器 相关链接:M ...

  7. 使用网络调试助手 MQTT接入阿里云物联网平台,逐字节讲解,适用单片机/ESP8266接入阿里云

    目录 1. CONNECT 连接服务器 2. CONNACK 确认连接 3. DISCONNECT 断开连接 4. PINGREQ 心跳请求 5. PINGRESP 心跳响应 6. SUBSCRIBE ...

  8. 【小程序案例】支付宝小程序-MQTT模器,IoT设备通过WSS接入阿里云IoT物联网平台...

    支付宝小程序-MQTT模拟器通过WSS接入阿里云IoT物联网平台 准备工作 1.1 注册阿里云账号 开通阿里云账号,并通过支付宝实名认证 https://www.aliyun.com 1.2 免费开通 ...

  9. 【安信可A9G专题⑤】A9G模组AT指令MQTT接入阿里云实现APP控制

    本系列博客学习由 安信可科技 - 官方博客 技术分享,如有疑问请留言或联系邮箱. 1.A9G环境在windows上搭建并编译,串口打印 Hello GPRS 2.A9G在微信公众号上的定位功能笔记分享 ...

最新文章

  1. Closing Spring root WebApplicationContext
  2. wingide的使用方法积累
  3. docker环境安装redis
  4. little tricks(持续更新)【python】
  5. 03 | 事务隔离:为什么你改了我还看不见?笔记(转)
  6. php修改隐藏域非法提交,PHP get、post变量放在表单隐藏域示例
  7. Python入门-散点图绘制
  8. OUTLOOK EXPRESS的数据备份
  9. shell应用之监测电脑内存、负载和磁盘的使用情况
  10. asp.net 安全
  11. “华为杯”第十八届中国研究生数学建模竞赛一等奖经验分享
  12. 华为s8600手机驱动_深度丨国产OLED驱动芯片玩家的机遇与困难
  13. 微型计算机工作原理详细,微型计算机基本工作原理.ppt
  14. 泛微e9隐藏明细表_泛微协同 泛微OA e-cology产品功能清单 模块列表
  15. HTML学生个人网站作业设计:动漫网站设计——哆啦A梦(5页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  16. POJ 1861 Network(KUS算法)
  17. 大于4G的文件无法拷贝到U盘
  18. 为什么业务中很少用到设计模式
  19. 为什么E-GREEDY算法中e越小,性能会更好
  20. iPhone X全屏适配

热门文章

  1. STC单片机按键扫描程序
  2. GIS 克隆 IClone
  3. CAMP模型python实现
  4. iperf测试WiFi吞吐量
  5. K-means对图像进行分类
  6. python编程设计圆柱体积_PYTHON程序设计实验2
  7. 游戏音乐制作不但要用音乐吸引玩家,还要突出游戏背景
  8. 5G多卡聚合路由器在救护车领域的应用
  9. 智慧书-永恒的处世经典格言:1-40
  10. java雷电游戏源码项目