智慧小屋改进版

学了浙大的慕课<<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执行动作。

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

猜你喜欢

转载自blog.csdn.net/weixin_42126140/article/details/106446584