M5StickC简易洗手提醒装置-Arduino中文社区 - Powered by Discuz! Archiver

vany5921 发表于 2020-4-13 11:19

M5StickC简易洗手提醒装置

借助于ToF实现距离检测,当靠近水池时,进行20秒洗手消毒计时。默认采用32,33连接传感器,A键可手动操作计时。
#include <M5StickC.h>
#include <VL53L0X.h>                  //Time of flight distance sensor
#include <Wire.h>                     //i2C comms needed for VL sensor

const char* BuildTime = __TIME__;
const char* BuildDate = __DATE__;
const char* Version = "V0.3";
#define SKETCH "Wash Hands"
#define HOSTNAME "M5StickC-1"
#define STARTUPMSGDELAY 1500         // ms to wait to display startup messages
#define SHORTVERSION "YES"             // output just the version no on screen at startup
#define STARTUPSCREENBRIGHTNESS 200    // startup brightness
boolean M5stack = true;               //Enable M5 output text
int StdScreenBrightness = 100;
int BackGroundColor = BLUE;
String BackGround = "RED";
char Build;

// Used for Button
const intM5ButtonPin = 37;
uint8_t lastPinState = 1;
uint8_t pinState = 0;

/** START - Time Of Flight VL53L0X parameters **/
VL53L0X VL53L0Xsensor;
#define HIGH_ACCURACY
boolean TOFSensor = true;
int SensorDist = 50;
int SensorDist1 = 50;
int SensorDist2 = 50;
int SensorDist3 = 50;
int VL53L0XAddress = 0x29;
boolean Trigger = false;
String SensorStatus = "#TOF#";
int TriggerDist = 160;
/** END - Time Of Flight VL53L0X parameters **/

int SecsCountDownFrom = 20;
int MainLoopDelay = 200;

void SetupVL53L0X()
{
// Check VL53L0X TOF and set for accurate scanning
Wire.begin();
Wire.beginTransmission (VL53L0XAddress);
if (Wire.endTransmission() == 0)
{
    Serial.print (F("VL53L0X device found at 0x"));
    Serial.println (VL53L0XAddress, HEX);
   
    // only set parameters if sensor was detected
    VL53L0Xsensor.init();
    VL53L0Xsensor.setTimeout(500);
    //VL53L0Xsensor.setMeasurementTimingBudget(200000);
}
else
{
    Serial.println("######VL53L0X device NOT found   ######");
    Serial.println("######   TEST MODE - BUTTON      ######");
    TOFSensor = false;
}
}

void CheckTOF()
{
if (TOFSensor == true and Trigger == false)       // only read if sensor was found at startup and no current trigger
{
    SensorDist1 = VL53L0Xsensor.readRangeSingleMillimeters();
    delay(50);
    SensorDist2 = VL53L0Xsensor.readRangeSingleMillimeters();
    delay(50);
    SensorDist3 = VL53L0Xsensor.readRangeSingleMillimeters();
    SensorDist = (SensorDist1 + SensorDist2 + SensorDist3)/3;   // take an average of 3 settings to remove 'aborations'
   
    if (VL53L0Xsensor.timeoutOccurred())
    {
      Serial.println("VL53L0X TIMEOUT");
      SensorDist = 50;            // default sensor distance if it timeouts
    }
    else
    {
    Serial.println("Distance = " + String(SensorDist));
      if ( SensorDist <= TriggerDist )         // Door triggered
      {
      Trigger = true;
      }
      else
      {
      Trigger = false;
      }
    Serial.println("Trigger = " + String(Trigger));

    }
}
else
{
    CheckButtons();
}
}

void OutputBuildInfo()
{
sprintf(Build, "%s %s", BuildTime, BuildDate );
Serial.print(SKETCH);
Serial.print(" ");
Serial.println(Version);
Serial.print("Build ");
Serial.println(Build);
Serial.print("ESP Name ");
Serial.println(HOSTNAME);

if (M5stack == true )
{
    M5OutputBuildInfo();
}


}

void M5OutputBuildInfo()
{
//M5.Lcd.setBrightness(StdScreenBrightness);
M5.Lcd.fillScreen(BackGroundColor);
if (SHORTVERSION == "Yes" )
{
    M5.Lcd.setCursor(0,0);
    M5.Lcd.setTextSize(2);
    M5.Lcd.setTextColor(WHITE, BackGroundColor);
    M5.Lcd.println(Version);
    delay(STARTUPMSGDELAY);
}
else
{
    sprintf(Build, "%s %s", BuildTime, BuildDate );
    M5.Lcd.setCursor(0,0);
    M5.Lcd.setTextSize(2);
    M5.Lcd.setTextColor(WHITE, BackGroundColor);
    M5.Lcd.println(Version);
    M5.Lcd.println(SKETCH);
    M5.Lcd.println(BuildTime);
    M5.Lcd.println(BuildDate);
    M5.Lcd.println(HOSTNAME);
    delay(STARTUPMSGDELAY);
}
}

void CheckButtons()
{
    pinState = digitalRead(M5ButtonPin);
    if(!pinState && lastPinState){
      Trigger = true;
    }
    lastPinState = pinState;

}

/*
* ###################################################
* #            START SETUP FUNCTION               #
* ###################################################
*/

void setup()
{
Serial.begin(115200);
M5.begin();
M5.Lcd.setRotation(3);

// Setup big M5 button
pinMode(M5ButtonPin, INPUT_PULLUP);

OutputBuildInfo();

SetupVL53L0X();

Wire.begin();

delay(3000);
M5.Lcd.fillScreen( BLACK );
}

/*
* ###################################################
* #                END SETUP FUNCTION               #
* ###################################################
*/

/*
* ###################################################
* #               MAIN LOOP                     #
* ###################################################
*/
void loop()
{
delay(MainLoopDelay);
CheckTOF();

if (Trigger == true)
{
    //M5.Lcd.setBrightness(200);
    for (int Count = SecsCountDownFrom; Count > 0; Count--)
    {
      Serial.println(Count);
      BackGround = "RED";
      //M5.Lcd.setRotation(3);
      M5.Lcd.fillScreen( RED );
      M5.Lcd.setTextColor(YELLOW);
      M5.Lcd.setTextSize(6);
      M5.Lcd.setCursor(60, 20);
      M5.Lcd.println(Count);

      delay(990);
    }
    Serial.println("Rinse Hands");

    M5.Lcd.fillScreen( YELLOW );
    M5.Lcd.setTextColor(BLACK);
    M5.Lcd.setTextSize(4);
    M5.Lcd.setCursor(28, 4);
    M5.Lcd.print("RINSE");
    M5.Lcd.setCursor(28, 44);
    M5.Lcd.print("HANDS");
    delay(4000);
   
    Serial.println("Well Done");
      
    M5.Lcd.fillScreen( GREEN );
    M5.Lcd.setTextColor(BLACK);
    M5.Lcd.setTextSize(4);
    M5.Lcd.setCursor(28, 4);
    M5.Lcd.print("WELL");
    M5.Lcd.setCursor(28, 44);
    M5.Lcd.print("DONE");
    delay(2000);
    Serial.println("Ready");
   
    Trigger = false;
}
else
{
    if ( BackGround != "BLACK" )
    {
      Serial.println("Ready");
      //M5.Lcd.setBrightness(20);
      M5.Lcd.fillScreen( BLACK );
      M5.Lcd.setTextColor(GREEN);
      M5.Lcd.setTextSize(2);
      M5.Lcd.setCursor(48, 14);
      M5.Lcd.print("READY");
      BackGround = "BLACK";
    }
}
}

页: [1]
查看完整版本: M5StickC简易洗手提醒装置