//- ----------------------------------------------------------------------------------------------------------------------- // AskSin++ // 2017-12-14 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/ // ci-test=yes board=328p aes=no //- ----------------------------------------------------------------------------------------------------------------------- // define this to read the device id, serial and device type from bootloader section // #define USE_OTA_BOOTLOADER #define EI_NOTEXTERNAL #include #include #include #include // we use a Pro Mini // Arduino pin for the LED // D4 == PIN 4 on Pro Mini #define LED_PIN 4 // Arduino pin for the config button // B0 == PIN 8 on Pro Mini #define CONFIG_BUTTON_PIN 8 // define L298N when using a H-Bridge motor driver // #define L298N #ifdef L298N // define up and down pins for L298N driver #define UP_PIN 16 #define DOWN_PIN 17 #else // define relay pins #define ON_RELAY_PIN 15 #define DIR_RELAY_PIN 14 #endif #define UP_BUTTON_PIN 6 #define DOWN_BUTTON_PIN 3 // number of available peers per channel #define PEERS_PER_CHANNEL 12 // all library classes are placed in the namespace 'as' using namespace as; // define all device properties const struct DeviceInfo PROGMEM devinfo = { {0x59,0x32,0xaf}, // Device ID "papa5932af", // Device Serial {0x00,0x05}, // Device Model 0x24, // Firmware Version as::DeviceType::BlindActuator, // Device Type {0x01,0x00} // Info Bytes }; /** * Configure the used hardware */ typedef AvrSPI<10,11,12,13> RadioSPI; typedef AskSin,NoBattery,Radio > Hal; //typedef AskSin,NoBattery,NoRadio> Hal; DEFREGISTER(BlindReg0,MASTERID_REGS,DREG_INTKEY,DREG_CONFBUTTONTIME,DREG_LOCALRESETDISABLE) class BlindList0 : public RegList0 { public: BlindList0 (uint16_t addr) : RegList0(addr) {} void defaults () { clear(); // intKeyVisible(false); confButtonTime(0xff); // localResetDisable(false); } }; class BlChannel : public ActorChannel { public: typedef ActorChannel BaseChannel; BlChannel () {} virtual ~BlChannel () {} virtual void switchState(uint8_t oldstate,uint8_t newstate, uint32_t stateDelay) { BaseChannel::switchState(oldstate, newstate, stateDelay); if( newstate == AS_CM_JT_RAMPON && stateDelay > 0 ) { motorUp(); } else if( newstate == AS_CM_JT_RAMPOFF && stateDelay > 0 ) { motorDown(); } else { motorStop(); } } void motorUp () { #ifdef L298N digitalWrite(DOWN_PIN,LOW); digitalWrite(UP_PIN,HIGH); #else digitalWrite(DIR_RELAY_PIN,HIGH); digitalWrite(ON_RELAY_PIN,HIGH); #endif } void motorDown () { #ifdef L298N digitalWrite(UP_PIN,LOW); digitalWrite(DOWN_PIN,HIGH); #else digitalWrite(DIR_RELAY_PIN,LOW); digitalWrite(ON_RELAY_PIN,HIGH); #endif } void motorStop () { #ifdef L298N digitalWrite(UP_PIN,LOW); digitalWrite(DOWN_PIN,LOW); #else digitalWrite(DIR_RELAY_PIN,LOW); digitalWrite(ON_RELAY_PIN,LOW); #endif } void init () { #ifdef L298N pinMode(UP_PIN,OUTPUT); pinMode(DOWN_PIN,OUTPUT); #else pinMode(ON_RELAY_PIN,OUTPUT); pinMode(DIR_RELAY_PIN,OUTPUT); #endif motorStop(); BaseChannel::init(); } }; // setup the device with channel type and number of channels typedef MultiChannelDevice BlindType; Hal hal; BlindType sdev(devinfo,0x20); ConfigButton cfgBtn(sdev); InternalButton btnup(sdev,1); InternalButton btndown(sdev,2); void initPeerings (bool first) { // create internal peerings - CCU2 needs this if( first == true ) { sdev.channel(1).peer(btnup.peer(),btndown.peer()); } } void setup () { DINIT(57600,ASKSIN_PLUS_PLUS_IDENTIFIER); //storage().setByte(0,0); bool first = sdev.init(hal); sdev.channel(1).init(); // sdev.channel(1).getList1().refRunningTimeBottomTop(270); // sdev.channel(1).getList1().refRunningTimeTopBottom(270); buttonISR(cfgBtn,CONFIG_BUTTON_PIN); buttonISR(btnup,UP_BUTTON_PIN); buttonISR(btndown,DOWN_BUTTON_PIN); initPeerings(first); sdev.initDone(); } void loop() { bool worked = hal.runready(); bool poll = sdev.pollRadio(); if( worked == false && poll == false ) { hal.activity.savePower >(hal); } }