Created ServoControl Example
Created in "Other Examples" and is based on Example 13 - WindowShade
This commit is contained in:
parent
54f7928204
commit
8252c5390e
|
|
@ -0,0 +1,68 @@
|
||||||
|
|
||||||
|
////////////////////////////////////
|
||||||
|
// DEVICE-SPECIFIC LED SERVICES //
|
||||||
|
////////////////////////////////////
|
||||||
|
|
||||||
|
#include <extras/PwmPin.h>
|
||||||
|
|
||||||
|
////////////////////////////////////
|
||||||
|
|
||||||
|
struct DEV_WindowShade : Service::WindowCovering { // A motorized Window Shade with Hold Feature
|
||||||
|
|
||||||
|
SpanCharacteristic *current; // reference to a "generic" Current Position Characteristic (used by a variety of different Service)
|
||||||
|
SpanCharacteristic *target; // reference to a "generic" Target Position Characteristic (used by a variety of different Service)
|
||||||
|
SpanCharacteristic *hTiltCurrent; // reference to horizontal tilt of window shade - current position
|
||||||
|
SpanCharacteristic *hTiltTarget; // reference to horizontal tilt of window shade - target position
|
||||||
|
|
||||||
|
ServoPin *hTiltServo; // reference to Servo Pin to control Horiontal Tilt
|
||||||
|
|
||||||
|
DEV_WindowShade(uint8_t hTiltServoPin) : Service::WindowCovering(){ // constructor() method
|
||||||
|
|
||||||
|
current=new Characteristic::CurrentPosition(0); // Window Shades have positions that range from 0 (fully lowered) to 100 (fully raised)
|
||||||
|
target=new Characteristic::TargetPosition(0); // Window Shades have positions that range from 0 (fully lowered) to 100 (fully raised)
|
||||||
|
target->setRange(0,100,10); // set the allowable target-position range to 0-100 IN STEPS of 10
|
||||||
|
|
||||||
|
hTiltCurrent=new Characteristic::CurrentHorizontalTiltAngle(); // Tilt Angle is measured in degrees; HAP default is -90 to +90
|
||||||
|
hTiltTarget=new Characteristic::TargetHorizontalTiltAngle();
|
||||||
|
|
||||||
|
// Here we define our Servo using HomeSpan's ServoPin Class.
|
||||||
|
// See the HomeSpan API Reference for full details and a list of all parameters.
|
||||||
|
|
||||||
|
hTiltServo=new ServoPin(hTiltServoPin);
|
||||||
|
|
||||||
|
Serial.print("Configuring Motorized Window Shade"); // initialization message
|
||||||
|
Serial.print("\n");
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
boolean update(){ // update() method
|
||||||
|
|
||||||
|
if(target->updated()){ // check to see if shade target position was updated
|
||||||
|
if(target->getNewVal()>current->getVal()){ // if the target-position requested is greater than the current-position, simply log a "raise" message
|
||||||
|
LOG1("Raising Shade\n"); // ** there is nothing more to do - HomeKit keeps track of the current-position so knows raising is required
|
||||||
|
} else
|
||||||
|
if(target->getNewVal()<current->getVal()){ // if the target-position requested is less than the current-position, simply log a "raise" message
|
||||||
|
LOG1("Lowering Shade\n"); // ** there is nothing more to do - HomeKit keeps track of the current-position so knows lowering is required
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(hTiltTarget->updated()){ // check to see if shade tilt angle was updated
|
||||||
|
hTiltCurrent->setVal(hTiltTarget->getNewVal()); // set current value of tilt to match target value
|
||||||
|
hTiltServo->set(hTiltTarget->getNewVal()); // <--- update actual servo position with ServoPin->set(degrees) method
|
||||||
|
}
|
||||||
|
|
||||||
|
return(true); // return true
|
||||||
|
|
||||||
|
} // update
|
||||||
|
|
||||||
|
void loop(){ // loop() method
|
||||||
|
|
||||||
|
// Here we simulate a window shade that takes 5 seconds to move to its new target position
|
||||||
|
|
||||||
|
if(current->getVal()!=target->getVal() && target->timeVal()>5000){ // if 5 seconds have elapsed since the target-position was last modified...
|
||||||
|
current->setVal(target->getVal()); // ...set the current position to equal the target position
|
||||||
|
}
|
||||||
|
|
||||||
|
} // loop
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
|
||||||
|
//////////////////////////////////
|
||||||
|
// DEVICE-SPECIFIC SERVICES //
|
||||||
|
//////////////////////////////////
|
||||||
|
|
||||||
|
struct DEV_Identify : Service::AccessoryInformation {
|
||||||
|
|
||||||
|
int nBlinks; // number of times to blink built-in LED in identify routine
|
||||||
|
SpanCharacteristic *identify; // reference to the Identify Characteristic
|
||||||
|
|
||||||
|
DEV_Identify(const char *name, const char *manu, const char *sn, const char *model, const char *version, int nBlinks) : Service::AccessoryInformation(){
|
||||||
|
|
||||||
|
new Characteristic::Name(name); // create all the required Characteristics with values set based on above arguments
|
||||||
|
new Characteristic::Manufacturer(manu);
|
||||||
|
new Characteristic::SerialNumber(sn);
|
||||||
|
new Characteristic::Model(model);
|
||||||
|
new Characteristic::FirmwareRevision(version);
|
||||||
|
identify=new Characteristic::Identify(); // store a reference to the Identify Characteristic for use below
|
||||||
|
|
||||||
|
this->nBlinks=nBlinks; // store the number of times to blink the LED
|
||||||
|
|
||||||
|
pinMode(homeSpan.getStatusPin(),OUTPUT); // make sure LED is set for output
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean update(){
|
||||||
|
|
||||||
|
for(int i=0;i<nBlinks;i++){
|
||||||
|
digitalWrite(homeSpan.getStatusPin(),LOW);
|
||||||
|
delay(250);
|
||||||
|
digitalWrite(homeSpan.getStatusPin(),HIGH);
|
||||||
|
delay(250);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(true); // return true
|
||||||
|
|
||||||
|
} // update
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*********************************************************************************
|
||||||
|
* MIT License
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 Gregg E. Berman
|
||||||
|
*
|
||||||
|
* https://github.com/HomeSpan/HomeSpan
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
********************************************************************************/
|
||||||
|
|
||||||
|
// This example demonstrates how to control a real-world Servo Motor using HomeSpan's
|
||||||
|
// ServoPin Class, as included in "extras/PwmPin.h" The code builds upon the
|
||||||
|
// WindowShade Accessory from Example 13 by adding a Horizontal Tilt Characteristic that
|
||||||
|
// is controlled by a Servo connected to the ESP32.
|
||||||
|
|
||||||
|
#include "HomeSpan.h"
|
||||||
|
#include "DEV_Identify.h"
|
||||||
|
#include "DEV_DoorsWindows.h"
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
homeSpan.begin(Category::Bridges,"HomeSpan Bridge");
|
||||||
|
|
||||||
|
new SpanAccessory();
|
||||||
|
new DEV_Identify("Bridge #1","HomeSpan","123-ABC","HS Bridge","0.9",3);
|
||||||
|
new Service::HAPProtocolInformation();
|
||||||
|
new Characteristic::Version("1.1.0");
|
||||||
|
|
||||||
|
new SpanAccessory();
|
||||||
|
new DEV_Identify("Window Shade","HomeSpan","123-ABC","Shade","0.9",0);
|
||||||
|
new DEV_WindowShade(18); // Create a motorized Window Shade with a Servo attached to Pin 18 that controls the Horizontal Tilt of the Shade
|
||||||
|
|
||||||
|
} // end of setup()
|
||||||
|
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
void loop(){
|
||||||
|
|
||||||
|
homeSpan.poll();
|
||||||
|
|
||||||
|
} // end of loop()
|
||||||
Loading…
Reference in New Issue